From: Shannon Zhao <shannon.z...@linaro.org> When specifying NUMA for ARM machine, generate /memory node according to NUMA topology.
Signed-off-by: Shannon Zhao <shannon.z...@linaro.org> --- hw/arm/boot.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/hw/arm/boot.c b/hw/arm/boot.c index 7742dd3..10f3615 100644 --- a/hw/arm/boot.c +++ b/hw/arm/boot.c @@ -13,6 +13,7 @@ #include "hw/arm/linux-boot-if.h" #include "sysemu/kvm.h" #include "sysemu/sysemu.h" +#include "sysemu/numa.h" #include "hw/boards.h" #include "hw/loader.h" #include "elf.h" @@ -353,6 +354,9 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo, void *fdt = NULL; int size, rc; uint32_t acells, scells; + char *nodename; + unsigned int i; + hwaddr mem_base, mem_len; if (binfo->dtb_filename) { char *filename; @@ -402,14 +406,37 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo, goto fail; } + mem_len = (nb_numa_nodes > 0) ? numa_info[0].node_mem : binfo->ram_size; rc = qemu_fdt_setprop_sized_cells(fdt, "/memory", "reg", acells, binfo->loader_start, - scells, binfo->ram_size); + scells, mem_len); if (rc < 0) { fprintf(stderr, "couldn't set /memory/reg\n"); goto fail; } + if (nb_numa_nodes > 0) { + /* create /memory node and set properties for other memory numa nodes */ + mem_base = binfo->loader_start + mem_len; + for (i = 1; i < nb_numa_nodes; i++) { + mem_len = numa_info[i].node_mem; + nodename = g_strdup_printf("/memory@%" PRIx64, mem_base); + qemu_fdt_add_subnode(fdt, nodename); + qemu_fdt_setprop_string(fdt, nodename, "device_type", "memory"); + rc = qemu_fdt_setprop_sized_cells(fdt, nodename, "reg", + acells, mem_base, + scells, mem_len); + if (rc < 0) { + fprintf(stderr, "couldn't set /memory/reg\n"); + goto fail; + } + + qemu_fdt_setprop_cell(fdt, nodename, "numa-node-id", i); + mem_base += mem_len; + g_free(nodename); + } + } + if (binfo->kernel_cmdline && *binfo->kernel_cmdline) { rc = qemu_fdt_setprop_string(fdt, "/chosen", "bootargs", binfo->kernel_cmdline); -- 2.0.4