Message ID | 20220511144528.393530-9-apatel@ventanamicro.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | QEMU RISC-V nested virtualization fixes | expand |
On Thu, May 12, 2022 at 12:53 AM Anup Patel <apatel@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 <apatel@ventanamicro.com> Reviewed-by: Alistair Francis <alistair.francis@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 > >
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);
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 <apatel@ventanamicro.com> --- hw/riscv/virt.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-)