From: Daniel Henrique Barboza Date: Mon, 15 Jun 2026 20:37:25 +0000 (-0300) Subject: hw/riscv/sifive_u.c: add intc_phandles array X-Git-Tag: v11.1.0-rc0~61^2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3fac79db3fed0188e56d19d8de55428d617bfbd7;p=thirdparty%2Fqemu.git hw/riscv/sifive_u.c: add intc_phandles array 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 Reviewed-by: Alistair Francis Message-ID: <20260615203734.954428-6-daniel.barboza@oss.qualcomm.com> Signed-off-by: Alistair Francis --- 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);