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