[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