@samitouri / QOSamiQemu / commits / 7cc146d825

hw/riscv: add create_fdt_socket_memory() helper

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 <daniel.barboza@oss.qualcomm.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20260615203734.954428-5-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 7cc146d825536a4a52e3873d138ca3c04dc81944
5 files changed +32 -37
hw/riscv/fdt-common.c
+15
@@ -10,6 +10,7 @@
10
11 #include "qemu/error-report.h"
12 #include "system/device_tree.h"
13 +#include "hw/core/boards.h"
14 #include "hw/riscv/fdt-common.h"
15
16 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,
36
37 return fdt;
38 }
39 +
40 +void create_fdt_socket_memory(void *fdt, hwaddr addr, uint64_t size,
41 + int socket_id, bool numa_enabled)
42 +{
43 + g_autofree char *mem_name = g_strdup_printf("/memory@%"HWADDR_PRIx, addr);
44 +
45 + qemu_fdt_add_subnode(fdt, mem_name);
46 + qemu_fdt_setprop_sized_cells(fdt, mem_name, "reg", 2, addr, 2, size);
47 + qemu_fdt_setprop_string(fdt, mem_name, "device_type", "memory");
48 +
49 + if (numa_enabled) {
50 + qemu_fdt_setprop_cell(fdt, mem_name, "numa-node-id", socket_id);
51 + }
52 +}
hw/riscv/sifive_u.c
+2 -9
@@ -98,7 +98,6 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
98 bool is_32_bit)
99 {
100 MachineState *ms = MACHINE(s);
101 - uint64_t mem_size = ms->ram_size;
101 void *fdt;
102 int cpu;
103 uint32_t *cells;
@@ -138,14 +137,8 @@ static void create_fdt(SiFiveUState *s, const MemMapEntry *memmap,
137 qemu_fdt_setprop_cell(fdt, nodename, "#clock-cells", 0x0);
138 g_free(nodename);
139
141 - nodename = g_strdup_printf("/memory@%lx",
142 - (long)memmap[SIFIVE_U_DEV_DRAM].base);
143 - qemu_fdt_add_subnode(fdt, nodename);
144 - qemu_fdt_setprop_cells(fdt, nodename, "reg",
145 - memmap[SIFIVE_U_DEV_DRAM].base >> 32, memmap[SIFIVE_U_DEV_DRAM].base,
146 - mem_size >> 32, mem_size);
147 - qemu_fdt_setprop_string(fdt, nodename, "device_type", "memory");
148 - g_free(nodename);
140 + create_fdt_socket_memory(fdt, memmap[SIFIVE_U_DEV_DRAM].base,
141 + ms->ram_size, 0, false);
142
143 qemu_fdt_add_subnode(fdt, "/cpus");
144 qemu_fdt_setprop_cell(fdt, "/cpus", "timebase-frequency",
hw/riscv/spike.c
+7 -11
@@ -55,13 +55,12 @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
55 {
56 void *fdt;
57 int fdt_size;
58 - uint64_t addr, size;
58 unsigned long clint_addr;
59 int cpu, socket;
60 MachineState *ms = MACHINE(s);
61 uint32_t *clint_cells;
62 uint32_t cpu_phandle, intc_phandle, phandle = 1;
64 - char *mem_name, *clint_name, *clust_name;
63 + char *clint_name, *clust_name;
64 char *core_name, *cpu_name, *intc_name;
65 static const char * const clint_compat[2] = {
66 "sifive,clint0", "riscv,clint0"
@@ -85,6 +84,10 @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
84 qemu_fdt_add_subnode(fdt, "/cpus/cpu-map");
85
86 for (socket = (riscv_socket_count(ms) - 1); socket >= 0; socket--) {
87 + hwaddr memaddr = memmap[SPIKE_DRAM].base +
88 + riscv_socket_mem_offset(ms, socket);
89 + uint64_t memsize = riscv_socket_mem_size(ms, socket);
90 +
91 clust_name = g_strdup_printf("/cpus/cpu-map/cluster%d", socket);
92 qemu_fdt_add_subnode(fdt, clust_name);
93
@@ -133,15 +136,8 @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
136 g_free(cpu_name);
137 }
138
136 - addr = memmap[SPIKE_DRAM].base + riscv_socket_mem_offset(ms, socket);
137 - size = riscv_socket_mem_size(ms, socket);
138 - mem_name = g_strdup_printf("/memory@%lx", (long)addr);
139 - qemu_fdt_add_subnode(fdt, mem_name);
140 - qemu_fdt_setprop_cells(fdt, mem_name, "reg",
141 - addr >> 32, addr, size >> 32, size);
142 - qemu_fdt_setprop_string(fdt, mem_name, "device_type", "memory");
143 - riscv_socket_fdt_write_id(ms, mem_name, socket);
144 - g_free(mem_name);
139 + create_fdt_socket_memory(fdt, memaddr, memsize, socket,
140 + riscv_numa_enabled(ms));
141
142 clint_addr = memmap[SPIKE_CLINT].base +
143 (memmap[SPIKE_CLINT].size * socket);
hw/riscv/virt.c
+6 -17
@@ -302,22 +302,6 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket,
302 }
303 }
304
305 -static void create_fdt_socket_memory(RISCVVirtState *s, int socket)
306 -{
307 - g_autofree char *mem_name = NULL;
308 - hwaddr addr;
309 - uint64_t size;
310 - MachineState *ms = MACHINE(s);
311 -
312 - addr = s->memmap[VIRT_DRAM].base + riscv_socket_mem_offset(ms, socket);
313 - size = riscv_socket_mem_size(ms, socket);
314 - mem_name = g_strdup_printf("/memory@%"HWADDR_PRIx, addr);
315 - qemu_fdt_add_subnode(ms->fdt, mem_name);
316 - qemu_fdt_setprop_sized_cells(ms->fdt, mem_name, "reg", 2, addr, 2, size);
317 - qemu_fdt_setprop_string(ms->fdt, mem_name, "device_type", "memory");
318 - riscv_socket_fdt_write_id(ms, mem_name, socket);
319 -}
320 -
305 static void create_fdt_socket_clint(RISCVVirtState *s,
306 int socket,
307 uint32_t *intc_phandles)
@@ -759,6 +743,10 @@ static void create_fdt_sockets(RISCVVirtState *s,
743 phandle_pos = ms->smp.cpus;
744 for (socket = (socket_count - 1); socket >= 0; socket--) {
745 g_autofree char *clust_name = NULL;
746 + hwaddr memaddr = s->memmap[VIRT_DRAM].base +
747 + riscv_socket_mem_offset(ms, socket);
748 + uint64_t memsize = riscv_socket_mem_size(ms, socket);
749 +
750 phandle_pos -= s->soc[socket].num_harts;
751
752 clust_name = g_strdup_printf("/cpus/cpu-map/cluster%d", socket);
@@ -767,7 +755,8 @@ static void create_fdt_sockets(RISCVVirtState *s,
755 create_fdt_socket_cpus(s, socket, clust_name, phandle,
756 &intc_phandles[phandle_pos]);
757
770 - create_fdt_socket_memory(s, socket);
758 + create_fdt_socket_memory(ms->fdt, memaddr, memsize,
759 + socket, riscv_numa_enabled(ms));
760
761 if (virt_aclint_allowed() && s->have_aclint) {
762 create_fdt_socket_aclint(s, socket,
include/hw/riscv/fdt-common.h
+2
@@ -11,4 +11,6 @@
11
12 void *create_board_device_tree(const char *model, const char *compatible,
13 int *fdt_size);
14 +void create_fdt_socket_memory(void *fdt, hwaddr addr, uint64_t size,
15 + int socket_id, bool numa_enabled);
16 #endif