| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef __ASM_SMP_H | 
 | 2 | #define __ASM_SMP_H | 
 | 3 |  | 
 | 4 | /* | 
 | 5 |  * We need the APIC definitions automatically as part of 'smp.h' | 
 | 6 |  */ | 
 | 7 | #ifndef __ASSEMBLY__ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 | #include <linux/kernel.h> | 
 | 9 | #include <linux/threads.h> | 
 | 10 | #include <linux/cpumask.h> | 
 | 11 | #endif | 
 | 12 |  | 
| Jan Beulich | 00f1ea6 | 2007-05-02 19:27:04 +0200 | [diff] [blame] | 13 | #if defined(CONFIG_X86_LOCAL_APIC) && !defined(__ASSEMBLY__) | 
| Jiri Slaby | 1977f03 | 2007-10-18 23:40:25 -0700 | [diff] [blame] | 14 | #include <linux/bitops.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 15 | #include <asm/mpspec.h> | 
| Jan Beulich | 00f1ea6 | 2007-05-02 19:27:04 +0200 | [diff] [blame] | 16 | #include <asm/apic.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 | #ifdef CONFIG_X86_IO_APIC | 
 | 18 | #include <asm/io_apic.h> | 
 | 19 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 20 | #endif | 
 | 21 |  | 
 | 22 | #define BAD_APICID 0xFFu | 
 | 23 | #ifdef CONFIG_SMP | 
 | 24 | #ifndef __ASSEMBLY__ | 
 | 25 |  | 
 | 26 | /* | 
 | 27 |  * Private routines/data | 
 | 28 |  */ | 
 | 29 |   | 
 | 30 | extern void smp_alloc_memory(void); | 
 | 31 | extern int pic_mode; | 
 | 32 | extern int smp_num_siblings; | 
| Mike Travis | d5a7430 | 2007-10-16 01:24:05 -0700 | [diff] [blame] | 33 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); | 
| Mike Travis | 0835761 | 2007-10-16 01:24:04 -0700 | [diff] [blame] | 34 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 35 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | extern void (*mtrr_hook) (void); | 
 | 37 | extern void zap_low_mappings (void); | 
| Li Shaohua | 6fe940d | 2005-06-25 14:54:53 -0700 | [diff] [blame] | 38 | extern void lock_ipi_call_lock(void); | 
 | 39 | extern void unlock_ipi_call_lock(void); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 |  | 
 | 41 | #define MAX_APICID 256 | 
| Mike Travis | 71fff5e | 2007-10-19 20:35:03 +0200 | [diff] [blame] | 42 | extern u8 __initdata x86_cpu_to_apicid_init[]; | 
 | 43 | extern void *x86_cpu_to_apicid_ptr; | 
 | 44 | DECLARE_PER_CPU(u8, x86_cpu_to_apicid); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 |  | 
| Mike Travis | 71fff5e | 2007-10-19 20:35:03 +0200 | [diff] [blame] | 46 | #define cpu_physical_id(cpu)	per_cpu(x86_cpu_to_apicid, cpu) | 
| Ashok Raj | b4033c1 | 2005-11-08 21:42:33 -0800 | [diff] [blame] | 47 |  | 
| Jeremy Fitzhardinge | c70df74 | 2007-07-17 18:37:03 -0700 | [diff] [blame] | 48 | extern void set_cpu_sibling_map(int cpu); | 
 | 49 |  | 
| Li Shaohua | e1367da | 2005-06-25 14:54:56 -0700 | [diff] [blame] | 50 | #ifdef CONFIG_HOTPLUG_CPU | 
 | 51 | extern void cpu_exit_clear(void); | 
 | 52 | extern void cpu_uninit(void); | 
| Jeremy Fitzhardinge | c70df74 | 2007-07-17 18:37:03 -0700 | [diff] [blame] | 53 | extern void remove_siblinginfo(int cpu); | 
| Li Shaohua | e1367da | 2005-06-25 14:54:56 -0700 | [diff] [blame] | 54 | #endif | 
 | 55 |  | 
