This quirk is required for imx8mp-evk to boot via u-boot successfully.
Signed-off-by: Bernhard Beschow <[email protected]>
---
hw/sd/sdhci.c | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index eab814096d..3b0a26ef53 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1892,9 +1892,33 @@ static void fsl_esdhc_le_init(Object *obj)
qdev_prop_set_uint8(dev, "vendor", SDHCI_VENDOR_FSL);
}
+static uint64_t usdhc_read(void *opaque, hwaddr offset, unsigned size)
+{
+ if (offset == SDHC_CLKCON) {
+ /* we force the reset value of the lower nibble since QEMU alters it */
+ return esdhc_read(opaque, offset, size) | 0xf;
+ }
+
+ return esdhc_read(opaque, offset, size);
+}
+
+static void usdhc_write(void *opaque, hwaddr offset, uint64_t val,
+ unsigned size)
+{
+ if (offset == SDHC_CLKCON) {
+ if ((val & 0xf) != 1) {
+ qemu_log_mask(LOG_GUEST_ERROR,
+ "%s: SYS_CTRL[3..0] shall always be written as 0xf",
+ DEVICE(opaque)->canonical_path);
+ }
+ }
+
+ esdhc_write(opaque, offset, val, size);
+}
+
static const MemoryRegionOps usdhc_mmio_ops = {
- .read = esdhc_read,
- .write = esdhc_write,
+ .read = usdhc_read,
+ .write = usdhc_write,
.valid = {
.min_access_size = 1,
.max_access_size = 4,
--
2.52.0