hw/riscv: virt: Fix interrupt parent for dynamic platform devices
When both APLIC and IMSIC are present in virt machine, the APLIC should
be used as parent interrupt controller for dynamic platform devices.
In case of multiple sockets, we should prefer interrupt controller of
socket0 for dynamic platform devices.
Fixes: 3029fab643
("hw/riscv: virt: Add support for generating
platform FDT entries")
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-Id: <20220511144528.393530-9-apatel@ventanamicro.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
62cf02451e
commit
d644e5e44f
@ -478,10 +478,12 @@ static void create_fdt_socket_plic(RISCVVirtState *s,
|
|||||||
qemu_fdt_setprop_cell(mc->fdt, plic_name, "phandle",
|
qemu_fdt_setprop_cell(mc->fdt, plic_name, "phandle",
|
||||||
plic_phandles[socket]);
|
plic_phandles[socket]);
|
||||||
|
|
||||||
|
if (!socket) {
|
||||||
platform_bus_add_all_fdt_nodes(mc->fdt, plic_name,
|
platform_bus_add_all_fdt_nodes(mc->fdt, plic_name,
|
||||||
memmap[VIRT_PLATFORM_BUS].base,
|
memmap[VIRT_PLATFORM_BUS].base,
|
||||||
memmap[VIRT_PLATFORM_BUS].size,
|
memmap[VIRT_PLATFORM_BUS].size,
|
||||||
VIRT_PLATFORM_BUS_IRQ);
|
VIRT_PLATFORM_BUS_IRQ);
|
||||||
|
}
|
||||||
|
|
||||||
g_free(plic_name);
|
g_free(plic_name);
|
||||||
|
|
||||||
@ -561,11 +563,6 @@ static void create_fdt_imsic(RISCVVirtState *s, const MemMapEntry *memmap,
|
|||||||
}
|
}
|
||||||
qemu_fdt_setprop_cell(mc->fdt, imsic_name, "phandle", *msi_m_phandle);
|
qemu_fdt_setprop_cell(mc->fdt, imsic_name, "phandle", *msi_m_phandle);
|
||||||
|
|
||||||
platform_bus_add_all_fdt_nodes(mc->fdt, imsic_name,
|
|
||||||
memmap[VIRT_PLATFORM_BUS].base,
|
|
||||||
memmap[VIRT_PLATFORM_BUS].size,
|
|
||||||
VIRT_PLATFORM_BUS_IRQ);
|
|
||||||
|
|
||||||
g_free(imsic_name);
|
g_free(imsic_name);
|
||||||
|
|
||||||
/* S-level IMSIC node */
|
/* S-level IMSIC node */
|
||||||
@ -704,10 +701,12 @@ static void create_fdt_socket_aplic(RISCVVirtState *s,
|
|||||||
riscv_socket_fdt_write_id(mc, mc->fdt, aplic_name, socket);
|
riscv_socket_fdt_write_id(mc, mc->fdt, aplic_name, socket);
|
||||||
qemu_fdt_setprop_cell(mc->fdt, aplic_name, "phandle", aplic_s_phandle);
|
qemu_fdt_setprop_cell(mc->fdt, aplic_name, "phandle", aplic_s_phandle);
|
||||||
|
|
||||||
|
if (!socket) {
|
||||||
platform_bus_add_all_fdt_nodes(mc->fdt, aplic_name,
|
platform_bus_add_all_fdt_nodes(mc->fdt, aplic_name,
|
||||||
memmap[VIRT_PLATFORM_BUS].base,
|
memmap[VIRT_PLATFORM_BUS].base,
|
||||||
memmap[VIRT_PLATFORM_BUS].size,
|
memmap[VIRT_PLATFORM_BUS].size,
|
||||||
VIRT_PLATFORM_BUS_IRQ);
|
VIRT_PLATFORM_BUS_IRQ);
|
||||||
|
}
|
||||||
|
|
||||||
g_free(aplic_name);
|
g_free(aplic_name);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user