| Jeremy Fitzhardinge | 01a2f43 | 2007-05-02 19:27:11 +0200 | [diff] [blame] | 56 | struct smp_ops | 
 | 57 | { | 
 | 58 | 	void (*smp_prepare_boot_cpu)(void); | 
 | 59 | 	void (*smp_prepare_cpus)(unsigned max_cpus); | 
 | 60 | 	int (*cpu_up)(unsigned cpu); | 
 | 61 | 	void (*smp_cpus_done)(unsigned max_cpus); | 
 | 62 |  | 
 | 63 | 	void (*smp_send_stop)(void); | 
 | 64 | 	void (*smp_send_reschedule)(int cpu); | 
 | 65 | 	int (*smp_call_function_mask)(cpumask_t mask, | 
 | 66 | 				      void (*func)(void *info), void *info, | 
 | 67 | 				      int wait); | 
 | 68 | }; | 
 | 69 |  | 
 | 70 | extern struct smp_ops smp_ops; | 
 | 71 |  | 
 | 72 | static inline void smp_prepare_boot_cpu(void) | 
 | 73 | { | 
 | 74 | 	smp_ops.smp_prepare_boot_cpu(); | 
 | 75 | } | 
 | 76 | static inline void smp_prepare_cpus(unsigned int max_cpus) | 
 | 77 | { | 
 | 78 | 	smp_ops.smp_prepare_cpus(max_cpus); | 
 | 79 | } | 
 | 80 | static inline int __cpu_up(unsigned int cpu) | 
 | 81 | { | 
 | 82 | 	return smp_ops.cpu_up(cpu); | 
 | 83 | } | 
 | 84 | static inline void smp_cpus_done(unsigned int max_cpus) | 
 | 85 | { | 
 | 86 | 	smp_ops.smp_cpus_done(max_cpus); | 
 | 87 | } | 
 | 88 |  | 
 | 89 | static inline void smp_send_stop(void) | 
 | 90 | { | 
 | 91 | 	smp_ops.smp_send_stop(); | 
 | 92 | } | 
 | 93 | static inline void smp_send_reschedule(int cpu) | 
 | 94 | { | 
 | 95 | 	smp_ops.smp_send_reschedule(cpu); | 
 | 96 | } | 
| Thomas Gleixner | ceff8d8 | 2007-10-26 17:22:17 +0200 | [diff] [blame] | 97 | static inline int smp_call_function_mask(cpumask_t mask, | 
 | 98 | 					 void (*func) (void *info), void *info, | 
 | 99 | 					 int wait) | 
 | 100 | { | 
 | 101 | 	return smp_ops.smp_call_function_mask(mask, func, info, wait); | 
 | 102 | } | 
| Jeremy Fitzhardinge | 01a2f43 | 2007-05-02 19:27:11 +0200 | [diff] [blame] | 103 |  | 
 | 104 | void native_smp_prepare_boot_cpu(void); | 
 | 105 | void native_smp_prepare_cpus(unsigned int max_cpus); | 
 | 106 | int native_cpu_up(unsigned int cpunum); | 
 | 107 | void native_smp_cpus_done(unsigned int max_cpus); | 
 | 108 |  | 
| Zachary Amsden | ae5da27 | 2007-02-13 13:26:21 +0100 | [diff] [blame] | 109 | #ifndef CONFIG_PARAVIRT | 
 | 110 | #define startup_ipi_hook(phys_apicid, start_eip, start_esp) 		\ | 
 | 111 | do { } while (0) | 
 | 112 | #endif | 
 | 113 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 114 | /* | 
 | 115 |  * This function is needed by all SMP systems. It must _always_ be valid | 
 | 116 |  * from the initial startup. We map APIC_BASE very early in page_setup(), | 
 | 117 |  * so this is correct in the x86 case. | 
 | 118 |  */ | 
| Jeremy Fitzhardinge | 7c3576d | 2007-05-02 19:27:16 +0200 | [diff] [blame] | 119 | DECLARE_PER_CPU(int, cpu_number); | 
 | 120 | #define raw_smp_processor_id() (x86_read_percpu(cpu_number)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 121 |  | 
 | 122 | extern cpumask_t cpu_callout_map; | 
 | 123 | extern cpumask_t cpu_callin_map; | 
| Zwane Mwaikambo | 4ad8d38 | 2005-09-03 15:56:51 -0700 | [diff] [blame] | 124 | extern cpumask_t cpu_possible_map; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 125 |  | 
 | 126 | /* We don't mark CPUs online until __cpu_up(), so we need another measure */ | 
 | 127 | static inline int num_booting_cpus(void) | 
 | 128 | { | 
 | 129 | 	return cpus_weight(cpu_callout_map); | 
 | 130 | } | 
 | 131 |  | 
