* [PATCH v1 0/5] Add Axiado SoC AX3005 and EVB
@ 2026-08-20 10:21 Kuan-Jui Chiu
2026-08-20 10:21 ` [PATCH v1 1/5] hw/sd/axiado_sdhci: Add header guard Kuan-Jui Chiu
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Kuan-Jui Chiu @ 2026-08-20 10:21 UTC (permalink / raw)
To: qemu-devel, peter.maydell; +Cc: Kuan-Jui Chiu
This patchset introduces Axiado SoC AX3005 and evaluation board for emulation
The model for Axiado SoC AX3005 supports
4 Cortex-A53 CPUs
Arm Generic Interrupt Controller v3
9 Cadence UARTs
1 SDHCI controller with PHY
8 Cadence GPIOs
Refer Axiado website for more product information
https://axiado.com/products/
and minor changes for the compatibility with existing AX3000 SoC model
Test plan:
1. Verified the machine "ax3005-evb" with following command
qemu-system-aarch64 \
-m 2G \
-machine ax3005-evb \
-device loader,file=bl31.bin,addr=0x88300000 \
-device loader,file=tee-raw.bin,addr=0x88400000 \
-device loader,file=u-boot.bin,addr=0x80000000 \
-device loader,file=fitImage,addr=0x80100000 \
-device loader,file=obmc-phosphor-image-evk-ax3005-qemu.squashfs-xz,addr=0x80B00000 \
-device loader,cpu-num=0,addr=0x88300000 \
-device loader,cpu-num=1,addr=0x88300000 \
-device loader,cpu-num=2,addr=0x88300000 \
-device loader,cpu-num=3,addr=0x88300000 \
-nographic \
-serial null \
-serial null \
-serial null \
-serial mon:stdio \
-drive if=sd,file=obmc-phosphor-image-evk-ax3005-qemu.wic,format=raw
2. Run QEMU test suite
make check
Ok: 331
Fail: 0
Skipped: 17
make check-functional
Ok: 28
Fail: 0
Skipped: 7
Kuan-Jui Chiu (5):
hw/sd/axiado_sdhci: Add header guard
hw/arm: Rename ax3000-boards as axiado-boards
hw/arm/ax3000: Specify SoC name in header and variable
hw/arm: Add Axiado SoC AX3005
hw/arm: Add Axiado Ax3005 EVB
MAINTAINERS | 2 +
hw/arm/ax3000-boards.c | 4 +-
hw/arm/ax3000-evk.c | 4 +-
hw/arm/ax3000-soc.c | 4 +-
hw/arm/ax3005-evk.c | 55 +++++
hw/arm/ax3005-soc.c | 224 ++++++++++++++++++
hw/arm/meson.build | 6 +-
include/hw/arm/ax3005-soc.h | 102 ++++++++
.../arm/{ax3000-boards.h => axiado-boards.h} | 10 +
include/hw/sd/axiado_sdhci.h | 5 +
10 files changed, 408 insertions(+), 8 deletions(-)
create mode 100644 hw/arm/ax3005-evk.c
create mode 100644 hw/arm/ax3005-soc.c
create mode 100644 include/hw/arm/ax3005-soc.h
rename include/hw/arm/{ax3000-boards.h => axiado-boards.h} (69%)
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH v1 1/5] hw/sd/axiado_sdhci: Add header guard 2026-08-20 10:21 [PATCH v1 0/5] Add Axiado SoC AX3005 and EVB Kuan-Jui Chiu @ 2026-08-20 10:21 ` Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 2/5] hw/arm: Rename ax3000-boards as axiado-boards Kuan-Jui Chiu ` (3 subsequent siblings) 4 siblings, 0 replies; 9+ messages in thread From: Kuan-Jui Chiu @ 2026-08-20 10:21 UTC (permalink / raw) To: qemu-devel, peter.maydell; +Cc: Kuan-Jui Chiu Signed-off-by: Kuan-Jui Chiu <kchiu@axiado.com> --- include/hw/sd/axiado_sdhci.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/hw/sd/axiado_sdhci.h b/include/hw/sd/axiado_sdhci.h index 85afebad93..ab52eb8185 100644 --- a/include/hw/sd/axiado_sdhci.h +++ b/include/hw/sd/axiado_sdhci.h @@ -6,6 +6,9 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef AXIADO_SDHCI_H +#define AXIADO_SDHCI_H + #include "hw/sd/sdhci.h" #include "qom/object.h" @@ -19,3 +22,5 @@ typedef struct AxiadoSDHCIState { MemoryRegion emmc_phy; BusState *sd_bus; } AxiadoSDHCIState; + +#endif /* AXIADO_SDHCI_H */ -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v1 2/5] hw/arm: Rename ax3000-boards as axiado-boards 2026-08-20 10:21 [PATCH v1 0/5] Add Axiado SoC AX3005 and EVB Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 1/5] hw/sd/axiado_sdhci: Add header guard Kuan-Jui Chiu @ 2026-08-20 10:21 ` Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 3/5] hw/arm/ax3000: Specify SoC name in header and variable Kuan-Jui Chiu ` (2 subsequent siblings) 4 siblings, 0 replies; 9+ messages in thread From: Kuan-Jui Chiu @ 2026-08-20 10:21 UTC (permalink / raw) To: qemu-devel, peter.maydell; +Cc: Kuan-Jui Chiu Rename header file ax3000-boards.h as axiado-boards.h for sharing across different Axiado SoC series Signed-off-by: Kuan-Jui Chiu <kchiu@axiado.com> --- hw/arm/ax3000-boards.c | 2 +- hw/arm/ax3000-evk.c | 2 +- include/hw/arm/{ax3000-boards.h => axiado-boards.h} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename include/hw/arm/{ax3000-boards.h => axiado-boards.h} (100%) diff --git a/hw/arm/ax3000-boards.c b/hw/arm/ax3000-boards.c index 4b8deec15c..1b645b7f43 100644 --- a/hw/arm/ax3000-boards.c +++ b/hw/arm/ax3000-boards.c @@ -7,7 +7,7 @@ */ #include "qemu/osdep.h" -#include "hw/arm/ax3000-boards.h" +#include "hw/arm/axiado-boards.h" #include "hw/arm/boot.h" #include "hw/arm/machines-qom.h" #include "qemu/error-report.h" diff --git a/hw/arm/ax3000-evk.c b/hw/arm/ax3000-evk.c index a170848871..f491de7521 100644 --- a/hw/arm/ax3000-evk.c +++ b/hw/arm/ax3000-evk.c @@ -7,7 +7,7 @@ */ #include "qemu/osdep.h" -#include "hw/arm/ax3000-boards.h" +#include "hw/arm/axiado-boards.h" static void axiado_scm3003_class_init(ObjectClass *oc, const void *data) { diff --git a/include/hw/arm/ax3000-boards.h b/include/hw/arm/axiado-boards.h similarity index 100% rename from include/hw/arm/ax3000-boards.h rename to include/hw/arm/axiado-boards.h -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v1 3/5] hw/arm/ax3000: Specify SoC name in header and variable 2026-08-20 10:21 [PATCH v1 0/5] Add Axiado SoC AX3005 and EVB Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 1/5] hw/sd/axiado_sdhci: Add header guard Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 2/5] hw/arm: Rename ax3000-boards as axiado-boards Kuan-Jui Chiu @ 2026-08-20 10:21 ` Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 4/5] hw/arm: Add Axiado SoC AX3005 Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 5/5] hw/arm: Add Axiado Ax3005 EVB Kuan-Jui Chiu 4 siblings, 0 replies; 9+ messages in thread From: Kuan-Jui Chiu @ 2026-08-20 10:21 UTC (permalink / raw) To: qemu-devel, peter.maydell; +Cc: Kuan-Jui Chiu Signed-off-by: Kuan-Jui Chiu <kchiu@axiado.com> --- hw/arm/ax3000-boards.c | 2 +- hw/arm/ax3000-evk.c | 2 +- hw/arm/ax3000-soc.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hw/arm/ax3000-boards.c b/hw/arm/ax3000-boards.c index 1b645b7f43..a499890317 100644 --- a/hw/arm/ax3000-boards.c +++ b/hw/arm/ax3000-boards.c @@ -1,5 +1,5 @@ /* - * Axiado Boards + * Axiado Ax3000 Boards * * Author: Kuan-Jui Chiu <kchiu@axiado.com> * diff --git a/hw/arm/ax3000-evk.c b/hw/arm/ax3000-evk.c index f491de7521..adcad2f340 100644 --- a/hw/arm/ax3000-evk.c +++ b/hw/arm/ax3000-evk.c @@ -1,5 +1,5 @@ /* - * Axiado Evaluation Kit Emulation + * Axiado Ax3000 Evaluation Kit Emulation * * Author: Kuan-Jui Chiu <kchiu@axiado.com> * diff --git a/hw/arm/ax3000-soc.c b/hw/arm/ax3000-soc.c index 71e31c6fb4..5009faaf99 100644 --- a/hw/arm/ax3000-soc.c +++ b/hw/arm/ax3000-soc.c @@ -229,7 +229,7 @@ static void ax3000_class_init(ObjectClass *oc, const void *data) sc->num_cpus = AX3000_NUM_CPUS; } -static const TypeInfo axiado_soc_types[] = { +static const TypeInfo ax3000_soc_types[] = { { .name = TYPE_AX3000_SOC, .parent = TYPE_SYS_BUS_DEVICE, @@ -239,4 +239,4 @@ static const TypeInfo axiado_soc_types[] = { } }; -DEFINE_TYPES(axiado_soc_types) +DEFINE_TYPES(ax3000_soc_types) -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v1 4/5] hw/arm: Add Axiado SoC AX3005 2026-08-20 10:21 [PATCH v1 0/5] Add Axiado SoC AX3005 and EVB Kuan-Jui Chiu ` (2 preceding siblings ...) 2026-08-20 10:21 ` [PATCH v1 3/5] hw/arm/ax3000: Specify SoC name in header and variable Kuan-Jui Chiu @ 2026-08-20 10:21 ` Kuan-Jui Chiu 2026-08-23 10:33 ` Jack Wang 2026-08-20 10:21 ` [PATCH v1 5/5] hw/arm: Add Axiado Ax3005 EVB Kuan-Jui Chiu 4 siblings, 1 reply; 9+ messages in thread From: Kuan-Jui Chiu @ 2026-08-20 10:21 UTC (permalink / raw) To: qemu-devel, peter.maydell; +Cc: Kuan-Jui Chiu This patch adds new model for Axiado SoC AX3005 which supports 4 Cortex-A53 ARM64 CPUs Arm Generic Interrupt Controller v3 9 Cadence UARTs 1 SDHCI controller with PHY 8 Cadence GPIOs Signed-off-by: Kuan-Jui Chiu <kchiu@axiado.com> --- MAINTAINERS | 2 + hw/arm/ax3005-soc.c | 224 ++++++++++++++++++++++++++++++++++++ hw/arm/meson.build | 3 +- include/hw/arm/ax3005-soc.h | 102 ++++++++++++++++ 4 files changed, 330 insertions(+), 1 deletion(-) create mode 100644 hw/arm/ax3005-soc.c create mode 100644 include/hw/arm/ax3005-soc.h diff --git a/MAINTAINERS b/MAINTAINERS index b51f5c3e60..cb542ad591 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1312,8 +1312,10 @@ M: Kuan-Jui Chiu <kchiu@axiado.com> L: qemu-arm@nongnu.org S: Maintained F: hw/arm/ax3000*.c +F: hw/arm/ax3005*.c F: hw/*/axiado*.c F: include/hw/arm/ax3000*.h +F: include/hw/arm/ax3005*.h F: include/hw/*/axiado*.h AVR Machines diff --git a/hw/arm/ax3005-soc.c b/hw/arm/ax3005-soc.c new file mode 100644 index 0000000000..e8a91bceb6 --- /dev/null +++ b/hw/arm/ax3005-soc.c @@ -0,0 +1,224 @@ +/* + * Axiado SoC AX3005 + * + * Author: Kuan-Jui Chiu <kchiu@axiado.com> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "system/address-spaces.h" +#include "hw/arm/bsa.h" +#include "hw/arm/ax3005-soc.h" +#include "hw/misc/unimp.h" +#include "system/system.h" +#include "qobject/qlist.h" +#include "qom/object.h" +#include "hw/core/boards.h" + +static void ax3005_init(Object *obj) +{ + Ax3005SoCState *s = AX3005_SOC(obj); + Ax3005SoCClass *sc = AX3005_SOC_GET_CLASS(s); + + for (int i = 0; i < sc->num_cpus; i++) { + g_autofree char *name = g_strdup_printf("cpu%d", i); + object_initialize_child(obj, name, &s->cpu[i], + ARM_CPU_TYPE_NAME("cortex-a53")); + } + + object_initialize_child(obj, "gic", &s->gic, gicv3_class_name()); + + for (int i = 0; i < AX3005_NUM_UARTS; i++) { + g_autofree char *name = g_strdup_printf("uart%d", i); + object_initialize_child(obj, name, &s->uart[i], TYPE_CADENCE_UART); + } + + object_initialize_child(obj, "sdhci0", &s->sdhci0, TYPE_AXIADO_SDHCI); + + for (int i = 0; i < AX3005_NUM_GPIOS; i++) { + g_autofree char *name = g_strdup_printf("gpio%d", i); + object_initialize_child(obj, name, &s->gpio[i], TYPE_CADENCE_GPIO); + } +} + +static void ax3005_realize(DeviceState *dev, Error **errp) +{ + Ax3005SoCState *s = AX3005_SOC(dev); + Ax3005SoCClass *sc = AX3005_SOC_GET_CLASS(s); + SysBusDevice *gic_sbd = SYS_BUS_DEVICE(&s->gic); + DeviceState *gic_dev = DEVICE(&s->gic); + QList *redist_region_count; + SysBusDevice *sdhci0_sbd; + DeviceState *card; + DriveInfo *dinfo; + + /* CPUs */ + for (int i = 0; i < sc->num_cpus; i++) { + object_property_set_int(OBJECT(&s->cpu[i]), "cntfrq", 1000000000, + &error_abort); + + if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) { + return; + } + } + + /* GIC */ + qdev_prop_set_uint32(gic_dev, "num-cpu", sc->num_cpus); + qdev_prop_set_uint32(gic_dev, "num-irq", + AX3005_NUM_IRQS + GIC_INTERNAL); + + redist_region_count = qlist_new(); + qlist_append_int(redist_region_count, sc->num_cpus); + qdev_prop_set_array(gic_dev, "redist-region-count", redist_region_count); + + if (!sysbus_realize(gic_sbd, errp)) { + return; + } + + sysbus_mmio_map(gic_sbd, 0, AX3005_GIC_DIST_BASE); + sysbus_mmio_map(gic_sbd, 1, AX3005_GIC_REDIST_BASE); + + /* + * Mapping from the output timer irq lines from the CPU to the + * GIC PPI inputs. + */ + const int timer_irqs[] = { + [GTIMER_PHYS] = ARCH_TIMER_NS_EL1_IRQ, + [GTIMER_VIRT] = ARCH_TIMER_VIRT_IRQ, + [GTIMER_HYP] = ARCH_TIMER_NS_EL2_IRQ, + [GTIMER_SEC] = ARCH_TIMER_S_EL1_IRQ + }; + + /* + * Wire the outputs from each CPU's generic timer and the GICv3 + * maintenance interrupt signal to the appropriate GIC PPI inputs, and + * the GIC's IRQ/FIQ interrupt outputs to the CPU's inputs. + */ + for (int i = 0; i < sc->num_cpus; i++) { + DeviceState *cpu_dev = DEVICE(&s->cpu[i]); + int intidbase = AX3005_NUM_IRQS + i * GIC_INTERNAL; + qemu_irq irq; + + for (int j = 0; j < ARRAY_SIZE(timer_irqs); j++) { + irq = qdev_get_gpio_in(gic_dev, intidbase + timer_irqs[j]); + qdev_connect_gpio_out(cpu_dev, j, irq); + } + + irq = qdev_get_gpio_in(gic_dev, intidbase + ARCH_GIC_MAINT_IRQ); + qdev_connect_gpio_out_named(cpu_dev, "gicv3-maintenance-interrupt", + 0, irq); + + sysbus_connect_irq(gic_sbd, i, + qdev_get_gpio_in(cpu_dev, ARM_CPU_IRQ)); + sysbus_connect_irq(gic_sbd, i + sc->num_cpus, + qdev_get_gpio_in(cpu_dev, ARM_CPU_FIQ)); + sysbus_connect_irq(gic_sbd, i + 2 * sc->num_cpus, + qdev_get_gpio_in(cpu_dev, ARM_CPU_VIRQ)); + sysbus_connect_irq(gic_sbd, i + 3 * sc->num_cpus, + qdev_get_gpio_in(cpu_dev, ARM_CPU_VFIQ)); + } + + /* DRAM */ + memory_region_init_ram(&s->dram, OBJECT(s), "dram", AX3005_DRAM_SIZE, + &error_fatal); + memory_region_add_subregion(get_system_memory(), AX3005_DRAM_BASE, + &s->dram); + + /* UARTs */ + const struct { + hwaddr addr; + unsigned int irq; + } serial_table[] = { + { AX3005_UART0_BASE, AX3005_UART0_IRQ }, + { AX3005_UART1_BASE, AX3005_UART1_IRQ }, + { AX3005_UART2_BASE, AX3005_UART2_IRQ }, + { AX3005_UART3_BASE, AX3005_UART3_IRQ }, + { AX3005_UART4_BASE, AX3005_UART4_IRQ }, + { AX3005_UART5_BASE, AX3005_UART5_IRQ }, + { AX3005_UART6_BASE, AX3005_UART6_IRQ }, + { AX3005_UART7_BASE, AX3005_UART7_IRQ }, + { AX3005_UART8_BASE, AX3005_UART8_IRQ } + }; + + for (int i = 0; i < AX3005_NUM_UARTS; i++) { + qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i)); + if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) { + return; + } + + sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart[i]), 0, + qdev_get_gpio_in(gic_dev, serial_table[i].irq)); + } + + /* Timer control */ + create_unimplemented_device("ax3005.timerctrl", AX3005_TIMER_CTRL, 32); + + /* SDHCI */ + sdhci0_sbd = SYS_BUS_DEVICE(&s->sdhci0); + if (!sysbus_realize(sdhci0_sbd, errp)) { + return; + } + + sysbus_mmio_map(sdhci0_sbd, 0, AX3005_SDHCI0_BASE); + sysbus_mmio_map(sdhci0_sbd, 1, AX3005_EMMC_PHY_BASE); + sysbus_connect_irq(sdhci0_sbd, 0, + qdev_get_gpio_in(gic_dev, AX3005_SDHCI0_IRQ)); + + dinfo = drive_get(IF_SD, 0, 0); + if (dinfo) { + card = qdev_new(TYPE_SD_CARD); + qdev_prop_set_drive_err(card, "drive", + blk_by_legacy_dinfo(dinfo), + &error_fatal); + qdev_realize_and_unref(card, s->sdhci0.sd_bus, &error_fatal); + } + + /* GPIOs */ + const struct { + hwaddr addr; + unsigned int irq; + } gpio_table[] = { + { AX3005_GPIO0_BASE, AX3005_GPIO0_IRQ }, + { AX3005_GPIO1_BASE, AX3005_GPIO1_IRQ }, + { AX3005_GPIO2_BASE, AX3005_GPIO2_IRQ }, + { AX3005_GPIO3_BASE, AX3005_GPIO3_IRQ }, + { AX3005_GPIO4_BASE, AX3005_GPIO4_IRQ }, + { AX3005_GPIO5_BASE, AX3005_GPIO5_IRQ }, + { AX3005_GPIO6_BASE, AX3005_GPIO6_IRQ }, + { AX3005_GPIO7_BASE, AX3005_GPIO7_IRQ } + }; + + for (int i = 0; i < AX3005_NUM_GPIOS; i++) { + if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) { + return; + } + + sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0, + qdev_get_gpio_in(gic_dev, gpio_table[i].irq)); + } +} + +static void ax3005_class_init(ObjectClass *oc, const void *data) +{ + DeviceClass *dc = DEVICE_CLASS(oc); + Ax3005SoCClass *sc = AX3005_SOC_CLASS(oc); + + dc->desc = "Axiado SoC AX3005"; + dc->realize = ax3005_realize; + sc->num_cpus = AX3005_NUM_CPUS; +} + +static const TypeInfo ax3005_soc_types[] = { + { + .name = TYPE_AX3005_SOC, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(Ax3005SoCState), + .instance_init = ax3005_init, + .class_init = ax3005_class_init, + } +}; + +DEFINE_TYPES(ax3005_soc_types) diff --git a/hw/arm/meson.build b/hw/arm/meson.build index 8ee5307a91..9fceb8d2e7 100644 --- a/hw/arm/meson.build +++ b/hw/arm/meson.build @@ -111,7 +111,8 @@ arm_common_ss.add(when: 'CONFIG_VERSATILE', if_true: files('versatilepb.c')) arm_common_ss.add(when: 'CONFIG_VEXPRESS', if_true: files('vexpress.c')) arm_common_ss.add(when: ['CONFIG_AXIADO_SOC', 'TARGET_AARCH64'], if_true: files( - 'ax3000-soc.c')) + 'ax3000-soc.c', + 'ax3005-soc.c')) arm_common_ss.add(when: ['CONFIG_AXIADO_EVK', 'TARGET_AARCH64'], if_true: files( 'ax3000-boards.c', 'ax3000-evk.c')) diff --git a/include/hw/arm/ax3005-soc.h b/include/hw/arm/ax3005-soc.h new file mode 100644 index 0000000000..2a383a8084 --- /dev/null +++ b/include/hw/arm/ax3005-soc.h @@ -0,0 +1,102 @@ +/* + * Axiado SoC AX3005 + * + * Author: Kuan-Jui Chiu <kchiu@axiado.com> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef AXIADO_AX3005_H +#define AXIADO_AX3005_H + +#include "cpu.h" +#include "hw/intc/arm_gicv3_common.h" +#include "hw/char/cadence_uart.h" +#include "hw/gpio/cadence_gpio.h" +#include "hw/sd/axiado_sdhci.h" +#include "hw/core/sysbus.h" +#include "qemu/units.h" + +#define TYPE_AX3005_SOC "ax3005" +OBJECT_DECLARE_TYPE(Ax3005SoCState, Ax3005SoCClass, AX3005_SOC) + +#define AX3005_DRAM_BASE 0x80000000 +#define AX3005_DRAM_SIZE (2 * GiB) + +#define AX3005_GIC_DIST_BASE 0x40400000 +#define AX3005_GIC_DIST_SIZE (64 * KiB) +#define AX3005_GIC_REDIST_BASE 0x40500000 +#define AX3005_GIC_REDIST_SIZE (768 * KiB) + +#define AX3005_UART0_BASE 0x33020000 +#define AX3005_UART1_BASE 0x330A0000 +#define AX3005_UART2_BASE 0x33120000 +#define AX3005_UART3_BASE 0x33020800 +#define AX3005_UART4_BASE 0x331A0400 +#define AX3005_UART5_BASE 0x33381D00 +#define AX3005_UART6_BASE 0x33381E00 +#define AX3005_UART7_BASE 0x33381F00 +#define AX3005_UART8_BASE 0x330C0000 + +#define AX3005_SDHCI0_BASE 0x46000000 +#define AX3005_EMMC_PHY_BASE 0x33301C00 + +#define AX3005_GPIO0_BASE 0x33000000 +#define AX3005_GPIO1_BASE 0x33080000 +#define AX3005_GPIO2_BASE 0x33100000 +#define AX3005_GPIO3_BASE 0x33180000 +#define AX3005_GPIO4_BASE 0x33200000 +#define AX3005_GPIO5_BASE 0x33280000 +#define AX3005_GPIO6_BASE 0x33300000 +#define AX3005_GPIO7_BASE 0x33380000 + +#define AX3005_TIMER_CTRL 0x48016000 + +enum Ax3005Configuration { + AX3005_NUM_CPUS = 4, + AX3005_NUM_IRQS = 224, + AX3005_NUM_UARTS = 9, + AX3005_NUM_GPIOS = 8, +}; + +typedef struct Ax3005SoCState { + SysBusDevice parent; + + ARMCPU cpu[AX3005_NUM_CPUS]; + GICv3State gic; + MemoryRegion dram; + CadenceUARTState uart[AX3005_NUM_UARTS]; + CadenceGPIOState gpio[AX3005_NUM_GPIOS]; + AxiadoSDHCIState sdhci0; +} Ax3005SoCState; + +typedef struct Ax3005SoCClass { + SysBusDeviceClass parent; + + uint32_t num_cpus; +} Ax3005SoCClass; + +enum Ax3005Irqs { + AX3005_UART0_IRQ = 112, + AX3005_UART1_IRQ = 113, + AX3005_UART2_IRQ = 114, + AX3005_UART3_IRQ = 170, + AX3005_UART4_IRQ = 208, + AX3005_UART5_IRQ = 209, + AX3005_UART6_IRQ = 210, + AX3005_UART7_IRQ = 211, + AX3005_UART8_IRQ = 212, + + AX3005_SDHCI0_IRQ = 123, + + AX3005_GPIO0_IRQ = 183, + AX3005_GPIO1_IRQ = 184, + AX3005_GPIO2_IRQ = 185, + AX3005_GPIO3_IRQ = 186, + AX3005_GPIO4_IRQ = 187, + AX3005_GPIO5_IRQ = 188, + AX3005_GPIO6_IRQ = 189, + AX3005_GPIO7_IRQ = 190, +}; + +#endif /* AXIADO_AX3005_H */ -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v1 4/5] hw/arm: Add Axiado SoC AX3005 2026-08-20 10:21 ` [PATCH v1 4/5] hw/arm: Add Axiado SoC AX3005 Kuan-Jui Chiu @ 2026-08-23 10:33 ` Jack Wang 2026-08-24 1:50 ` Kuan-Jui Chiu 0 siblings, 1 reply; 9+ messages in thread From: Jack Wang @ 2026-08-23 10:33 UTC (permalink / raw) To: kchiu; +Cc: qemu-devel, peter.maydell, Kuan-Jui Chiu Hi Kuan-Jui I tested this series with ax3005-evb machine,the initialization did not complete. The process showed it repeatedly executing in 'ax3005_init' > +static const TypeInfo ax3005_soc_types[] = { > + { > + .name = TYPE_AX3005_SOC, > + .parent = TYPE_SYS_BUS_DEVICE, > + .instance_size = sizeof(Ax3005SoCState), > + .instance_init = ax3005_init, > + .class_init = ax3005_class_init, > + } > +}; You add instance_size here but forget to add class_size. Then qemu defaultly use SysBusDeviceClass’s class_size cause of father-son relationship. > +typedef struct Ax3005SoCClass { > + SysBusDeviceClass parent; > + > + uint32_t num_cpus; > +} Ax3005SoCClass; Here your struct apparently extend SysBusDeviceClass field. I think it is the way why previous repeating behavior.After add class_size locally and rebuild the the machine completed initialization and responded to QMP commands successfully. Best regards :) Jack Wang ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 4/5] hw/arm: Add Axiado SoC AX3005 2026-08-23 10:33 ` Jack Wang @ 2026-08-24 1:50 ` Kuan-Jui Chiu 2026-08-24 12:07 ` Jack Wang 0 siblings, 1 reply; 9+ messages in thread From: Kuan-Jui Chiu @ 2026-08-24 1:50 UTC (permalink / raw) To: Jack Wang; +Cc: qemu-devel, peter.maydell Hi Jack Thanks for the test, could you share how you built and what the command was you used to test? I did not see this issue on my side, maybe I missed something B.R. Howard Jack Wang 於 2026/8/23 下午 06:33 寫道: > CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe. > > > Hi Kuan-Jui > > I tested this series with ax3005-evb machine,the initialization did not complete. > The process showed it repeatedly executing in 'ax3005_init' >> +static const TypeInfo ax3005_soc_types[] = { >> + { >> + .name = TYPE_AX3005_SOC, >> + .parent = TYPE_SYS_BUS_DEVICE, >> + .instance_size = sizeof(Ax3005SoCState), >> + .instance_init = ax3005_init, >> + .class_init = ax3005_class_init, >> + } >> +}; > You add instance_size here but forget to add class_size. Then qemu defaultly use SysBusDeviceClass’s class_size cause of father-son relationship. > >> +typedef struct Ax3005SoCClass { >> + SysBusDeviceClass parent; >> + >> + uint32_t num_cpus; >> +} Ax3005SoCClass; > Here your struct apparently extend SysBusDeviceClass field. I think it is the way why previous repeating behavior.After add class_size locally and rebuild the the machine completed initialization and responded to QMP commands successfully. > > Best regards :) > Jack Wang ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 4/5] hw/arm: Add Axiado SoC AX3005 2026-08-24 1:50 ` Kuan-Jui Chiu @ 2026-08-24 12:07 ` Jack Wang 0 siblings, 0 replies; 9+ messages in thread From: Jack Wang @ 2026-08-24 12:07 UTC (permalink / raw) To: kchiu; +Cc: qemu-devel, peter.maydell, qemu-arm [-- Attachment #1: Type: text/plain, Size: 2621 bytes --] Hi Kuan_Jui Sorry that my previous message was not clear enough.The build is not hang,but the machine initialization did not return of ax3005-evb. This is the reason why I said 'initialization did not complete’. If you want to reproduce the mistake,commands below will help you ../qemu/configure --target-list=aarch64-softmmu --enable-debug --enable-werror --disable-rust ninja qemu-system-aarch64 After the build completes, start the emulator with: printf '%s\n''{"execute":"qmp_capabilities"}' '{"execute":"query-status"}' '{"execute":"query-memory-size-summary”}'{"execute":"quit”}’ | build/qemu-system-aarch64 -M ax3005-evb -m 2G -display none -serial none -qmp stdio -S QEMU printed the QMP greeting, but no response to the`qmp_capabilities` command was received. The process did not complete machine initialization and remained in the initialization path around `ax3005_init()` And i noticed that you deliver new version. Cheer for this,maybe we could discuss more in new series. Best regards : ) Jack Wang > On Mon, 24 Aug 2026 09:50:09 +0800, Kuan-Jui Chiu <kchiu@axiado.com> wrote: > Hi Jack > > Thanks for the test, could you share how you built and what the command > was you used to test? > > I did not see this issue on my side, maybe I missed something > > B.R. > Howard > > Jack Wang 於 2026/8/23 下午 06:33 寫道: > > >> On Sun, 23 Aug 2026 18:33:01 +0800, Jack Wang <163wangjack@gmail.com <mailto:163wangjack@gmail.com>> wrote: >> Hi Kuan-Jui >> >> I tested this series with ax3005-evb machine,the initialization did not complete. >> The process showed it repeatedly executing in 'ax3005_init' >> >>> +static const TypeInfo ax3005_soc_types[] = { >>> + { >>> + .name = TYPE_AX3005_SOC, >>> + .parent = TYPE_SYS_BUS_DEVICE, >>> + .instance_size = sizeof(Ax3005SoCState), >>> + .instance_init = ax3005_init, >>> + .class_init = ax3005_class_init, >>> + } >>> +}; >> >> You add instance_size here but forget to add class_size. Then qemu defaultly use SysBusDeviceClass’s class_size cause of father-son relationship. >> >>> +typedef struct Ax3005SoCClass { >>> + SysBusDeviceClass parent; >>> + >>> + uint32_t num_cpus; >>> +} Ax3005SoCClass; >> >> Here your struct apparently extend SysBusDeviceClass field. I think it is the way why previous repeating behavior.After add class_size locally and rebuild the the machine completed initialization and responded to QMP commands successfully. >> >> Best regards :) >> Jack Wang [-- Attachment #2: Type: text/html, Size: 17116 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v1 5/5] hw/arm: Add Axiado Ax3005 EVB 2026-08-20 10:21 [PATCH v1 0/5] Add Axiado SoC AX3005 and EVB Kuan-Jui Chiu ` (3 preceding siblings ...) 2026-08-20 10:21 ` [PATCH v1 4/5] hw/arm: Add Axiado SoC AX3005 Kuan-Jui Chiu @ 2026-08-20 10:21 ` Kuan-Jui Chiu 4 siblings, 0 replies; 9+ messages in thread From: Kuan-Jui Chiu @ 2026-08-20 10:21 UTC (permalink / raw) To: qemu-devel, peter.maydell; +Cc: Kuan-Jui Chiu Add EVK ax3005-evb built with AX3005 SoC Signed-off-by: Kuan-Jui Chiu <kchiu@axiado.com> --- hw/arm/ax3005-evk.c | 55 ++++++++++++++++++++++++++++++++++ hw/arm/meson.build | 3 +- include/hw/arm/axiado-boards.h | 10 +++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 hw/arm/ax3005-evk.c diff --git a/hw/arm/ax3005-evk.c b/hw/arm/ax3005-evk.c new file mode 100644 index 0000000000..0b7ad17d24 --- /dev/null +++ b/hw/arm/ax3005-evk.c @@ -0,0 +1,55 @@ +/* + * Axiado Ax3005 Evaluation Kit Emulation + * + * Author: Kuan-Jui Chiu <kchiu@axiado.com> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "hw/arm/axiado-boards.h" +#include "hw/arm/boot.h" +#include "hw/arm/machines-qom.h" +#include "qemu/error-report.h" +#include "qom/object.h" + +static struct arm_boot_info ax3005_binfo = { + .loader_start = AX3005_DRAM_BASE, + .board_id = -1, +}; + +static void ax3005_evb_machine_init(MachineState *machine) +{ + Ax3005MachineState *ams = AX3005_MACHINE(machine); + + ams->soc = AX3005_SOC(object_new(TYPE_AX3005_SOC)); + object_property_add_child(OBJECT(machine), "soc", OBJECT(ams->soc)); + sysbus_realize_and_unref(SYS_BUS_DEVICE(ams->soc), &error_fatal); + + ax3005_binfo.ram_size = machine->ram_size; + arm_load_kernel(&ams->soc->cpu[0], machine, &ax3005_binfo); +} + +static void ax3005_evb_class_init(ObjectClass *oc, const void *data) +{ + MachineClass *mc = MACHINE_CLASS(oc); + + mc->desc = "Axiado AX3005 Evaluation Board"; + mc->init = ax3005_evb_machine_init; + mc->default_cpus = AX3005_NUM_CPUS; + mc->min_cpus = AX3005_NUM_CPUS; + mc->max_cpus = AX3005_NUM_CPUS; + mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"); +} + +static const TypeInfo ax3005_evk_types[] = { + { + .name = TYPE_AX3005_MACHINE, + .parent = TYPE_MACHINE, + .instance_size = sizeof(Ax3005MachineState), + .class_init = ax3005_evb_class_init, + .interfaces = aarch64_machine_interfaces, + } +}; + +DEFINE_TYPES(ax3005_evk_types) diff --git a/hw/arm/meson.build b/hw/arm/meson.build index 9fceb8d2e7..8d9c602b88 100644 --- a/hw/arm/meson.build +++ b/hw/arm/meson.build @@ -115,7 +115,8 @@ arm_common_ss.add(when: ['CONFIG_AXIADO_SOC', 'TARGET_AARCH64'], if_true: files( 'ax3005-soc.c')) arm_common_ss.add(when: ['CONFIG_AXIADO_EVK', 'TARGET_AARCH64'], if_true: files( 'ax3000-boards.c', - 'ax3000-evk.c')) + 'ax3000-evk.c', + 'ax3005-evk.c')) arm_common_ss.add(files('boot.c')) diff --git a/include/hw/arm/axiado-boards.h b/include/hw/arm/axiado-boards.h index 4a632661e1..7a610ecfda 100644 --- a/include/hw/arm/axiado-boards.h +++ b/include/hw/arm/axiado-boards.h @@ -11,6 +11,7 @@ #include "hw/core/boards.h" #include "hw/arm/ax3000-soc.h" +#include "hw/arm/ax3005-soc.h" #define TYPE_AX3000_MACHINE MACHINE_TYPE_NAME("ax3000") OBJECT_DECLARE_TYPE(Ax3000MachineState, Ax3000MachineClass, AX3000_MACHINE) @@ -25,4 +26,13 @@ typedef struct Ax3000MachineClass { MachineClass parent; } Ax3000MachineClass; + +#define TYPE_AX3005_MACHINE MACHINE_TYPE_NAME("ax3005-evb") +OBJECT_DECLARE_SIMPLE_TYPE(Ax3005MachineState, AX3005_MACHINE) + +struct Ax3005MachineState { + MachineState parent; + + Ax3005SoCState *soc; +}; #endif -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-08-24 12:07 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-08-20 10:21 [PATCH v1 0/5] Add Axiado SoC AX3005 and EVB Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 1/5] hw/sd/axiado_sdhci: Add header guard Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 2/5] hw/arm: Rename ax3000-boards as axiado-boards Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 3/5] hw/arm/ax3000: Specify SoC name in header and variable Kuan-Jui Chiu 2026-08-20 10:21 ` [PATCH v1 4/5] hw/arm: Add Axiado SoC AX3005 Kuan-Jui Chiu 2026-08-23 10:33 ` Jack Wang 2026-08-24 1:50 ` Kuan-Jui Chiu 2026-08-24 12:07 ` Jack Wang 2026-08-20 10:21 ` [PATCH v1 5/5] hw/arm: Add Axiado Ax3005 EVB Kuan-Jui Chiu
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.