Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #ifndef _ASM_X86_SMP_H
  2 #define _ASM_X86_SMP_H
  3 #ifndef __ASSEMBLY__
  4 #include <linux/cpumask.h>
  5 #include <linux/init.h>
  6 #include <asm/percpu.h>
  7 
  8 /*
  9  * We need the APIC definitions automatically as part of 'smp.h'
 10  */
 11 #ifdef CONFIG_X86_LOCAL_APIC
 12 # include <asm/mpspec.h>
 13 # include <asm/apic.h>
 14 # ifdef CONFIG_X86_IO_APIC
 15 #  include <asm/io_apic.h>
 16 # endif
 17 #endif
 18 #include <asm/thread_info.h>
 19 #include <asm/cpumask.h>
 20 
 21 extern int smp_num_siblings;
 22 extern unsigned int num_processors;
 23 
 24 DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_map);
 25 DECLARE_PER_CPU(cpumask_var_t, cpu_core_map);
 26 DECLARE_PER_CPU(u16, cpu_llc_id);
 27 DECLARE_PER_CPU(int, cpu_number);
 28 
 29 static inline struct cpumask *cpu_sibling_mask(int cpu)
 30 {
 31         return per_cpu(cpu_sibling_map, cpu);
 32 }
 33 
 34 static inline struct cpumask *cpu_core_mask(int cpu)
 35 {
 36         return per_cpu(cpu_core_map, cpu);
 37 }
 38 
 39 DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid);
 40 DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid);
 41 
 42 /* Static state in head.S used to set up a CPU */
 43 extern struct {
 44         void *sp;
 45         unsigned short ss;
 46 } stack_start;
 47 
 48 struct smp_ops {
 49         void (*smp_prepare_boot_cpu)(void);
 50         void (*smp_prepare_cpus)(unsigned max_cpus);
 51         void (*smp_cpus_done)(unsigned max_cpus);
 52 
 53         void (*smp_send_stop)(void);
 54         void (*smp_send_reschedule)(int cpu);
 55 
 56         int (*cpu_up)(unsigned cpu);
 57         int (*cpu_disable)(void);
 58         void (*cpu_die)(unsigned int cpu);
 59         void (*play_dead)(void);
 60 
 61         void (*send_call_func_ipi)(const struct cpumask *mask);
 62         void (*send_call_func_single_ipi)(int cpu);
 63 };
 64 
 65 /* Globals due to paravirt */
 66 extern void set_cpu_sibling_map(int cpu);
 67 
 68 #ifdef CONFIG_SMP
 69 #ifndef CONFIG_PARAVIRT
 70 #define startup_ipi_hook(phys_apicid, start_eip, start_esp) do { } while (0)
 71 #endif
 72 extern struct smp_ops smp_ops;
 73 
 74 static inline void smp_send_stop(void)
 75 {
 76         smp_ops.smp_send_stop();
 77 }
 78 
 79 static inline void smp_prepare_boot_cpu(void)
 80 {
 81         smp_ops.smp_prepare_boot_cpu();
 82 }
 83 
 84 static inline void smp_prepare_cpus(unsigned int max_cpus)
 85 {
 86         smp_ops.smp_prepare_cpus(max_cpus);
 87 }
 88 
 89 static inline void smp_cpus_done(unsigned int max_cpus)
 90 {
 91         smp_ops.smp_cpus_done(max_cpus);
 92 }
 93 
 94 static inline int __cpu_up(unsigned int cpu)
 95 {
 96         return smp_ops.cpu_up(cpu);
 97 }
 98 
 99 static inline int __cpu_disable(void)
100 {
101         return smp_ops.cpu_disable();
102 }
103 
104 static inline void __cpu_die(unsigned int cpu)
105 {
106         smp_ops.cpu_die(cpu);
107 }
108 
109 static inline void play_dead(void)
110 {
111         smp_ops.play_dead();
112 }
113 
114 static inline void smp_send_reschedule(int cpu)
115 {
116         smp_ops.smp_send_reschedule(cpu);
117 }
118 
119 static inline void arch_send_call_function_single_ipi(int cpu)
120 {
121         smp_ops.send_call_func_single_ipi(cpu);
122 }
123 
124 #define arch_send_call_function_ipi_mask arch_send_call_function_ipi_mask
125 static inline void arch_send_call_function_ipi_mask(const struct cpumask *mask)
126 {
127         smp_ops.send_call_func_ipi(mask);
128 }
129 
130 void cpu_disable_common(void);
131 void native_smp_prepare_boot_cpu(void);
132 void native_smp_prepare_cpus(unsigned int max_cpus);
133 void native_smp_cpus_done(unsigned int max_cpus);
134 int native_cpu_up(unsigned int cpunum);
135 int native_cpu_disable(void);
136 void native_cpu_die(unsigned int cpu);
137 void native_play_dead(void);
138 void play_dead_common(void);
139 
140 void native_send_call_func_ipi(const struct cpumask *mask);
141 void native_send_call_func_single_ipi(int cpu);
142 
143 void smp_store_cpu_info(int id);
144 #define cpu_physical_id(cpu)    per_cpu(x86_cpu_to_apicid, cpu)
145 
146 /* We don't mark CPUs online until __cpu_up(), so we need another measure */
147 static inline int num_booting_cpus(void)
148 {
149         return cpumask_weight(cpu_callout_mask);
150 }
151 #endif /* CONFIG_SMP */
152 
153 extern unsigned disabled_cpus __cpuinitdata;
154 
155 #ifdef CONFIG_X86_32_SMP
156 /*
157  * This function is needed by all SMP systems. It must _always_ be valid
158  * from the initial startup. We map APIC_BASE very early in page_setup(),
159  * so this is correct in the x86 case.
160  */
161 #define raw_smp_processor_id() (percpu_read(cpu_number))
162 extern int safe_smp_processor_id(void);
163 
164 #elif defined(CONFIG_X86_64_SMP)
165 #define raw_smp_processor_id() (percpu_read(cpu_number))
166 
167 #define stack_smp_processor_id()                                        \
168 ({                                                              \
169         struct thread_info *ti;                                         \
170         __asm__("andq %%rsp,%0; ":"=r" (ti) : "" (CURRENT_MASK));      \
171         ti->cpu;                                                        \
172 })
173 #define safe_smp_processor_id()         smp_processor_id()
174 
175 #endif
176 
177 #ifdef CONFIG_X86_LOCAL_APIC
178 
179 #ifndef CONFIG_X86_64
180 static inline int logical_smp_processor_id(void)
181 {
182         /* we don't want to mark this access volatile - bad code generation */
183         return GET_APIC_LOGICAL_ID(apic_read(APIC_LDR));
184 }
185 
186 #endif
187 
188 extern int hard_smp_processor_id(void);
189 
190 #else /* CONFIG_X86_LOCAL_APIC */
191 
192 # ifndef CONFIG_SMP
193 #  define hard_smp_processor_id()       0
194 # endif
195 
196 #endif /* CONFIG_X86_LOCAL_APIC */
197 
198 #endif /* __ASSEMBLY__ */
199 #endif /* _ASM_X86_SMP_H */
200 
  This page was automatically generated by the LXR engine.