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