11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/arch/m32r/kernel/smpboot.c 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * orig : i386 2.4.10 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * M32R SMP booting functions 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2001, 2002, 2003 Hitoshi Yamamoto 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Taken from i386 version. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) 1995 Alan Cox, Building #3 <alan@redhat.com> 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com> 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Much of the core SMP work is based on previous work by Thomas Radke, to 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * whom a great many thanks are extended. 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Thanks to Intel for making available several different Pentium, 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Pentium Pro and Pentium-II/Xeon MP machines. 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Original development of Linux SMP code supported by Caldera. 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This code is released under the GNU General Public License version 2 or 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * later. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixes 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Felix Koop : NR_CPUS used properly 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Jose Renau : Handle single CPU case. 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alan Cox : By repeated request 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8) - Total BogoMIP report. 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Greg Wright : Fix for kernel stacks panic. 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Erich Boleyn : MP v1.4 and additional changes. 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Matthias Sattler : Changes for 2.1 kernel map. 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Michel Lespinasse : Changes for 2.1 kernel map. 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Michael Chastain : Change trampoline.S to gnu as. 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alan Cox : Dumb bug: 'B' step PPro's are fine 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Ingo Molnar : Added APIC timers, based on code 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from Jose Renau 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Ingo Molnar : various cleanups and rewrites 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Tigran Aivazian : fixed "0.00 in /proc/uptime on SMP" bug. 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Maciej W. Rozycki : Bits for genuine 82489DX APICs 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Martin J. Bligh : Added support for multi-quad systems 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 427c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takata#include <linux/module.h> 433baf63a507094992a5bf238ba3bcea71f458b1e8Ingo Molnar#include <linux/cpu.h> 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 457c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takata#include <linux/kernel.h> 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h> 47df0f65f02a55888feae52a7e7d59d29f5edd400dMathieu Desnoyers#include <linux/sched.h> 48cfcd8c4fbc4c84c286d3ebae8648914016c1ea4cHirokazu Takata#include <linux/err.h> 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/irq.h> 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bootmem.h> 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h> 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h> 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgalloc.h> 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/tlbflush.h> 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEBUG_SMP 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG_SMP 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define Dprintk(x...) printk(x) 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define Dprintk(x...) 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern cpumask_t cpu_initialized; 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Data structures and variables */ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Processor that is doing the boot up */ 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int bsp_phys_id = -1; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bitmask of physically existing CPUs */ 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsphysid_mask_t phys_cpu_present_map; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldscpumask_t cpu_bootout_map; 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldscpumask_t cpu_bootin_map; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic cpumask_t cpu_callin_map; 797c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takatacpumask_t cpu_callout_map; 807c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu TakataEXPORT_SYMBOL(cpu_callout_map); 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Per CPU bogomips and other parameters */ 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int cpucount; 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic cpumask_t smp_commenced_mask; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct { 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void * spi; 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short ss; 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} stack_start; 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* which physical physical ID maps to which logical CPU number */ 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic volatile int physid_2_cpu[NR_CPUS]; 95e231a9c4fdf402bcfd5a7c27be49050882631a95Al Viro#define physid_to_cpu(physid) physid_2_cpu[physid] 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* which logical CPU number maps to which physical ID */ 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvolatile int cpu_2_physid[NR_CPUS]; 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsDEFINE_PER_CPU(int, prof_multiplier) = 1; 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsDEFINE_PER_CPU(int, prof_old_multiplier) = 1; 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsDEFINE_PER_CPU(int, prof_counter) = 1; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsspinlock_t ipi_lock[NR_IPIS]; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int calibration_result; 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Function Prototypes */ 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void init_ipi_lock(void); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void do_boot_cpu(int); 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint start_secondary(void *); 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void smp_callin(void); 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void smp_online(void); 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void show_mp_info(int); 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void smp_store_cpu_info(int); 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void show_cpu_info(int); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint setup_profiling_timer(unsigned int); 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void init_cpu_to_physid(void); 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void map_cpu_to_physid(int, int); 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void unmap_cpu_to_physid(int, int); 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 1285aa8b6c1a6136f9b8d91419d93e9e37ccc2e30c0Simon Arlott/* Boot up APs Routines : BSP */ 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 130b881bc469bdbdcca60e75047885509eb9886d3a2Greg Kroah-Hartmanvoid smp_prepare_boot_cpu(void) 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bsp_phys_id = hard_smp_processor_id(); 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds physid_set(bsp_phys_id, phys_cpu_present_map); 134937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro set_cpu_online(0, true); /* BSP's cpu_id == 0 */ 135937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_set_cpu(0, &cpu_callout_map); 136937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_set_cpu(0, &cpu_callin_map); 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Initialize the logical to physical CPU number mapping 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds init_cpu_to_physid(); 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds map_cpu_to_physid(0, bsp_phys_id); 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds current_thread_info()->cpu = 0; 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*==========================================================================* 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Name: smp_prepare_cpus (old smp_boot_cpus) 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Description: This routine boot up APs. 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Born on Date: 2002.02.05 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Arguments: NONE 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Returns: void (cannot fail) 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modification log: 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Date Who Description 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ---------- --- -------------------------------------------------------- 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2003-06-24 hy modify for linux-2.5.69 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *==========================================================================*/ 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init smp_prepare_cpus(unsigned int max_cpus) 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int phys_id; 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long nr_cpu; 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds nr_cpu = inl(M32R_FPGA_NUM_OF_CPUS_PORTL); 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (nr_cpu > NR_CPUS) { 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "NUM_OF_CPUS reg. value [%ld] > NR_CPU [%d]", 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds nr_cpu, NR_CPUS); 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto smp_done; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++) 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds physid_set(phys_id, phys_cpu_present_map); 1767c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takata#ifndef CONFIG_HOTPLUG_CPU 177937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro init_cpu_present(cpu_possible_mask); 1787c1c4e541888947947bc46a18a9a5543a259ed62Hirokazu Takata#endif 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_mp_info(nr_cpu); 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds init_ipi_lock(); 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Setup boot CPU information 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds smp_store_cpu_info(0); /* Final full version of the data */ 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If SMP should be disabled, then really disable it! 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!max_cpus) { 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "SMP mode deactivated by commandline.\n"); 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto smp_done; 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Now scan the CPU present map and fire up the other CPUs. 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("CPU present map : %lx\n", physids_coerce(phys_cpu_present_map)); 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (phys_id = 0 ; phys_id < NR_CPUS ; phys_id++) { 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Don't even attempt to start the boot CPU! 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (phys_id == bsp_phys_id) 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!physid_isset(phys_id, phys_cpu_present_map)) 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 212d5a6d1739526ed8c383db3dabc232bc15603439aRoel Kluin if (max_cpus <= cpucount + 1) 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds continue; 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds do_boot_cpu(phys_id); 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Make sure we unmap all failed CPUs 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (physid_to_cpu(phys_id) == -1) { 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds physid_clear(phys_id, phys_cpu_present_map); 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("phys CPU#%d not responding - " \ 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "cannot use it.\n", phys_id); 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssmp_done: 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("Boot done.\n"); 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * init_ipi_lock : Initialize IPI locks. 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init init_ipi_lock(void) 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ipi; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (ipi = 0 ; ipi < NR_IPIS ; ipi++) 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_lock_init(&ipi_lock[ipi]); 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*==========================================================================* 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Name: do_boot_cpu 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Description: This routine boot up one AP. 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Born on Date: 2002.02.05 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Arguments: phys_id - Target CPU physical ID 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Returns: void (cannot fail) 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modification log: 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Date Who Description 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ---------- --- -------------------------------------------------------- 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2003-06-24 hy modify for linux-2.5.69 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *==========================================================================*/ 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init do_boot_cpu(int phys_id) 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct task_struct *idle; 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long send_status, boot_status; 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int timeout, cpu_id; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_id = ++cpucount; 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We can't use kernel_thread since we must avoid to 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * reschedule the child. 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds idle = fork_idle(cpu_id); 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (IS_ERR(idle)) 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds panic("failed fork for CPU#%d.", cpu_id); 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds idle->thread.lr = (unsigned long)start_secondary; 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds map_cpu_to_physid(cpu_id, phys_id); 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* So we see what's up */ 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("Booting processor %d/%d\n", phys_id, cpu_id); 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds stack_start.spi = (void *)idle->thread.sp; 2826c3559fc458e3ed171d7a8bf6a6d7eaea1e7b2e5Al Viro task_thread_info(idle)->cpu = cpu_id; 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Send Startup IPI 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1.IPI received by CPU#(phys_id). 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2.CPU#(phys_id) enter startup_AP (arch/m32r/kernel/head.S) 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3.CPU#(phys_id) enter start_secondary() 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds send_status = 0; 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds boot_status = 0; 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 293937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_set_cpu(phys_id, &cpu_bootout_map); 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Send Startup IPI */ 296937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro send_IPI_mask_phys(cpumask_of(phys_id), CPU_BOOT_IPI, 0); 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("Waiting for send to finish...\n"); 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds timeout = 0; 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Wait 100[ms] */ 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds do { 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("+"); 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(1000); 305937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro send_status = !cpumask_test_cpu(phys_id, &cpu_bootin_map); 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } while (send_status && (timeout++ < 100)); 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("After Startup.\n"); 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!send_status) { 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * allow APs to start initializing. 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("Before Callout %d.\n", cpu_id); 315937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_set_cpu(cpu_id, &cpu_callout_map); 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("After Callout %d.\n", cpu_id); 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Wait 5s total for a response 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (timeout = 0; timeout < 5000; timeout++) { 322937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro if (cpumask_test_cpu(cpu_id, &cpu_callin_map)) 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; /* It has booted */ 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(1000); 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 327937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro if (cpumask_test_cpu(cpu_id, &cpu_callin_map)) { 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* number CPUs logically, starting from 1 (BSP is 0) */ 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("OK.\n"); 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds boot_status = 1; 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("Not responding.\n"); 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("IPI never delivered???\n"); 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (send_status || boot_status) { 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unmap_cpu_to_physid(cpu_id, phys_id); 339937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_clear_cpu(cpu_id, &cpu_callout_map); 340937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_clear_cpu(cpu_id, &cpu_callin_map); 341937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_clear_cpu(cpu_id, &cpu_initialized); 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpucount--; 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 346d1407fde791285d1ffd4c7af6b666987d1213f6aPaul Gortmakerint __cpu_up(unsigned int cpu_id, struct task_struct *tidle) 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int timeout; 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 350937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_set_cpu(cpu_id, &smp_commenced_mask); 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Wait 5s total for a response 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (timeout = 0; timeout < 5000; timeout++) { 356937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro if (cpu_online(cpu_id)) 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(1000); 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 360937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro if (!cpu_online(cpu_id)) 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUG(); 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init smp_cpus_done(unsigned int max_cpus) 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int cpu_id, timeout; 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long bogosum = 0; 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (timeout = 0; timeout < 5000; timeout++) { 372937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro if (cpumask_equal(&cpu_callin_map, cpu_online_mask)) 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(1000); 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 376937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro if (!cpumask_equal(&cpu_callin_map, cpu_online_mask)) 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUG(); 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (cpu_id = 0 ; cpu_id < num_online_cpus() ; cpu_id++) 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_cpu_info(cpu_id); 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Allow the user to impress friends. 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("Before bogomips.\n"); 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpucount) { 387937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro for_each_cpu(cpu_id,cpu_online_mask) 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bogosum += cpu_data[cpu_id].loops_per_jiffy; 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "Total of %d processors activated " \ 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "(%lu.%02lu BogoMIPS).\n", cpucount + 1, 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bogosum / (500000 / HZ), 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (bogosum / (5000 / HZ)) % 100); 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("Before bogocount - setting activated=1.\n"); 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 3995aa8b6c1a6136f9b8d91419d93e9e37ccc2e30c0Simon Arlott/* Activate a secondary processor Routines */ 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*==========================================================================* 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Name: start_secondary 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Description: This routine activate a secondary processor. 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Born on Date: 2002.02.05 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Arguments: *unused - currently unused. 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Returns: void (cannot fail) 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modification log: 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Date Who Description 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ---------- --- -------------------------------------------------------- 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2003-06-24 hy modify for linux-2.5.69 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *==========================================================================*/ 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint __init start_secondary(void *unused) 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_init(); 4225bfb5d690f36d316a5f3b4f7775fda996faa6b12Nick Piggin preempt_disable(); 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds smp_callin(); 424937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro while (!cpumask_test_cpu(smp_processor_id(), &smp_commenced_mask)) 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_relax(); 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds smp_online(); 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * low-memory mappings have been cleared, flush them from 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the local TLBs too. 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_flush_tlb_all(); 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 43501436228bfefca77493efa00aa49a8b67167d4c5Thomas Gleixner cpu_startup_entry(CPUHP_ONLINE); 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*==========================================================================* 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Name: smp_callin 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Description: This routine activate a secondary processor. 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Born on Date: 2002.02.05 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Arguments: NONE 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Returns: void (cannot fail) 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modification log: 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Date Who Description 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ---------- --- -------------------------------------------------------- 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2003-06-24 hy modify for linux-2.5.69 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *==========================================================================*/ 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init smp_callin(void) 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int phys_id = hard_smp_processor_id(); 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int cpu_id = smp_processor_id(); 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long timeout; 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 462937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro if (cpumask_test_cpu(cpu_id, &cpu_callin_map)) { 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("huh, phys CPU#%d, CPU#%d already present??\n", 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds phys_id, cpu_id); 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUG(); 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Dprintk("CPU#%d (phys ID: %d) waiting for CALLOUT\n", cpu_id, phys_id); 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Waiting 2s total for startup (udelay is not yet working) */ 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds timeout = jiffies + (2 * HZ); 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds while (time_before(jiffies, timeout)) { 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Has the boot CPU finished it's STARTUP sequence ? */ 473937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro if (cpumask_test_cpu(cpu_id, &cpu_callout_map)) 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_relax(); 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!time_before(jiffies, timeout)) { 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("BUG: CPU#%d started up but did not get a callout!\n", 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_id); 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUG(); 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Allow the master to continue. */ 485937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro cpumask_set_cpu(cpu_id, &cpu_callin_map); 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init smp_online(void) 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int cpu_id = smp_processor_id(); 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 492e545a6140b698b2494daf0b32107bdcc5e901390Manfred Spraul notify_cpu_starting(cpu_id); 493e545a6140b698b2494daf0b32107bdcc5e901390Manfred Spraul 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_irq_enable(); 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Get our bogomips. */ 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds calibrate_delay(); 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Save our processor parameters */ 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds smp_store_cpu_info(cpu_id); 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 502937e26c0d1843c92750dac9bca1c972d33e73306KOSAKI Motohiro set_cpu_online(cpu_id, true); 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 5065aa8b6c1a6136f9b8d91419d93e9e37ccc2e30c0Simon Arlott/* Boot up CPUs common Routines */ 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init show_mp_info(int nr_cpu) 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char cpu_model0[17], cpu_model1[17], cpu_ver[9]; 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strncpy(cpu_model0, (char *)M32R_FPGA_CPU_NAME_ADDR, 16); 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strncpy(cpu_model1, (char *)M32R_FPGA_MODEL_ID_ADDR, 16); 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strncpy(cpu_ver, (char *)M32R_FPGA_VERSION_ADDR, 8); 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_model0[16] = '\0'; 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 15 ; i >= 0 ; i--) { 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu_model0[i] != ' ') 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_model0[i] = '\0'; 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_model1[16] = '\0'; 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 15 ; i >= 0 ; i--) { 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu_model1[i] != ' ') 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_model1[i] = '\0'; 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_ver[8] = '\0'; 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 7 ; i >= 0 ; i--) { 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu_ver[i] != ' ') 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_ver[i] = '\0'; 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "M32R-mp information\n"); 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO " On-chip CPUs : %d\n", nr_cpu); 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO " CPU model : %s/%s(%s)\n", cpu_model0, 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_model1, cpu_ver); 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The bootstrap kernel entry code has set these up. Save them for 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a given CPU 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init smp_store_cpu_info(int cpu_id) 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct cpuinfo_m32r *ci = cpu_data + cpu_id; 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ci = boot_cpu_data; 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ci->loops_per_jiffy = loops_per_jiffy; 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init show_cpu_info(int cpu_id) 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct cpuinfo_m32r *ci = &cpu_data[cpu_id]; 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk("CPU#%d : ", cpu_id); 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PRINT_CLOCK(name, value) \ 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(name " clock %d.%02dMHz", \ 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((value) / 1000000), ((value) % 1000000) / 10000) 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PRINT_CLOCK("CPU", (int)ci->cpu_clock); 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PRINT_CLOCK(", Bus", (int)ci->bus_clock); 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(", loops_per_jiffy[%ld]\n", ci->loops_per_jiffy); 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the frequency of the profiling timer can be changed 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * by writing a multiplier value into /proc/profile. 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint setup_profiling_timer(unsigned int multiplier) 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Sanity check. [at least 500 APIC cycles should be 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * between APIC interrupts as a rule of thumb, to avoid 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * irqs flooding us] 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ( (!multiplier) || (calibration_result / multiplier < 500)) 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Set the new multiplier for each CPU. CPUs don't start using the 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * new values until the next timer interrupt in which they do process 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * accounting. At that time they also adjust their APIC timers 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * accordingly. 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5919e2f913df70b378379a358a44e7d286f7b765e8eRusty Russell for_each_possible_cpu(i) 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds per_cpu(prof_multiplier, i) = multiplier; 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Initialize all maps between cpu number and apicids */ 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init init_cpu_to_physid(void) 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0 ; i < NR_CPUS ; i++) { 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_2_physid[i] = -1; 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds physid_2_cpu[i] = -1; 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * set up a mapping between cpu and apicid. Uses logical apicids for multiquad, 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * else physical apic ids 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init map_cpu_to_physid(int cpu_id, int phys_id) 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds physid_2_cpu[phys_id] = cpu_id; 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_2_physid[cpu_id] = phys_id; 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * undo a mapping between cpu and apicid. Uses logical apicids for multiquad, 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * else physical apic ids 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init unmap_cpu_to_physid(int cpu_id, int phys_id) 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds physid_2_cpu[phys_id] = -1; 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpu_2_physid[cpu_id] = -1; 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 627