Commit 1eb3c11b39 for qemu.org
commit 1eb3c11b39ce82ba36af09147500a08b44ed74cb
Author: Joel Stanley <joel@jms.id.au>
Date: Thu Sep 3 15:21:15 2026 +0930
hw/riscv/aia: Take a MemoryRegion for the created devices
Add a MemoryRegion parameter to riscv_create_aia(), to be passed on to
the IMSIC and APLIC helpers so a SoC can have the controllers mapped
into its own memory container. Both callers pass system_memory, so there
is no change in behaviour.
As the controllers don't yet take a MemoryRegion the parameter is not
yet passed on. Changing riscv_create_aia first avoids churn in the
intermediate commits.
Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Signed-off-by: Joel Stanley <joel@jms.id.au>
Reviewed-by: Chao Liu <chao.liu@processmission.com>
Message-ID: <20260903055131.257903-2-joel@jms.id.au>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
diff --git a/hw/riscv/aia.c b/hw/riscv/aia.c
index c1a5982856..e11382e512 100644
--- a/hw/riscv/aia.c
+++ b/hw/riscv/aia.c
@@ -24,7 +24,8 @@ uint32_t imsic_num_bits(uint32_t count)
return ret;
}
-DeviceState *riscv_create_aia(bool msimode, int aia_guests,
+DeviceState *riscv_create_aia(MemoryRegion *container,
+ bool msimode, int aia_guests,
uint32_t m_imsic_stride,
uint32_t s_imsic_stride,
uint16_t num_sources,
diff --git a/hw/riscv/aia.h b/hw/riscv/aia.h
index 3b6d7f9625..5df3292610 100644
--- a/hw/riscv/aia.h
+++ b/hw/riscv/aia.h
@@ -13,7 +13,8 @@
uint32_t imsic_num_bits(uint32_t count);
-DeviceState *riscv_create_aia(bool msimode, int aia_guests,
+DeviceState *riscv_create_aia(MemoryRegion *container,
+ bool msimode, int aia_guests,
uint32_t m_imsic_stride,
uint32_t s_imsic_stride,
uint16_t num_sources,
diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c
index db8a1805d7..e40aacbb6c 100644
--- a/hw/riscv/tt_atlantis.c
+++ b/hw/riscv/tt_atlantis.c
@@ -497,7 +497,8 @@ static void tt_atlantis_machine_init(MachineState *machine)
&error_abort);
sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_fatal);
- s->irqchip = riscv_create_aia(true, TT_IMSIC_GUESTS,
+ s->irqchip = riscv_create_aia(system_memory,
+ true, TT_IMSIC_GUESTS,
TT_IMSIC_STRIDE,
TT_IMSIC_STRIDE,
TT_IRQCHIP_NUM_SOURCES,
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index a72f1a6e4c..def46c1ec6 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -808,8 +808,9 @@ static void virt_machine_init(MachineState *machine)
s->irqchip[i] = virt_create_plic(s->memmap, i,
base_hartid, hart_count);
} else {
+ bool msimode = s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC;
int imsic_bits = imsic_num_bits(s->aia_guests + 1);
- s->irqchip[i] = riscv_create_aia(s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC,
+ s->irqchip[i] = riscv_create_aia(system_memory, msimode,
s->aia_guests,
IMSIC_HART_SIZE(0),
IMSIC_HART_SIZE(imsic_bits),