root/drivers/base/arch_topology.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. arch_set_freq_scale
  2. topology_set_cpu_scale
  3. cpu_capacity_show
  4. register_cpu_capacity_sysctl
  5. topology_update_cpu_topology
  6. update_topology_flags_workfn
  7. free_raw_capacity
  8. topology_normalize_cpu_scale
  9. topology_parse_cpu_capacity
  10. init_cpu_capacity_callback
  11. register_cpufreq_notifier
  12. parsing_done_workfn
  13. get_cpu_for_node
  14. parse_core
  15. parse_cluster
  16. parse_dt_topology
  17. cpu_coregroup_mask
  18. update_siblings_masks
  19. clear_cpu_topology
  20. reset_cpu_topology
  21. remove_cpu_topology
  22. parse_acpi_topology
  23. init_cpu_topology

   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/cpu.h>
  11 #include <linux/cpufreq.h>
  12 #include <linux/device.h>
  13 #include <linux/of.h>
  14 #include <linux/slab.h>
  15 #include <linux/string.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/percpu.h>
  21 #include <linux/sched.h>
  22 #include <linux/smp.h>
  23 
  24 DEFINE_PER_CPU(unsigned long, freq_scale) = SCHED_CAPACITY_SCALE;
  25 
  26 void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq,
  27                          unsigned long max_freq)
  28 {
  29         unsigned long scale;
  30         int i;
  31 
  32         scale = (cur_freq << SCHED_CAPACITY_SHIFT) / max_freq;
  33 
  34         for_each_cpu(i, cpus)
  35                 per_cpu(freq_scale, i) = scale;
  36 }
  37 
  38 DEFINE_PER_CPU(unsigned long, cpu_scale) = SCHED_CAPACITY_SCALE;
  39 
  40 void topology_set_cpu_scale(unsigned int cpu, unsigned long capacity)
  41 {
  42         per_cpu(cpu_scale, cpu) = capacity;
  43 }
  44 
  45 static ssize_t cpu_capacity_show(struct device *dev,
  46                                  struct device_attribute *attr,
  47                                  char *buf)
  48 {
  49         struct cpu *cpu = container_of(dev, struct cpu, dev);
  50 
  51         return sprintf(buf, "%lu\n", topology_get_cpu_scale(cpu->dev.id));
  52 }
  53 
  54 static void update_topology_flags_workfn(struct work_struct *work);
  55 static DECLARE_WORK(update_topology_flags_work, update_topology_flags_workfn);
  56 
  57 static DEVICE_ATTR_RO(cpu_capacity);
  58 
  59 static int register_cpu_capacity_sysctl(void)
  60 {
  61         int i;
  62         struct device *cpu;
  63 
  64         for_each_possible_cpu(i) {
  65                 cpu = get_cpu_device(i);
  66                 if (!cpu) {
  67                         pr_err("%s: too early to get CPU%d device!\n",
  68                                __func__, i);
  69                         continue;
  70                 }
  71                 device_create_file(cpu, &dev_attr_cpu_capacity);
  72         }
  73 
  74         return 0;
  75 }
  76 subsys_initcall(register_cpu_capacity_sysctl);
  77 
  78 static int update_topology;
  79 
  80 int topology_update_cpu_topology(void)
  81 {
  82         return update_topology;
  83 }
  84 
  85 /*
  86  * Updating the sched_domains can't be done directly from cpufreq callbacks
  87  * due to locking, so queue the work for later.
  88  */
  89 static void update_topology_flags_workfn(struct work_struct *work)
  90 {
  91         update_topology = 1;
  92         rebuild_sched_domains();
  93         pr_debug("sched_domain hierarchy rebuilt, flags updated\n");
  94         update_topology = 0;
  95 }
  96 
  97 static u32 capacity_scale;
  98 static u32 *raw_capacity;
  99 
 100 static int free_raw_capacity(void)
 101 {
 102         kfree(raw_capacity);
 103         raw_capacity = NULL;
 104 
 105         return 0;
 106 }
 107 
 108 void topology_normalize_cpu_scale(void)
 109 {
 110         u64 capacity;
 111         int cpu;
 112 
 113         if (!raw_capacity)
 114                 return;
 115 
 116         pr_debug("cpu_capacity: capacity_scale=%u\n", capacity_scale);
 117         for_each_possible_cpu(cpu) {
 118                 pr_debug("cpu_capacity: cpu=%d raw_capacity=%u\n",
 119                          cpu, raw_capacity[cpu]);
 120                 capacity = (raw_capacity[cpu] << SCHED_CAPACITY_SHIFT)
 121                         / capacity_scale;
 122                 topology_set_cpu_scale(cpu, capacity);
 123                 pr_debug("cpu_capacity: CPU%d cpu_capacity=%lu\n",
 124                         cpu, topology_get_cpu_scale(cpu));
 125         }
 126 }
 127 
 128 bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
 129 {
 130         static bool cap_parsing_failed;
 131         int ret;
 132         u32 cpu_capacity;
 133 
 134         if (cap_parsing_failed)
 135                 return false;
 136 
 137         ret = of_property_read_u32(cpu_node, "capacity-dmips-mhz",
 138                                    &cpu_capacity);
 139         if (!ret) {
 140                 if (!raw_capacity) {
 141                         raw_capacity = kcalloc(num_possible_cpus(),
 142                                                sizeof(*raw_capacity),
 143                                                GFP_KERNEL);
 144                         if (!raw_capacity) {
 145                                 cap_parsing_failed = true;
 146                                 return false;
 147                         }
 148                 }
 149                 capacity_scale = max(cpu_capacity, capacity_scale);
 150                 raw_capacity[cpu] = cpu_capacity;
 151                 pr_debug("cpu_capacity: %pOF cpu_capacity=%u (raw)\n",
 152                         cpu_node, raw_capacity[cpu]);
 153         } else {
 154                 if (raw_capacity) {
 155                         pr_err("cpu_capacity: missing %pOF raw capacity\n",
 156                                 cpu_node);
 157                         pr_err("cpu_capacity: partial information: fallback to 1024 for all CPUs\n");
 158                 }
 159                 cap_parsing_failed = true;
 160                 free_raw_capacity();
 161         }
 162 
 163         return !ret;
 164 }
 165 
 166 #ifdef CONFIG_CPU_FREQ
 167 static cpumask_var_t cpus_to_visit;
 168 static void parsing_done_workfn(struct work_struct *work);
 169 static DECLARE_WORK(parsing_done_work, parsing_done_workfn);
 170 
 171 static int
 172 init_cpu_capacity_callback(struct notifier_block *nb,
 173                            unsigned long val,
 174                            void *data)
 175 {
 176         struct cpufreq_policy *policy = data;
 177         int cpu;
 178 
 179         if (!raw_capacity)
 180                 return 0;
 181 
 182         if (val != CPUFREQ_CREATE_POLICY)
 183                 return 0;
 184 
 185         pr_debug("cpu_capacity: init cpu capacity for CPUs [%*pbl] (to_visit=%*pbl)\n",
 186                  cpumask_pr_args(policy->related_cpus),
 187                  cpumask_pr_args(cpus_to_visit));
 188 
 189         cpumask_andnot(cpus_to_visit, cpus_to_visit, policy->related_cpus);
 190 
 191         for_each_cpu(cpu, policy->related_cpus) {
 192                 raw_capacity[cpu] = topology_get_cpu_scale(cpu) *
 193                                     policy->cpuinfo.max_freq / 1000UL;
 194                 capacity_scale = max(raw_capacity[cpu], capacity_scale);
 195         }
 196 
 197         if (cpumask_empty(cpus_to_visit)) {
 198                 topology_normalize_cpu_scale();
 199                 schedule_work(&update_topology_flags_work);
 200                 free_raw_capacity();
 201                 pr_debug("cpu_capacity: parsing done\n");
 202                 schedule_work(&parsing_done_work);
 203         }
 204 
 205         return 0;
 206 }
 207 
 208 static struct notifier_block init_cpu_capacity_notifier = {
 209         .notifier_call = init_cpu_capacity_callback,
 210 };
 211 
 212 static int __init register_cpufreq_notifier(void)
 213 {
 214         int ret;
 215 
 216         /*
 217          * on ACPI-based systems we need to use the default cpu capacity
 218          * until we have the necessary code to parse the cpu capacity, so
 219          * skip registering cpufreq notifier.
 220          */
 221         if (!acpi_disabled || !raw_capacity)
 222                 return -EINVAL;
 223 
 224         if (!alloc_cpumask_var(&cpus_to_visit, GFP_KERNEL))
 225                 return -ENOMEM;
 226 
 227         cpumask_copy(cpus_to_visit, cpu_possible_mask);
 228 
 229         ret = cpufreq_register_notifier(&init_cpu_capacity_notifier,
 230                                         CPUFREQ_POLICY_NOTIFIER);
 231 
 232         if (ret)
 233                 free_cpumask_var(cpus_to_visit);
 234 
 235         return ret;
 236 }
 237 core_initcall(register_cpufreq_notifier);
 238 
 239 static void parsing_done_workfn(struct work_struct *work)
 240 {
 241         cpufreq_unregister_notifier(&init_cpu_capacity_notifier,
 242                                          CPUFREQ_POLICY_NOTIFIER);
 243         free_cpumask_var(cpus_to_visit);
 244 }
 245 
 246 #else
 247 core_initcall(free_raw_capacity);
 248 #endif
 249 
 250 #if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)
 251 static int __init get_cpu_for_node(struct device_node *node)
 252 {
 253         struct device_node *cpu_node;
 254         int cpu;
 255 
 256         cpu_node = of_parse_phandle(node, "cpu", 0);
 257         if (!cpu_node)
 258                 return -1;
 259 
 260         cpu = of_cpu_node_to_id(cpu_node);
 261         if (cpu >= 0)
 262                 topology_parse_cpu_capacity(cpu_node, cpu);
 263         else
 264                 pr_crit("Unable to find CPU node for %pOF\n", cpu_node);
 265 
 266         of_node_put(cpu_node);
 267         return cpu;
 268 }
 269 
 270 static int __init parse_core(struct device_node *core, int package_id,
 271                              int core_id)
 272 {
 273         char name[10];
 274         bool leaf = true;
 275         int i = 0;
 276         int cpu;
 277         struct device_node *t;
 278 
 279         do {
 280                 snprintf(name, sizeof(name), "thread%d", i);
 281                 t = of_get_child_by_name(core, name);
 282                 if (t) {
 283                         leaf = false;
 284                         cpu = get_cpu_for_node(t);
 285                         if (cpu >= 0) {
 286                                 cpu_topology[cpu].package_id = package_id;
 287                                 cpu_topology[cpu].core_id = core_id;
 288                                 cpu_topology[cpu].thread_id = i;
 289                         } else {
 290                                 pr_err("%pOF: Can't get CPU for thread\n",
 291                                        t);
 292                                 of_node_put(t);
 293                                 return -EINVAL;
 294                         }
 295                         of_node_put(t);
 296                 }
 297                 i++;
 298         } while (t);
 299 
 300         cpu = get_cpu_for_node(core);
 301         if (cpu >= 0) {
 302                 if (!leaf) {
 303                         pr_err("%pOF: Core has both threads and CPU\n",
 304                                core);
 305                         return -EINVAL;
 306                 }
 307 
 308                 cpu_topology[cpu].package_id = package_id;
 309                 cpu_topology[cpu].core_id = core_id;
 310         } else if (leaf) {
 311                 pr_err("%pOF: Can't get CPU for leaf core\n", core);
 312                 return -EINVAL;
 313         }
 314 
 315         return 0;
 316 }
 317 
 318 static int __init parse_cluster(struct device_node *cluster, int depth)
 319 {
 320         char name[10];
 321         bool leaf = true;
 322         bool has_cores = false;
 323         struct device_node *c;
 324         static int package_id __initdata;
 325         int core_id = 0;
 326         int i, ret;
 327 
 328         /*
 329          * First check for child clusters; we currently ignore any
 330          * information about the nesting of clusters and present the
 331          * scheduler with a flat list of them.
 332          */
 333         i = 0;
 334         do {
 335                 snprintf(name, sizeof(name), "cluster%d", i);
 336                 c = of_get_child_by_name(cluster, name);
 337                 if (c) {
 338                         leaf = false;
 339                         ret = parse_cluster(c, depth + 1);
 340                         of_node_put(c);
 341                         if (ret != 0)
 342                                 return ret;
 343                 }
 344                 i++;
 345         } while (c);
 346 
 347         /* Now check for cores */
 348         i = 0;
 349         do {
 350                 snprintf(name, sizeof(name), "core%d", i);
 351                 c = of_get_child_by_name(cluster, name);
 352                 if (c) {
 353                         has_cores = true;
 354 
 355                         if (depth == 0) {
 356                                 pr_err("%pOF: cpu-map children should be clusters\n",
 357                                        c);
 358                                 of_node_put(c);
 359                                 return -EINVAL;
 360                         }
 361 
 362                         if (leaf) {
 363                                 ret = parse_core(c, package_id, core_id++);
 364                         } else {
 365                                 pr_err("%pOF: Non-leaf cluster with core %s\n",
 366                                        cluster, name);
 367                                 ret = -EINVAL;
 368                         }
 369 
 370                         of_node_put(c);
 371                         if (ret != 0)
 372                                 return ret;
 373                 }
 374                 i++;
 375         } while (c);
 376 
 377         if (leaf && !has_cores)
 378                 pr_warn("%pOF: empty cluster\n", cluster);
 379 
 380         if (leaf)
 381                 package_id++;
 382 
 383         return 0;
 384 }
 385 
 386 static int __init parse_dt_topology(void)
 387 {
 388         struct device_node *cn, *map;
 389         int ret = 0;
 390         int cpu;
 391 
 392         cn = of_find_node_by_path("/cpus");
 393         if (!cn) {
 394                 pr_err("No CPU information found in DT\n");
 395                 return 0;
 396         }
 397 
 398         /*
 399          * When topology is provided cpu-map is essentially a root
 400          * cluster with restricted subnodes.
 401          */
 402         map = of_get_child_by_name(cn, "cpu-map");
 403         if (!map)
 404                 goto out;
 405 
 406         ret = parse_cluster(map, 0);
 407         if (ret != 0)
 408                 goto out_map;
 409 
 410         topology_normalize_cpu_scale();
 411 
 412         /*
 413          * Check that all cores are in the topology; the SMP code will
 414          * only mark cores described in the DT as possible.
 415          */
 416         for_each_possible_cpu(cpu)
 417                 if (cpu_topology[cpu].package_id == -1)
 418                         ret = -EINVAL;
 419 
 420 out_map:
 421         of_node_put(map);
 422 out:
 423         of_node_put(cn);
 424         return ret;
 425 }
 426 #endif
 427 
 428 /*
 429  * cpu topology table
 430  */
 431 struct cpu_topology cpu_topology[NR_CPUS];
 432 EXPORT_SYMBOL_GPL(cpu_topology);
 433 
 434 const struct cpumask *cpu_coregroup_mask(int cpu)
 435 {
 436         const cpumask_t *core_mask = cpumask_of_node(cpu_to_node(cpu));
 437 
 438         /* Find the smaller of NUMA, core or LLC siblings */
 439         if (cpumask_subset(&cpu_topology[cpu].core_sibling, core_mask)) {
 440                 /* not numa in package, lets use the package siblings */
 441                 core_mask = &cpu_topology[cpu].core_sibling;
 442         }
 443         if (cpu_topology[cpu].llc_id != -1) {
 444                 if (cpumask_subset(&cpu_topology[cpu].llc_sibling, core_mask))
 445                         core_mask = &cpu_topology[cpu].llc_sibling;
 446         }
 447 
 448         return core_mask;
 449 }
 450 
 451 void update_siblings_masks(unsigned int cpuid)
 452 {
 453         struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid];
 454         int cpu;
 455 
 456         /* update core and thread sibling masks */
 457         for_each_online_cpu(cpu) {
 458                 cpu_topo = &cpu_topology[cpu];
 459 
 460                 if (cpuid_topo->llc_id == cpu_topo->llc_id) {
 461                         cpumask_set_cpu(cpu, &cpuid_topo->llc_sibling);
 462                         cpumask_set_cpu(cpuid, &cpu_topo->llc_sibling);
 463                 }
 464 
 465                 if (cpuid_topo->package_id != cpu_topo->package_id)
 466                         continue;
 467 
 468                 cpumask_set_cpu(cpuid, &cpu_topo->core_sibling);
 469                 cpumask_set_cpu(cpu, &cpuid_topo->core_sibling);
 470 
 471                 if (cpuid_topo->core_id != cpu_topo->core_id)
 472                         continue;
 473 
 474                 cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling);
 475                 cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling);
 476         }
 477 }
 478 
 479 static void clear_cpu_topology(int cpu)
 480 {
 481         struct cpu_topology *cpu_topo = &cpu_topology[cpu];
 482 
 483         cpumask_clear(&cpu_topo->llc_sibling);
 484         cpumask_set_cpu(cpu, &cpu_topo->llc_sibling);
 485 
 486         cpumask_clear(&cpu_topo->core_sibling);
 487         cpumask_set_cpu(cpu, &cpu_topo->core_sibling);
 488         cpumask_clear(&cpu_topo->thread_sibling);
 489         cpumask_set_cpu(cpu, &cpu_topo->thread_sibling);
 490 }
 491 
 492 void __init reset_cpu_topology(void)
 493 {
 494         unsigned int cpu;
 495 
 496         for_each_possible_cpu(cpu) {
 497                 struct cpu_topology *cpu_topo = &cpu_topology[cpu];
 498 
 499                 cpu_topo->thread_id = -1;
 500                 cpu_topo->core_id = -1;
 501                 cpu_topo->package_id = -1;
 502                 cpu_topo->llc_id = -1;
 503 
 504                 clear_cpu_topology(cpu);
 505         }
 506 }
 507 
 508 void remove_cpu_topology(unsigned int cpu)
 509 {
 510         int sibling;
 511 
 512         for_each_cpu(sibling, topology_core_cpumask(cpu))
 513                 cpumask_clear_cpu(cpu, topology_core_cpumask(sibling));
 514         for_each_cpu(sibling, topology_sibling_cpumask(cpu))
 515                 cpumask_clear_cpu(cpu, topology_sibling_cpumask(sibling));
 516         for_each_cpu(sibling, topology_llc_cpumask(cpu))
 517                 cpumask_clear_cpu(cpu, topology_llc_cpumask(sibling));
 518 
 519         clear_cpu_topology(cpu);
 520 }
 521 
 522 __weak int __init parse_acpi_topology(void)
 523 {
 524         return 0;
 525 }
 526 
 527 #if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)
 528 void __init init_cpu_topology(void)
 529 {
 530         reset_cpu_topology();
 531 
 532         /*
 533          * Discard anything that was parsed if we hit an error so we
 534          * don't use partial information.
 535          */
 536         if (parse_acpi_topology())
 537                 reset_cpu_topology();
 538         else if (of_have_populated_dt() && parse_dt_topology())
 539                 reset_cpu_topology();
 540 }
 541 #endif

/* [<][>][^][v][top][bottom][index][help] */