1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __LINUX_SMP_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __LINUX_SMP_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *	Generic SMP support
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *		Alan Cox. <alan@redhat.com>
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void cpu_idle(void);
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/preempt.h>
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/kernel.h>
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/compiler.h>
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/thread_info.h>
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/smp.h>
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * main cross-CPU interfaces, handles INIT, TLB flush, STOP, etc.
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (defined in asm header):
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * stops all CPUs but the current one:
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void smp_send_stop(void);
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * sends a 'reschedule' event to another CPU:
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void smp_send_reschedule(int cpu);
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Prepare machine for booting other CPUs.
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void smp_prepare_cpus(unsigned int max_cpus);
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Bring a CPU up
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __cpu_up(unsigned int cpunum);
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Final polishing of CPUs
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void smp_cpus_done(unsigned int max_cpus);
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Call a function on all other processors
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint smp_call_function(void(*func)(void *info), void *info, int retry, int wait);
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Call a function on all processors
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint on_each_cpu(void (*func) (void *info), void *info, int retry, int wait);
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MSG_ALL_BUT_SELF	0x8000	/* Assume <32768 CPU's */
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MSG_ALL			0x8001
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MSG_INVALIDATE_TLB	0x0001	/* Remote processor TLB invalidate */
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MSG_STOP_CPU		0x0002	/* Sent to shut down slave CPU's
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					 * when rebooting
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru					 */
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MSG_RESCHEDULE		0x0003	/* Reschedule request from master CPU*/
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MSG_CALL_FUNCTION       0x0004  /* Call function on all other CPUs */
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Mark the boot cpu "online" so that it can call console drivers in
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * printk() and can access its per-cpu storage.
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid smp_prepare_boot_cpu(void);
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* !SMP */
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *	These macros fold the SMP functionality into a single CPU system
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define raw_smp_processor_id()			0
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define hard_smp_processor_id()			0
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int up_smp_call_function(void)
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return 0;
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_call_function(func,info,retry,wait)	(up_smp_call_function())
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define on_each_cpu(func,info,retry,wait)	\
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	({					\
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		local_irq_disable();		\
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		func(info);			\
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		local_irq_enable();		\
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		0;				\
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	})
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void smp_send_reschedule(int cpu) { }
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define num_booting_cpus()			1
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_prepare_boot_cpu()			do {} while (0)
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* !SMP */
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * smp_processor_id(): get the current CPU ID.
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * if DEBUG_PREEMPT is enabled the we check whether it is
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * used in a preemption-safe way. (smp_processor_id() is safe
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * if it's used in a preemption-off critical section, or in
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * a thread that is bound to the current CPU.)
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * NOTE: raw_smp_processor_id() is for internal use only
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (smp_processor_id() is the preferred variant), but in rare
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * instances it might also be used to turn off false positives
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (i.e. smp_processor_id() use that the debugging code reports but
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * which use for some reason is legal). Don't use this to hack around
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the warning message, as your code might not work under PREEMPT.
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_DEBUG_PREEMPT
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  extern unsigned int debug_smp_processor_id(void);
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define smp_processor_id() debug_smp_processor_id()
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define smp_processor_id() raw_smp_processor_id()
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define get_cpu()		({ preempt_disable(); smp_processor_id(); })
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define put_cpu()		preempt_enable()
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define put_cpu_no_resched()	preempt_enable_no_resched()
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid smp_setup_processor_id(void);
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __LINUX_SMP_H */
131