On Thu, May 12, 2022 at 12:53 AM Anup Patel <apa...@ventanamicro.com> wrote: > > 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: 3029fab64309 ("hw/riscv: virt: Add support for generating > platform FDT entries") > Signed-off-by: Anup Patel <apa...@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > hw/riscv/virt.c | 25 ++++++++++++------------- > 1 file changed, 12 insertions(+), 13 deletions(-) > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index 3326f4db96..c576173815 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -478,10 +478,12 @@ static void create_fdt_socket_plic(RISCVVirtState *s, > qemu_fdt_setprop_cell(mc->fdt, plic_name, "phandle", > plic_phandles[socket]); > > - platform_bus_add_all_fdt_nodes(mc->fdt, plic_name, > - memmap[VIRT_PLATFORM_BUS].base, > - memmap[VIRT_PLATFORM_BUS].size, > - VIRT_PLATFORM_BUS_IRQ); > + if (!socket) { > + platform_bus_add_all_fdt_nodes(mc->fdt, plic_name, > + memmap[VIRT_PLATFORM_BUS].base, > + memmap[VIRT_PLATFORM_BUS].size, > + VIRT_PLATFORM_BUS_IRQ); > + } > > 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); > > - 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); > > /* 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); > qemu_fdt_setprop_cell(mc->fdt, aplic_name, "phandle", aplic_s_phandle); > > - platform_bus_add_all_fdt_nodes(mc->fdt, aplic_name, > - memmap[VIRT_PLATFORM_BUS].base, > - memmap[VIRT_PLATFORM_BUS].size, > - VIRT_PLATFORM_BUS_IRQ); > + if (!socket) { > + platform_bus_add_all_fdt_nodes(mc->fdt, aplic_name, > + memmap[VIRT_PLATFORM_BUS].base, > + memmap[VIRT_PLATFORM_BUS].size, > + VIRT_PLATFORM_BUS_IRQ); > + } > > g_free(aplic_name); > > -- > 2.34.1 > >