mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-07-02 06:30:43 +08:00
rtemsbsd/arasan_sd: Prevent disabled device probe
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.
This commit is contained in:
parent
a0d36f58fd
commit
63dae7159f
@ -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
|
||||
|
||||
rid = 0;
|
||||
sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
|
||||
RF_ACTIVE);
|
||||
|
Loading…
x
Reference in New Issue
Block a user