LCOV - code coverage report
Current view: top level - arch/x86/kernel - smpboot.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 156 669 23.3 %
Date: 2022-04-01 14:58:12 Functions: 19 55 34.5 %
Branches: 38 315 12.1 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-or-later
       2                 :            :  /*
       3                 :            :  *      x86 SMP booting functions
       4                 :            :  *
       5                 :            :  *      (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk>
       6                 :            :  *      (c) 1998, 1999, 2000, 2009 Ingo Molnar <mingo@redhat.com>
       7                 :            :  *      Copyright 2001 Andi Kleen, SuSE Labs.
       8                 :            :  *
       9                 :            :  *      Much of the core SMP work is based on previous work by Thomas Radke, to
      10                 :            :  *      whom a great many thanks are extended.
      11                 :            :  *
      12                 :            :  *      Thanks to Intel for making available several different Pentium,
      13                 :            :  *      Pentium Pro and Pentium-II/Xeon MP machines.
      14                 :            :  *      Original development of Linux SMP code supported by Caldera.
      15                 :            :  *
      16                 :            :  *      Fixes
      17                 :            :  *              Felix Koop      :       NR_CPUS used properly
      18                 :            :  *              Jose Renau      :       Handle single CPU case.
      19                 :            :  *              Alan Cox        :       By repeated request 8) - Total BogoMIPS report.
      20                 :            :  *              Greg Wright     :       Fix for kernel stacks panic.
      21                 :            :  *              Erich Boleyn    :       MP v1.4 and additional changes.
      22                 :            :  *      Matthias Sattler        :       Changes for 2.1 kernel map.
      23                 :            :  *      Michel Lespinasse       :       Changes for 2.1 kernel map.
      24                 :            :  *      Michael Chastain        :       Change trampoline.S to gnu as.
      25                 :            :  *              Alan Cox        :       Dumb bug: 'B' step PPro's are fine
      26                 :            :  *              Ingo Molnar     :       Added APIC timers, based on code
      27                 :            :  *                                      from Jose Renau
      28                 :            :  *              Ingo Molnar     :       various cleanups and rewrites
      29                 :            :  *              Tigran Aivazian :       fixed "0.00 in /proc/uptime on SMP" bug.
      30                 :            :  *      Maciej W. Rozycki       :       Bits for genuine 82489DX APICs
      31                 :            :  *      Andi Kleen              :       Changed for SMP boot into long mode.
      32                 :            :  *              Martin J. Bligh :       Added support for multi-quad systems
      33                 :            :  *              Dave Jones      :       Report invalid combinations of Athlon CPUs.
      34                 :            :  *              Rusty Russell   :       Hacked into shape for new "hotplug" boot process.
      35                 :            :  *      Andi Kleen              :       Converted to new state machine.
      36                 :            :  *      Ashok Raj               :       CPU hotplug support
      37                 :            :  *      Glauber Costa           :       i386 and x86_64 integration
      38                 :            :  */
      39                 :            : 
      40                 :            : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      41                 :            : 
      42                 :            : #include <linux/init.h>
      43                 :            : #include <linux/smp.h>
      44                 :            : #include <linux/export.h>
      45                 :            : #include <linux/sched.h>
      46                 :            : #include <linux/sched/topology.h>
      47                 :            : #include <linux/sched/hotplug.h>
      48                 :            : #include <linux/sched/task_stack.h>
      49                 :            : #include <linux/percpu.h>
      50                 :            : #include <linux/memblock.h>
      51                 :            : #include <linux/err.h>
      52                 :            : #include <linux/nmi.h>
      53                 :            : #include <linux/tboot.h>
      54                 :            : #include <linux/stackprotector.h>
      55                 :            : #include <linux/gfp.h>
      56                 :            : #include <linux/cpuidle.h>
      57                 :            : #include <linux/numa.h>
      58                 :            : 
      59                 :            : #include <asm/acpi.h>
      60                 :            : #include <asm/desc.h>
      61                 :            : #include <asm/nmi.h>
      62                 :            : #include <asm/irq.h>
      63                 :            : #include <asm/realmode.h>
      64                 :            : #include <asm/cpu.h>
      65                 :            : #include <asm/numa.h>
      66                 :            : #include <asm/pgtable.h>
      67                 :            : #include <asm/tlbflush.h>
      68                 :            : #include <asm/mtrr.h>
      69                 :            : #include <asm/mwait.h>
      70                 :            : #include <asm/apic.h>
      71                 :            : #include <asm/io_apic.h>
      72                 :            : #include <asm/fpu/internal.h>
      73                 :            : #include <asm/setup.h>
      74                 :            : #include <asm/uv/uv.h>
      75                 :            : #include <linux/mc146818rtc.h>
      76                 :            : #include <asm/i8259.h>
      77                 :            : #include <asm/misc.h>
      78                 :            : #include <asm/qspinlock.h>
      79                 :            : #include <asm/intel-family.h>
      80                 :            : #include <asm/cpu_device_id.h>
      81                 :            : #include <asm/spec-ctrl.h>
      82                 :            : #include <asm/hw_irq.h>
      83                 :            : 
      84                 :            : /* representing HT siblings of each logical CPU */
      85                 :            : DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_map);
      86                 :            : EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
      87                 :            : 
      88                 :            : /* representing HT and core siblings of each logical CPU */
      89                 :            : DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_map);
      90                 :            : EXPORT_PER_CPU_SYMBOL(cpu_core_map);
      91                 :            : 
      92                 :            : /* representing HT, core, and die siblings of each logical CPU */
      93                 :            : DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_die_map);
      94                 :            : EXPORT_PER_CPU_SYMBOL(cpu_die_map);
      95                 :            : 
      96                 :            : DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_llc_shared_map);
      97                 :            : 
      98                 :            : /* Per CPU bogomips and other parameters */
      99                 :            : DEFINE_PER_CPU_READ_MOSTLY(struct cpuinfo_x86, cpu_info);
     100                 :            : EXPORT_PER_CPU_SYMBOL(cpu_info);
     101                 :            : 
     102                 :            : /* Logical package management. We might want to allocate that dynamically */
     103                 :            : unsigned int __max_logical_packages __read_mostly;
     104                 :            : EXPORT_SYMBOL(__max_logical_packages);
     105                 :            : static unsigned int logical_packages __read_mostly;
     106                 :            : static unsigned int logical_die __read_mostly;
     107                 :            : 
     108                 :            : /* Maximum number of SMT threads on any online core */
     109                 :            : int __read_mostly __max_smt_threads = 1;
     110                 :            : 
     111                 :            : /* Flag to indicate if a complete sched domain rebuild is required */
     112                 :            : bool x86_topology_update;
     113                 :            : 
     114                 :          3 : int arch_update_cpu_topology(void)
     115                 :            : {
     116                 :          3 :         int retval = x86_topology_update;
     117                 :            : 
     118                 :          3 :         x86_topology_update = false;
     119                 :          3 :         return retval;
     120                 :            : }
     121                 :            : 
     122                 :          0 : static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
     123                 :            : {
     124                 :          0 :         unsigned long flags;
     125                 :            : 
     126                 :          0 :         spin_lock_irqsave(&rtc_lock, flags);
     127                 :          0 :         CMOS_WRITE(0xa, 0xf);
     128                 :          0 :         spin_unlock_irqrestore(&rtc_lock, flags);
     129                 :          0 :         *((volatile unsigned short *)phys_to_virt(TRAMPOLINE_PHYS_HIGH)) =
     130                 :          0 :                                                         start_eip >> 4;
     131                 :          0 :         *((volatile unsigned short *)phys_to_virt(TRAMPOLINE_PHYS_LOW)) =
     132                 :          0 :                                                         start_eip & 0xf;
     133                 :          0 : }
     134                 :            : 
     135                 :          0 : static inline void smpboot_restore_warm_reset_vector(void)
     136                 :            : {
     137                 :          0 :         unsigned long flags;
     138                 :            : 
     139                 :            :         /*
     140                 :            :          * Paranoid:  Set warm reset code and vector here back
     141                 :            :          * to default values.
     142                 :            :          */
     143                 :          0 :         spin_lock_irqsave(&rtc_lock, flags);
     144                 :          0 :         CMOS_WRITE(0, 0xf);
     145                 :          0 :         spin_unlock_irqrestore(&rtc_lock, flags);
     146                 :            : 
     147                 :          0 :         *((volatile u32 *)phys_to_virt(TRAMPOLINE_PHYS_LOW)) = 0;
     148                 :          0 : }
     149                 :            : 
     150                 :            : /*
     151                 :            :  * Report back to the Boot Processor during boot time or to the caller processor
     152                 :            :  * during CPU online.
     153                 :            :  */
     154                 :          0 : static void smp_callin(void)
     155                 :            : {
     156                 :          0 :         int cpuid;
     157                 :            : 
     158                 :            :         /*
     159                 :            :          * If waken up by an INIT in an 82489DX configuration
     160                 :            :          * cpu_callout_mask guarantees we don't get here before
     161                 :            :          * an INIT_deassert IPI reaches our local APIC, so it is
     162                 :            :          * now safe to touch our local APIC.
     163                 :            :          */
     164                 :          0 :         cpuid = smp_processor_id();
     165                 :            : 
     166                 :            :         /*
     167                 :            :          * the boot CPU has finished the init stage and is spinning
     168                 :            :          * on callin_map until we finish. We are free to set up this
     169                 :            :          * CPU, first the APIC. (this is probably redundant on most
     170                 :            :          * boards)
     171                 :            :          */
     172                 :          0 :         apic_ap_setup();
     173                 :            : 
     174                 :            :         /*
     175                 :            :          * Save our processor parameters. Note: this information
     176                 :            :          * is needed for clock calibration.
     177                 :            :          */
     178                 :          0 :         smp_store_cpu_info(cpuid);
     179                 :            : 
     180                 :            :         /*
     181                 :            :          * The topology information must be up to date before
     182                 :            :          * calibrate_delay() and notify_cpu_starting().
     183                 :            :          */
     184                 :          0 :         set_cpu_sibling_map(raw_smp_processor_id());
     185                 :            : 
     186                 :            :         /*
     187                 :            :          * Get our bogomips.
     188                 :            :          * Update loops_per_jiffy in cpu_data. Previous call to
     189                 :            :          * smp_store_cpu_info() stored a value that is close but not as
     190                 :            :          * accurate as the value just calculated.
     191                 :            :          */
     192                 :          0 :         calibrate_delay();
     193                 :          0 :         cpu_data(cpuid).loops_per_jiffy = loops_per_jiffy;
     194                 :          0 :         pr_debug("Stack at about %p\n", &cpuid);
     195                 :            : 
     196                 :          0 :         wmb();
     197                 :            : 
     198                 :          0 :         notify_cpu_starting(cpuid);
     199                 :            : 
     200                 :            :         /*
     201                 :            :          * Allow the master to continue.
     202                 :            :          */
     203                 :          0 :         cpumask_set_cpu(cpuid, cpu_callin_mask);
     204                 :          0 : }
     205                 :            : 
     206                 :            : static int cpu0_logical_apicid;
     207                 :            : static int enable_start_cpu0;
     208                 :            : /*
     209                 :            :  * Activate a secondary processor.
     210                 :            :  */
     211                 :          0 : static void notrace start_secondary(void *unused)
     212                 :            : {
     213                 :            :         /*
     214                 :            :          * Don't put *anything* except direct CPU state initialization
     215                 :            :          * before cpu_init(), SMP booting is too fragile that we want to
     216                 :            :          * limit the things done here to the most necessary things.
     217                 :            :          */
     218                 :          0 :         cr4_init();
     219                 :            : 
     220                 :            : #ifdef CONFIG_X86_32
     221                 :            :         /* switch away from the initial page table */
     222                 :            :         load_cr3(swapper_pg_dir);
     223                 :            :         __flush_tlb_all();
     224                 :            : #endif
     225                 :          0 :         load_current_idt();
     226                 :          0 :         cpu_init();
     227                 :          0 :         x86_cpuinit.early_percpu_clock_init();
     228                 :          0 :         preempt_disable();
     229                 :          0 :         smp_callin();
     230                 :            : 
     231                 :          0 :         enable_start_cpu0 = 0;
     232                 :            : 
     233                 :            :         /* otherwise gcc will move up smp_processor_id before the cpu_init */
     234                 :          0 :         barrier();
     235                 :            :         /*
     236                 :            :          * Check TSC synchronization with the boot CPU:
     237                 :            :          */
     238                 :          0 :         check_tsc_sync_target();
     239                 :            : 
     240                 :          0 :         speculative_store_bypass_ht_init();
     241                 :            : 
     242                 :            :         /*
     243                 :            :          * Lock vector_lock, set CPU online and bring the vector
     244                 :            :          * allocator online. Online must be set with vector_lock held
     245                 :            :          * to prevent a concurrent irq setup/teardown from seeing a
     246                 :            :          * half valid vector space.
     247                 :            :          */
     248                 :          0 :         lock_vector_lock();
     249                 :          0 :         set_cpu_online(smp_processor_id(), true);
     250                 :          0 :         lapic_online();
     251                 :          0 :         unlock_vector_lock();
     252                 :          0 :         cpu_set_state_online(smp_processor_id());
     253                 :          0 :         x86_platform.nmi_init();
     254                 :            : 
     255                 :            :         /* enable local interrupts */
     256                 :          0 :         local_irq_enable();
     257                 :            : 
     258                 :            :         /* to prevent fake stack check failure in clock setup */
     259                 :          0 :         boot_init_stack_canary();
     260                 :            : 
     261                 :          0 :         x86_cpuinit.setup_percpu_clockev();
     262                 :            : 
     263                 :          0 :         wmb();
     264                 :          0 :         cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
     265                 :          0 : }
     266                 :            : 
     267                 :            : /**
     268                 :            :  * topology_is_primary_thread - Check whether CPU is the primary SMT thread
     269                 :            :  * @cpu:        CPU to check
     270                 :            :  */
     271                 :          0 : bool topology_is_primary_thread(unsigned int cpu)
     272                 :            : {
     273                 :          0 :         return apic_id_is_primary_thread(per_cpu(x86_cpu_to_apicid, cpu));
     274                 :            : }
     275                 :            : 
     276                 :            : /**
     277                 :            :  * topology_smt_supported - Check whether SMT is supported by the CPUs
     278                 :            :  */
     279                 :          3 : bool topology_smt_supported(void)
     280                 :            : {
     281                 :          3 :         return smp_num_siblings > 1;
     282                 :            : }
     283                 :            : 
     284                 :            : /**
     285                 :            :  * topology_phys_to_logical_pkg - Map a physical package id to a logical
     286                 :            :  *
     287                 :            :  * Returns logical package id or -1 if not found
     288                 :            :  */
     289                 :          3 : int topology_phys_to_logical_pkg(unsigned int phys_pkg)
     290                 :            : {
     291                 :          3 :         int cpu;
     292                 :            : 
     293         [ +  + ]:          6 :         for_each_possible_cpu(cpu) {
     294                 :          3 :                 struct cpuinfo_x86 *c = &cpu_data(cpu);
     295                 :            : 
     296   [ -  +  -  - ]:          3 :                 if (c->initialized && c->phys_proc_id == phys_pkg)
     297                 :          0 :                         return c->logical_proc_id;
     298                 :            :         }
     299                 :            :         return -1;
     300                 :            : }
     301                 :            : EXPORT_SYMBOL(topology_phys_to_logical_pkg);
     302                 :            : /**
     303                 :            :  * topology_phys_to_logical_die - Map a physical die id to logical
     304                 :            :  *
     305                 :            :  * Returns logical die id or -1 if not found
     306                 :            :  */
     307                 :          3 : int topology_phys_to_logical_die(unsigned int die_id, unsigned int cur_cpu)
     308                 :            : {
     309                 :          3 :         int cpu;
     310                 :          3 :         int proc_id = cpu_data(cur_cpu).phys_proc_id;
     311                 :            : 
     312         [ +  + ]:          6 :         for_each_possible_cpu(cpu) {
     313                 :          3 :                 struct cpuinfo_x86 *c = &cpu_data(cpu);
     314                 :            : 
     315   [ -  +  -  - ]:          3 :                 if (c->initialized && c->cpu_die_id == die_id &&
     316         [ #  # ]:          0 :                     c->phys_proc_id == proc_id)
     317                 :          0 :                         return c->logical_die_id;
     318                 :            :         }
     319                 :            :         return -1;
     320                 :            : }
     321                 :            : EXPORT_SYMBOL(topology_phys_to_logical_die);
     322                 :            : 
     323                 :            : /**
     324                 :            :  * topology_update_package_map - Update the physical to logical package map
     325                 :            :  * @pkg:        The physical package id as retrieved via CPUID
     326                 :            :  * @cpu:        The cpu for which this is updated
     327                 :            :  */
     328                 :          3 : int topology_update_package_map(unsigned int pkg, unsigned int cpu)
     329                 :            : {
     330                 :          3 :         int new;
     331                 :            : 
     332                 :            :         /* Already available somewhere? */
     333                 :          3 :         new = topology_phys_to_logical_pkg(pkg);
     334         [ -  + ]:          3 :         if (new >= 0)
     335                 :          0 :                 goto found;
     336                 :            : 
     337                 :          3 :         new = logical_packages++;
     338         [ +  - ]:          3 :         if (new != pkg) {
     339                 :          0 :                 pr_info("CPU %u Converting physical %u to logical package %u\n",
     340                 :            :                         cpu, pkg, new);
     341                 :            :         }
     342                 :          3 : found:
     343                 :          3 :         cpu_data(cpu).logical_proc_id = new;
     344                 :          3 :         return 0;
     345                 :            : }
     346                 :            : /**
     347                 :            :  * topology_update_die_map - Update the physical to logical die map
     348                 :            :  * @die:        The die id as retrieved via CPUID
     349                 :            :  * @cpu:        The cpu for which this is updated
     350                 :            :  */
     351                 :          3 : int topology_update_die_map(unsigned int die, unsigned int cpu)
     352                 :            : {
     353                 :          3 :         int new;
     354                 :            : 
     355                 :            :         /* Already available somewhere? */
     356                 :          3 :         new = topology_phys_to_logical_die(die, cpu);
     357         [ -  + ]:          3 :         if (new >= 0)
     358                 :          0 :                 goto found;
     359                 :            : 
     360                 :          3 :         new = logical_die++;
     361         [ +  - ]:          3 :         if (new != die) {
     362                 :          0 :                 pr_info("CPU %u Converting physical %u to logical die %u\n",
     363                 :            :                         cpu, die, new);
     364                 :            :         }
     365                 :          3 : found:
     366                 :          3 :         cpu_data(cpu).logical_die_id = new;
     367                 :          3 :         return 0;
     368                 :            : }
     369                 :            : 
     370                 :          3 : void __init smp_store_boot_cpu_info(void)
     371                 :            : {
     372                 :          3 :         int id = 0; /* CPU 0 */
     373                 :          3 :         struct cpuinfo_x86 *c = &cpu_data(id);
     374                 :            : 
     375                 :          3 :         *c = boot_cpu_data;
     376                 :          3 :         c->cpu_index = id;
     377                 :          3 :         topology_update_package_map(c->phys_proc_id, id);
     378                 :          3 :         topology_update_die_map(c->cpu_die_id, id);
     379                 :          3 :         c->initialized = true;
     380                 :          3 : }
     381                 :            : 
     382                 :            : /*
     383                 :            :  * The bootstrap kernel entry code has set these up. Save them for
     384                 :            :  * a given CPU
     385                 :            :  */
     386                 :          0 : void smp_store_cpu_info(int id)
     387                 :            : {
     388                 :          0 :         struct cpuinfo_x86 *c = &cpu_data(id);
     389                 :            : 
     390                 :            :         /* Copy boot_cpu_data only on the first bringup */
     391         [ #  # ]:          0 :         if (!c->initialized)
     392                 :          0 :                 *c = boot_cpu_data;
     393                 :          0 :         c->cpu_index = id;
     394                 :            :         /*
     395                 :            :          * During boot time, CPU0 has this setup already. Save the info when
     396                 :            :          * bringing up AP or offlined CPU0.
     397                 :            :          */
     398                 :          0 :         identify_secondary_cpu(c);
     399                 :          0 :         c->initialized = true;
     400                 :          0 : }
     401                 :            : 
     402                 :            : static bool
     403                 :          0 : topology_same_node(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)
     404                 :            : {
     405                 :          0 :         int cpu1 = c->cpu_index, cpu2 = o->cpu_index;
     406                 :            : 
     407                 :          0 :         return (cpu_to_node(cpu1) == cpu_to_node(cpu2));
     408                 :            : }
     409                 :            : 
     410                 :            : static bool
     411                 :            : topology_sane(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o, const char *name)
     412                 :            : {
     413                 :            :         int cpu1 = c->cpu_index, cpu2 = o->cpu_index;
     414                 :            : 
     415                 :            :         return !WARN_ONCE(!topology_same_node(c, o),
     416                 :            :                 "sched: CPU #%d's %s-sibling CPU #%d is not on the same node! "
     417                 :            :                 "[node: %d != %d]. Ignoring dependency.\n",
     418                 :            :                 cpu1, name, cpu2, cpu_to_node(cpu1), cpu_to_node(cpu2));
     419                 :            : }
     420                 :            : 
     421                 :            : #define link_mask(mfunc, c1, c2)                                        \
     422                 :            : do {                                                                    \
     423                 :            :         cpumask_set_cpu((c1), mfunc(c2));                               \
     424                 :            :         cpumask_set_cpu((c2), mfunc(c1));                               \
     425                 :            : } while (0)
     426                 :            : 
     427                 :          0 : static bool match_smt(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)
     428                 :            : {
     429         [ #  # ]:          0 :         if (boot_cpu_has(X86_FEATURE_TOPOEXT)) {
     430                 :          0 :                 int cpu1 = c->cpu_index, cpu2 = o->cpu_index;
     431                 :            : 
     432         [ #  # ]:          0 :                 if (c->phys_proc_id == o->phys_proc_id &&
     433         [ #  # ]:          0 :                     c->cpu_die_id == o->cpu_die_id &&
     434         [ #  # ]:          0 :                     per_cpu(cpu_llc_id, cpu1) == per_cpu(cpu_llc_id, cpu2)) {
     435         [ #  # ]:          0 :                         if (c->cpu_core_id == o->cpu_core_id)
     436                 :          0 :                                 return topology_sane(c, o, "smt");
     437                 :            : 
     438         [ #  # ]:          0 :                         if ((c->cu_id != 0xff) &&
     439   [ #  #  #  # ]:          0 :                             (o->cu_id != 0xff) &&
     440                 :            :                             (c->cu_id == o->cu_id))
     441                 :          0 :                                 return topology_sane(c, o, "smt");
     442                 :            :                 }
     443                 :            : 
     444         [ #  # ]:          0 :         } else if (c->phys_proc_id == o->phys_proc_id &&
     445         [ #  # ]:          0 :                    c->cpu_die_id == o->cpu_die_id &&
     446         [ #  # ]:          0 :                    c->cpu_core_id == o->cpu_core_id) {
     447                 :          0 :                 return topology_sane(c, o, "smt");
     448                 :            :         }
     449                 :            : 
     450                 :            :         return false;
     451                 :            : }
     452                 :            : 
     453                 :            : /*
     454                 :            :  * Define snc_cpu[] for SNC (Sub-NUMA Cluster) CPUs.
     455                 :            :  *
     456                 :            :  * These are Intel CPUs that enumerate an LLC that is shared by
     457                 :            :  * multiple NUMA nodes. The LLC on these systems is shared for
     458                 :            :  * off-package data access but private to the NUMA node (half
     459                 :            :  * of the package) for on-package access.
     460                 :            :  *
     461                 :            :  * CPUID (the source of the information about the LLC) can only
     462                 :            :  * enumerate the cache as being shared *or* unshared, but not
     463                 :            :  * this particular configuration. The CPU in this case enumerates
     464                 :            :  * the cache to be shared across the entire package (spanning both
     465                 :            :  * NUMA nodes).
     466                 :            :  */
     467                 :            : 
     468                 :            : static const struct x86_cpu_id snc_cpu[] = {
     469                 :            :         { X86_VENDOR_INTEL, 6, INTEL_FAM6_SKYLAKE_X },
     470                 :            :         {}
     471                 :            : };
     472                 :            : 
     473                 :          0 : static bool match_llc(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)
     474                 :            : {
     475                 :          0 :         int cpu1 = c->cpu_index, cpu2 = o->cpu_index;
     476                 :            : 
     477                 :            :         /* Do not match if we do not have a valid APICID for cpu: */
     478         [ #  # ]:          0 :         if (per_cpu(cpu_llc_id, cpu1) == BAD_APICID)
     479                 :            :                 return false;
     480                 :            : 
     481                 :            :         /* Do not match if LLC id does not match: */
     482         [ #  # ]:          0 :         if (per_cpu(cpu_llc_id, cpu1) != per_cpu(cpu_llc_id, cpu2))
     483                 :            :                 return false;
     484                 :            : 
     485                 :            :         /*
     486                 :            :          * Allow the SNC topology without warning. Return of false
     487                 :            :          * means 'c' does not share the LLC of 'o'. This will be
     488                 :            :          * reflected to userspace.
     489                 :            :          */
     490   [ #  #  #  # ]:          0 :         if (!topology_same_node(c, o) && x86_match_cpu(snc_cpu))
     491                 :            :                 return false;
     492                 :            : 
     493                 :          0 :         return topology_sane(c, o, "llc");
     494                 :            : }
     495                 :            : 
     496                 :            : /*
     497                 :            :  * Unlike the other levels, we do not enforce keeping a
     498                 :            :  * multicore group inside a NUMA node.  If this happens, we will
     499                 :            :  * discard the MC level of the topology later.
     500                 :            :  */
     501                 :          0 : static bool match_pkg(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)
     502                 :            : {
     503                 :          0 :         if (c->phys_proc_id == o->phys_proc_id)
     504                 :          0 :                 return true;
     505                 :            :         return false;
     506                 :            : }
     507                 :            : 
     508                 :          0 : static bool match_die(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)
     509                 :            : {
     510         [ #  # ]:          0 :         if ((c->phys_proc_id == o->phys_proc_id) &&
     511         [ #  # ]:          0 :                 (c->cpu_die_id == o->cpu_die_id))
     512                 :            :                 return true;
     513                 :            :         return false;
     514                 :            : }
     515                 :            : 
     516                 :            : 
     517                 :            : #if defined(CONFIG_SCHED_SMT) || defined(CONFIG_SCHED_MC)
     518                 :          3 : static inline int x86_sched_itmt_flags(void)
     519                 :            : {
     520   [ +  -  -  - ]:          3 :         return sysctl_sched_itmt_enabled ? SD_ASYM_PACKING : 0;
     521                 :            : }
     522                 :            : 
     523                 :            : #ifdef CONFIG_SCHED_MC
     524                 :          0 : static int x86_core_flags(void)
     525                 :            : {
     526         [ #  # ]:          0 :         return cpu_core_flags() | x86_sched_itmt_flags();
     527                 :            : }
     528                 :            : #endif
     529                 :            : #ifdef CONFIG_SCHED_SMT
     530                 :          3 : static int x86_smt_flags(void)
     531                 :            : {
     532         [ +  - ]:          3 :         return cpu_smt_flags() | x86_sched_itmt_flags();
     533                 :            : }
     534                 :            : #endif
     535                 :            : #endif
     536                 :            : 
     537                 :            : static struct sched_domain_topology_level x86_numa_in_package_topology[] = {
     538                 :            : #ifdef CONFIG_SCHED_SMT
     539                 :            :         { cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) },
     540                 :            : #endif
     541                 :            : #ifdef CONFIG_SCHED_MC
     542                 :            :         { cpu_coregroup_mask, x86_core_flags, SD_INIT_NAME(MC) },
     543                 :            : #endif
     544                 :            :         { NULL, },
     545                 :            : };
     546                 :            : 
     547                 :            : static struct sched_domain_topology_level x86_topology[] = {
     548                 :            : #ifdef CONFIG_SCHED_SMT
     549                 :            :         { cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) },
     550                 :            : #endif
     551                 :            : #ifdef CONFIG_SCHED_MC
     552                 :            :         { cpu_coregroup_mask, x86_core_flags, SD_INIT_NAME(MC) },
     553                 :            : #endif
     554                 :            :         { cpu_cpu_mask, SD_INIT_NAME(DIE) },
     555                 :            :         { NULL, },
     556                 :            : };
     557                 :            : 
     558                 :            : /*
     559                 :            :  * Set if a package/die has multiple NUMA nodes inside.
     560                 :            :  * AMD Magny-Cours, Intel Cluster-on-Die, and Intel
     561                 :            :  * Sub-NUMA Clustering have this.
     562                 :            :  */
     563                 :            : static bool x86_has_numa_in_package;
     564                 :            : 
     565                 :          3 : void set_cpu_sibling_map(int cpu)
     566                 :            : {
     567                 :          3 :         bool has_smt = smp_num_siblings > 1;
     568   [ +  -  +  - ]:          3 :         bool has_mp = has_smt || boot_cpu_data.x86_max_cores > 1;
     569                 :          3 :         struct cpuinfo_x86 *c = &cpu_data(cpu);
     570                 :          3 :         struct cpuinfo_x86 *o;
     571                 :          3 :         int i, threads;
     572                 :            : 
     573                 :          3 :         cpumask_set_cpu(cpu, cpu_sibling_setup_mask);
     574                 :            : 
     575         [ +  - ]:          3 :         if (!has_mp) {
     576                 :          3 :                 cpumask_set_cpu(cpu, topology_sibling_cpumask(cpu));
     577                 :          3 :                 cpumask_set_cpu(cpu, cpu_llc_shared_mask(cpu));
     578                 :          3 :                 cpumask_set_cpu(cpu, topology_core_cpumask(cpu));
     579                 :          3 :                 cpumask_set_cpu(cpu, topology_die_cpumask(cpu));
     580                 :          3 :                 c->booted_cores = 1;
     581                 :          3 :                 return;
     582                 :            :         }
     583                 :            : 
     584         [ #  # ]:          0 :         for_each_cpu(i, cpu_sibling_setup_mask) {
     585                 :          0 :                 o = &cpu_data(i);
     586                 :            : 
     587   [ #  #  #  #  :          0 :                 if ((i == cpu) || (has_smt && match_smt(c, o)))
                   #  # ]
     588                 :          0 :                         link_mask(topology_sibling_cpumask, cpu, i);
     589                 :            : 
     590   [ #  #  #  # ]:          0 :                 if ((i == cpu) || (has_mp && match_llc(c, o)))
     591                 :          0 :                         link_mask(cpu_llc_shared_mask, cpu, i);
     592                 :            : 
     593                 :            :         }
     594                 :            : 
     595                 :            :         /*
     596                 :            :          * This needs a separate iteration over the cpus because we rely on all
     597                 :            :          * topology_sibling_cpumask links to be set-up.
     598                 :            :          */
     599         [ #  # ]:          0 :         for_each_cpu(i, cpu_sibling_setup_mask) {
     600                 :          0 :                 o = &cpu_data(i);
     601                 :            : 
     602   [ #  #  #  # ]:          0 :                 if ((i == cpu) || (has_mp && match_pkg(c, o))) {
     603                 :          0 :                         link_mask(topology_core_cpumask, cpu, i);
     604                 :            : 
     605                 :            :                         /*
     606                 :            :                          *  Does this new cpu bringup a new core?
     607                 :            :                          */
     608                 :          0 :                         if (cpumask_weight(
     609         [ #  # ]:          0 :                             topology_sibling_cpumask(cpu)) == 1) {
     610                 :            :                                 /*
     611                 :            :                                  * for each core in package, increment
     612                 :            :                                  * the booted_cores for this new cpu
     613                 :            :                                  */
     614         [ #  # ]:          0 :                                 if (cpumask_first(
     615                 :          0 :                                     topology_sibling_cpumask(i)) == i)
     616                 :          0 :                                         c->booted_cores++;
     617                 :            :                                 /*
     618                 :            :                                  * increment the core count for all
     619                 :            :                                  * the other cpus in this package
     620                 :            :                                  */
     621         [ #  # ]:          0 :                                 if (i != cpu)
     622                 :          0 :                                         cpu_data(i).booted_cores++;
     623   [ #  #  #  # ]:          0 :                         } else if (i != cpu && !c->booted_cores)
     624                 :          0 :                                 c->booted_cores = cpu_data(i).booted_cores;
     625                 :            :                 }
     626   [ #  #  #  # ]:          0 :                 if (match_pkg(c, o) && !topology_same_node(c, o))
     627                 :          0 :                         x86_has_numa_in_package = true;
     628                 :            : 
     629         [ #  # ]:          0 :                 if ((i == cpu) || (has_mp && match_die(c, o)))
     630                 :          0 :                         link_mask(topology_die_cpumask, cpu, i);
     631                 :            :         }
     632                 :            : 
     633                 :          0 :         threads = cpumask_weight(topology_sibling_cpumask(cpu));
     634         [ #  # ]:          0 :         if (threads > __max_smt_threads)
     635                 :          0 :                 __max_smt_threads = threads;
     636                 :            : }
     637                 :            : 
     638                 :            : /* maps the cpu to the sched domain representing multi-core */
     639                 :          0 : const struct cpumask *cpu_coregroup_mask(int cpu)
     640                 :            : {
     641                 :          0 :         return cpu_llc_shared_mask(cpu);
     642                 :            : }
     643                 :            : 
     644                 :          3 : static void impress_friends(void)
     645                 :            : {
     646                 :          3 :         int cpu;
     647                 :          3 :         unsigned long bogosum = 0;
     648                 :            :         /*
     649                 :            :          * Allow the user to impress friends.
     650                 :            :          */
     651                 :          3 :         pr_debug("Before bogomips\n");
     652         [ +  + ]:          6 :         for_each_possible_cpu(cpu)
     653         [ +  - ]:          3 :                 if (cpumask_test_cpu(cpu, cpu_callout_mask))
     654                 :          3 :                         bogosum += cpu_data(cpu).loops_per_jiffy;
     655                 :          3 :         pr_info("Total of %d processors activated (%lu.%02lu BogoMIPS)\n",
     656                 :            :                 num_online_cpus(),
     657                 :            :                 bogosum/(500000/HZ),
     658                 :            :                 (bogosum/(5000/HZ))%100);
     659                 :            : 
     660                 :          3 :         pr_debug("Before bogocount - setting activated=1\n");
     661                 :          3 : }
     662                 :            : 
     663                 :          0 : void __inquire_remote_apic(int apicid)
     664                 :            : {
     665                 :          0 :         unsigned i, regs[] = { APIC_ID >> 4, APIC_LVR >> 4, APIC_SPIV >> 4 };
     666                 :          0 :         const char * const names[] = { "ID", "VERSION", "SPIV" };
     667                 :          0 :         int timeout;
     668                 :          0 :         u32 status;
     669                 :            : 
     670                 :          0 :         pr_info("Inquiring remote APIC 0x%x...\n", apicid);
     671                 :            : 
     672         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(regs); i++) {
     673                 :          0 :                 pr_info("... APIC 0x%x %s: ", apicid, names[i]);
     674                 :            : 
     675                 :            :                 /*
     676                 :            :                  * Wait for idle.
     677                 :            :                  */
     678                 :          0 :                 status = safe_apic_wait_icr_idle();
     679         [ #  # ]:          0 :                 if (status)
     680                 :          0 :                         pr_cont("a previous APIC delivery may have failed\n");
     681                 :            : 
     682                 :          0 :                 apic_icr_write(APIC_DM_REMRD | regs[i], apicid);
     683                 :            : 
     684                 :          0 :                 timeout = 0;
     685                 :          0 :                 do {
     686                 :          0 :                         udelay(100);
     687                 :          0 :                         status = apic_read(APIC_ICR) & APIC_ICR_RR_MASK;
     688   [ #  #  #  # ]:          0 :                 } while (status == APIC_ICR_RR_INPROG && timeout++ < 1000);
     689                 :            : 
     690         [ #  # ]:          0 :                 switch (status) {
     691                 :            :                 case APIC_ICR_RR_VALID:
     692                 :          0 :                         status = apic_read(APIC_RRR);
     693                 :          0 :                         pr_cont("%08x\n", status);
     694                 :          0 :                         break;
     695                 :          0 :                 default:
     696                 :          0 :                         pr_cont("failed\n");
     697                 :            :                 }
     698                 :            :         }
     699                 :          0 : }
     700                 :            : 
     701                 :            : /*
     702                 :            :  * The Multiprocessor Specification 1.4 (1997) example code suggests
     703                 :            :  * that there should be a 10ms delay between the BSP asserting INIT
     704                 :            :  * and de-asserting INIT, when starting a remote processor.
     705                 :            :  * But that slows boot and resume on modern processors, which include
     706                 :            :  * many cores and don't require that delay.
     707                 :            :  *
     708                 :            :  * Cmdline "init_cpu_udelay=" is available to over-ride this delay.
     709                 :            :  * Modern processor families are quirked to remove the delay entirely.
     710                 :            :  */
     711                 :            : #define UDELAY_10MS_DEFAULT 10000
     712                 :            : 
     713                 :            : static unsigned int init_udelay = UINT_MAX;
     714                 :            : 
     715                 :          0 : static int __init cpu_init_udelay(char *str)
     716                 :            : {
     717                 :          0 :         get_option(&str, &init_udelay);
     718                 :            : 
     719                 :          0 :         return 0;
     720                 :            : }
     721                 :            : early_param("cpu_init_udelay", cpu_init_udelay);
     722                 :            : 
     723                 :          3 : static void __init smp_quirk_init_udelay(void)
     724                 :            : {
     725                 :            :         /* if cmdline changed it from default, leave it alone */
     726         [ +  - ]:          3 :         if (init_udelay != UINT_MAX)
     727                 :            :                 return;
     728                 :            : 
     729                 :            :         /* if modern processor, use no delay */
     730         [ +  - ]:          3 :         if (((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 == 6)) ||
     731   [ -  +  -  -  :          3 :             ((boot_cpu_data.x86_vendor == X86_VENDOR_HYGON) && (boot_cpu_data.x86 >= 0x18)) ||
                   +  - ]
     732         [ -  + ]:          3 :             ((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && (boot_cpu_data.x86 >= 0xF))) {
     733                 :          0 :                 init_udelay = 0;
     734                 :          0 :                 return;
     735                 :            :         }
     736                 :            :         /* else, use legacy delay */
     737                 :          3 :         init_udelay = UDELAY_10MS_DEFAULT;
     738                 :            : }
     739                 :            : 
     740                 :            : /*
     741                 :            :  * Poke the other CPU in the eye via NMI to wake it up. Remember that the normal
     742                 :            :  * INIT, INIT, STARTUP sequence will reset the chip hard for us, and this
     743                 :            :  * won't ... remember to clear down the APIC, etc later.
     744                 :            :  */
     745                 :            : int
     746                 :          0 : wakeup_secondary_cpu_via_nmi(int apicid, unsigned long start_eip)
     747                 :            : {
     748                 :          0 :         unsigned long send_status, accept_status = 0;
     749                 :          0 :         int maxlvt;
     750                 :            : 
     751                 :            :         /* Target chip */
     752                 :            :         /* Boot on the stack */
     753                 :            :         /* Kick the second */
     754                 :          0 :         apic_icr_write(APIC_DM_NMI | apic->dest_logical, apicid);
     755                 :            : 
     756                 :          0 :         pr_debug("Waiting for send to finish...\n");
     757                 :          0 :         send_status = safe_apic_wait_icr_idle();
     758                 :            : 
     759                 :            :         /*
     760                 :            :          * Give the other CPU some time to accept the IPI.
     761                 :            :          */
     762                 :          0 :         udelay(200);
     763                 :          0 :         if (APIC_INTEGRATED(boot_cpu_apic_version)) {
     764                 :          0 :                 maxlvt = lapic_get_maxlvt();
     765         [ #  # ]:          0 :                 if (maxlvt > 3)                      /* Due to the Pentium erratum 3AP.  */
     766                 :          0 :                         apic_write(APIC_ESR, 0);
     767                 :          0 :                 accept_status = (apic_read(APIC_ESR) & 0xEF);
     768                 :            :         }
     769                 :          0 :         pr_debug("NMI sent\n");
     770                 :            : 
     771         [ #  # ]:          0 :         if (send_status)
     772                 :          0 :                 pr_err("APIC never delivered???\n");
     773         [ #  # ]:          0 :         if (accept_status)
     774                 :          0 :                 pr_err("APIC delivery error (%lx)\n", accept_status);
     775                 :            : 
     776                 :          0 :         return (send_status | accept_status);
     777                 :            : }
     778                 :            : 
     779                 :            : static int
     780                 :          0 : wakeup_secondary_cpu_via_init(int phys_apicid, unsigned long start_eip)
     781                 :            : {
     782                 :          0 :         unsigned long send_status = 0, accept_status = 0;
     783                 :          0 :         int maxlvt, num_starts, j;
     784                 :            : 
     785                 :          0 :         maxlvt = lapic_get_maxlvt();
     786                 :            : 
     787                 :            :         /*
     788                 :            :          * Be paranoid about clearing APIC errors.
     789                 :            :          */
     790                 :          0 :         if (APIC_INTEGRATED(boot_cpu_apic_version)) {
     791         [ #  # ]:          0 :                 if (maxlvt > 3)              /* Due to the Pentium erratum 3AP.  */
     792                 :          0 :                         apic_write(APIC_ESR, 0);
     793                 :          0 :                 apic_read(APIC_ESR);
     794                 :            :         }
     795                 :            : 
     796                 :          0 :         pr_debug("Asserting INIT\n");
     797                 :            : 
     798                 :            :         /*
     799                 :            :          * Turn INIT on target chip
     800                 :            :          */
     801                 :            :         /*
     802                 :            :          * Send IPI
     803                 :            :          */
     804                 :          0 :         apic_icr_write(APIC_INT_LEVELTRIG | APIC_INT_ASSERT | APIC_DM_INIT,
     805                 :            :                        phys_apicid);
     806                 :            : 
     807                 :          0 :         pr_debug("Waiting for send to finish...\n");
     808                 :          0 :         send_status = safe_apic_wait_icr_idle();
     809                 :            : 
     810   [ #  #  #  # ]:          0 :         udelay(init_udelay);
     811                 :            : 
     812                 :          0 :         pr_debug("Deasserting INIT\n");
     813                 :            : 
     814                 :            :         /* Target chip */
     815                 :            :         /* Send IPI */
     816                 :          0 :         apic_icr_write(APIC_INT_LEVELTRIG | APIC_DM_INIT, phys_apicid);
     817                 :            : 
     818                 :          0 :         pr_debug("Waiting for send to finish...\n");
     819                 :          0 :         send_status = safe_apic_wait_icr_idle();
     820                 :            : 
     821                 :          0 :         mb();
     822                 :            : 
     823                 :            :         /*
     824                 :            :          * Should we send STARTUP IPIs ?
     825                 :            :          *
     826                 :            :          * Determine this based on the APIC version.
     827                 :            :          * If we don't have an integrated APIC, don't send the STARTUP IPIs.
     828                 :            :          */
     829                 :          0 :         if (APIC_INTEGRATED(boot_cpu_apic_version))
     830                 :          0 :                 num_starts = 2;
     831                 :            :         else
     832                 :            :                 num_starts = 0;
     833                 :            : 
     834                 :            :         /*
     835                 :            :          * Run STARTUP IPI loop.
     836                 :            :          */
     837                 :          0 :         pr_debug("#startup loops: %d\n", num_starts);
     838                 :            : 
     839         [ #  # ]:          0 :         for (j = 1; j <= num_starts; j++) {
     840                 :          0 :                 pr_debug("Sending STARTUP #%d\n", j);
     841         [ #  # ]:          0 :                 if (maxlvt > 3)              /* Due to the Pentium erratum 3AP.  */
     842                 :          0 :                         apic_write(APIC_ESR, 0);
     843                 :          0 :                 apic_read(APIC_ESR);
     844                 :          0 :                 pr_debug("After apic_write\n");
     845                 :            : 
     846                 :            :                 /*
     847                 :            :                  * STARTUP IPI
     848                 :            :                  */
     849                 :            : 
     850                 :            :                 /* Target chip */
     851                 :            :                 /* Boot on the stack */
     852                 :            :                 /* Kick the second */
     853                 :          0 :                 apic_icr_write(APIC_DM_STARTUP | (start_eip >> 12),
     854                 :            :                                phys_apicid);
     855                 :            : 
     856                 :            :                 /*
     857                 :            :                  * Give the other CPU some time to accept the IPI.
     858                 :            :                  */
     859         [ #  # ]:          0 :                 if (init_udelay == 0)
     860                 :          0 :                         udelay(10);
     861                 :            :                 else
     862                 :          0 :                         udelay(300);
     863                 :            : 
     864                 :          0 :                 pr_debug("Startup point 1\n");
     865                 :            : 
     866                 :          0 :                 pr_debug("Waiting for send to finish...\n");
     867                 :          0 :                 send_status = safe_apic_wait_icr_idle();
     868                 :            : 
     869                 :            :                 /*
     870                 :            :                  * Give the other CPU some time to accept the IPI.
     871                 :            :                  */
     872         [ #  # ]:          0 :                 if (init_udelay == 0)
     873                 :          0 :                         udelay(10);
     874                 :            :                 else
     875                 :          0 :                         udelay(200);
     876                 :            : 
     877         [ #  # ]:          0 :                 if (maxlvt > 3)              /* Due to the Pentium erratum 3AP.  */
     878                 :          0 :                         apic_write(APIC_ESR, 0);
     879                 :          0 :                 accept_status = (apic_read(APIC_ESR) & 0xEF);
     880         [ #  # ]:          0 :                 if (send_status || accept_status)
     881                 :            :                         break;
     882                 :            :         }
     883                 :          0 :         pr_debug("After Startup\n");
     884                 :            : 
     885         [ #  # ]:          0 :         if (send_status)
     886                 :          0 :                 pr_err("APIC never delivered???\n");
     887         [ #  # ]:          0 :         if (accept_status)
     888                 :          0 :                 pr_err("APIC delivery error (%lx)\n", accept_status);
     889                 :            : 
     890                 :          0 :         return (send_status | accept_status);
     891                 :            : }
     892                 :            : 
     893                 :            : /* reduce the number of lines printed when booting a large cpu count system */
     894                 :          0 : static void announce_cpu(int cpu, int apicid)
     895                 :            : {
     896                 :          0 :         static int current_node = NUMA_NO_NODE;
     897         [ #  # ]:          0 :         int node = early_cpu_to_node(cpu);
     898                 :          0 :         static int width, node_width;
     899                 :            : 
     900         [ #  # ]:          0 :         if (!width)
     901                 :          0 :                 width = num_digits(num_possible_cpus()) + 1; /* + '#' sign */
     902                 :            : 
     903         [ #  # ]:          0 :         if (!node_width)
     904                 :          0 :                 node_width = num_digits(num_possible_nodes()) + 1; /* + '#' */
     905                 :            : 
     906         [ #  # ]:          0 :         if (cpu == 1)
     907                 :          0 :                 printk(KERN_INFO "x86: Booting SMP configuration:\n");
     908                 :            : 
     909         [ #  # ]:          0 :         if (system_state < SYSTEM_RUNNING) {
     910         [ #  # ]:          0 :                 if (node != current_node) {
     911         [ #  # ]:          0 :                         if (current_node > (-1))
     912                 :          0 :                                 pr_cont("\n");
     913                 :          0 :                         current_node = node;
     914                 :            : 
     915                 :          0 :                         printk(KERN_INFO ".... node %*s#%d, CPUs:  ",
     916                 :          0 :                                node_width - num_digits(node), " ", node);
     917                 :            :                 }
     918                 :            : 
     919                 :            :                 /* Add padding for the BSP */
     920         [ #  # ]:          0 :                 if (cpu == 1)
     921                 :          0 :                         pr_cont("%*s", width + 1, " ");
     922                 :            : 
     923                 :          0 :                 pr_cont("%*s#%d", width - num_digits(cpu), " ", cpu);
     924                 :            : 
     925                 :            :         } else
     926                 :          0 :                 pr_info("Booting Node %d Processor %d APIC 0x%x\n",
     927                 :            :                         node, cpu, apicid);
     928                 :          0 : }
     929                 :            : 
     930                 :          0 : static int wakeup_cpu0_nmi(unsigned int cmd, struct pt_regs *regs)
     931                 :            : {
     932                 :          0 :         int cpu;
     933                 :            : 
     934         [ #  # ]:          0 :         cpu = smp_processor_id();
     935   [ #  #  #  #  :          0 :         if (cpu == 0 && !cpu_online(cpu) && enable_start_cpu0)
                   #  # ]
     936                 :          0 :                 return NMI_HANDLED;
     937                 :            : 
     938                 :            :         return NMI_DONE;
     939                 :            : }
     940                 :            : 
     941                 :            : /*
     942                 :            :  * Wake up AP by INIT, INIT, STARTUP sequence.
     943                 :            :  *
     944                 :            :  * Instead of waiting for STARTUP after INITs, BSP will execute the BIOS
     945                 :            :  * boot-strap code which is not a desired behavior for waking up BSP. To
     946                 :            :  * void the boot-strap code, wake up CPU0 by NMI instead.
     947                 :            :  *
     948                 :            :  * This works to wake up soft offlined CPU0 only. If CPU0 is hard offlined
     949                 :            :  * (i.e. physically hot removed and then hot added), NMI won't wake it up.
     950                 :            :  * We'll change this code in the future to wake up hard offlined CPU0 if
     951                 :            :  * real platform and request are available.
     952                 :            :  */
     953                 :            : static int
     954                 :          0 : wakeup_cpu_via_init_nmi(int cpu, unsigned long start_ip, int apicid,
     955                 :            :                int *cpu0_nmi_registered)
     956                 :            : {
     957                 :          0 :         int id;
     958                 :          0 :         int boot_error;
     959                 :            : 
     960                 :          0 :         preempt_disable();
     961                 :            : 
     962                 :            :         /*
     963                 :            :          * Wake up AP by INIT, INIT, STARTUP sequence.
     964                 :            :          */
     965         [ #  # ]:          0 :         if (cpu) {
     966                 :          0 :                 boot_error = wakeup_secondary_cpu_via_init(apicid, start_ip);
     967                 :          0 :                 goto out;
     968                 :            :         }
     969                 :            : 
     970                 :            :         /*
     971                 :            :          * Wake up BSP by nmi.
     972                 :            :          *
     973                 :            :          * Register a NMI handler to help wake up CPU0.
     974                 :            :          */
     975                 :          0 :         boot_error = register_nmi_handler(NMI_LOCAL,
     976                 :            :                                           wakeup_cpu0_nmi, 0, "wake_cpu0");
     977                 :            : 
     978         [ #  # ]:          0 :         if (!boot_error) {
     979                 :          0 :                 enable_start_cpu0 = 1;
     980                 :          0 :                 *cpu0_nmi_registered = 1;
     981         [ #  # ]:          0 :                 if (apic->dest_logical == APIC_DEST_LOGICAL)
     982                 :          0 :                         id = cpu0_logical_apicid;
     983                 :            :                 else
     984                 :            :                         id = apicid;
     985                 :          0 :                 boot_error = wakeup_secondary_cpu_via_nmi(id, start_ip);
     986                 :            :         }
     987                 :            : 
     988                 :          0 : out:
     989                 :          0 :         preempt_enable();
     990                 :            : 
     991                 :          0 :         return boot_error;
     992                 :            : }
     993                 :            : 
     994                 :          0 : int common_cpu_up(unsigned int cpu, struct task_struct *idle)
     995                 :            : {
     996                 :          0 :         int ret;
     997                 :            : 
     998                 :            :         /* Just in case we booted with a single CPU. */
     999                 :          0 :         alternatives_enable_smp();
    1000                 :            : 
    1001                 :          0 :         per_cpu(current_task, cpu) = idle;
    1002                 :            : 
    1003                 :            :         /* Initialize the interrupt stack(s) */
    1004                 :          0 :         ret = irq_init_percpu_irqstack(cpu);
    1005         [ #  # ]:          0 :         if (ret)
    1006                 :            :                 return ret;
    1007                 :            : 
    1008                 :            : #ifdef CONFIG_X86_32
    1009                 :            :         /* Stack for startup_32 can be just as for start_secondary onwards */
    1010                 :            :         per_cpu(cpu_current_top_of_stack, cpu) = task_top_of_stack(idle);
    1011                 :            : #else
    1012                 :          0 :         initial_gs = per_cpu_offset(cpu);
    1013                 :            : #endif
    1014                 :          0 :         return 0;
    1015                 :            : }
    1016                 :            : 
    1017                 :            : /*
    1018                 :            :  * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad
    1019                 :            :  * (ie clustered apic addressing mode), this is a LOGICAL apic ID.
    1020                 :            :  * Returns zero if CPU booted OK, else error code from
    1021                 :            :  * ->wakeup_secondary_cpu.
    1022                 :            :  */
    1023                 :          0 : static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle,
    1024                 :            :                        int *cpu0_nmi_registered)
    1025                 :            : {
    1026                 :            :         /* start_ip had better be page-aligned! */
    1027                 :          0 :         unsigned long start_ip = real_mode_header->trampoline_start;
    1028                 :            : 
    1029                 :          0 :         unsigned long boot_error = 0;
    1030                 :          0 :         unsigned long timeout;
    1031                 :            : 
    1032                 :          0 :         idle->thread.sp = (unsigned long)task_pt_regs(idle);
    1033                 :          0 :         early_gdt_descr.address = (unsigned long)get_cpu_gdt_rw(cpu);
    1034                 :          0 :         initial_code = (unsigned long)start_secondary;
    1035                 :          0 :         initial_stack  = idle->thread.sp;
    1036                 :            : 
    1037                 :            :         /* Enable the espfix hack for this CPU */
    1038                 :          0 :         init_espfix_ap(cpu);
    1039                 :            : 
    1040                 :            :         /* So we see what's up */
    1041                 :          0 :         announce_cpu(cpu, apicid);
    1042                 :            : 
    1043                 :            :         /*
    1044                 :            :          * This grunge runs the startup process for
    1045                 :            :          * the targeted processor.
    1046                 :            :          */
    1047                 :            : 
    1048         [ #  # ]:          0 :         if (x86_platform.legacy.warm_reset) {
    1049                 :            : 
    1050                 :          0 :                 pr_debug("Setting warm reset code and vector.\n");
    1051                 :            : 
    1052                 :          0 :                 smpboot_setup_warm_reset_vector(start_ip);
    1053                 :            :                 /*
    1054                 :            :                  * Be paranoid about clearing APIC errors.
    1055                 :            :                 */
    1056                 :          0 :                 if (APIC_INTEGRATED(boot_cpu_apic_version)) {
    1057                 :          0 :                         apic_write(APIC_ESR, 0);
    1058                 :          0 :                         apic_read(APIC_ESR);
    1059                 :            :                 }
    1060                 :            :         }
    1061                 :            : 
    1062                 :            :         /*
    1063                 :            :          * AP might wait on cpu_callout_mask in cpu_init() with
    1064                 :            :          * cpu_initialized_mask set if previous attempt to online
    1065                 :            :          * it timed-out. Clear cpu_initialized_mask so that after
    1066                 :            :          * INIT/SIPI it could start with a clean state.
    1067                 :            :          */
    1068                 :          0 :         cpumask_clear_cpu(cpu, cpu_initialized_mask);
    1069                 :          0 :         smp_mb();
    1070                 :            : 
    1071                 :            :         /*
    1072                 :            :          * Wake up a CPU in difference cases:
    1073                 :            :          * - Use the method in the APIC driver if it's defined
    1074                 :            :          * Otherwise,
    1075                 :            :          * - Use an INIT boot APIC message for APs or NMI for BSP.
    1076                 :            :          */
    1077         [ #  # ]:          0 :         if (apic->wakeup_secondary_cpu)
    1078                 :          0 :                 boot_error = apic->wakeup_secondary_cpu(apicid, start_ip);
    1079                 :            :         else
    1080                 :          0 :                 boot_error = wakeup_cpu_via_init_nmi(cpu, start_ip, apicid,
    1081                 :            :                                                      cpu0_nmi_registered);
    1082                 :            : 
    1083         [ #  # ]:          0 :         if (!boot_error) {
    1084                 :            :                 /*
    1085                 :            :                  * Wait 10s total for first sign of life from AP
    1086                 :            :                  */
    1087                 :          0 :                 boot_error = -1;
    1088                 :          0 :                 timeout = jiffies + 10*HZ;
    1089         [ #  # ]:          0 :                 while (time_before(jiffies, timeout)) {
    1090         [ #  # ]:          0 :                         if (cpumask_test_cpu(cpu, cpu_initialized_mask)) {
    1091                 :            :                                 /*
    1092                 :            :                                  * Tell AP to proceed with initialization
    1093                 :            :                                  */
    1094                 :          0 :                                 cpumask_set_cpu(cpu, cpu_callout_mask);
    1095                 :          0 :                                 boot_error = 0;
    1096                 :          0 :                                 break;
    1097                 :            :                         }
    1098                 :          0 :                         schedule();
    1099                 :            :                 }
    1100                 :            :         }
    1101                 :            : 
    1102         [ #  # ]:          0 :         if (!boot_error) {
    1103                 :            :                 /*
    1104                 :            :                  * Wait till AP completes initial initialization
    1105                 :            :                  */
    1106         [ #  # ]:          0 :                 while (!cpumask_test_cpu(cpu, cpu_callin_mask)) {
    1107                 :            :                         /*
    1108                 :            :                          * Allow other tasks to run while we wait for the
    1109                 :            :                          * AP to come online. This also gives a chance
    1110                 :            :                          * for the MTRR work(triggered by the AP coming online)
    1111                 :            :                          * to be completed in the stop machine context.
    1112                 :            :                          */
    1113                 :          0 :                         schedule();
    1114                 :            :                 }
    1115                 :            :         }
    1116                 :            : 
    1117         [ #  # ]:          0 :         if (x86_platform.legacy.warm_reset) {
    1118                 :            :                 /*
    1119                 :            :                  * Cleanup possible dangling ends...
    1120                 :            :                  */
    1121                 :          0 :                 smpboot_restore_warm_reset_vector();
    1122                 :            :         }
    1123                 :            : 
    1124                 :          0 :         return boot_error;
    1125                 :            : }
    1126                 :            : 
    1127                 :          0 : int native_cpu_up(unsigned int cpu, struct task_struct *tidle)
    1128                 :            : {
    1129                 :          0 :         int apicid = apic->cpu_present_to_apicid(cpu);
    1130                 :          0 :         int cpu0_nmi_registered = 0;
    1131                 :          0 :         unsigned long flags;
    1132                 :          0 :         int err, ret = 0;
    1133                 :            : 
    1134                 :          0 :         lockdep_assert_irqs_enabled();
    1135                 :            : 
    1136                 :          0 :         pr_debug("++++++++++++++++++++=_---CPU UP  %u\n", cpu);
    1137                 :            : 
    1138   [ #  #  #  # ]:          0 :         if (apicid == BAD_APICID ||
    1139         [ #  # ]:          0 :             !physid_isset(apicid, phys_cpu_present_map) ||
    1140                 :          0 :             !apic->apic_id_valid(apicid)) {
    1141                 :          0 :                 pr_err("%s: bad cpu %d\n", __func__, cpu);
    1142                 :          0 :                 return -EINVAL;
    1143                 :            :         }
    1144                 :            : 
    1145                 :            :         /*
    1146                 :            :          * Already booted CPU?
    1147                 :            :          */
    1148         [ #  # ]:          0 :         if (cpumask_test_cpu(cpu, cpu_callin_mask)) {
    1149                 :            :                 pr_debug("do_boot_cpu %d Already started\n", cpu);
    1150                 :            :                 return -ENOSYS;
    1151                 :            :         }
    1152                 :            : 
    1153                 :            :         /*
    1154                 :            :          * Save current MTRR state in case it was changed since early boot
    1155                 :            :          * (e.g. by the ACPI SMI) to initialize new CPUs with MTRRs in sync:
    1156                 :            :          */
    1157                 :          0 :         mtrr_save_state();
    1158                 :            : 
    1159                 :            :         /* x86 CPUs take themselves offline, so delayed offline is OK. */
    1160                 :          0 :         err = cpu_check_up_prepare(cpu);
    1161         [ #  # ]:          0 :         if (err && err != -EBUSY)
    1162                 :            :                 return err;
    1163                 :            : 
    1164                 :            :         /* the FPU context is blank, nobody can own it */
    1165                 :          0 :         per_cpu(fpu_fpregs_owner_ctx, cpu) = NULL;
    1166                 :            : 
    1167                 :          0 :         err = common_cpu_up(cpu, tidle);
    1168         [ #  # ]:          0 :         if (err)
    1169                 :            :                 return err;
    1170                 :            : 
    1171                 :          0 :         err = do_boot_cpu(apicid, cpu, tidle, &cpu0_nmi_registered);
    1172         [ #  # ]:          0 :         if (err) {
    1173                 :          0 :                 pr_err("do_boot_cpu failed(%d) to wakeup CPU#%u\n", err, cpu);
    1174                 :          0 :                 ret = -EIO;
    1175                 :          0 :                 goto unreg_nmi;
    1176                 :            :         }
    1177                 :            : 
    1178                 :            :         /*
    1179                 :            :          * Check TSC synchronization with the AP (keep irqs disabled
    1180                 :            :          * while doing so):
    1181                 :            :          */
    1182                 :          0 :         local_irq_save(flags);
    1183                 :          0 :         check_tsc_sync_source(cpu);
    1184                 :          0 :         local_irq_restore(flags);
    1185                 :            : 
    1186         [ #  # ]:          0 :         while (!cpu_online(cpu)) {
    1187                 :          0 :                 cpu_relax();
    1188                 :          0 :                 touch_nmi_watchdog();
    1189                 :            :         }
    1190                 :            : 
    1191                 :          0 : unreg_nmi:
    1192                 :            :         /*
    1193                 :            :          * Clean up the nmi handler. Do this after the callin and callout sync
    1194                 :            :          * to avoid impact of possible long unregister time.
    1195                 :            :          */
    1196         [ #  # ]:          0 :         if (cpu0_nmi_registered)
    1197                 :          0 :                 unregister_nmi_handler(NMI_LOCAL, "wake_cpu0");
    1198                 :            : 
    1199                 :            :         return ret;
    1200                 :            : }
    1201                 :            : 
    1202                 :            : /**
    1203                 :            :  * arch_disable_smp_support() - disables SMP support for x86 at runtime
    1204                 :            :  */
    1205                 :          0 : void arch_disable_smp_support(void)
    1206                 :            : {
    1207                 :          0 :         disable_ioapic_support();
    1208                 :          0 : }
    1209                 :            : 
    1210                 :            : /*
    1211                 :            :  * Fall back to non SMP mode after errors.
    1212                 :            :  *
    1213                 :            :  * RED-PEN audit/test this more. I bet there is more state messed up here.
    1214                 :            :  */
    1215                 :          0 : static __init void disable_smp(void)
    1216                 :            : {
    1217                 :          0 :         pr_info("SMP disabled\n");
    1218                 :            : 
    1219                 :          0 :         disable_ioapic_support();
    1220                 :            : 
    1221                 :          0 :         init_cpu_present(cpumask_of(0));
    1222                 :          0 :         init_cpu_possible(cpumask_of(0));
    1223                 :            : 
    1224         [ #  # ]:          0 :         if (smp_found_config)
    1225                 :          0 :                 physid_set_mask_of_physid(boot_cpu_physical_apicid, &phys_cpu_present_map);
    1226                 :            :         else
    1227                 :          0 :                 physid_set_mask_of_physid(0, &phys_cpu_present_map);
    1228                 :          0 :         cpumask_set_cpu(0, topology_sibling_cpumask(0));
    1229                 :          0 :         cpumask_set_cpu(0, topology_core_cpumask(0));
    1230                 :          0 :         cpumask_set_cpu(0, topology_die_cpumask(0));
    1231                 :          0 : }
    1232                 :            : 
    1233                 :            : /*
    1234                 :            :  * Various sanity checks.
    1235                 :            :  */
    1236                 :          3 : static void __init smp_sanity_check(void)
    1237                 :            : {
    1238                 :          3 :         preempt_disable();
    1239                 :            : 
    1240                 :            : #if !defined(CONFIG_X86_BIGSMP) && defined(CONFIG_X86_32)
    1241                 :            :         if (def_to_bigsmp && nr_cpu_ids > 8) {
    1242                 :            :                 unsigned int cpu;
    1243                 :            :                 unsigned nr;
    1244                 :            : 
    1245                 :            :                 pr_warn("More than 8 CPUs detected - skipping them\n"
    1246                 :            :                         "Use CONFIG_X86_BIGSMP\n");
    1247                 :            : 
    1248                 :            :                 nr = 0;
    1249                 :            :                 for_each_present_cpu(cpu) {
    1250                 :            :                         if (nr >= 8)
    1251                 :            :                                 set_cpu_present(cpu, false);
    1252                 :            :                         nr++;
    1253                 :            :                 }
    1254                 :            : 
    1255                 :            :                 nr = 0;
    1256                 :            :                 for_each_possible_cpu(cpu) {
    1257                 :            :                         if (nr >= 8)
    1258                 :            :                                 set_cpu_possible(cpu, false);
    1259                 :            :                         nr++;
    1260                 :            :                 }
    1261                 :            : 
    1262                 :            :                 nr_cpu_ids = 8;
    1263                 :            :         }
    1264                 :            : #endif
    1265                 :            : 
    1266         [ -  + ]:          3 :         if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) {
    1267                 :          0 :                 pr_warn("weird, boot CPU (#%d) not listed by the BIOS\n",
    1268                 :            :                         hard_smp_processor_id());
    1269                 :            : 
    1270                 :          0 :                 physid_set(hard_smp_processor_id(), phys_cpu_present_map);
    1271                 :            :         }
    1272                 :            : 
    1273                 :            :         /*
    1274                 :            :          * Should not be necessary because the MP table should list the boot
    1275                 :            :          * CPU too, but we do it for the sake of robustness anyway.
    1276                 :            :          */
    1277         [ -  + ]:          3 :         if (!apic->check_phys_apicid_present(boot_cpu_physical_apicid)) {
    1278                 :          0 :                 pr_notice("weird, boot CPU (#%d) not listed by the BIOS\n",
    1279                 :            :                           boot_cpu_physical_apicid);
    1280                 :          0 :                 physid_set(hard_smp_processor_id(), phys_cpu_present_map);
    1281                 :            :         }
    1282                 :          3 :         preempt_enable();
    1283                 :          3 : }
    1284                 :            : 
    1285                 :          3 : static void __init smp_cpu_index_default(void)
    1286                 :            : {
    1287                 :          3 :         int i;
    1288                 :          3 :         struct cpuinfo_x86 *c;
    1289                 :            : 
    1290         [ +  + ]:          6 :         for_each_possible_cpu(i) {
    1291                 :          3 :                 c = &cpu_data(i);
    1292                 :            :                 /* mark all to hotplug */
    1293                 :          3 :                 c->cpu_index = nr_cpu_ids;
    1294                 :            :         }
    1295                 :          3 : }
    1296                 :            : 
    1297                 :          3 : static void __init smp_get_logical_apicid(void)
    1298                 :            : {
    1299                 :          3 :         if (x2apic_mode)
    1300                 :            :                 cpu0_logical_apicid = apic_read(APIC_LDR);
    1301                 :            :         else
    1302                 :          3 :                 cpu0_logical_apicid = GET_APIC_LOGICAL_ID(apic_read(APIC_LDR));
    1303                 :          3 : }
    1304                 :            : 
    1305                 :            : /*
    1306                 :            :  * Prepare for SMP bootup.
    1307                 :            :  * @max_cpus: configured maximum number of CPUs, It is a legacy parameter
    1308                 :            :  *            for common interface support.
    1309                 :            :  */
    1310                 :          3 : void __init native_smp_prepare_cpus(unsigned int max_cpus)
    1311                 :            : {
    1312                 :          3 :         unsigned int i;
    1313                 :            : 
    1314                 :          3 :         smp_cpu_index_default();
    1315                 :            : 
    1316                 :            :         /*
    1317                 :            :          * Setup boot CPU information
    1318                 :            :          */
    1319                 :          3 :         smp_store_boot_cpu_info(); /* Final full version of the data */
    1320                 :          3 :         cpumask_copy(cpu_callin_mask, cpumask_of(0));
    1321                 :          3 :         mb();
    1322                 :            : 
    1323         [ +  + ]:          9 :         for_each_possible_cpu(i) {
    1324                 :          3 :                 zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL);
    1325                 :          3 :                 zalloc_cpumask_var(&per_cpu(cpu_core_map, i), GFP_KERNEL);
    1326                 :          3 :                 zalloc_cpumask_var(&per_cpu(cpu_die_map, i), GFP_KERNEL);
    1327                 :          3 :                 zalloc_cpumask_var(&per_cpu(cpu_llc_shared_map, i), GFP_KERNEL);
    1328                 :            :         }
    1329                 :            : 
    1330                 :            :         /*
    1331                 :            :          * Set 'default' x86 topology, this matches default_topology() in that
    1332                 :            :          * it has NUMA nodes as a topology level. See also
    1333                 :            :          * native_smp_cpus_done().
    1334                 :            :          *
    1335                 :            :          * Must be done before set_cpus_sibling_map() is ran.
    1336                 :            :          */
    1337                 :          3 :         set_sched_topology(x86_topology);
    1338                 :            : 
    1339                 :          3 :         set_cpu_sibling_map(0);
    1340                 :            : 
    1341                 :          3 :         smp_sanity_check();
    1342                 :            : 
    1343      [ -  -  + ]:          3 :         switch (apic_intr_mode) {
    1344                 :          0 :         case APIC_PIC:
    1345                 :            :         case APIC_VIRTUAL_WIRE_NO_CONFIG:
    1346                 :          0 :                 disable_smp();
    1347                 :          0 :                 return;
    1348                 :          0 :         case APIC_SYMMETRIC_IO_NO_ROUTING:
    1349                 :          0 :                 disable_smp();
    1350                 :            :                 /* Setup local timer */
    1351                 :          0 :                 x86_init.timers.setup_percpu_clockev();
    1352                 :          0 :                 return;
    1353                 :            :         case APIC_VIRTUAL_WIRE:
    1354                 :            :         case APIC_SYMMETRIC_IO:
    1355                 :            :                 break;
    1356                 :            :         }
    1357                 :            : 
    1358                 :            :         /* Setup local timer */
    1359                 :          3 :         x86_init.timers.setup_percpu_clockev();
    1360                 :            : 
    1361                 :          3 :         smp_get_logical_apicid();
    1362                 :            : 
    1363                 :          3 :         pr_info("CPU0: ");
    1364                 :          3 :         print_cpu_info(&cpu_data(0));
    1365                 :            : 
    1366                 :          3 :         uv_system_init();
    1367                 :            : 
    1368                 :          3 :         set_mtrr_aps_delayed_init();
    1369                 :            : 
    1370                 :          3 :         smp_quirk_init_udelay();
    1371                 :            : 
    1372                 :          3 :         speculative_store_bypass_ht_init();
    1373                 :            : }
    1374                 :            : 
    1375                 :          0 : void arch_enable_nonboot_cpus_begin(void)
    1376                 :            : {
    1377                 :          0 :         set_mtrr_aps_delayed_init();
    1378                 :          0 : }
    1379                 :            : 
    1380                 :          0 : void arch_enable_nonboot_cpus_end(void)
    1381                 :            : {
    1382                 :          0 :         mtrr_aps_init();
    1383                 :          0 : }
    1384                 :            : 
    1385                 :            : /*
    1386                 :            :  * Early setup to make printk work.
    1387                 :            :  */
    1388                 :          3 : void __init native_smp_prepare_boot_cpu(void)
    1389                 :            : {
    1390                 :          3 :         int me = smp_processor_id();
    1391                 :          3 :         switch_to_new_gdt(me);
    1392                 :            :         /* already set me in cpu_online_mask in boot_cpu_init() */
    1393                 :          3 :         cpumask_set_cpu(me, cpu_callout_mask);
    1394                 :          3 :         cpu_set_state_online(me);
    1395                 :          3 :         native_pv_lock_init();
    1396                 :          3 : }
    1397                 :            : 
    1398                 :          3 : void __init calculate_max_logical_packages(void)
    1399                 :            : {
    1400                 :          3 :         int ncpus;
    1401                 :            : 
    1402                 :            :         /*
    1403                 :            :          * Today neither Intel nor AMD support heterogenous systems so
    1404                 :            :          * extrapolate the boot cpu's data to all packages.
    1405                 :            :          */
    1406                 :          3 :         ncpus = cpu_data(0).booted_cores * topology_max_smt_threads();
    1407                 :          3 :         __max_logical_packages = DIV_ROUND_UP(total_cpus, ncpus);
    1408                 :          3 :         pr_info("Max logical packages: %u\n", __max_logical_packages);
    1409                 :          3 : }
    1410                 :            : 
    1411                 :          3 : void __init native_smp_cpus_done(unsigned int max_cpus)
    1412                 :            : {
    1413                 :          3 :         pr_debug("Boot done\n");
    1414                 :            : 
    1415                 :          3 :         calculate_max_logical_packages();
    1416                 :            : 
    1417         [ -  + ]:          3 :         if (x86_has_numa_in_package)
    1418                 :          0 :                 set_sched_topology(x86_numa_in_package_topology);
    1419                 :            : 
    1420                 :          3 :         nmi_selftest();
    1421                 :          3 :         impress_friends();
    1422                 :          3 :         mtrr_aps_init();
    1423                 :          3 : }
    1424                 :            : 
    1425                 :            : static int __initdata setup_possible_cpus = -1;
    1426                 :          0 : static int __init _setup_possible_cpus(char *str)
    1427                 :            : {
    1428                 :          0 :         get_option(&str, &setup_possible_cpus);
    1429                 :          0 :         return 0;
    1430                 :            : }
    1431                 :            : early_param("possible_cpus", _setup_possible_cpus);
    1432                 :            : 
    1433                 :            : 
    1434                 :            : /*
    1435                 :            :  * cpu_possible_mask should be static, it cannot change as cpu's
    1436                 :            :  * are onlined, or offlined. The reason is per-cpu data-structures
    1437                 :            :  * are allocated by some modules at init time, and dont expect to
    1438                 :            :  * do this dynamically on cpu arrival/departure.
    1439                 :            :  * cpu_present_mask on the other hand can change dynamically.
    1440                 :            :  * In case when cpu_hotplug is not compiled, then we resort to current
    1441                 :            :  * behaviour, which is cpu_possible == cpu_present.
    1442                 :            :  * - Ashok Raj
    1443                 :            :  *
    1444                 :            :  * Three ways to find out the number of additional hotplug CPUs:
    1445                 :            :  * - If the BIOS specified disabled CPUs in ACPI/mptables use that.
    1446                 :            :  * - The user can overwrite it with possible_cpus=NUM
    1447                 :            :  * - Otherwise don't reserve additional CPUs.
    1448                 :            :  * We do this because additional CPUs waste a lot of memory.
    1449                 :            :  * -AK
    1450                 :            :  */
    1451                 :          3 : __init void prefill_possible_map(void)
    1452                 :            : {
    1453                 :          3 :         int i, possible;
    1454                 :            : 
    1455                 :            :         /* No boot processor was found in mptable or ACPI MADT */
    1456         [ -  + ]:          3 :         if (!num_processors) {
    1457         [ #  # ]:          0 :                 if (boot_cpu_has(X86_FEATURE_APIC)) {
    1458                 :          0 :                         int apicid = boot_cpu_physical_apicid;
    1459                 :          0 :                         int cpu = hard_smp_processor_id();
    1460                 :            : 
    1461                 :          0 :                         pr_warn("Boot CPU (id %d) not listed by BIOS\n", cpu);
    1462                 :            : 
    1463                 :            :                         /* Make sure boot cpu is enumerated */
    1464   [ #  #  #  # ]:          0 :                         if (apic->cpu_present_to_apicid(0) == BAD_APICID &&
    1465                 :          0 :                             apic->apic_id_valid(apicid))
    1466                 :          0 :                                 generic_processor_info(apicid, boot_cpu_apic_version);
    1467                 :            :                 }
    1468                 :            : 
    1469         [ #  # ]:          0 :                 if (!num_processors)
    1470                 :          0 :                         num_processors = 1;
    1471                 :            :         }
    1472                 :            : 
    1473                 :          3 :         i = setup_max_cpus ?: 1;
    1474         [ +  - ]:          3 :         if (setup_possible_cpus == -1) {
    1475                 :          3 :                 possible = num_processors;
    1476                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1477         [ +  - ]:          3 :                 if (setup_max_cpus)
    1478                 :          3 :                         possible += disabled_cpus;
    1479                 :            : #else
    1480                 :            :                 if (possible > i)
    1481                 :            :                         possible = i;
    1482                 :            : #endif
    1483                 :            :         } else
    1484                 :            :                 possible = setup_possible_cpus;
    1485                 :            : 
    1486                 :          3 :         total_cpus = max_t(int, possible, num_processors + disabled_cpus);
    1487                 :            : 
    1488                 :            :         /* nr_cpu_ids could be reduced via nr_cpus= */
    1489         [ -  + ]:          3 :         if (possible > nr_cpu_ids) {
    1490                 :          0 :                 pr_warn("%d Processors exceeds NR_CPUS limit of %u\n",
    1491                 :            :                         possible, nr_cpu_ids);
    1492                 :          0 :                 possible = nr_cpu_ids;
    1493                 :            :         }
    1494                 :            : 
    1495                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1496         [ -  + ]:          3 :         if (!setup_max_cpus)
    1497                 :            : #endif
    1498         [ #  # ]:          0 :         if (possible > i) {
    1499                 :          0 :                 pr_warn("%d Processors exceeds max_cpus limit of %u\n",
    1500                 :            :                         possible, setup_max_cpus);
    1501                 :          0 :                 possible = i;
    1502                 :            :         }
    1503                 :            : 
    1504                 :          3 :         nr_cpu_ids = possible;
    1505                 :            : 
    1506                 :          3 :         pr_info("Allowing %d CPUs, %d hotplug CPUs\n",
    1507                 :            :                 possible, max_t(int, possible - num_processors, 0));
    1508                 :            : 
    1509                 :          3 :         reset_cpu_possible_mask();
    1510                 :            : 
    1511         [ +  + ]:          6 :         for (i = 0; i < possible; i++)
    1512                 :          3 :                 set_cpu_possible(i, true);
    1513                 :          3 : }
    1514                 :            : 
    1515                 :            : #ifdef CONFIG_HOTPLUG_CPU
    1516                 :            : 
    1517                 :            : /* Recompute SMT state for all CPUs on offline */
    1518                 :          0 : static void recompute_smt_state(void)
    1519                 :            : {
    1520                 :          0 :         int max_threads, cpu;
    1521                 :            : 
    1522                 :          0 :         max_threads = 0;
    1523         [ #  # ]:          0 :         for_each_online_cpu (cpu) {
    1524                 :          0 :                 int threads = cpumask_weight(topology_sibling_cpumask(cpu));
    1525                 :            : 
    1526                 :          0 :                 if (threads > max_threads)
    1527                 :            :                         max_threads = threads;
    1528                 :            :         }
    1529                 :          0 :         __max_smt_threads = max_threads;
    1530                 :          0 : }
    1531                 :            : 
    1532                 :          0 : static void remove_siblinginfo(int cpu)
    1533                 :            : {
    1534                 :          0 :         int sibling;
    1535                 :          0 :         struct cpuinfo_x86 *c = &cpu_data(cpu);
    1536                 :            : 
    1537         [ #  # ]:          0 :         for_each_cpu(sibling, topology_core_cpumask(cpu)) {
    1538                 :          0 :                 cpumask_clear_cpu(cpu, topology_core_cpumask(sibling));
    1539                 :            :                 /*/
    1540                 :            :                  * last thread sibling in this cpu core going down
    1541                 :            :                  */
    1542         [ #  # ]:          0 :                 if (cpumask_weight(topology_sibling_cpumask(cpu)) == 1)
    1543                 :          0 :                         cpu_data(sibling).booted_cores--;
    1544                 :            :         }
    1545                 :            : 
    1546         [ #  # ]:          0 :         for_each_cpu(sibling, topology_die_cpumask(cpu))
    1547                 :          0 :                 cpumask_clear_cpu(cpu, topology_die_cpumask(sibling));
    1548         [ #  # ]:          0 :         for_each_cpu(sibling, topology_sibling_cpumask(cpu))
    1549                 :          0 :                 cpumask_clear_cpu(cpu, topology_sibling_cpumask(sibling));
    1550         [ #  # ]:          0 :         for_each_cpu(sibling, cpu_llc_shared_mask(cpu))
    1551                 :          0 :                 cpumask_clear_cpu(cpu, cpu_llc_shared_mask(sibling));
    1552                 :          0 :         cpumask_clear(cpu_llc_shared_mask(cpu));
    1553                 :          0 :         cpumask_clear(topology_sibling_cpumask(cpu));
    1554                 :          0 :         cpumask_clear(topology_core_cpumask(cpu));
    1555                 :          0 :         cpumask_clear(topology_die_cpumask(cpu));
    1556                 :          0 :         c->cpu_core_id = 0;
    1557                 :          0 :         c->booted_cores = 0;
    1558                 :          0 :         cpumask_clear_cpu(cpu, cpu_sibling_setup_mask);
    1559                 :          0 :         recompute_smt_state();
    1560                 :          0 : }
    1561                 :            : 
    1562                 :          0 : static void remove_cpu_from_maps(int cpu)
    1563                 :            : {
    1564                 :          0 :         set_cpu_online(cpu, false);
    1565                 :          0 :         cpumask_clear_cpu(cpu, cpu_callout_mask);
    1566                 :          0 :         cpumask_clear_cpu(cpu, cpu_callin_mask);
    1567                 :            :         /* was set by cpu_init() */
    1568                 :          0 :         cpumask_clear_cpu(cpu, cpu_initialized_mask);
    1569                 :          0 :         numa_remove_cpu(cpu);
    1570                 :          0 : }
    1571                 :            : 
    1572                 :          0 : void cpu_disable_common(void)
    1573                 :            : {
    1574                 :          0 :         int cpu = smp_processor_id();
    1575                 :            : 
    1576                 :          0 :         remove_siblinginfo(cpu);
    1577                 :            : 
    1578                 :            :         /* It's now safe to remove this processor from the online map */
    1579                 :          0 :         lock_vector_lock();
    1580                 :          0 :         remove_cpu_from_maps(cpu);
    1581                 :          0 :         unlock_vector_lock();
    1582                 :          0 :         fixup_irqs();
    1583                 :          0 :         lapic_offline();
    1584                 :          0 : }
    1585                 :            : 
    1586                 :          0 : int native_cpu_disable(void)
    1587                 :            : {
    1588                 :          0 :         int ret;
    1589                 :            : 
    1590                 :          0 :         ret = lapic_can_unplug_cpu();
    1591         [ #  # ]:          0 :         if (ret)
    1592                 :            :                 return ret;
    1593                 :            : 
    1594                 :            :         /*
    1595                 :            :          * Disable the local APIC. Otherwise IPI broadcasts will reach
    1596                 :            :          * it. It still responds normally to INIT, NMI, SMI, and SIPI
    1597                 :            :          * messages.
    1598                 :            :          */
    1599                 :          0 :         apic_soft_disable();
    1600                 :          0 :         cpu_disable_common();
    1601                 :            : 
    1602                 :          0 :         return 0;
    1603                 :            : }
    1604                 :            : 
    1605                 :          0 : int common_cpu_die(unsigned int cpu)
    1606                 :            : {
    1607                 :          0 :         int ret = 0;
    1608                 :            : 
    1609                 :            :         /* We don't do anything here: idle task is faking death itself. */
    1610                 :            : 
    1611                 :            :         /* They ack this in play_dead() by setting CPU_DEAD */
    1612         [ #  # ]:          0 :         if (cpu_wait_death(cpu, 5)) {
    1613         [ #  # ]:          0 :                 if (system_state == SYSTEM_RUNNING)
    1614                 :          0 :                         pr_info("CPU %u is now offline\n", cpu);
    1615                 :            :         } else {
    1616                 :          0 :                 pr_err("CPU %u didn't die...\n", cpu);
    1617                 :          0 :                 ret = -1;
    1618                 :            :         }
    1619                 :            : 
    1620                 :          0 :         return ret;
    1621                 :            : }
    1622                 :            : 
    1623                 :          0 : void native_cpu_die(unsigned int cpu)
    1624                 :            : {
    1625                 :          0 :         common_cpu_die(cpu);
    1626                 :          0 : }
    1627                 :            : 
    1628                 :          0 : void play_dead_common(void)
    1629                 :            : {
    1630                 :          0 :         idle_task_exit();
    1631                 :            : 
    1632                 :            :         /* Ack it */
    1633                 :          0 :         (void)cpu_report_death();
    1634                 :            : 
    1635                 :            :         /*
    1636                 :            :          * With physical CPU hotplug, we should halt the cpu
    1637                 :            :          */
    1638                 :          0 :         local_irq_disable();
    1639                 :          0 : }
    1640                 :            : 
    1641                 :          0 : static bool wakeup_cpu0(void)
    1642                 :            : {
    1643   [ #  #  #  # ]:          0 :         if (smp_processor_id() == 0 && enable_start_cpu0)
    1644                 :          0 :                 return true;
    1645                 :            : 
    1646                 :            :         return false;
    1647                 :            : }
    1648                 :            : 
    1649                 :            : /*
    1650                 :            :  * We need to flush the caches before going to sleep, lest we have
    1651                 :            :  * dirty data in our caches when we come back up.
    1652                 :            :  */
    1653                 :          0 : static inline void mwait_play_dead(void)
    1654                 :            : {
    1655                 :          0 :         unsigned int eax, ebx, ecx, edx;
    1656                 :          0 :         unsigned int highest_cstate = 0;
    1657                 :          0 :         unsigned int highest_subcstate = 0;
    1658                 :          0 :         void *mwait_ptr;
    1659                 :          0 :         int i;
    1660                 :            : 
    1661         [ #  # ]:          0 :         if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD ||
    1662                 :            :             boot_cpu_data.x86_vendor == X86_VENDOR_HYGON)
    1663                 :            :                 return;
    1664         [ #  # ]:          0 :         if (!this_cpu_has(X86_FEATURE_MWAIT))
    1665                 :            :                 return;
    1666         [ #  # ]:          0 :         if (!this_cpu_has(X86_FEATURE_CLFLUSH))
    1667                 :            :                 return;
    1668         [ #  # ]:          0 :         if (__this_cpu_read(cpu_info.cpuid_level) < CPUID_MWAIT_LEAF)
    1669                 :            :                 return;
    1670                 :            : 
    1671                 :          0 :         eax = CPUID_MWAIT_LEAF;
    1672                 :          0 :         ecx = 0;
    1673                 :          0 :         native_cpuid(&eax, &ebx, &ecx, &edx);
    1674                 :            : 
    1675                 :            :         /*
    1676                 :            :          * eax will be 0 if EDX enumeration is not valid.
    1677                 :            :          * Initialized below to cstate, sub_cstate value when EDX is valid.
    1678                 :            :          */
    1679         [ #  # ]:          0 :         if (!(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED)) {
    1680                 :            :                 eax = 0;
    1681                 :            :         } else {
    1682                 :          0 :                 edx >>= MWAIT_SUBSTATE_SIZE;
    1683   [ #  #  #  # ]:          0 :                 for (i = 0; i < 7 && edx; i++, edx >>= MWAIT_SUBSTATE_SIZE) {
    1684         [ #  # ]:          0 :                         if (edx & MWAIT_SUBSTATE_MASK) {
    1685                 :          0 :                                 highest_cstate = i;
    1686                 :          0 :                                 highest_subcstate = edx & MWAIT_SUBSTATE_MASK;
    1687                 :            :                         }
    1688                 :            :                 }
    1689                 :          0 :                 eax = (highest_cstate << MWAIT_SUBSTATE_SIZE) |
    1690                 :          0 :                         (highest_subcstate - 1);
    1691                 :            :         }
    1692                 :            : 
    1693                 :            :         /*
    1694                 :            :          * This should be a memory location in a cache line which is
    1695                 :            :          * unlikely to be touched by other processors.  The actual
    1696                 :            :          * content is immaterial as it is not actually modified in any way.
    1697                 :            :          */
    1698                 :          0 :         mwait_ptr = &current_thread_info()->flags;
    1699                 :            : 
    1700                 :          0 :         wbinvd();
    1701                 :            : 
    1702                 :          0 :         while (1) {
    1703                 :            :                 /*
    1704                 :            :                  * The CLFLUSH is a workaround for erratum AAI65 for
    1705                 :            :                  * the Xeon 7400 series.  It's not clear it is actually
    1706                 :            :                  * needed, but it should be harmless in either case.
    1707                 :            :                  * The WBINVD is insufficient due to the spurious-wakeup
    1708                 :            :                  * case where we return around the loop.
    1709                 :            :                  */
    1710                 :          0 :                 mb();
    1711                 :          0 :                 clflush(mwait_ptr);
    1712                 :          0 :                 mb();
    1713                 :          0 :                 __monitor(mwait_ptr, 0, 0);
    1714                 :          0 :                 mb();
    1715         [ #  # ]:          0 :                 __mwait(eax, 0);
    1716                 :            :                 /*
    1717                 :            :                  * If NMI wants to wake up CPU0, start CPU0.
    1718                 :            :                  */
    1719         [ #  # ]:          0 :                 if (wakeup_cpu0())
    1720                 :          0 :                         start_cpu0();
    1721                 :            :         }
    1722                 :            : }
    1723                 :            : 
    1724                 :          0 : void hlt_play_dead(void)
    1725                 :            : {
    1726         [ #  # ]:          0 :         if (__this_cpu_read(cpu_info.x86) >= 4)
    1727                 :          0 :                 wbinvd();
    1728                 :            : 
    1729                 :          0 :         while (1) {
    1730         [ #  # ]:          0 :                 native_halt();
    1731                 :            :                 /*
    1732                 :            :                  * If NMI wants to wake up CPU0, start CPU0.
    1733                 :            :                  */
    1734         [ #  # ]:          0 :                 if (wakeup_cpu0())
    1735                 :          0 :                         start_cpu0();
    1736                 :            :         }
    1737                 :            : }
    1738                 :            : 
    1739                 :          0 : void native_play_dead(void)
    1740                 :            : {
    1741                 :          0 :         play_dead_common();
    1742                 :          0 :         tboot_shutdown(TB_SHUTDOWN_WFS);
    1743                 :            : 
    1744                 :          0 :         mwait_play_dead();      /* Only returns on failure */
    1745         [ #  # ]:          0 :         if (cpuidle_play_dead())
    1746                 :          0 :                 hlt_play_dead();
    1747                 :          0 : }
    1748                 :            : 
    1749                 :            : #else /* ... !CONFIG_HOTPLUG_CPU */
    1750                 :            : int native_cpu_disable(void)
    1751                 :            : {
    1752                 :            :         return -ENOSYS;
    1753                 :            : }
    1754                 :            : 
    1755                 :            : void native_cpu_die(unsigned int cpu)
    1756                 :            : {
    1757                 :            :         /* We said "no" in __cpu_disable */
    1758                 :            :         BUG();
    1759                 :            : }
    1760                 :            : 
    1761                 :            : void native_play_dead(void)
    1762                 :            : {
    1763                 :            :         BUG();
    1764                 :            : }
    1765                 :            : 
    1766                 :            : #endif

Generated by: LCOV version 1.14