On Tue, Jun 16, 2026 at 6:39 AM Daniel Henrique Barboza
<[email protected]> wrote:
>
> This helper encapsulates the creation of /memory@addr FDT subnodes.
>
> Boards are responsible for calculating the adequate addr, size and
> inform if we have numa enabled.
>
> Signed-off-by: Daniel Henrique Barboza <[email protected]>

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

Alistair

> ---
>  hw/riscv/fdt-common.c         | 15 +++++++++++++++
>  hw/riscv/sifive_u.c           | 11 ++---------
>  hw/riscv/spike.c              | 18 +++++++-----------
>  hw/riscv/virt.c               | 23 ++++++-----------------
>  include/hw/riscv/fdt-common.h |  2 ++
>  5 files changed, 32 insertions(+), 37 deletions(-)
>
> diff --git a/hw/riscv/fdt-common.c b/hw/riscv/fdt-common.c
> index b155246998..719c36e001 100644
> --- a/hw/riscv/fdt-common.c
> +++ b/hw/riscv/fdt-common.c
> @@ -10,6 +10,7 @@
>
>  #include "qemu/error-report.h"
>  #include "system/device_tree.h"
> +#include "hw/core/boards.h"
>  #include "hw/riscv/fdt-common.h"
>
>  void *create_board_device_tree(const char *model, const char *compatible,
> @@ -35,3 +36,17 @@ void *create_board_device_tree(const char *model, const 
> char *compatible,
>
>      return fdt;
>  }
> +
> +void create_fdt_socket_memory(void *fdt, hwaddr addr, uint64_t size,
> +                              int socket_id, bool numa_enabled)
> +{
> +    g_autofree char *mem_name = g_strdup_printf("/memory@%"HWADDR_PRIx, 
> addr);
> +
> +    qemu_fdt_add_subnode(fdt, mem_name);
> +    qemu_fdt_setprop_sized_cells(fdt, mem_name, "reg", 2, addr, 2, size);
> +    qemu_fdt_setprop_string(fdt, mem_name, "device_type", "memory");
> +
> +    if (numa_enabled) {
> +        qemu_fdt_setprop_cell(fdt, mem_name, "numa-node-id", socket_id);
> +    }
> +}
> diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
> index 5d3b2751ad..a00cfd08a7 100644
> --- a/hw/riscv/sifive_u.c
> +++ b/hw/riscv/sifive_u.c
> @@ -98,7 +98,6 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry 
> *memmap,
>                         bool is_32_bit)
>  {
>      MachineState *ms = MACHINE(s);
> -    uint64_t mem_size = ms->ram_size;
>      void *fdt;
>      int cpu;
>      uint32_t *cells;
> @@ -138,14 +137,8 @@ static void create_fdt(SiFiveUState *s, const 
> MemMapEntry *memmap,
>      qemu_fdt_setprop_cell(fdt, nodename, "#clock-cells", 0x0);
>      g_free(nodename);
>
> -    nodename = g_strdup_printf("/memory@%lx",
> -        (long)memmap[SIFIVE_U_DEV_DRAM].base);
> -    qemu_fdt_add_subnode(fdt, nodename);
> -    qemu_fdt_setprop_cells(fdt, nodename, "reg",
> -        memmap[SIFIVE_U_DEV_DRAM].base >> 32, memmap[SIFIVE_U_DEV_DRAM].base,
> -        mem_size >> 32, mem_size);
> -    qemu_fdt_setprop_string(fdt, nodename, "device_type", "memory");
> -    g_free(nodename);
> +    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",
> diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
> index 79c9bb041f..92facba29d 100644
> --- a/hw/riscv/spike.c
> +++ b/hw/riscv/spike.c
> @@ -55,13 +55,12 @@ static void create_fdt(SpikeState *s, const MemMapEntry 
> *memmap,
>  {
>      void *fdt;
>      int fdt_size;
> -    uint64_t addr, size;
>      unsigned long clint_addr;
>      int cpu, socket;
>      MachineState *ms = MACHINE(s);
>      uint32_t *clint_cells;
>      uint32_t cpu_phandle, intc_phandle, phandle = 1;
> -    char *mem_name, *clint_name, *clust_name;
> +    char *clint_name, *clust_name;
>      char *core_name, *cpu_name, *intc_name;
>      static const char * const clint_compat[2] = {
>          "sifive,clint0", "riscv,clint0"
> @@ -85,6 +84,10 @@ static void create_fdt(SpikeState *s, const MemMapEntry 
> *memmap,
>      qemu_fdt_add_subnode(fdt, "/cpus/cpu-map");
>
>      for (socket = (riscv_socket_count(ms) - 1); socket >= 0; socket--) {
> +        hwaddr memaddr = memmap[SPIKE_DRAM].base +
> +                         riscv_socket_mem_offset(ms, socket);
> +        uint64_t memsize =  riscv_socket_mem_size(ms, socket);
> +
>          clust_name = g_strdup_printf("/cpus/cpu-map/cluster%d", socket);
>          qemu_fdt_add_subnode(fdt, clust_name);
>
> @@ -133,15 +136,8 @@ static void create_fdt(SpikeState *s, const MemMapEntry 
> *memmap,
>              g_free(cpu_name);
>          }
>
> -        addr = memmap[SPIKE_DRAM].base + riscv_socket_mem_offset(ms, socket);
> -        size = riscv_socket_mem_size(ms, socket);
> -        mem_name = g_strdup_printf("/memory@%lx", (long)addr);
> -        qemu_fdt_add_subnode(fdt, mem_name);
> -        qemu_fdt_setprop_cells(fdt, mem_name, "reg",
> -            addr >> 32, addr, size >> 32, size);
> -        qemu_fdt_setprop_string(fdt, mem_name, "device_type", "memory");
> -        riscv_socket_fdt_write_id(ms, mem_name, socket);
> -        g_free(mem_name);
> +        create_fdt_socket_memory(fdt, memaddr, memsize, socket,
> +                                 riscv_numa_enabled(ms));
>
>          clint_addr = memmap[SPIKE_CLINT].base +
>              (memmap[SPIKE_CLINT].size * socket);
> diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
> index cb1d83fd48..df3eadef78 100644
> --- a/hw/riscv/virt.c
> +++ b/hw/riscv/virt.c
> @@ -302,22 +302,6 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, 
> int socket,
>      }
>  }
>
> -static void create_fdt_socket_memory(RISCVVirtState *s, int socket)
> -{
> -    g_autofree char *mem_name = NULL;
> -    hwaddr addr;
> -    uint64_t size;
> -    MachineState *ms = MACHINE(s);
> -
> -    addr = s->memmap[VIRT_DRAM].base + riscv_socket_mem_offset(ms, socket);
> -    size = riscv_socket_mem_size(ms, socket);
> -    mem_name = g_strdup_printf("/memory@%"HWADDR_PRIx, addr);
> -    qemu_fdt_add_subnode(ms->fdt, mem_name);
> -    qemu_fdt_setprop_sized_cells(ms->fdt, mem_name, "reg", 2, addr, 2, size);
> -    qemu_fdt_setprop_string(ms->fdt, mem_name, "device_type", "memory");
> -    riscv_socket_fdt_write_id(ms, mem_name, socket);
> -}
> -
>  static void create_fdt_socket_clint(RISCVVirtState *s,
>                                      int socket,
>                                      uint32_t *intc_phandles)
> @@ -759,6 +743,10 @@ static void create_fdt_sockets(RISCVVirtState *s,
>      phandle_pos = ms->smp.cpus;
>      for (socket = (socket_count - 1); socket >= 0; socket--) {
>          g_autofree char *clust_name = NULL;
> +        hwaddr memaddr = s->memmap[VIRT_DRAM].base +
> +                         riscv_socket_mem_offset(ms, socket);
> +        uint64_t memsize = riscv_socket_mem_size(ms, socket);
> +
>          phandle_pos -= s->soc[socket].num_harts;
>
>          clust_name = g_strdup_printf("/cpus/cpu-map/cluster%d", socket);
> @@ -767,7 +755,8 @@ static void create_fdt_sockets(RISCVVirtState *s,
>          create_fdt_socket_cpus(s, socket, clust_name, phandle,
>                                 &intc_phandles[phandle_pos]);
>
> -        create_fdt_socket_memory(s, socket);
> +        create_fdt_socket_memory(ms->fdt, memaddr, memsize,
> +                                 socket, riscv_numa_enabled(ms));
>
>          if (virt_aclint_allowed() && s->have_aclint) {
>              create_fdt_socket_aclint(s, socket,
> diff --git a/include/hw/riscv/fdt-common.h b/include/hw/riscv/fdt-common.h
> index adf9b33dfd..81689f418b 100644
> --- a/include/hw/riscv/fdt-common.h
> +++ b/include/hw/riscv/fdt-common.h
> @@ -11,4 +11,6 @@
>
>  void *create_board_device_tree(const char *model, const char *compatible,
>                                 int *fdt_size);
> +void create_fdt_socket_memory(void *fdt, hwaddr addr, uint64_t size,
> +                              int socket_id, bool numa_enabled);
>  #endif
> --
> 2.43.0
>
>

Reply via email to