| Fernando Luis Vazquez Cao | a36166c | 2007-05-09 02:33:27 -0700 | [diff] [blame] | 132 | extern int safe_smp_processor_id(void); | 
 | 133 | extern int __cpu_disable(void); | 
 | 134 | extern void __cpu_die(unsigned int cpu); | 
 | 135 | extern unsigned int num_processors; | 
 | 136 |  | 
| Jeremy Fitzhardinge | 724faa8 | 2007-07-17 18:37:03 -0700 | [diff] [blame] | 137 | void __cpuinit smp_store_cpu_info(int id); | 
 | 138 |  | 
| Fernando Luis Vazquez Cao | a36166c | 2007-05-09 02:33:27 -0700 | [diff] [blame] | 139 | #endif /* !__ASSEMBLY__ */ | 
 | 140 |  | 
 | 141 | #else /* CONFIG_SMP */ | 
 | 142 |  | 
 | 143 | #define safe_smp_processor_id()		0 | 
 | 144 | #define cpu_physical_id(cpu)		boot_cpu_physical_apicid | 
 | 145 |  | 
 | 146 | #define NO_PROC_ID		0xFF		/* No processor magic marker */ | 
 | 147 |  | 
 | 148 | #endif /* CONFIG_SMP */ | 
 | 149 |  | 
 | 150 | #ifndef __ASSEMBLY__ | 
 | 151 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 152 | #ifdef CONFIG_X86_LOCAL_APIC | 
 | 153 |  | 
 | 154 | #ifdef APIC_DEFINITION | 
 | 155 | extern int hard_smp_processor_id(void); | 
 | 156 | #else | 
 | 157 | #include <mach_apicdef.h> | 
 | 158 | static inline int hard_smp_processor_id(void) | 
 | 159 | { | 
 | 160 | 	/* we don't want to mark this access volatile - bad code generation */ | 
 | 161 | 	return GET_APIC_ID(*(unsigned long *)(APIC_BASE+APIC_ID)); | 
 | 162 | } | 
| Fernando Luis Vazquez Cao | a36166c | 2007-05-09 02:33:27 -0700 | [diff] [blame] | 163 | #endif /* APIC_DEFINITION */ | 
| Zwane Mwaikambo | f370513 | 2005-06-25 14:54:50 -0700 | [diff] [blame] | 164 |  | 
| Fernando Luis Vazquez Cao | a36166c | 2007-05-09 02:33:27 -0700 | [diff] [blame] | 165 | #else /* CONFIG_X86_LOCAL_APIC */ | 
| Andi Kleen | 874c4fe | 2006-09-26 10:52:26 +0200 | [diff] [blame] | 166 |  | 
| Fernando Luis Vazquez Cao | a36166c | 2007-05-09 02:33:27 -0700 | [diff] [blame] | 167 | #ifndef CONFIG_SMP | 
| Fernando Luis Vazquez Cao | 2f4dfe2 | 2007-05-09 02:33:25 -0700 | [diff] [blame] | 168 | #define hard_smp_processor_id()		0 | 
| Fernando Luis Vazquez Cao | a36166c | 2007-05-09 02:33:27 -0700 | [diff] [blame] | 169 | #endif | 
| Ashok Raj | b4033c1 | 2005-11-08 21:42:33 -0800 | [diff] [blame] | 170 |  | 
| Fernando Luis Vazquez Cao | a36166c | 2007-05-09 02:33:27 -0700 | [diff] [blame] | 171 | #endif /* CONFIG_X86_LOCAL_APIC */ | 
| Jiri Kosina | 815a965 | 2006-10-06 11:11:56 +0200 | [diff] [blame] | 172 |  | 
 | 173 | extern u8 apicid_2_node[]; | 
 | 174 |  | 
| Andi Kleen | 874c4fe | 2006-09-26 10:52:26 +0200 | [diff] [blame] | 175 | #ifdef CONFIG_X86_LOCAL_APIC | 
 | 176 | static __inline int logical_smp_processor_id(void) | 
 | 177 | { | 
 | 178 | 	/* we don't want to mark this access volatile - bad code generation */ | 
 | 179 | 	return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR)); | 
 | 180 | } | 
 | 181 | #endif | 
 | 182 | #endif | 
 | 183 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 184 | #endif |