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