@samitouri / QOSamiQemu / commits / 2019f4e0dd

hw/arm: ax3000-soc: Enable Axiado SD host controller

Enable SD host controller into Axiado AX3000 SoC to load kernel and rootfs from eMMC. Signed-off-by: Kuan-Jui Chiu <kchiu@axiado.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260713073033.3883619-6-kchiu@axiado.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Kuan-Jui Chiu committed Aug 11, 2026 at 20:14 UTC 2019f4e0ddb3f7c0d3246042ee7535b7348792ce
3 files changed +30
hw/arm/Kconfig
+1
@@ -731,4 +731,5 @@ config AXIADO_SOC
731 select ARM_GIC
732 select CADENCE # UART
733 select AXIADO_CLK
734 + select AXIADO_SDHCI
735 select UNIMP
hw/arm/ax3000-soc.c
+22
@@ -35,6 +35,7 @@ static void ax3000_init(Object *obj)
35 }
36
37 object_initialize_child(obj, "clk", &s->ax3000_clk, TYPE_AX3000_CLK);
38 + object_initialize_child(obj, "sdhci0", &s->sdhci0, TYPE_AXIADO_SDHCI);
39 }
40
41 static void ax3000_realize(DeviceState *dev, Error **errp)
@@ -46,6 +47,7 @@ static void ax3000_realize(DeviceState *dev, Error **errp)
47 QList *redist_region_count;
48 SysBusDevice *sdhci0_sbd;
49 DeviceState *card;
50 + DriveInfo *dinfo;
51
52 /* CPUs */
53 for (int i = 0; i < sc->num_cpus; i++) {
@@ -165,6 +167,26 @@ static void ax3000_realize(DeviceState *dev, Error **errp)
167 return;
168 }
169 sysbus_mmio_map(SYS_BUS_DEVICE(&s->ax3000_clk), 0, AX3000_PLL_BASE);
170 +
171 + /* SDHCI */
172 + sdhci0_sbd = SYS_BUS_DEVICE(&s->sdhci0);
173 + if (!sysbus_realize(sdhci0_sbd, errp)) {
174 + return;
175 + }
176 +
177 + sysbus_mmio_map(sdhci0_sbd, 0, AX3000_SDHCI0_BASE);
178 + sysbus_mmio_map(sdhci0_sbd, 1, AX3000_EMMC_PHY_BASE);
179 + sysbus_connect_irq(sdhci0_sbd, 0,
180 + qdev_get_gpio_in(gic_dev, AX3000_SDHCI0_IRQ));
181 +
182 + dinfo = drive_get(IF_SD, 0, 0);
183 + if (dinfo) {
184 + card = qdev_new(TYPE_SD_CARD);
185 + qdev_prop_set_drive_err(card, "drive",
186 + blk_by_legacy_dinfo(dinfo),
187 + &error_fatal);
188 + qdev_realize_and_unref(card, s->sdhci0.sd_bus, &error_fatal);
189 + }
190 }
191
192 static void ax3000_class_init(ObjectClass *oc, const void *data)
include/hw/arm/ax3000-soc.h
+7
@@ -13,6 +13,7 @@
13 #include "hw/intc/arm_gicv3_common.h"
14 #include "hw/char/cadence_uart.h"
15 #include "hw/misc/axiado_clk.h"
16 +#include "hw/sd/axiado_sdhci.h"
17 #include "hw/core/sysbus.h"
18 #include "qemu/units.h"
19
@@ -34,6 +35,9 @@ OBJECT_DECLARE_TYPE(Ax3000SoCState, Ax3000SoCClass, AX3000_SOC)
35 #define AX3000_UART2_BASE 0x80620000
36 #define AX3000_UART3_BASE 0x80520800
37
38 +#define AX3000_SDHCI0_BASE 0x86000000
39 +#define AX3000_EMMC_PHY_BASE 0x80801C00
40 +
41 #define AX3000_TIMER_CTRL 0x8A020000
42 #define AX3000_PLL_BASE 0x80000000
43
@@ -52,6 +56,7 @@ typedef struct Ax3000SoCState {
56 MemoryRegion dram[AX3000_NUM_BANKS];
57 Ax3000ClkState ax3000_clk;
58 CadenceUARTState uart[AX3000_NUM_UARTS];
59 + AxiadoSDHCIState sdhci0;
60 } Ax3000SoCState;
61
62 typedef struct Ax3000SoCClass {
@@ -65,6 +70,8 @@ enum Ax3000Irqs {
70 AX3000_UART1_IRQ = 113,
71 AX3000_UART2_IRQ = 114,
72 AX3000_UART3_IRQ = 170,
73 +
74 + AX3000_SDHCI0_IRQ = 123,
75 };
76
77 #endif /* AXIADO_AX3000_H */