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(cpus, &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(&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, &scale_freq_counters_mask); 81 } 82 } 83 84 rcu_read_unlock(); 85 86 update_scale_freq_invariant(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, &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(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(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, 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, "%lu\n", topology_get_cpu_scale(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(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(cpu, &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(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(capacity << SCHED_CAPACITY_SHIFT, 290 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(cpu_node, "capacity-dmips-mhz", 308 &cpu_capacity); 309 if (!ret) { 310 if (!raw_capacity) { 311 raw_capacity = kcalloc(num_possible_cpus(), 312 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(cpu_node, 0); 330 if (!PTR_ERR_OR_ZERO(cpu_clk)) { 331 per_cpu(freq_factor, cpu) = 332 clk_get_rate(cpu_clk) / 1000; 333 clk_put(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_disabled || !acpi_cpc_valid())) 357 return; 358 359 raw_capacity = kcalloc(num_possible_cpus(), 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, &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(&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(cpus_to_visit, cpus_to_visit, 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(cpus_to_visit)) { 417 topology_normalize_cpu_scale(); 418 schedule_work(&update_topology_flags_work); 419 free_raw_capacity(); 420 pr_debug("cpu_capacity: parsing done\n"); 421 schedule_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(&cpus_to_visit, GFP_KERNEL)) 443 return -ENOMEM; 444 445 cpumask_copy(cpus_to_visit, cpu_possible_mask); 446 447 ret = cpufreq_register_notifier(&init_cpu_capacity_notifier, 448 CPUFREQ_POLICY_NOTIFIER); 449 450 if (ret) 451 free_cpumask_var(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(&init_cpu_capacity_notifier, 460 CPUFREQ_POLICY_NOTIFIER); 461 free_cpumask_var(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 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].core_id = core_id; 517 cpu_topology[cpu].thread_id = i; 518 } else if (cpu != -ENODEV) { 519 pr_err("%pOF: Can't get CPU for thread\n", t); 520 of_node_put(t); 521 return -EINVAL; 522 } 523 of_node_put(t); 524 } 525 i++; 526 } while (t); 527 528 cpu = get_cpu_for_node(core); 529 if (cpu >= 0) { 530 if (!leaf) { 531 pr_err("%pOF: Core has both threads and CPU\n", 532 core); 533 return -EINVAL; 534 } 535 536 cpu_topology[cpu].package_id = package_id; 537 cpu_topology[cpu].core_id = core_id; 538 } else if (leaf && cpu != -ENODEV) { 539 pr_err("%pOF: Can't get CPU for leaf core\n", core); 540 return -EINVAL; 541 } 542 543 return 0; 544 } 545 546 static int __init parse_cluster(struct device_node *cluster, int depth) 547 { 548 char name[20]; 549 bool leaf = true; 550 bool has_cores = false; 551 struct device_node *c; 552 static int package_id __initdata; 553 int core_id = 0; 554 int i, ret; 555 556 /* 557 * First check for child clusters; we currently ignore any 558 * information about the nesting of clusters and present the 559 * scheduler with a flat list of them. 560 */ 561 i = 0; 562 do { 563 snprintf(name, sizeof(name), "cluster%d", i); 564 c = of_get_child_by_name(cluster, name); 565 if (c) { 566 leaf = false; 567 ret = parse_cluster(c, depth + 1); 568 of_node_put(c); 569 if (ret != 0) 570 return ret; 571 } 572 i++; 573 } while (c); 574 575 /* Now check for cores */ 576 i = 0; 577 do { 578 snprintf(name, sizeof(name), "core%d", i); 579 c = of_get_child_by_name(cluster, name); 580 if (c) { 581 has_cores = true; 582 583 if (depth == 0) { 584 pr_err("%pOF: cpu-map children should be clusters\n", 585 c); 586 of_node_put(c); 587 return -EINVAL; 588 } 589 590 if (leaf) { 591 ret = parse_core(c, package_id, core_id++); 592 } else { 593 pr_err("%pOF: Non-leaf cluster with core %s\n", 594 cluster, name); 595 ret = -EINVAL; 596 } 597 598 of_node_put(c); 599 if (ret != 0) 600 return ret; 601 } 602 i++; 603 } while (c); 604 605 if (leaf && !has_cores) 606 pr_warn("%pOF: empty cluster\n", cluster); 607 608 if (leaf) 609 package_id++; 610 611 return 0; 612 } 613 614 static int __init parse_dt_topology(void) 615 { 616 struct device_node *cn, *map; 617 int ret = 0; 618 int cpu; 619 620 cn = of_find_node_by_path("/cpus"); 621 if (!cn) { 622 pr_err("No CPU information found in DT\n"); 623 return 0; 624 } 625 626 /* 627 * When topology is provided cpu-map is essentially a root 628 * cluster with restricted subnodes. 629 */ 630 map = of_get_child_by_name(cn, "cpu-map"); 631 if (!map) 632 goto out; 633 634 ret = parse_cluster(map, 0); 635 if (ret != 0) 636 goto out_map; 637 638 topology_normalize_cpu_scale(); 639 640 /* 641 * Check that all cores are in the topology; the SMP code will 642 * only mark cores described in the DT as possible. 643 */ 644 for_each_possible_cpu(cpu) 645 if (cpu_topology[cpu].package_id == -1) 646 ret = -EINVAL; 647 648 out_map: 649 of_node_put(map); 650 out: 651 of_node_put(cn); 652 return ret; 653 } 654 #endif 655 656 /* 657 * cpu topology table 658 */ 659 struct cpu_topology cpu_topology[NR_CPUS]; 660 EXPORT_SYMBOL_GPL(cpu_topology); 661 662 const struct cpumask *cpu_coregroup_mask(int cpu) 663 { 664 const cpumask_t *core_mask = cpumask_of_node(cpu_to_node(cpu)); 665 666 /* Find the smaller of NUMA, core or LLC siblings */ 667 if (cpumask_subset(&cpu_topology[cpu].core_sibling, core_mask)) { 668 /* not numa in package, lets use the package siblings */ 669 core_mask = &cpu_topology[cpu].core_sibling; 670 } 671 672 if (last_level_cache_is_valid(cpu)) { 673 if (cpumask_subset(&cpu_topology[cpu].llc_sibling, core_mask)) 674 core_mask = &cpu_topology[cpu].llc_sibling; 675 } 676 677 /* 678 * For systems with no shared cpu-side LLC but with clusters defined, 679 * extend core_mask to cluster_siblings. The sched domain builder will 680 * then remove MC as redundant with CLS if SCHED_CLUSTER is enabled. 681 */ 682 if (IS_ENABLED(CONFIG_SCHED_CLUSTER) && 683 cpumask_subset(core_mask, &cpu_topology[cpu].cluster_sibling)) 684 core_mask = &cpu_topology[cpu].cluster_sibling; 685 686 return core_mask; 687 } 688 689 const struct cpumask *cpu_clustergroup_mask(int cpu) 690 { 691 return &cpu_topology[cpu].cluster_sibling; 692 } 693 694 void update_siblings_masks(unsigned int cpuid) 695 { 696 struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; 697 int cpu; 698 699 /* update core and thread sibling masks */ 700 for_each_online_cpu(cpu) { 701 cpu_topo = &cpu_topology[cpu]; 702 703 if (last_level_cache_is_shared(cpu, cpuid)) { 704 cpumask_set_cpu(cpu, &cpuid_topo->llc_sibling); 705 cpumask_set_cpu(cpuid, &cpu_topo->llc_sibling); 706 } 707 708 if (cpuid_topo->package_id != cpu_topo->package_id) 709 continue; 710 711 if (cpuid_topo->cluster_id == cpu_topo->cluster_id && 712 cpuid_topo->cluster_id != -1) { 713 cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); 714 cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); 715 } 716 717 cpumask_set_cpu(cpuid, &cpu_topo->core_sibling); 718 cpumask_set_cpu(cpu, &cpuid_topo->core_sibling); 719 720 if (cpuid_topo->core_id != cpu_topo->core_id) 721 continue; 722 723 cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling); 724 cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling); 725 } 726 } 727 728 static void clear_cpu_topology(int cpu) 729 { 730 struct cpu_topology *cpu_topo = &cpu_topology[cpu]; 731 732 cpumask_clear(&cpu_topo->llc_sibling); 733 cpumask_set_cpu(cpu, &cpu_topo->llc_sibling); 734 735 cpumask_clear(&cpu_topo->cluster_sibling); 736 cpumask_set_cpu(cpu, &cpu_topo->cluster_sibling); 737 738 cpumask_clear(&cpu_topo->core_sibling); 739 cpumask_set_cpu(cpu, &cpu_topo->core_sibling); 740 cpumask_clear(&cpu_topo->thread_sibling); 741 cpumask_set_cpu(cpu, &cpu_topo->thread_sibling); 742 } 743 744 void __init reset_cpu_topology(void) 745 { 746 unsigned int cpu; 747 748 for_each_possible_cpu(cpu) { 749 struct cpu_topology *cpu_topo = &cpu_topology[cpu]; 750 751 cpu_topo->thread_id = -1; 752 cpu_topo->core_id = -1; 753 cpu_topo->cluster_id = -1; 754 cpu_topo->package_id = -1; 755 cpu_topo->llc_id = -1; 756 757 clear_cpu_topology(cpu); 758 } 759 } 760 761 void remove_cpu_topology(unsigned int cpu) 762 { 763 int sibling; 764 765 for_each_cpu(sibling, topology_core_cpumask(cpu)) 766 cpumask_clear_cpu(cpu, topology_core_cpumask(sibling)); 767 for_each_cpu(sibling, topology_sibling_cpumask(cpu)) 768 cpumask_clear_cpu(cpu, topology_sibling_cpumask(sibling)); 769 for_each_cpu(sibling, topology_cluster_cpumask(cpu)) 770 cpumask_clear_cpu(cpu, topology_cluster_cpumask(sibling)); 771 for_each_cpu(sibling, topology_llc_cpumask(cpu)) 772 cpumask_clear_cpu(cpu, topology_llc_cpumask(sibling)); 773 774 clear_cpu_topology(cpu); 775 } 776 777 __weak int __init parse_acpi_topology(void) 778 { 779 return 0; 780 } 781 782 #if defined(CONFIG_ARM64) || defined(CONFIG_RISCV) 783 void __init init_cpu_topology(void) 784 { 785 int ret, cpu; 786 787 reset_cpu_topology(); 788 ret = parse_acpi_topology(); 789 if (!ret) 790 ret = of_have_populated_dt() && parse_dt_topology(); 791 792 if (ret) { 793 /* 794 * Discard anything that was parsed if we hit an error so we 795 * don't use partial information. 796 */ 797 reset_cpu_topology(); 798 return; 799 } 800 801 for_each_possible_cpu(cpu) { 802 ret = detect_cache_attributes(cpu); 803 if (ret) { 804 pr_info("Early cacheinfo failed, ret = %d\n", ret); 805 break; 806 } 807 } 808 } 809 #endif 810