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