@samitouri / QOSamiQemu / commits / 3fac79db3f

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 <daniel.barboza@oss.qualcomm.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20260615203734.954428-6-daniel.barboza@oss.qualcomm.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Daniel Henrique Barboza committed Jun 15, 2026 at 17:37 UTC 3fac79db3fed0188e56d19d8de55428d617bfbd7
1 file changed +6 -7
hw/riscv/sifive_u.c
+6 -7
@@ -111,6 +111,7 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
111 static const char * const plic_compat[2] = {
112 "sifive,plic-1.0.0", "riscv,plic0"
113 };
114 + g_autofree uint32_t *intc_phandles = g_new0(uint32_t, ms->smp.cpus);
115
116 fdt = ms->fdt = create_board_device_tree("SiFive HiFive Unleashed A00",
117 "sifive,hifive-unleashed-a00", &s->fdt_size);
@@ -168,8 +169,10 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
169 qemu_fdt_setprop_string(fdt, nodename, "device_type", "cpu");
170 qemu_fdt_setprop_cell(fdt, nodename, "phandle", cpu_phandle);
171
172 + intc_phandles[cpu] = phandle++;
173 +
174 qemu_fdt_add_subnode(fdt, intc);
172 - qemu_fdt_setprop_cell(fdt, intc, "phandle", phandle++);
175 + qemu_fdt_setprop_cell(fdt, intc, "phandle", intc_phandles[cpu]);
176 qemu_fdt_setprop_string(fdt, intc, "compatible", "riscv,cpu-intc");
177 qemu_fdt_setprop(fdt, intc, "interrupt-controller", NULL, 0);
178 qemu_fdt_setprop_cell(fdt, intc, "#interrupt-cells", 1);
@@ -179,14 +182,10 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
182
183 cells = g_new0(uint32_t, ms->smp.cpus * 4);
184 for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
182 - nodename =
183 - g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu);
184 - uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename);
185 - cells[cpu * 4 + 0] = cpu_to_be32(intc_phandle);
185 + cells[cpu * 4 + 0] = cpu_to_be32(intc_phandles[cpu]);
186 cells[cpu * 4 + 1] = cpu_to_be32(IRQ_M_SOFT);
187 - cells[cpu * 4 + 2] = cpu_to_be32(intc_phandle);
187 + cells[cpu * 4 + 2] = cpu_to_be32(intc_phandles[cpu]);
188 cells[cpu * 4 + 3] = cpu_to_be32(IRQ_M_TIMER);
189 - g_free(nodename);
189 }
190 nodename = g_strdup_printf("/soc/clint@%lx",
191 (long)memmap[SIFIVE_U_DEV_CLINT].base);