On Tue, Jun 16, 2026 at 6:41 AM Daniel Henrique Barboza
<[email protected]> wrote:
>
> Consolidate the '/cpus' FDT root node creation into a single place.
>
> Signed-off-by: Daniel Henrique Barboza <[email protected]>

Reviewed-by: Alistair Francis <[email protected]>

Alistair

> ---
>  hw/riscv/fdt-common.c         | 10 ++++++++++
>  hw/riscv/sifive_u.c           |  7 +------
>  hw/riscv/spike.c              |  7 +------
>  hw/riscv/virt.c               | 11 +++--------
>  include/hw/riscv/fdt-common.h |  1 +
>  5 files changed, 16 insertions(+), 20 deletions(-)
>
> diff --git a/hw/riscv/fdt-common.c b/hw/riscv/fdt-common.c
> index d2661ec389..02ac9ddcd8 100644
> --- a/hw/riscv/fdt-common.c
> +++ b/hw/riscv/fdt-common.c
> @@ -83,3 +83,13 @@ void create_fdt_socket_clint(void *fdt, hwaddr addr, 
> uint64_t size,
>          qemu_fdt_setprop_cell(fdt, clint_name, "numa-node-id", socket_id);
>      }
>  }
> +
> +void fdt_create_cpu_socket_subnode(void *fdt, uint64_t timebase_frequency)
> +{
> +    qemu_fdt_add_subnode(fdt, "/cpus");
> +    qemu_fdt_setprop_cell(fdt, "/cpus", "timebase-frequency",
> +                          timebase_frequency);
> +    qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
> +    qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
> +    qemu_fdt_add_subnode(fdt, "/cpus/cpu-map");
> +}
> diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
> index a4265fed0f..27c1a74d99 100644
> --- a/hw/riscv/sifive_u.c
> +++ b/hw/riscv/sifive_u.c
> @@ -139,12 +139,7 @@ static void create_fdt(SiFiveUState *s, const 
> MemMapEntry *memmap,
>      create_fdt_socket_memory(fdt, memmap[SIFIVE_U_DEV_DRAM].base,
>                               ms->ram_size, 0, false);
>
> -    qemu_fdt_add_subnode(fdt, "/cpus");
> -    qemu_fdt_setprop_cell(fdt, "/cpus", "timebase-frequency",
> -        CLINT_TIMEBASE_FREQ);
> -    qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
> -    qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
> -    qemu_fdt_add_subnode(fdt, "/cpus/cpu-map");
> +    fdt_create_cpu_socket_subnode(fdt, CLINT_TIMEBASE_FREQ);
>
>      clust_name = g_strdup_printf("/cpus/cpu-map/cluster%d", 0);
>      qemu_fdt_add_subnode(fdt, clust_name);
> diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
> index b15188fb07..ee8232f734 100644
> --- a/hw/riscv/spike.c
> +++ b/hw/riscv/spike.c
> @@ -73,12 +73,7 @@ static void create_fdt(SpikeState *s, const MemMapEntry 
> *memmap,
>              0x0, memmap[SPIKE_HTIF].base, 0x0, memmap[SPIKE_HTIF].size);
>      }
>
> -    qemu_fdt_add_subnode(fdt, "/cpus");
> -    qemu_fdt_setprop_cell(fdt, "/cpus", "timebase-frequency",
> -        RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ);
> -    qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0);
> -    qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1);
> -    qemu_fdt_add_subnode(fdt, "/cpus/cpu-map");
> +    fdt_create_cpu_socket_subnode(fdt, RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ);
>
>      for (socket = (riscv_socket_count(ms) - 1); socket >= 0; socket--) {
>          g_autofree uint32_t *intc_phandles = g_new0(uint32_t,
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index b134f11266..6641b60131 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -694,14 +694,9 @@ static void create_fdt_sockets(RISCVVirtState *s,
>      int socket_count = riscv_socket_count(ms);
>      bool numa_enabled = riscv_numa_enabled(ms);
>
> -    qemu_fdt_add_subnode(ms->fdt, "/cpus");
> -    qemu_fdt_setprop_cell(ms->fdt, "/cpus", "timebase-frequency",
> -                          kvm_enabled() ?
> -                          
> kvm_riscv_get_timebase_frequency(&s->soc->harts[0]) :
> -                          RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ);
> -    qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0);
> -    qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
> -    qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
> +    fdt_create_cpu_socket_subnode(ms->fdt,
> +        kvm_enabled() ? kvm_riscv_get_timebase_frequency(&s->soc->harts[0]) :
> +                        RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ);
>
>      intc_phandles = g_new0(uint32_t, ms->smp.cpus);
>
> diff --git a/include/hw/riscv/fdt-common.h b/include/hw/riscv/fdt-common.h
> index 6e81d6cd6c..27020e69c6 100644
> --- a/include/hw/riscv/fdt-common.h
> +++ b/include/hw/riscv/fdt-common.h
> @@ -18,4 +18,5 @@ void create_fdt_clint(void *fdt, hwaddr addr, uint64_t size,
>  void create_fdt_socket_clint(void *fdt, hwaddr addr, uint64_t size,
>                               int socket_id, uint32_t *intc_phandles,
>                               int num_harts, bool numa_enabled);
> +void fdt_create_cpu_socket_subnode(void *fdt, uint64_t timebase_frequency);
>  #endif
> --
> 2.43.0
>
>

Reply via email to