[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[qemu-xen staging-4.18] hw/sd/sdhci: Do not force sdhci_mmio_*_ops onto all SD controllers



commit b4b3aac5b542557c63bc24049b61c2640ad90dd9
Author:     Bernhard Beschow <shentey@xxxxxxxxx>
AuthorDate: Sun Jul 9 10:09:50 2023 +0200
Commit:     Michael Tokarev <mjt@xxxxxxxxxx>
CommitDate: Sun Sep 10 19:39:41 2023 +0300

    hw/sd/sdhci: Do not force sdhci_mmio_*_ops onto all SD controllers
    
    Since commit c0a55a0c9da2 "hw/sd/sdhci: Support big endian SD host 
controller
    interfaces" sdhci_common_realize() forces all SD card controllers to use 
either
    sdhci_mmio_le_ops or sdhci_mmio_be_ops, depending on the "endianness" 
property.
    However, there are device models which use different MMIO ops: 
TYPE_IMX_USDHC
    uses usdhc_mmio_ops and TYPE_S3C_SDHCI uses sdhci_s3c_mmio_ops.
    
    Forcing sdhci_mmio_le_ops breaks SD card handling on the "sabrelite" board, 
for
    example. Fix this by defaulting the io_ops to little endian and switch to 
big
    endian in sdhci_common_realize() only if there is a matchig big endian 
variant
    available.
    
    Fixes: c0a55a0c9da2 ("hw/sd/sdhci: Support big endian SD host controller
    interfaces")
    
    Signed-off-by: Bernhard Beschow <shentey@xxxxxxxxx>
    Tested-by: Guenter Roeck <linux@xxxxxxxxxxxx>
    Message-Id: <20230709080950.92489-1-shentey@xxxxxxxxx>
    (cherry picked from commit 3b830790151ff231531ef2595793e387dd154efb)
    Signed-off-by: Michael Tokarev <mjt@xxxxxxxxxx>
---
 hw/sd/sdhci.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 6811f0f1a8..362c2c86aa 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1382,6 +1382,8 @@ void sdhci_initfn(SDHCIState *s)
 
     s->insert_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, 
sdhci_raise_insertion_irq, s);
     s->transfer_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_data_transfer, 
s);
+
+    s->io_ops = &sdhci_mmio_le_ops;
 }
 
 void sdhci_uninitfn(SDHCIState *s)
@@ -1399,9 +1401,13 @@ void sdhci_common_realize(SDHCIState *s, Error **errp)
 
     switch (s->endianness) {
     case DEVICE_LITTLE_ENDIAN:
-        s->io_ops = &sdhci_mmio_le_ops;
+        /* s->io_ops is little endian by default */
         break;
     case DEVICE_BIG_ENDIAN:
+        if (s->io_ops != &sdhci_mmio_le_ops) {
+            error_setg(errp, "SD controller doesn't support big endianness");
+            return;
+        }
         s->io_ops = &sdhci_mmio_be_ops;
         break;
     default:
--
generated by git-patchbot for /home/xen/git/qemu-xen.git#staging-4.18



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.