|
@@ -314,14 +314,9 @@ static void add_str(GString *s, const gchar *s1)
|
|
g_string_append_len(s, s1, strlen(s1) + 1);
|
|
g_string_append_len(s, s1, strlen(s1) + 1);
|
|
}
|
|
}
|
|
|
|
|
|
-static int spapr_dt_memory_node(void *fdt, int nodeid, hwaddr start,
|
|
|
|
- hwaddr size)
|
|
|
|
|
|
+static int spapr_dt_memory_node(SpaprMachineState *spapr, void *fdt, int nodeid,
|
|
|
|
+ hwaddr start, hwaddr size)
|
|
{
|
|
{
|
|
- uint32_t associativity[] = {
|
|
|
|
- cpu_to_be32(0x4), /* length */
|
|
|
|
- cpu_to_be32(0x0), cpu_to_be32(0x0),
|
|
|
|
- cpu_to_be32(0x0), cpu_to_be32(nodeid)
|
|
|
|
- };
|
|
|
|
char mem_name[32];
|
|
char mem_name[32];
|
|
uint64_t mem_reg_property[2];
|
|
uint64_t mem_reg_property[2];
|
|
int off;
|
|
int off;
|
|
@@ -335,8 +330,7 @@ static int spapr_dt_memory_node(void *fdt, int nodeid, hwaddr start,
|
|
_FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
|
|
_FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
|
|
_FDT((fdt_setprop(fdt, off, "reg", mem_reg_property,
|
|
_FDT((fdt_setprop(fdt, off, "reg", mem_reg_property,
|
|
sizeof(mem_reg_property))));
|
|
sizeof(mem_reg_property))));
|
|
- _FDT((fdt_setprop(fdt, off, "ibm,associativity", associativity,
|
|
|
|
- sizeof(associativity))));
|
|
|
|
|
|
+ spapr_numa_write_associativity_dt(spapr, fdt, off, nodeid);
|
|
return off;
|
|
return off;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -649,7 +643,7 @@ static int spapr_dt_memory(SpaprMachineState *spapr, void *fdt)
|
|
if (!mem_start) {
|
|
if (!mem_start) {
|
|
/* spapr_machine_init() checks for rma_size <= node0_size
|
|
/* spapr_machine_init() checks for rma_size <= node0_size
|
|
* already */
|
|
* already */
|
|
- spapr_dt_memory_node(fdt, i, 0, spapr->rma_size);
|
|
|
|
|
|
+ spapr_dt_memory_node(spapr, fdt, i, 0, spapr->rma_size);
|
|
mem_start += spapr->rma_size;
|
|
mem_start += spapr->rma_size;
|
|
node_size -= spapr->rma_size;
|
|
node_size -= spapr->rma_size;
|
|
}
|
|
}
|
|
@@ -661,7 +655,7 @@ static int spapr_dt_memory(SpaprMachineState *spapr, void *fdt)
|
|
sizetmp = 1ULL << ctzl(mem_start);
|
|
sizetmp = 1ULL << ctzl(mem_start);
|
|
}
|
|
}
|
|
|
|
|
|
- spapr_dt_memory_node(fdt, i, mem_start, sizetmp);
|
|
|
|
|
|
+ spapr_dt_memory_node(spapr, fdt, i, mem_start, sizetmp);
|
|
node_size -= sizetmp;
|
|
node_size -= sizetmp;
|
|
mem_start += sizetmp;
|
|
mem_start += sizetmp;
|
|
}
|
|
}
|
|
@@ -1275,7 +1269,7 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space)
|
|
|
|
|
|
/* NVDIMM devices */
|
|
/* NVDIMM devices */
|
|
if (mc->nvdimm_supported) {
|
|
if (mc->nvdimm_supported) {
|
|
- spapr_dt_persistent_memory(fdt);
|
|
|
|
|
|
+ spapr_dt_persistent_memory(spapr, fdt);
|
|
}
|
|
}
|
|
|
|
|
|
return fdt;
|
|
return fdt;
|
|
@@ -2810,6 +2804,9 @@ static void spapr_machine_init(MachineState *machine)
|
|
*/
|
|
*/
|
|
spapr->gpu_numa_id = MAX(1, machine->numa_state->num_nodes);
|
|
spapr->gpu_numa_id = MAX(1, machine->numa_state->num_nodes);
|
|
|
|
|
|
|
|
+ /* Init numa_assoc_array */
|
|
|
|
+ spapr_numa_associativity_init(spapr, machine);
|
|
|
|
+
|
|
if ((!kvm_enabled() || kvmppc_has_cap_mmu_radix()) &&
|
|
if ((!kvm_enabled() || kvmppc_has_cap_mmu_radix()) &&
|
|
ppc_type_check_compat(machine->cpu_type, CPU_POWERPC_LOGICAL_3_00, 0,
|
|
ppc_type_check_compat(machine->cpu_type, CPU_POWERPC_LOGICAL_3_00, 0,
|
|
spapr->max_compat_pvr)) {
|
|
spapr->max_compat_pvr)) {
|
|
@@ -3394,7 +3391,7 @@ int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
|
|
addr = spapr_drc_index(drc) * SPAPR_MEMORY_BLOCK_SIZE;
|
|
addr = spapr_drc_index(drc) * SPAPR_MEMORY_BLOCK_SIZE;
|
|
node = object_property_get_uint(OBJECT(drc->dev), PC_DIMM_NODE_PROP,
|
|
node = object_property_get_uint(OBJECT(drc->dev), PC_DIMM_NODE_PROP,
|
|
&error_abort);
|
|
&error_abort);
|
|
- *fdt_start_offset = spapr_dt_memory_node(fdt, node, addr,
|
|
|
|
|
|
+ *fdt_start_offset = spapr_dt_memory_node(spapr, fdt, node, addr,
|
|
SPAPR_MEMORY_BLOCK_SIZE);
|
|
SPAPR_MEMORY_BLOCK_SIZE);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|