Re: [PATCH rtems-libbsd] rtemsbsd/arasan_sd: Prevent disabled device probe

2022-09-15 Thread Chris Johns
On 16/9/22 6:16 am, Kinsey Moore wrote:
> Probing a SDIO/SDHCI interface that has been disabled by system init via
> holding it in reset can cause a CPU hang. This prevents probing of
> devices that have been disabled in such a manner on ZynqMP systems.> ---
>  rtemsbsd/sys/dev/sdhci/arasan_sdhci.c | 25 +
>  1 file changed, 25 insertions(+)
> 
> diff --git a/rtemsbsd/sys/dev/sdhci/arasan_sdhci.c 
> b/rtemsbsd/sys/dev/sdhci/arasan_sdhci.c
> index ccdcb09b..6332260a 100644
> --- a/rtemsbsd/sys/dev/sdhci/arasan_sdhci.c
> +++ b/rtemsbsd/sys/dev/sdhci/arasan_sdhci.c
> @@ -246,6 +246,31 @@ arasan_sdhci_attach(device_t dev)
>   goto fail;
>   }
>  
> + /*
> +  * These devices may be disabled by being held in reset. If this is the
> +  * case, a read attempt in its register range will result in a CPU hang.
> +  * Detect this situation and avoid probing the device in this situation.
> +  */
> +#if defined(LIBBSP_AARCH64_XILINX_ZYNQMP_BSP_H)
> + volatile uint32_t *RST_LPD_IOU2_ptr = (uint32_t*)0xFF5E0238;
> + uint32_t RST_LPD_IOU2 = *RST_LPD_IOU2_ptr;
> + uint32_t SDIO0_disabled = RST_LPD_IOU2 & (1 << 5);
> + uint32_t SDIO1_disabled = RST_LPD_IOU2 & (1 << 6);
> + if ( sc->mem_res == 0xFF16 ) {
> + if ( SDIO0_disabled != 0 ) {
> + device_printf(dev, "SDIO0 disabled\n");
> + err = ENXIO;
> + goto fail;
> + }
> + } else {
> + if ( SDIO1_disabled != 0 ) {
> + device_printf(dev, "SDIO1 disabled\n");
> + err = ENXIO;
> + goto fail;
> + }
> + }
> +#endif

This is fine given it is specific to the ZynqMP. If we find anything common
between the various families it can be updated.

Chris
___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel


[PATCH rtems-libbsd] rtemsbsd/arasan_sd: Prevent disabled device probe

2022-09-15 Thread Kinsey Moore
Probing a SDIO/SDHCI interface that has been disabled by system init via
holding it in reset can cause a CPU hang. This prevents probing of
devices that have been disabled in such a manner on ZynqMP systems.
---
 rtemsbsd/sys/dev/sdhci/arasan_sdhci.c | 25 +
 1 file changed, 25 insertions(+)

diff --git a/rtemsbsd/sys/dev/sdhci/arasan_sdhci.c 
b/rtemsbsd/sys/dev/sdhci/arasan_sdhci.c
index ccdcb09b..6332260a 100644
--- a/rtemsbsd/sys/dev/sdhci/arasan_sdhci.c
+++ b/rtemsbsd/sys/dev/sdhci/arasan_sdhci.c
@@ -246,6 +246,31 @@ arasan_sdhci_attach(device_t dev)
goto fail;
}
 
+   /*
+* These devices may be disabled by being held in reset. If this is the
+* case, a read attempt in its register range will result in a CPU hang.
+* Detect this situation and avoid probing the device in this situation.
+*/
+#if defined(LIBBSP_AARCH64_XILINX_ZYNQMP_BSP_H)
+   volatile uint32_t *RST_LPD_IOU2_ptr = (uint32_t*)0xFF5E0238;
+   uint32_t RST_LPD_IOU2 = *RST_LPD_IOU2_ptr;
+   uint32_t SDIO0_disabled = RST_LPD_IOU2 & (1 << 5);
+   uint32_t SDIO1_disabled = RST_LPD_IOU2 & (1 << 6);
+   if ( sc->mem_res == 0xFF16 ) {
+   if ( SDIO0_disabled != 0 ) {
+   device_printf(dev, "SDIO0 disabled\n");
+   err = ENXIO;
+   goto fail;
+   }
+   } else {
+   if ( SDIO1_disabled != 0 ) {
+   device_printf(dev, "SDIO1 disabled\n");
+   err = ENXIO;
+   goto fail;
+   }
+   }
+#endif
+
rid = 0;
sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_ACTIVE);
-- 
2.30.2

___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel