On Tue, Jun 16, 2026 at 6:38 AM Daniel Henrique Barboza <[email protected]> wrote: > > Store the intc phandles in an 'intc_phandles' array, like the 'virt' > board does, instead of re-creating the interrupt-controller FDT string > and using qemu_fdt_get_phandle() to fetch it. > > Signed-off-by: Daniel Henrique Barboza <[email protected]>
Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > hw/riscv/sifive_u.c | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c > index a00cfd08a7..ce86989bc8 100644 > --- a/hw/riscv/sifive_u.c > +++ b/hw/riscv/sifive_u.c > @@ -111,6 +111,7 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry > *memmap, > static const char * const plic_compat[2] = { > "sifive,plic-1.0.0", "riscv,plic0" > }; > + g_autofree uint32_t *intc_phandles = g_new0(uint32_t, ms->smp.cpus); > > fdt = ms->fdt = create_board_device_tree("SiFive HiFive Unleashed A00", > "sifive,hifive-unleashed-a00", &s->fdt_size); > @@ -168,8 +169,10 @@ static void create_fdt(SiFiveUState *s, const > MemMapEntry *memmap, > qemu_fdt_setprop_string(fdt, nodename, "device_type", "cpu"); > qemu_fdt_setprop_cell(fdt, nodename, "phandle", cpu_phandle); > > + intc_phandles[cpu] = phandle++; > + > qemu_fdt_add_subnode(fdt, intc); > - qemu_fdt_setprop_cell(fdt, intc, "phandle", phandle++); > + qemu_fdt_setprop_cell(fdt, intc, "phandle", intc_phandles[cpu]); > qemu_fdt_setprop_string(fdt, intc, "compatible", "riscv,cpu-intc"); > qemu_fdt_setprop(fdt, intc, "interrupt-controller", NULL, 0); > qemu_fdt_setprop_cell(fdt, intc, "#interrupt-cells", 1); > @@ -179,14 +182,10 @@ static void create_fdt(SiFiveUState *s, const > MemMapEntry *memmap, > > cells = g_new0(uint32_t, ms->smp.cpus * 4); > for (cpu = 0; cpu < ms->smp.cpus; cpu++) { > - nodename = > - g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu); > - uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename); > - cells[cpu * 4 + 0] = cpu_to_be32(intc_phandle); > + cells[cpu * 4 + 0] = cpu_to_be32(intc_phandles[cpu]); > cells[cpu * 4 + 1] = cpu_to_be32(IRQ_M_SOFT); > - cells[cpu * 4 + 2] = cpu_to_be32(intc_phandle); > + cells[cpu * 4 + 2] = cpu_to_be32(intc_phandles[cpu]); > cells[cpu * 4 + 3] = cpu_to_be32(IRQ_M_TIMER); > - g_free(nodename); > } > nodename = g_strdup_printf("/soc/clint@%lx", > (long)memmap[SIFIVE_U_DEV_CLINT].base); > -- > 2.43.0 > >
