aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorDaniel Henrique Barboza <danielhb413@gmail.com>2020-10-07 14:28:47 -0300
committerDavid Gibson <david@gibson.dropbear.id.au>2020-10-09 10:52:09 +1100
commit491e884e3666e0af6a1eef06df496611097a060e (patch)
treee6b01954408fc3c57f8283a390a20bcfab3dc425 /hw
parentee6635b227491e7d487ecd868e0dbfbb0c444217 (diff)
downloadqemu-491e884e3666e0af6a1eef06df496611097a060e.zip
qemu-491e884e3666e0af6a1eef06df496611097a060e.tar.gz
qemu-491e884e3666e0af6a1eef06df496611097a060e.tar.bz2
spapr_numa: change reference-points and maxdomain settings
This is the first guest visible change introduced in spapr_numa.c. The previous settings of both reference-points and maxdomains were too restrictive, but enough for the existing associativity we're setting in the resources. We'll change that in the following patches, populating the associativity arrays based on user input. For those changes to be effective, reference-points and maxdomains must be more flexible. After this patch, we'll have 4 distinct levels of NUMA (0x4, 0x3, 0x2, 0x1) and maxdomains will allow for any type of configuration the user intends to do - under the scope and limitations of PAPR itself, of course. Reviewed-by: Greg Kurz <groug@kaod.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20201007172849.302240-4-danielhb413@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'hw')
-rw-r--r--hw/ppc/spapr_numa.c43
1 files changed, 35 insertions, 8 deletions
diff --git a/hw/ppc/spapr_numa.c b/hw/ppc/spapr_numa.c
index fe395e8..16badb1 100644
--- a/hw/ppc/spapr_numa.c
+++ b/hw/ppc/spapr_numa.c
@@ -178,24 +178,51 @@ int spapr_numa_write_assoc_lookup_arrays(SpaprMachineState *spapr, void *fdt,
*/
void spapr_numa_write_rtas_dt(SpaprMachineState *spapr, void *fdt, int rtas)
{
+ MachineState *ms = MACHINE(spapr);
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
uint32_t refpoints[] = {
cpu_to_be32(0x4),
- cpu_to_be32(0x4),
+ cpu_to_be32(0x3),
cpu_to_be32(0x2),
+ cpu_to_be32(0x1),
};
uint32_t nr_refpoints = ARRAY_SIZE(refpoints);
- uint32_t maxdomain = cpu_to_be32(spapr->gpu_numa_id > 1 ? 1 : 0);
+ uint32_t maxdomain = ms->numa_state->num_nodes + spapr->gpu_numa_id;
uint32_t maxdomains[] = {
cpu_to_be32(4),
- maxdomain,
- maxdomain,
- maxdomain,
- cpu_to_be32(spapr->gpu_numa_id),
+ cpu_to_be32(maxdomain),
+ cpu_to_be32(maxdomain),
+ cpu_to_be32(maxdomain),
+ cpu_to_be32(maxdomain)
};
- if (smc->pre_5_1_assoc_refpoints) {
- nr_refpoints = 2;
+ if (spapr_machine_using_legacy_numa(spapr)) {
+ uint32_t legacy_refpoints[] = {
+ cpu_to_be32(0x4),
+ cpu_to_be32(0x4),
+ cpu_to_be32(0x2),
+ };
+ uint32_t legacy_maxdomain = spapr->gpu_numa_id > 1 ? 1 : 0;
+ uint32_t legacy_maxdomains[] = {
+ cpu_to_be32(4),
+ cpu_to_be32(legacy_maxdomain),
+ cpu_to_be32(legacy_maxdomain),
+ cpu_to_be32(legacy_maxdomain),
+ cpu_to_be32(spapr->gpu_numa_id),
+ };
+
+ G_STATIC_ASSERT(sizeof(legacy_refpoints) <= sizeof(refpoints));
+ G_STATIC_ASSERT(sizeof(legacy_maxdomains) <= sizeof(maxdomains));
+
+ nr_refpoints = 3;
+
+ memcpy(refpoints, legacy_refpoints, sizeof(legacy_refpoints));
+ memcpy(maxdomains, legacy_maxdomains, sizeof(legacy_maxdomains));
+
+ /* pseries-5.0 and older reference-points array is {0x4, 0x4} */
+ if (smc->pre_5_1_assoc_refpoints) {
+ nr_refpoints = 2;
+ }
}
_FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points",