[PATCH rtems-libbsd] rtemsbsd/arasan_sd: Prevent disabled device probe
Chris Johns
chrisj at rtems.org
Fri Sep 16 06:26:41 UTC 2022
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 == 0xFF160000 ) {
> + 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
More information about the devel
mailing list