1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Arch specific cpu topology information |
4 | * |
5 | * Copyright (C) 2016, ARM Ltd. |
6 | * Written by: Juri Lelli, ARM Ltd. |
7 | */ |
8 | |
9 | #include <linux/acpi.h> |
10 | #include <linux/cacheinfo.h> |
11 | #include <linux/cpu.h> |
12 | #include <linux/cpufreq.h> |
13 | #include <linux/device.h> |
14 | #include <linux/of.h> |
15 | #include <linux/slab.h> |
16 | #include <linux/sched/topology.h> |
17 | #include <linux/cpuset.h> |
18 | #include <linux/cpumask.h> |
19 | #include <linux/init.h> |
20 | #include <linux/rcupdate.h> |
21 | #include <linux/sched.h> |
22 | |
23 | #define CREATE_TRACE_POINTS |
24 | #include <trace/events/thermal_pressure.h> |
25 | |
26 | static DEFINE_PER_CPU(struct scale_freq_data __rcu *, sft_data); |
27 | static struct cpumask scale_freq_counters_mask; |
28 | static bool scale_freq_invariant; |
29 | static DEFINE_PER_CPU(u32, freq_factor) = 1; |
30 | |
31 | static bool supports_scale_freq_counters(const struct cpumask *cpus) |
32 | { |
33 | return cpumask_subset(src1p: cpus, src2p: &scale_freq_counters_mask); |
34 | } |
35 | |
36 | bool topology_scale_freq_invariant(void) |
37 | { |
38 | return cpufreq_supports_freq_invariance() || |
39 | supports_scale_freq_counters(cpu_online_mask); |
40 | } |
41 | |
42 | static void update_scale_freq_invariant(bool status) |
43 | { |
44 | if (scale_freq_invariant == status) |
45 | return; |
46 | |
47 | /* |
48 | * Task scheduler behavior depends on frequency invariance support, |
49 | * either cpufreq or counter driven. If the support status changes as |
50 | * a result of counter initialisation and use, retrigger the build of |
51 | * scheduling domains to ensure the information is propagated properly. |
52 | */ |
53 | if (topology_scale_freq_invariant() == status) { |
54 | scale_freq_invariant = status; |
55 | rebuild_sched_domains_energy(); |
56 | } |
57 | } |
58 | |
59 | void topology_set_scale_freq_source(struct scale_freq_data *data, |
60 | const struct cpumask *cpus) |
61 | { |
62 | struct scale_freq_data *sfd; |
63 | int cpu; |
64 | |
65 | /* |
66 | * Avoid calling rebuild_sched_domains() unnecessarily if FIE is |
67 | * supported by cpufreq. |
68 | */ |
69 | if (cpumask_empty(srcp: &scale_freq_counters_mask)) |
70 | scale_freq_invariant = topology_scale_freq_invariant(); |
71 | |
72 | rcu_read_lock(); |
73 | |
74 | for_each_cpu(cpu, cpus) { |
75 | sfd = rcu_dereference(*per_cpu_ptr(&sft_data, cpu)); |
76 | |
77 | /* Use ARCH provided counters whenever possible */ |
78 | if (!sfd || sfd->source != SCALE_FREQ_SOURCE_ARCH) { |
79 | rcu_assign_pointer(per_cpu(sft_data, cpu), data); |
80 | cpumask_set_cpu(cpu, dstp: &scale_freq_counters_mask); |
81 | } |
82 | } |
83 | |
84 | rcu_read_unlock(); |
85 | |
86 | update_scale_freq_invariant(status: true); |
87 | } |
88 | EXPORT_SYMBOL_GPL(topology_set_scale_freq_source); |
89 | |
90 | void topology_clear_scale_freq_source(enum scale_freq_source source, |
91 | const struct cpumask *cpus) |
92 | { |
93 | struct scale_freq_data *sfd; |
94 | int cpu; |
95 | |
96 | rcu_read_lock(); |
97 | |
98 | for_each_cpu(cpu, cpus) { |
99 | sfd = rcu_dereference(*per_cpu_ptr(&sft_data, cpu)); |
100 | |
101 | if (sfd && sfd->source == source) { |
102 | rcu_assign_pointer(per_cpu(sft_data, cpu), NULL); |
103 | cpumask_clear_cpu(cpu, dstp: &scale_freq_counters_mask); |
104 | } |
105 | } |
106 | |
107 | rcu_read_unlock(); |
108 | |
109 | /* |
110 | * Make sure all references to previous sft_data are dropped to avoid |
111 | * use-after-free races. |
112 | */ |
113 | synchronize_rcu(); |
114 | |
115 | update_scale_freq_invariant(status: false); |
116 | } |
117 | EXPORT_SYMBOL_GPL(topology_clear_scale_freq_source); |
118 | |
119 | void topology_scale_freq_tick(void) |
120 | { |
121 | struct scale_freq_data *sfd = rcu_dereference_sched(*this_cpu_ptr(&sft_data)); |
122 | |
123 | if (sfd) |
124 | sfd->set_freq_scale(); |
125 | } |
126 | |
127 | DEFINE_PER_CPU(unsigned long, arch_freq_scale) = SCHED_CAPACITY_SCALE; |
128 | EXPORT_PER_CPU_SYMBOL_GPL(arch_freq_scale); |
129 | |
130 | void topology_set_freq_scale(const struct cpumask *cpus, unsigned long cur_freq, |
131 | unsigned long max_freq) |
132 | { |
133 | unsigned long scale; |
134 | int i; |
135 | |
136 | if (WARN_ON_ONCE(!cur_freq || !max_freq)) |
137 | return; |
138 | |
139 | /* |
140 | * If the use of counters for FIE is enabled, just return as we don't |
141 | * want to update the scale factor with information from CPUFREQ. |
142 | * Instead the scale factor will be updated from arch_scale_freq_tick. |
143 | */ |
144 | if (supports_scale_freq_counters(cpus)) |
145 | return; |
146 | |
147 | scale = (cur_freq << SCHED_CAPACITY_SHIFT) / max_freq; |
148 | |
149 | for_each_cpu(i, cpus) |
150 | per_cpu(arch_freq_scale, i) = scale; |
151 | } |
152 | |
153 | DEFINE_PER_CPU(unsigned long, cpu_scale) = SCHED_CAPACITY_SCALE; |
154 | EXPORT_PER_CPU_SYMBOL_GPL(cpu_scale); |
155 | |
156 | void topology_set_cpu_scale(unsigned int cpu, unsigned long capacity) |
157 | { |
158 | per_cpu(cpu_scale, cpu) = capacity; |
159 | } |
160 | |
161 | DEFINE_PER_CPU(unsigned long, thermal_pressure); |
162 | |
163 | /** |
164 | * topology_update_thermal_pressure() - Update thermal pressure for CPUs |
165 | * @cpus : The related CPUs for which capacity has been reduced |
166 | * @capped_freq : The maximum allowed frequency that CPUs can run at |
167 | * |
168 | * Update the value of thermal pressure for all @cpus in the mask. The |
169 | * cpumask should include all (online+offline) affected CPUs, to avoid |
170 | * operating on stale data when hot-plug is used for some CPUs. The |
171 | * @capped_freq reflects the currently allowed max CPUs frequency due to |
172 | * thermal capping. It might be also a boost frequency value, which is bigger |
173 | * than the internal 'freq_factor' max frequency. In such case the pressure |
174 | * value should simply be removed, since this is an indication that there is |
175 | * no thermal throttling. The @capped_freq must be provided in kHz. |
176 | */ |
177 | void topology_update_thermal_pressure(const struct cpumask *cpus, |
178 | unsigned long capped_freq) |
179 | { |
180 | unsigned long max_capacity, capacity, th_pressure; |
181 | u32 max_freq; |
182 | int cpu; |
183 | |
184 | cpu = cpumask_first(srcp: cpus); |
185 | max_capacity = arch_scale_cpu_capacity(cpu); |
186 | max_freq = per_cpu(freq_factor, cpu); |
187 | |
188 | /* Convert to MHz scale which is used in 'freq_factor' */ |
189 | capped_freq /= 1000; |
190 | |
191 | /* |
192 | * Handle properly the boost frequencies, which should simply clean |
193 | * the thermal pressure value. |
194 | */ |
195 | if (max_freq <= capped_freq) |
196 | capacity = max_capacity; |
197 | else |
198 | capacity = mult_frac(max_capacity, capped_freq, max_freq); |
199 | |
200 | th_pressure = max_capacity - capacity; |
201 | |
202 | trace_thermal_pressure_update(cpu, thermal_pressure: th_pressure); |
203 | |
204 | for_each_cpu(cpu, cpus) |
205 | WRITE_ONCE(per_cpu(thermal_pressure, cpu), th_pressure); |
206 | } |
207 | EXPORT_SYMBOL_GPL(topology_update_thermal_pressure); |
208 | |
209 | static ssize_t cpu_capacity_show(struct device *dev, |
210 | struct device_attribute *attr, |
211 | char *buf) |
212 | { |
213 | struct cpu *cpu = container_of(dev, struct cpu, dev); |
214 | |
215 | return sysfs_emit(buf, fmt: "%lu\n" , topology_get_cpu_scale(cpu: cpu->dev.id)); |
216 | } |
217 | |
218 | static void update_topology_flags_workfn(struct work_struct *work); |
219 | static DECLARE_WORK(update_topology_flags_work, update_topology_flags_workfn); |
220 | |
221 | static DEVICE_ATTR_RO(cpu_capacity); |
222 | |
223 | static int register_cpu_capacity_sysctl(void) |
224 | { |
225 | int i; |
226 | struct device *cpu; |
227 | |
228 | for_each_possible_cpu(i) { |
229 | cpu = get_cpu_device(cpu: i); |
230 | if (!cpu) { |
231 | pr_err("%s: too early to get CPU%d device!\n" , |
232 | __func__, i); |
233 | continue; |
234 | } |
235 | device_create_file(device: cpu, entry: &dev_attr_cpu_capacity); |
236 | } |
237 | |
238 | return 0; |
239 | } |
240 | subsys_initcall(register_cpu_capacity_sysctl); |
241 | |
242 | static int update_topology; |
243 | |
244 | int topology_update_cpu_topology(void) |
245 | { |
246 | return update_topology; |
247 | } |
248 | |
249 | /* |
250 | * Updating the sched_domains can't be done directly from cpufreq callbacks |
251 | * due to locking, so queue the work for later. |
252 | */ |
253 | static void update_topology_flags_workfn(struct work_struct *work) |
254 | { |
255 | update_topology = 1; |
256 | rebuild_sched_domains(); |
257 | pr_debug("sched_domain hierarchy rebuilt, flags updated\n" ); |
258 | update_topology = 0; |
259 | } |
260 | |
261 | static u32 *raw_capacity; |
262 | |
263 | static int free_raw_capacity(void) |
264 | { |
265 | kfree(objp: raw_capacity); |
266 | raw_capacity = NULL; |
267 | |
268 | return 0; |
269 | } |
270 | |
271 | void topology_normalize_cpu_scale(void) |
272 | { |
273 | u64 capacity; |
274 | u64 capacity_scale; |
275 | int cpu; |
276 | |
277 | if (!raw_capacity) |
278 | return; |
279 | |
280 | capacity_scale = 1; |
281 | for_each_possible_cpu(cpu) { |
282 | capacity = raw_capacity[cpu] * per_cpu(freq_factor, cpu); |
283 | capacity_scale = max(capacity, capacity_scale); |
284 | } |
285 | |
286 | pr_debug("cpu_capacity: capacity_scale=%llu\n" , capacity_scale); |
287 | for_each_possible_cpu(cpu) { |
288 | capacity = raw_capacity[cpu] * per_cpu(freq_factor, cpu); |
289 | capacity = div64_u64(dividend: capacity << SCHED_CAPACITY_SHIFT, |
290 | divisor: capacity_scale); |
291 | topology_set_cpu_scale(cpu, capacity); |
292 | pr_debug("cpu_capacity: CPU%d cpu_capacity=%lu\n" , |
293 | cpu, topology_get_cpu_scale(cpu)); |
294 | } |
295 | } |
296 | |
297 | bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu) |
298 | { |
299 | struct clk *cpu_clk; |
300 | static bool cap_parsing_failed; |
301 | int ret; |
302 | u32 cpu_capacity; |
303 | |
304 | if (cap_parsing_failed) |
305 | return false; |
306 | |
307 | ret = of_property_read_u32(np: cpu_node, propname: "capacity-dmips-mhz" , |
308 | out_value: &cpu_capacity); |
309 | if (!ret) { |
310 | if (!raw_capacity) { |
311 | raw_capacity = kcalloc(num_possible_cpus(), |
312 | size: sizeof(*raw_capacity), |
313 | GFP_KERNEL); |
314 | if (!raw_capacity) { |
315 | cap_parsing_failed = true; |
316 | return false; |
317 | } |
318 | } |
319 | raw_capacity[cpu] = cpu_capacity; |
320 | pr_debug("cpu_capacity: %pOF cpu_capacity=%u (raw)\n" , |
321 | cpu_node, raw_capacity[cpu]); |
322 | |
323 | /* |
324 | * Update freq_factor for calculating early boot cpu capacities. |
325 | * For non-clk CPU DVFS mechanism, there's no way to get the |
326 | * frequency value now, assuming they are running at the same |
327 | * frequency (by keeping the initial freq_factor value). |
328 | */ |
329 | cpu_clk = of_clk_get(np: cpu_node, index: 0); |
330 | if (!PTR_ERR_OR_ZERO(ptr: cpu_clk)) { |
331 | per_cpu(freq_factor, cpu) = |
332 | clk_get_rate(clk: cpu_clk) / 1000; |
333 | clk_put(clk: cpu_clk); |
334 | } |
335 | } else { |
336 | if (raw_capacity) { |
337 | pr_err("cpu_capacity: missing %pOF raw capacity\n" , |
338 | cpu_node); |
339 | pr_err("cpu_capacity: partial information: fallback to 1024 for all CPUs\n" ); |
340 | } |
341 | cap_parsing_failed = true; |
342 | free_raw_capacity(); |
343 | } |
344 | |
345 | return !ret; |
346 | } |
347 | |
348 | #ifdef CONFIG_ACPI_CPPC_LIB |
349 | #include <acpi/cppc_acpi.h> |
350 | |
351 | void topology_init_cpu_capacity_cppc(void) |
352 | { |
353 | struct cppc_perf_caps perf_caps; |
354 | int cpu; |
355 | |
356 | if (likely(!acpi_cpc_valid())) |
357 | return; |
358 | |
359 | raw_capacity = kcalloc(num_possible_cpus(), size: sizeof(*raw_capacity), |
360 | GFP_KERNEL); |
361 | if (!raw_capacity) |
362 | return; |
363 | |
364 | for_each_possible_cpu(cpu) { |
365 | if (!cppc_get_perf_caps(cpu, caps: &perf_caps) && |
366 | (perf_caps.highest_perf >= perf_caps.nominal_perf) && |
367 | (perf_caps.highest_perf >= perf_caps.lowest_perf)) { |
368 | raw_capacity[cpu] = perf_caps.highest_perf; |
369 | pr_debug("cpu_capacity: CPU%d cpu_capacity=%u (raw).\n" , |
370 | cpu, raw_capacity[cpu]); |
371 | continue; |
372 | } |
373 | |
374 | pr_err("cpu_capacity: CPU%d missing/invalid highest performance.\n" , cpu); |
375 | pr_err("cpu_capacity: partial information: fallback to 1024 for all CPUs\n" ); |
376 | goto exit; |
377 | } |
378 | |
379 | topology_normalize_cpu_scale(); |
380 | schedule_work(work: &update_topology_flags_work); |
381 | pr_debug("cpu_capacity: cpu_capacity initialization done\n" ); |
382 | |
383 | exit: |
384 | free_raw_capacity(); |
385 | } |
386 | #endif |
387 | |
388 | #ifdef CONFIG_CPU_FREQ |
389 | static cpumask_var_t cpus_to_visit; |
390 | static void parsing_done_workfn(struct work_struct *work); |
391 | static DECLARE_WORK(parsing_done_work, parsing_done_workfn); |
392 | |
393 | static int |
394 | init_cpu_capacity_callback(struct notifier_block *nb, |
395 | unsigned long val, |
396 | void *data) |
397 | { |
398 | struct cpufreq_policy *policy = data; |
399 | int cpu; |
400 | |
401 | if (!raw_capacity) |
402 | return 0; |
403 | |
404 | if (val != CPUFREQ_CREATE_POLICY) |
405 | return 0; |
406 | |
407 | pr_debug("cpu_capacity: init cpu capacity for CPUs [%*pbl] (to_visit=%*pbl)\n" , |
408 | cpumask_pr_args(policy->related_cpus), |
409 | cpumask_pr_args(cpus_to_visit)); |
410 | |
411 | cpumask_andnot(dstp: cpus_to_visit, src1p: cpus_to_visit, src2p: policy->related_cpus); |
412 | |
413 | for_each_cpu(cpu, policy->related_cpus) |
414 | per_cpu(freq_factor, cpu) = policy->cpuinfo.max_freq / 1000; |
415 | |
416 | if (cpumask_empty(srcp: cpus_to_visit)) { |
417 | topology_normalize_cpu_scale(); |
418 | schedule_work(work: &update_topology_flags_work); |
419 | free_raw_capacity(); |
420 | pr_debug("cpu_capacity: parsing done\n" ); |
421 | schedule_work(work: &parsing_done_work); |
422 | } |
423 | |
424 | return 0; |
425 | } |
426 | |
427 | static struct notifier_block init_cpu_capacity_notifier = { |
428 | .notifier_call = init_cpu_capacity_callback, |
429 | }; |
430 | |
431 | static int __init register_cpufreq_notifier(void) |
432 | { |
433 | int ret; |
434 | |
435 | /* |
436 | * On ACPI-based systems skip registering cpufreq notifier as cpufreq |
437 | * information is not needed for cpu capacity initialization. |
438 | */ |
439 | if (!acpi_disabled || !raw_capacity) |
440 | return -EINVAL; |
441 | |
442 | if (!alloc_cpumask_var(mask: &cpus_to_visit, GFP_KERNEL)) |
443 | return -ENOMEM; |
444 | |
445 | cpumask_copy(dstp: cpus_to_visit, cpu_possible_mask); |
446 | |
447 | ret = cpufreq_register_notifier(nb: &init_cpu_capacity_notifier, |
448 | CPUFREQ_POLICY_NOTIFIER); |
449 | |
450 | if (ret) |
451 | free_cpumask_var(mask: cpus_to_visit); |
452 | |
453 | return ret; |
454 | } |
455 | core_initcall(register_cpufreq_notifier); |
456 | |
457 | static void parsing_done_workfn(struct work_struct *work) |
458 | { |
459 | cpufreq_unregister_notifier(nb: &init_cpu_capacity_notifier, |
460 | CPUFREQ_POLICY_NOTIFIER); |
461 | free_cpumask_var(mask: cpus_to_visit); |
462 | } |
463 | |
464 | #else |
465 | core_initcall(free_raw_capacity); |
466 | #endif |
467 | |
468 | #if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) |
469 | /* |
470 | * This function returns the logic cpu number of the node. |
471 | * There are basically three kinds of return values: |
472 | * (1) logic cpu number which is > 0. |
473 | * (2) -ENODEV when the device tree(DT) node is valid and found in the DT but |
474 | * there is no possible logical CPU in the kernel to match. This happens |
475 | * when CONFIG_NR_CPUS is configure to be smaller than the number of |
476 | * CPU nodes in DT. We need to just ignore this case. |
477 | * (3) -1 if the node does not exist in the device tree |
478 | */ |
479 | static int __init get_cpu_for_node(struct device_node *node) |
480 | { |
481 | struct device_node *cpu_node; |
482 | int cpu; |
483 | |
484 | cpu_node = of_parse_phandle(node, "cpu" , 0); |
485 | if (!cpu_node) |
486 | return -1; |
487 | |
488 | cpu = of_cpu_node_to_id(cpu_node); |
489 | if (cpu >= 0) |
490 | topology_parse_cpu_capacity(cpu_node, cpu); |
491 | else |
492 | pr_info("CPU node for %pOF exist but the possible cpu range is :%*pbl\n" , |
493 | cpu_node, cpumask_pr_args(cpu_possible_mask)); |
494 | |
495 | of_node_put(cpu_node); |
496 | return cpu; |
497 | } |
498 | |
499 | static int __init parse_core(struct device_node *core, int package_id, |
500 | int cluster_id, int core_id) |
501 | { |
502 | char name[20]; |
503 | bool leaf = true; |
504 | int i = 0; |
505 | int cpu; |
506 | struct device_node *t; |
507 | |
508 | do { |
509 | snprintf(name, sizeof(name), "thread%d" , i); |
510 | t = of_get_child_by_name(core, name); |
511 | if (t) { |
512 | leaf = false; |
513 | cpu = get_cpu_for_node(t); |
514 | if (cpu >= 0) { |
515 | cpu_topology[cpu].package_id = package_id; |
516 | cpu_topology[cpu].cluster_id = cluster_id; |
517 | cpu_topology[cpu].core_id = core_id; |
518 | cpu_topology[cpu].thread_id = i; |
519 | } else if (cpu != -ENODEV) { |
520 | pr_err("%pOF: Can't get CPU for thread\n" , t); |
521 | of_node_put(t); |
522 | return -EINVAL; |
523 | } |
524 | of_node_put(t); |
525 | } |
526 | i++; |
527 | } while (t); |
528 | |
529 | cpu = get_cpu_for_node(core); |
530 | if (cpu >= 0) { |
531 | if (!leaf) { |
532 | pr_err("%pOF: Core has both threads and CPU\n" , |
533 | core); |
534 | return -EINVAL; |
535 | } |
536 | |
537 | cpu_topology[cpu].package_id = package_id; |
538 | cpu_topology[cpu].cluster_id = cluster_id; |
539 | cpu_topology[cpu].core_id = core_id; |
540 | } else if (leaf && cpu != -ENODEV) { |
541 | pr_err("%pOF: Can't get CPU for leaf core\n" , core); |
542 | return -EINVAL; |
543 | } |
544 | |
545 | return 0; |
546 | } |
547 | |
548 | static int __init parse_cluster(struct device_node *cluster, int package_id, |
549 | int cluster_id, int depth) |
550 | { |
551 | char name[20]; |
552 | bool leaf = true; |
553 | bool has_cores = false; |
554 | struct device_node *c; |
555 | int core_id = 0; |
556 | int i, ret; |
557 | |
558 | /* |
559 | * First check for child clusters; we currently ignore any |
560 | * information about the nesting of clusters and present the |
561 | * scheduler with a flat list of them. |
562 | */ |
563 | i = 0; |
564 | do { |
565 | snprintf(name, sizeof(name), "cluster%d" , i); |
566 | c = of_get_child_by_name(cluster, name); |
567 | if (c) { |
568 | leaf = false; |
569 | ret = parse_cluster(c, package_id, i, depth + 1); |
570 | if (depth > 0) |
571 | pr_warn("Topology for clusters of clusters not yet supported\n" ); |
572 | of_node_put(c); |
573 | if (ret != 0) |
574 | return ret; |
575 | } |
576 | i++; |
577 | } while (c); |
578 | |
579 | /* Now check for cores */ |
580 | i = 0; |
581 | do { |
582 | snprintf(name, sizeof(name), "core%d" , i); |
583 | c = of_get_child_by_name(cluster, name); |
584 | if (c) { |
585 | has_cores = true; |
586 | |
587 | if (depth == 0) { |
588 | pr_err("%pOF: cpu-map children should be clusters\n" , |
589 | c); |
590 | of_node_put(c); |
591 | return -EINVAL; |
592 | } |
593 | |
594 | if (leaf) { |
595 | ret = parse_core(c, package_id, cluster_id, |
596 | core_id++); |
597 | } else { |
598 | pr_err("%pOF: Non-leaf cluster with core %s\n" , |
599 | cluster, name); |
600 | ret = -EINVAL; |
601 | } |
602 | |
603 | of_node_put(c); |
604 | if (ret != 0) |
605 | return ret; |
606 | } |
607 | i++; |
608 | } while (c); |
609 | |
610 | if (leaf && !has_cores) |
611 | pr_warn("%pOF: empty cluster\n" , cluster); |
612 | |
613 | return 0; |
614 | } |
615 | |
616 | static int __init parse_socket(struct device_node *socket) |
617 | { |
618 | char name[20]; |
619 | struct device_node *c; |
620 | bool has_socket = false; |
621 | int package_id = 0, ret; |
622 | |
623 | do { |
624 | snprintf(name, sizeof(name), "socket%d" , package_id); |
625 | c = of_get_child_by_name(socket, name); |
626 | if (c) { |
627 | has_socket = true; |
628 | ret = parse_cluster(c, package_id, -1, 0); |
629 | of_node_put(c); |
630 | if (ret != 0) |
631 | return ret; |
632 | } |
633 | package_id++; |
634 | } while (c); |
635 | |
636 | if (!has_socket) |
637 | ret = parse_cluster(socket, 0, -1, 0); |
638 | |
639 | return ret; |
640 | } |
641 | |
642 | static int __init parse_dt_topology(void) |
643 | { |
644 | struct device_node *cn, *map; |
645 | int ret = 0; |
646 | int cpu; |
647 | |
648 | cn = of_find_node_by_path("/cpus" ); |
649 | if (!cn) { |
650 | pr_err("No CPU information found in DT\n" ); |
651 | return 0; |
652 | } |
653 | |
654 | /* |
655 | * When topology is provided cpu-map is essentially a root |
656 | * cluster with restricted subnodes. |
657 | */ |
658 | map = of_get_child_by_name(cn, "cpu-map" ); |
659 | if (!map) |
660 | goto out; |
661 | |
662 | ret = parse_socket(map); |
663 | if (ret != 0) |
664 | goto out_map; |
665 | |
666 | topology_normalize_cpu_scale(); |
667 | |
668 | /* |
669 | * Check that all cores are in the topology; the SMP code will |
670 | * only mark cores described in the DT as possible. |
671 | */ |
672 | for_each_possible_cpu(cpu) |
673 | if (cpu_topology[cpu].package_id < 0) { |
674 | ret = -EINVAL; |
675 | break; |
676 | } |
677 | |
678 | out_map: |
679 | of_node_put(map); |
680 | out: |
681 | of_node_put(cn); |
682 | return ret; |
683 | } |
684 | #endif |
685 | |
686 | /* |
687 | * cpu topology table |
688 | */ |
689 | struct cpu_topology cpu_topology[NR_CPUS]; |
690 | EXPORT_SYMBOL_GPL(cpu_topology); |
691 | |
692 | const struct cpumask *cpu_coregroup_mask(int cpu) |
693 | { |
694 | const cpumask_t *core_mask = cpumask_of_node(cpu_to_node(cpu)); |
695 | |
696 | /* Find the smaller of NUMA, core or LLC siblings */ |
697 | if (cpumask_subset(src1p: &cpu_topology[cpu].core_sibling, src2p: core_mask)) { |
698 | /* not numa in package, lets use the package siblings */ |
699 | core_mask = &cpu_topology[cpu].core_sibling; |
700 | } |
701 | |
702 | if (last_level_cache_is_valid(cpu)) { |
703 | if (cpumask_subset(src1p: &cpu_topology[cpu].llc_sibling, src2p: core_mask)) |
704 | core_mask = &cpu_topology[cpu].llc_sibling; |
705 | } |
706 | |
707 | /* |
708 | * For systems with no shared cpu-side LLC but with clusters defined, |
709 | * extend core_mask to cluster_siblings. The sched domain builder will |
710 | * then remove MC as redundant with CLS if SCHED_CLUSTER is enabled. |
711 | */ |
712 | if (IS_ENABLED(CONFIG_SCHED_CLUSTER) && |
713 | cpumask_subset(src1p: core_mask, src2p: &cpu_topology[cpu].cluster_sibling)) |
714 | core_mask = &cpu_topology[cpu].cluster_sibling; |
715 | |
716 | return core_mask; |
717 | } |
718 | |
719 | const struct cpumask *cpu_clustergroup_mask(int cpu) |
720 | { |
721 | /* |
722 | * Forbid cpu_clustergroup_mask() to span more or the same CPUs as |
723 | * cpu_coregroup_mask(). |
724 | */ |
725 | if (cpumask_subset(src1p: cpu_coregroup_mask(cpu), |
726 | src2p: &cpu_topology[cpu].cluster_sibling)) |
727 | return topology_sibling_cpumask(cpu); |
728 | |
729 | return &cpu_topology[cpu].cluster_sibling; |
730 | } |
731 | |
732 | void update_siblings_masks(unsigned int cpuid) |
733 | { |
734 | struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; |
735 | int cpu, ret; |
736 | |
737 | ret = detect_cache_attributes(cpu: cpuid); |
738 | if (ret && ret != -ENOENT) |
739 | pr_info("Early cacheinfo allocation failed, ret = %d\n" , ret); |
740 | |
741 | /* update core and thread sibling masks */ |
742 | for_each_online_cpu(cpu) { |
743 | cpu_topo = &cpu_topology[cpu]; |
744 | |
745 | if (last_level_cache_is_shared(cpu_x: cpu, cpu_y: cpuid)) { |
746 | cpumask_set_cpu(cpu, dstp: &cpuid_topo->llc_sibling); |
747 | cpumask_set_cpu(cpu: cpuid, dstp: &cpu_topo->llc_sibling); |
748 | } |
749 | |
750 | if (cpuid_topo->package_id != cpu_topo->package_id) |
751 | continue; |
752 | |
753 | cpumask_set_cpu(cpu: cpuid, dstp: &cpu_topo->core_sibling); |
754 | cpumask_set_cpu(cpu, dstp: &cpuid_topo->core_sibling); |
755 | |
756 | if (cpuid_topo->cluster_id != cpu_topo->cluster_id) |
757 | continue; |
758 | |
759 | if (cpuid_topo->cluster_id >= 0) { |
760 | cpumask_set_cpu(cpu, dstp: &cpuid_topo->cluster_sibling); |
761 | cpumask_set_cpu(cpu: cpuid, dstp: &cpu_topo->cluster_sibling); |
762 | } |
763 | |
764 | if (cpuid_topo->core_id != cpu_topo->core_id) |
765 | continue; |
766 | |
767 | cpumask_set_cpu(cpu: cpuid, dstp: &cpu_topo->thread_sibling); |
768 | cpumask_set_cpu(cpu, dstp: &cpuid_topo->thread_sibling); |
769 | } |
770 | } |
771 | |
772 | static void clear_cpu_topology(int cpu) |
773 | { |
774 | struct cpu_topology *cpu_topo = &cpu_topology[cpu]; |
775 | |
776 | cpumask_clear(dstp: &cpu_topo->llc_sibling); |
777 | cpumask_set_cpu(cpu, dstp: &cpu_topo->llc_sibling); |
778 | |
779 | cpumask_clear(dstp: &cpu_topo->cluster_sibling); |
780 | cpumask_set_cpu(cpu, dstp: &cpu_topo->cluster_sibling); |
781 | |
782 | cpumask_clear(dstp: &cpu_topo->core_sibling); |
783 | cpumask_set_cpu(cpu, dstp: &cpu_topo->core_sibling); |
784 | cpumask_clear(dstp: &cpu_topo->thread_sibling); |
785 | cpumask_set_cpu(cpu, dstp: &cpu_topo->thread_sibling); |
786 | } |
787 | |
788 | void __init reset_cpu_topology(void) |
789 | { |
790 | unsigned int cpu; |
791 | |
792 | for_each_possible_cpu(cpu) { |
793 | struct cpu_topology *cpu_topo = &cpu_topology[cpu]; |
794 | |
795 | cpu_topo->thread_id = -1; |
796 | cpu_topo->core_id = -1; |
797 | cpu_topo->cluster_id = -1; |
798 | cpu_topo->package_id = -1; |
799 | |
800 | clear_cpu_topology(cpu); |
801 | } |
802 | } |
803 | |
804 | void remove_cpu_topology(unsigned int cpu) |
805 | { |
806 | int sibling; |
807 | |
808 | for_each_cpu(sibling, topology_core_cpumask(cpu)) |
809 | cpumask_clear_cpu(cpu, topology_core_cpumask(sibling)); |
810 | for_each_cpu(sibling, topology_sibling_cpumask(cpu)) |
811 | cpumask_clear_cpu(cpu, topology_sibling_cpumask(sibling)); |
812 | for_each_cpu(sibling, topology_cluster_cpumask(cpu)) |
813 | cpumask_clear_cpu(cpu, topology_cluster_cpumask(sibling)); |
814 | for_each_cpu(sibling, topology_llc_cpumask(cpu)) |
815 | cpumask_clear_cpu(cpu, dstp: topology_llc_cpumask(sibling)); |
816 | |
817 | clear_cpu_topology(cpu); |
818 | } |
819 | |
820 | __weak int __init parse_acpi_topology(void) |
821 | { |
822 | return 0; |
823 | } |
824 | |
825 | #if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) |
826 | void __init init_cpu_topology(void) |
827 | { |
828 | int cpu, ret; |
829 | |
830 | reset_cpu_topology(); |
831 | ret = parse_acpi_topology(); |
832 | if (!ret) |
833 | ret = of_have_populated_dt() && parse_dt_topology(); |
834 | |
835 | if (ret) { |
836 | /* |
837 | * Discard anything that was parsed if we hit an error so we |
838 | * don't use partial information. But do not return yet to give |
839 | * arch-specific early cache level detection a chance to run. |
840 | */ |
841 | reset_cpu_topology(); |
842 | } |
843 | |
844 | for_each_possible_cpu(cpu) { |
845 | ret = fetch_cache_info(cpu); |
846 | if (!ret) |
847 | continue; |
848 | else if (ret != -ENOENT) |
849 | pr_err("Early cacheinfo failed, ret = %d\n" , ret); |
850 | return; |
851 | } |
852 | } |
853 | |
854 | void store_cpu_topology(unsigned int cpuid) |
855 | { |
856 | struct cpu_topology *cpuid_topo = &cpu_topology[cpuid]; |
857 | |
858 | if (cpuid_topo->package_id != -1) |
859 | goto topology_populated; |
860 | |
861 | cpuid_topo->thread_id = -1; |
862 | cpuid_topo->core_id = cpuid; |
863 | cpuid_topo->package_id = cpu_to_node(cpuid); |
864 | |
865 | pr_debug("CPU%u: package %d core %d thread %d\n" , |
866 | cpuid, cpuid_topo->package_id, cpuid_topo->core_id, |
867 | cpuid_topo->thread_id); |
868 | |
869 | topology_populated: |
870 | update_siblings_masks(cpuid); |
871 | } |
872 | #endif |
873 | |