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
>
>

Reply via email to