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