Lines Matching +full:ppc +full:- +full:linux +full:- +full:user
10 * See the COPYING file in the top-level directory.
14 #include "hw/ppc/spapr_numa.h"
15 #include "hw/pci-host/spapr.h"
16 #include "hw/ppc/fdt.h"
18 /* Moved from hw/ppc/spapr_pci_nvlink2.c */
26 if (spapr_ovec_test(spapr->ov5_cas, OV5_FORM2_AFFINITY)) { in get_max_dist_ref_points()
38 if (spapr_ovec_test(spapr->ov5_cas, OV5_FORM2_AFFINITY)) { in get_numa_assoc_size()
62 if (spapr_ovec_test(spapr->ov5_cas, OV5_FORM2_AFFINITY)) { in get_associativity()
63 return spapr->FORM2_assoc_array[node_id]; in get_associativity()
65 return spapr->FORM1_assoc_array[node_id]; in get_associativity()
69 * Wrapper that returns node distance from ms->numa_state->nodes
74 NodeInfo *numa_info = ms->numa_state->nodes; in get_numa_distance()
82 * In case QEMU adds a default NUMA single node when the user in get_numa_distance()
83 * did not add any, or where the user did not supply distances, in get_numa_distance()
96 int nb_numa_nodes = ms->numa_state->num_nodes; in spapr_numa_is_symmetrical()
112 * This function will translate the user distances into
116 * - local distance (10) returns numa_level = 0x4, meaning there is
118 * - distances between 11 and 30 inclusive -> rounded to 20,
120 * - distances between 31 and 60 inclusive -> rounded to 40,
122 * - distances between 61 and 120 inclusive -> rounded to 80,
124 * - everything above 120 returns numa_level = 0 to indicate that
146 int nb_numa_nodes = ms->numa_state->num_nodes; in spapr_numa_define_FORM1_domains()
150 * Fill all associativity domains of non-zero NUMA nodes with in spapr_numa_define_FORM1_domains()
156 spapr->FORM1_assoc_array[i][j] = cpu_to_be32(i); in spapr_numa_define_FORM1_domains()
166 * - get the distance D between them in spapr_numa_define_FORM1_domains()
167 * - get the correspondent NUMA level 'n_level' for D in spapr_numa_define_FORM1_domains()
168 * - all associativity arrays were initialized with their own in spapr_numa_define_FORM1_domains()
179 * The PPC kernel expects the associativity domains of node 0 to in spapr_numa_define_FORM1_domains()
191 * The Linux kernel will assume that the distance between src and in spapr_numa_define_FORM1_domains()
196 * This logic can be seen in the Linux kernel source code, as of in spapr_numa_define_FORM1_domains()
207 for (i = n_level; i > 0; i--) { in spapr_numa_define_FORM1_domains()
208 assoc_src = spapr->FORM1_assoc_array[src][i]; in spapr_numa_define_FORM1_domains()
209 spapr->FORM1_assoc_array[dst][i] = assoc_src; in spapr_numa_define_FORM1_domains()
221 * Check we don't have a memory-less/cpu-less NUMA node in spapr_numa_FORM1_affinity_check()
224 * And the linux kernel needs to know the NUMA topology at start in spapr_numa_FORM1_affinity_check()
227 if (machine->numa_state->num_nodes) { in spapr_numa_FORM1_affinity_check()
228 for (i = 0; i < machine->numa_state->num_nodes; ++i) { in spapr_numa_FORM1_affinity_check()
229 /* check for memory-less node */ in spapr_numa_FORM1_affinity_check()
230 if (machine->numa_state->nodes[i].node_mem == 0) { in spapr_numa_FORM1_affinity_check()
233 /* check for cpu-less node */ in spapr_numa_FORM1_affinity_check()
236 if (cpu->node_id == i) { in spapr_numa_FORM1_affinity_check()
241 /* memory-less and cpu-less node */ in spapr_numa_FORM1_affinity_check()
244 "Memory-less/cpu-less nodes are not supported with FORM1 NUMA (node %d)", i); in spapr_numa_FORM1_affinity_check()
265 int nb_numa_nodes = machine->numa_state->num_nodes; in spapr_numa_FORM1_affinity_init()
275 * 'i' will be a valid node_id set by the user. in spapr_numa_FORM1_affinity_init()
278 spapr->FORM1_assoc_array[i][0] = cpu_to_be32(FORM1_DIST_REF_POINTS); in spapr_numa_FORM1_affinity_init()
279 spapr->FORM1_assoc_array[i][FORM1_DIST_REF_POINTS] = cpu_to_be32(i); in spapr_numa_FORM1_affinity_init()
283 spapr->FORM1_assoc_array[i][0] = cpu_to_be32(FORM1_DIST_REF_POINTS); in spapr_numa_FORM1_affinity_init()
286 uint32_t gpu_assoc = smc->pre_5_1_assoc_refpoints ? in spapr_numa_FORM1_affinity_init()
288 spapr->FORM1_assoc_array[i][j] = gpu_assoc; in spapr_numa_FORM1_affinity_init()
291 spapr->FORM1_assoc_array[i][FORM1_DIST_REF_POINTS] = cpu_to_be32(i); in spapr_numa_FORM1_affinity_init()
295 * Guests pseries-5.1 and older uses zeroed associativity domains, in spapr_numa_FORM1_affinity_init()
300 if (smc->pre_5_2_numa_associativity || in spapr_numa_FORM1_affinity_init()
301 machine->numa_state->num_nodes <= 1) { in spapr_numa_FORM1_affinity_init()
326 spapr->FORM2_assoc_array[i][0] = cpu_to_be32(1); in spapr_numa_FORM2_affinity_init()
327 spapr->FORM2_assoc_array[i][1] = cpu_to_be32(i); in spapr_numa_FORM2_affinity_init()
344 if (spapr_ovec_test(spapr->ov5_cas, OV5_FORM2_AFFINITY)) { in spapr_numa_associativity_check()
364 const uint32_t *associativity = get_associativity(spapr, cpu->node_id); in spapr_numa_get_vcpu_assoc()
377 vcpu_assoc[vcpu_assoc_size - 1] = cpu_to_be32(index); in spapr_numa_get_vcpu_assoc()
379 (vcpu_assoc_size - 2) * sizeof(uint32_t)); in spapr_numa_get_vcpu_assoc()
403 int nb_numa_nodes = machine->numa_state->num_nodes; in spapr_numa_write_assoc_lookup_arrays()
409 /* ibm,associativity-lookup-arrays */ in spapr_numa_write_assoc_lookup_arrays()
418 * For the lookup-array we use the ibm,associativity array of the in spapr_numa_write_assoc_lookup_arrays()
427 return fdt_setprop(fdt, offset, "ibm,associativity-lookup-arrays", in spapr_numa_write_assoc_lookup_arrays()
428 int_buf, (cur_index - int_buf) * sizeof(uint32_t)); in spapr_numa_write_assoc_lookup_arrays()
443 uint32_t maxdomain = ms->numa_state->num_nodes; in spapr_numa_FORM1_write_rtas_dt()
452 if (smc->pre_5_2_numa_associativity || in spapr_numa_FORM1_write_rtas_dt()
453 ms->numa_state->num_nodes <= 1) { in spapr_numa_FORM1_write_rtas_dt()
475 /* pseries-5.0 and older reference-points array is {0x4, 0x4} */ in spapr_numa_FORM1_write_rtas_dt()
476 if (smc->pre_5_1_assoc_refpoints) { in spapr_numa_FORM1_write_rtas_dt()
481 _FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points", in spapr_numa_FORM1_write_rtas_dt()
484 _FDT(fdt_setprop(fdt, rtas, "ibm,max-associativity-domains", in spapr_numa_FORM1_write_rtas_dt()
492 int nb_numa_nodes = ms->numa_state->num_nodes; in spapr_numa_FORM2_write_rtas_tables()
499 * ibm,numa-lookup-index-table: array with length and a in spapr_numa_FORM2_write_rtas_tables()
509 _FDT(fdt_setprop(fdt, rtas, "ibm,numa-lookup-index-table", in spapr_numa_FORM2_write_rtas_tables()
514 * ibm,numa-distance-table: contains all node distances. First in spapr_numa_FORM2_write_rtas_tables()
519 * ibm,numa-lookup-index-table is used by guest to navigate this in spapr_numa_FORM2_write_rtas_tables()
537 _FDT(fdt_setprop(fdt, rtas, "ibm,numa-distance-table", in spapr_numa_FORM2_write_rtas_tables()
555 * In FORM2, ibm,associativity-reference-points will point to in spapr_numa_FORM2_write_rtas_dt()
559 * This value (in our case, the numa-id) is then used as an index in spapr_numa_FORM2_write_rtas_dt()
561 * bandwidth, latency) via ibm,numa-lookup-index-table and other in spapr_numa_FORM2_write_rtas_dt()
562 * ibm,numa-*-table properties. in spapr_numa_FORM2_write_rtas_dt()
566 uint32_t maxdomain = ms->numa_state->num_nodes; in spapr_numa_FORM2_write_rtas_dt()
569 _FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points", in spapr_numa_FORM2_write_rtas_dt()
572 _FDT(fdt_setprop(fdt, rtas, "ibm,max-associativity-domains", in spapr_numa_FORM2_write_rtas_dt()
579 * Helper that writes ibm,associativity-reference-points and
580 * max-associativity-domains in the RTAS pointed by @rtas
585 if (spapr_ovec_test(spapr->ov5_cas, OV5_FORM2_AFFINITY)) { in spapr_numa_write_rtas_dt()
622 g_assert((vcpu_assoc_size - 1) <= 12); in h_home_node_associativity()
636 * including tcpu->node_id and procno, meaning that we don't in h_home_node_associativity()
640 * macro. The ternary will fill the remaining registers with -1 in h_home_node_associativity()
644 be32_to_cpu(vcpu_assoc[assoc_idx++]) : -1; in h_home_node_associativity()
646 be32_to_cpu(vcpu_assoc[assoc_idx++]) : -1; in h_home_node_associativity()