Commit 7cc146d825 for qemu.org
commit 7cc146d825536a4a52e3873d138ca3c04dc81944
Author: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>
Date: Mon Jun 15 17:37:24 2026 -0300
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>
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