diff options
author | Yinghai Lu <yinghai@kernel.org> | 2009-02-17 02:02:14 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-17 06:22:20 -0500 |
commit | c1eeb2de41d7015678bdd412b48a5f071b84e29a (patch) | |
tree | 6af99f46f557f9e854e882deac52d23b2fadb5a2 /arch | |
parent | 06cd9a7dc8a58186060a91b6ddc031057435fd34 (diff) |
x86: fold apic_ops into genapic
Impact: cleanup
make it simpler, don't need have one extra struct.
v2: fix the sgi_uv build
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/include/asm/apic.h | 97 | ||||
-rw-r--r-- | arch/x86/include/asm/genapic.h | 61 | ||||
-rw-r--r-- | arch/x86/kernel/apic.c | 63 | ||||
-rw-r--r-- | arch/x86/kernel/bigsmp_32.c | 7 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_amd_64.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_intel_64.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/perfctr-watchdog.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/es7000_32.c | 7 | ||||
-rw-r--r-- | arch/x86/kernel/genapic_64.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/genapic_flat_64.c | 16 | ||||
-rw-r--r-- | arch/x86/kernel/genx2apic_cluster.c | 11 | ||||
-rw-r--r-- | arch/x86/kernel/genx2apic_phys.c | 11 | ||||
-rw-r--r-- | arch/x86/kernel/genx2apic_uv_x.c | 9 | ||||
-rw-r--r-- | arch/x86/kernel/ipi.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/irq.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/nmi.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/numaq_32.c | 7 | ||||
-rw-r--r-- | arch/x86/kernel/probe_32.c | 7 | ||||
-rw-r--r-- | arch/x86/kernel/summit_32.c | 7 | ||||
-rw-r--r-- | arch/x86/kernel/uv_irq.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/vmi_32.c | 6 | ||||
-rw-r--r-- | arch/x86/kernel/vmiclock_32.c | 2 | ||||
-rw-r--r-- | arch/x86/lguest/boot.c | 19 | ||||
-rw-r--r-- | arch/x86/xen/enlighten.c | 21 |
24 files changed, 205 insertions, 162 deletions
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index dc1db99cd40e..4f56e053d347 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
@@ -92,6 +92,12 @@ static inline u32 native_apic_mem_read(u32 reg) | |||
92 | return *((volatile u32 *)(APIC_BASE + reg)); | 92 | return *((volatile u32 *)(APIC_BASE + reg)); |
93 | } | 93 | } |
94 | 94 | ||
95 | extern void native_apic_wait_icr_idle(void); | ||
96 | extern u32 native_safe_apic_wait_icr_idle(void); | ||
97 | extern void native_apic_icr_write(u32 low, u32 id); | ||
98 | extern u64 native_apic_icr_read(void); | ||
99 | |||
100 | #ifdef CONFIG_X86_X2APIC | ||
95 | static inline void native_apic_msr_write(u32 reg, u32 v) | 101 | static inline void native_apic_msr_write(u32 reg, u32 v) |
96 | { | 102 | { |
97 | if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR || | 103 | if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR || |
@@ -112,7 +118,31 @@ static inline u32 native_apic_msr_read(u32 reg) | |||
112 | return low; | 118 | return low; |
113 | } | 119 | } |
114 | 120 | ||
115 | #ifdef CONFIG_X86_X2APIC | 121 | static inline void native_x2apic_wait_icr_idle(void) |
122 | { | ||
123 | /* no need to wait for icr idle in x2apic */ | ||
124 | return; | ||
125 | } | ||
126 | |||
127 | static inline u32 native_safe_x2apic_wait_icr_idle(void) | ||
128 | { | ||
129 | /* no need to wait for icr idle in x2apic */ | ||
130 | return 0; | ||
131 | } | ||
132 | |||
133 | static inline void native_x2apic_icr_write(u32 low, u32 id) | ||
134 | { | ||
135 | wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low); | ||
136 | } | ||
137 | |||
138 | static inline u64 native_x2apic_icr_read(void) | ||
139 | { | ||
140 | unsigned long val; | ||
141 | |||
142 | rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val); | ||
143 | return val; | ||
144 | } | ||
145 | |||
116 | extern int x2apic; | 146 | extern int x2apic; |
117 | extern void check_x2apic(void); | 147 | extern void check_x2apic(void); |
118 | extern void enable_x2apic(void); | 148 | extern void enable_x2apic(void); |
@@ -146,47 +176,6 @@ static inline int x2apic_enabled(void) | |||
146 | } | 176 | } |
147 | #endif | 177 | #endif |
148 | 178 | ||
149 | struct apic_ops { | ||
150 | u32 (*read)(u32 reg); | ||
151 | void (*write)(u32 reg, u32 v); | ||
152 | u64 (*icr_read)(void); | ||
153 | void (*icr_write)(u32 low, u32 high); | ||
154 | void (*wait_icr_idle)(void); | ||
155 | u32 (*safe_wait_icr_idle)(void); | ||
156 | }; | ||
157 | |||
158 | extern struct apic_ops *apic_ops; | ||
159 | |||
160 | static inline u32 apic_read(u32 reg) | ||
161 | { | ||
162 | return apic_ops->read(reg); | ||
163 | } | ||
164 | |||
165 | static inline void apic_write(u32 reg, u32 val) | ||
166 | { | ||
167 | apic_ops->write(reg, val); | ||
168 | } | ||
169 | |||
170 | static inline u64 apic_icr_read(void) | ||
171 | { | ||
172 | return apic_ops->icr_read(); | ||
173 | } | ||
174 | |||
175 | static inline void apic_icr_write(u32 low, u32 high) | ||
176 | { | ||
177 | apic_ops->icr_write(low, high); | ||
178 | } | ||
179 | |||
180 | static inline void apic_wait_icr_idle(void) | ||
181 | { | ||
182 | apic_ops->wait_icr_idle(); | ||
183 | } | ||
184 | |||
185 | static inline u32 safe_apic_wait_icr_idle(void) | ||
186 | { | ||
187 | return apic_ops->safe_wait_icr_idle(); | ||
188 | } | ||
189 | |||
190 | extern int get_physical_broadcast(void); | 179 | extern int get_physical_broadcast(void); |
191 | 180 | ||
192 | #ifdef CONFIG_X86_X2APIC | 181 | #ifdef CONFIG_X86_X2APIC |
@@ -197,18 +186,6 @@ static inline void ack_x2APIC_irq(void) | |||
197 | } | 186 | } |
198 | #endif | 187 | #endif |
199 | 188 | ||
200 | |||
201 | static inline void ack_APIC_irq(void) | ||
202 | { | ||
203 | /* | ||
204 | * ack_APIC_irq() actually gets compiled as a single instruction | ||
205 | * ... yummie. | ||
206 | */ | ||
207 | |||
208 | /* Docs say use 0 for future compatibility */ | ||
209 | apic_write(APIC_EOI, 0); | ||
210 | } | ||
211 | |||
212 | extern int lapic_get_maxlvt(void); | 189 | extern int lapic_get_maxlvt(void); |
213 | extern void clear_local_APIC(void); | 190 | extern void clear_local_APIC(void); |
214 | extern void connect_bsp_APIC(void); | 191 | extern void connect_bsp_APIC(void); |
@@ -256,18 +233,6 @@ static inline void disable_local_APIC(void) { } | |||
256 | #define SET_APIC_ID(x) (apic->set_apic_id(x)) | 233 | #define SET_APIC_ID(x) (apic->set_apic_id(x)) |
257 | #else | 234 | #else |
258 | 235 | ||
259 | #ifdef CONFIG_X86_LOCAL_APIC | ||
260 | static inline unsigned default_get_apic_id(unsigned long x) | ||
261 | { | ||
262 | unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); | ||
263 | |||
264 | if (APIC_XAPIC(ver)) | ||
265 | return (x >> 24) & 0xFF; | ||
266 | else | ||
267 | return (x >> 24) & 0x0F; | ||
268 | } | ||
269 | #endif | ||
270 | |||
271 | #endif | 236 | #endif |
272 | 237 | ||
273 | #endif /* _ASM_X86_APIC_H */ | 238 | #endif /* _ASM_X86_APIC_H */ |
diff --git a/arch/x86/include/asm/genapic.h b/arch/x86/include/asm/genapic.h index 273b99452ae0..a6d0b00a544c 100644 --- a/arch/x86/include/asm/genapic.h +++ b/arch/x86/include/asm/genapic.h | |||
@@ -5,6 +5,7 @@ | |||
5 | 5 | ||
6 | #include <asm/mpspec.h> | 6 | #include <asm/mpspec.h> |
7 | #include <asm/atomic.h> | 7 | #include <asm/atomic.h> |
8 | #include <asm/apic.h> | ||
8 | 9 | ||
9 | /* | 10 | /* |
10 | * Copyright 2004 James Cleverdon, IBM. | 11 | * Copyright 2004 James Cleverdon, IBM. |
@@ -83,10 +84,70 @@ struct genapic { | |||
83 | void (*smp_callin_clear_local_apic)(void); | 84 | void (*smp_callin_clear_local_apic)(void); |
84 | void (*store_NMI_vector)(unsigned short *high, unsigned short *low); | 85 | void (*store_NMI_vector)(unsigned short *high, unsigned short *low); |
85 | void (*inquire_remote_apic)(int apicid); | 86 | void (*inquire_remote_apic)(int apicid); |
87 | |||
88 | /* apic ops */ | ||
89 | u32 (*read)(u32 reg); | ||
90 | void (*write)(u32 reg, u32 v); | ||
91 | u64 (*icr_read)(void); | ||
92 | void (*icr_write)(u32 low, u32 high); | ||
93 | void (*wait_icr_idle)(void); | ||
94 | u32 (*safe_wait_icr_idle)(void); | ||
86 | }; | 95 | }; |
87 | 96 | ||
88 | extern struct genapic *apic; | 97 | extern struct genapic *apic; |
89 | 98 | ||
99 | static inline u32 apic_read(u32 reg) | ||
100 | { | ||
101 | return apic->read(reg); | ||
102 | } | ||
103 | |||
104 | static inline void apic_write(u32 reg, u32 val) | ||
105 | { | ||
106 | apic->write(reg, val); | ||
107 | } | ||
108 | |||
109 | static inline u64 apic_icr_read(void) | ||
110 | { | ||
111 | return apic->icr_read(); | ||
112 | } | ||
113 | |||
114 | static inline void apic_icr_write(u32 low, u32 high) | ||
115 | { | ||
116 | apic->icr_write(low, high); | ||
117 | } | ||
118 | |||
119 | static inline void apic_wait_icr_idle(void) | ||
120 | { | ||
121 | apic->wait_icr_idle(); | ||
122 | } | ||
123 | |||
124 | static inline u32 safe_apic_wait_icr_idle(void) | ||
125 | { | ||
126 | return apic->safe_wait_icr_idle(); | ||
127 | } | ||
128 | |||
129 | |||
130 | static inline void ack_APIC_irq(void) | ||
131 | { | ||
132 | /* | ||
133 | * ack_APIC_irq() actually gets compiled as a single instruction | ||
134 | * ... yummie. | ||
135 | */ | ||
136 | |||
137 | /* Docs say use 0 for future compatibility */ | ||
138 | apic_write(APIC_EOI, 0); | ||
139 | } | ||
140 | |||
141 | static inline unsigned default_get_apic_id(unsigned long x) | ||
142 | { | ||
143 | unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); | ||
144 | |||
145 | if (APIC_XAPIC(ver)) | ||
146 | return (x >> 24) & 0xFF; | ||
147 | else | ||
148 | return (x >> 24) & 0x0F; | ||
149 | } | ||
150 | |||
90 | /* | 151 | /* |
91 | * Warm reset vector default position: | 152 | * Warm reset vector default position: |
92 | */ | 153 | */ |
diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c index 004aa1c31e4f..af494bad8858 100644 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic.c | |||
@@ -210,18 +210,13 @@ static int modern_apic(void) | |||
210 | return lapic_get_version() >= 0x14; | 210 | return lapic_get_version() >= 0x14; |
211 | } | 211 | } |
212 | 212 | ||
213 | /* | 213 | void native_apic_wait_icr_idle(void) |
214 | * Paravirt kernels also might be using these below ops. So we still | ||
215 | * use generic apic_read()/apic_write(), which might be pointing to different | ||
216 | * ops in PARAVIRT case. | ||
217 | */ | ||
218 | void xapic_wait_icr_idle(void) | ||
219 | { | 214 | { |
220 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) | 215 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) |
221 | cpu_relax(); | 216 | cpu_relax(); |
222 | } | 217 | } |
223 | 218 | ||
224 | u32 safe_xapic_wait_icr_idle(void) | 219 | u32 native_safe_apic_wait_icr_idle(void) |
225 | { | 220 | { |
226 | u32 send_status; | 221 | u32 send_status; |
227 | int timeout; | 222 | int timeout; |
@@ -237,13 +232,13 @@ u32 safe_xapic_wait_icr_idle(void) | |||
237 | return send_status; | 232 | return send_status; |
238 | } | 233 | } |
239 | 234 | ||
240 | void xapic_icr_write(u32 low, u32 id) | 235 | void native_apic_icr_write(u32 low, u32 id) |
241 | { | 236 | { |
242 | apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id)); | 237 | apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id)); |
243 | apic_write(APIC_ICR, low); | 238 | apic_write(APIC_ICR, low); |
244 | } | 239 | } |
245 | 240 | ||
246 | static u64 xapic_icr_read(void) | 241 | u64 native_apic_icr_read(void) |
247 | { | 242 | { |
248 | u32 icr1, icr2; | 243 | u32 icr1, icr2; |
249 | 244 | ||
@@ -253,54 +248,6 @@ static u64 xapic_icr_read(void) | |||
253 | return icr1 | ((u64)icr2 << 32); | 248 | return icr1 | ((u64)icr2 << 32); |
254 | } | 249 | } |
255 | 250 | ||
256 | static struct apic_ops xapic_ops = { | ||
257 | .read = native_apic_mem_read, | ||
258 | .write = native_apic_mem_write, | ||
259 | .icr_read = xapic_icr_read, | ||
260 | .icr_write = xapic_icr_write, | ||
261 | .wait_icr_idle = xapic_wait_icr_idle, | ||
262 | .safe_wait_icr_idle = safe_xapic_wait_icr_idle, | ||
263 | }; | ||
264 | |||
265 | struct apic_ops __read_mostly *apic_ops = &xapic_ops; | ||
266 | EXPORT_SYMBOL_GPL(apic_ops); | ||
267 | |||
268 | #ifdef CONFIG_X86_X2APIC | ||
269 | static void x2apic_wait_icr_idle(void) | ||
270 | { | ||
271 | /* no need to wait for icr idle in x2apic */ | ||
272 | return; | ||
273 | } | ||
274 | |||
275 | static u32 safe_x2apic_wait_icr_idle(void) | ||
276 | { | ||
277 | /* no need to wait for icr idle in x2apic */ | ||
278 | return 0; | ||
279 | } | ||
280 | |||
281 | void x2apic_icr_write(u32 low, u32 id) | ||
282 | { | ||
283 | wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low); | ||
284 | } | ||
285 | |||
286 | static u64 x2apic_icr_read(void) | ||
287 | { | ||
288 | unsigned long val; | ||
289 | |||
290 | rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val); | ||
291 | return val; | ||
292 | } | ||
293 | |||
294 | static struct apic_ops x2apic_ops = { | ||
295 | .read = native_apic_msr_read, | ||
296 | .write = native_apic_msr_write, | ||
297 | .icr_read = x2apic_icr_read, | ||
298 | .icr_write = x2apic_icr_write, | ||
299 | .wait_icr_idle = x2apic_wait_icr_idle, | ||
300 | .safe_wait_icr_idle = safe_x2apic_wait_icr_idle, | ||
301 | }; | ||
302 | #endif | ||
303 | |||
304 | /** | 251 | /** |
305 | * enable_NMI_through_LVT0 - enable NMI through local vector table 0 | 252 | * enable_NMI_through_LVT0 - enable NMI through local vector table 0 |
306 | */ | 253 | */ |
@@ -1329,7 +1276,6 @@ void check_x2apic(void) | |||
1329 | if (msr & X2APIC_ENABLE) { | 1276 | if (msr & X2APIC_ENABLE) { |
1330 | pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); | 1277 | pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); |
1331 | x2apic_preenabled = x2apic = 1; | 1278 | x2apic_preenabled = x2apic = 1; |
1332 | apic_ops = &x2apic_ops; | ||
1333 | } | 1279 | } |
1334 | } | 1280 | } |
1335 | 1281 | ||
@@ -1403,7 +1349,6 @@ void __init enable_IR_x2apic(void) | |||
1403 | 1349 | ||
1404 | if (!x2apic) { | 1350 | if (!x2apic) { |
1405 | x2apic = 1; | 1351 | x2apic = 1; |
1406 | apic_ops = &x2apic_ops; | ||
1407 | enable_x2apic(); | 1352 | enable_x2apic(); |
1408 | } | 1353 | } |
1409 | 1354 | ||
diff --git a/arch/x86/kernel/bigsmp_32.c b/arch/x86/kernel/bigsmp_32.c index 47a62f46afdb..9eeb714c5ded 100644 --- a/arch/x86/kernel/bigsmp_32.c +++ b/arch/x86/kernel/bigsmp_32.c | |||
@@ -263,4 +263,11 @@ struct genapic apic_bigsmp = { | |||
263 | .smp_callin_clear_local_apic = NULL, | 263 | .smp_callin_clear_local_apic = NULL, |
264 | .store_NMI_vector = NULL, | 264 | .store_NMI_vector = NULL, |
265 | .inquire_remote_apic = default_inquire_remote_apic, | 265 | .inquire_remote_apic = default_inquire_remote_apic, |
266 | |||
267 | .read = native_apic_mem_read, | ||
268 | .write = native_apic_mem_write, | ||
269 | .icr_read = native_apic_icr_read, | ||
270 | .icr_write = native_apic_icr_write, | ||
271 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
272 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
266 | }; | 273 | }; |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c index 4772e91e8246..e22d6ed26e61 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/smp.h> | 24 | #include <linux/smp.h> |
25 | #include <linux/sysdev.h> | 25 | #include <linux/sysdev.h> |
26 | #include <linux/sysfs.h> | 26 | #include <linux/sysfs.h> |
27 | #include <asm/apic.h> | 27 | #include <asm/genapic.h> |
28 | #include <asm/mce.h> | 28 | #include <asm/mce.h> |
29 | #include <asm/msr.h> | 29 | #include <asm/msr.h> |
30 | #include <asm/percpu.h> | 30 | #include <asm/percpu.h> |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel_64.c b/arch/x86/kernel/cpu/mcheck/mce_intel_64.c index 5e8c79e748a6..42f090702f02 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel_64.c | |||
@@ -7,7 +7,7 @@ | |||
7 | #include <linux/interrupt.h> | 7 | #include <linux/interrupt.h> |
8 | #include <linux/percpu.h> | 8 | #include <linux/percpu.h> |
9 | #include <asm/processor.h> | 9 | #include <asm/processor.h> |
10 | #include <asm/apic.h> | 10 | #include <asm/genapic.h> |
11 | #include <asm/msr.h> | 11 | #include <asm/msr.h> |
12 | #include <asm/mce.h> | 12 | #include <asm/mce.h> |
13 | #include <asm/hw_irq.h> | 13 | #include <asm/hw_irq.h> |
diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index 9abd48b22674..f6c70a164e32 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/nmi.h> | 19 | #include <linux/nmi.h> |
20 | #include <linux/kprobes.h> | 20 | #include <linux/kprobes.h> |
21 | 21 | ||
22 | #include <asm/apic.h> | 22 | #include <asm/genapic.h> |
23 | #include <asm/intel_arch_perfmon.h> | 23 | #include <asm/intel_arch_perfmon.h> |
24 | 24 | ||
25 | struct nmi_watchdog_ctlblk { | 25 | struct nmi_watchdog_ctlblk { |
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c index 55515d73d9c2..23f1df4ce18e 100644 --- a/arch/x86/kernel/es7000_32.c +++ b/arch/x86/kernel/es7000_32.c | |||
@@ -806,4 +806,11 @@ struct genapic apic_es7000 = { | |||
806 | .smp_callin_clear_local_apic = NULL, | 806 | .smp_callin_clear_local_apic = NULL, |
807 | .store_NMI_vector = NULL, | 807 | .store_NMI_vector = NULL, |
808 | .inquire_remote_apic = default_inquire_remote_apic, | 808 | .inquire_remote_apic = default_inquire_remote_apic, |
809 | |||
810 | .read = native_apic_mem_read, | ||
811 | .write = native_apic_mem_write, | ||
812 | .icr_read = native_apic_icr_read, | ||
813 | .icr_write = native_apic_icr_write, | ||
814 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
815 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
809 | }; | 816 | }; |
diff --git a/arch/x86/kernel/genapic_64.c b/arch/x86/kernel/genapic_64.c index cdc4772d9c87..70b616b4c629 100644 --- a/arch/x86/kernel/genapic_64.c +++ b/arch/x86/kernel/genapic_64.c | |||
@@ -19,8 +19,8 @@ | |||
19 | #include <linux/dmar.h> | 19 | #include <linux/dmar.h> |
20 | 20 | ||
21 | #include <asm/smp.h> | 21 | #include <asm/smp.h> |
22 | #include <asm/ipi.h> | ||
23 | #include <asm/genapic.h> | 22 | #include <asm/genapic.h> |
23 | #include <asm/ipi.h> | ||
24 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
25 | 25 | ||
26 | extern struct genapic apic_flat; | 26 | extern struct genapic apic_flat; |
diff --git a/arch/x86/kernel/genapic_flat_64.c b/arch/x86/kernel/genapic_flat_64.c index 249d2d3c034c..36ee760fd133 100644 --- a/arch/x86/kernel/genapic_flat_64.c +++ b/arch/x86/kernel/genapic_flat_64.c | |||
@@ -17,8 +17,8 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/hardirq.h> | 18 | #include <linux/hardirq.h> |
19 | #include <asm/smp.h> | 19 | #include <asm/smp.h> |
20 | #include <asm/ipi.h> | ||
21 | #include <asm/genapic.h> | 20 | #include <asm/genapic.h> |
21 | #include <asm/ipi.h> | ||
22 | 22 | ||
23 | #ifdef CONFIG_ACPI | 23 | #ifdef CONFIG_ACPI |
24 | #include <acpi/acpi_bus.h> | 24 | #include <acpi/acpi_bus.h> |
@@ -229,6 +229,13 @@ struct genapic apic_flat = { | |||
229 | .smp_callin_clear_local_apic = NULL, | 229 | .smp_callin_clear_local_apic = NULL, |
230 | .store_NMI_vector = NULL, | 230 | .store_NMI_vector = NULL, |
231 | .inquire_remote_apic = NULL, | 231 | .inquire_remote_apic = NULL, |
232 | |||
233 | .read = native_apic_mem_read, | ||
234 | .write = native_apic_mem_write, | ||
235 | .icr_read = native_apic_icr_read, | ||
236 | .icr_write = native_apic_icr_write, | ||
237 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
238 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
232 | }; | 239 | }; |
233 | 240 | ||
234 | /* | 241 | /* |
@@ -374,4 +381,11 @@ struct genapic apic_physflat = { | |||
374 | .smp_callin_clear_local_apic = NULL, | 381 | .smp_callin_clear_local_apic = NULL, |
375 | .store_NMI_vector = NULL, | 382 | .store_NMI_vector = NULL, |
376 | .inquire_remote_apic = NULL, | 383 | .inquire_remote_apic = NULL, |
384 | |||
385 | .read = native_apic_mem_read, | ||
386 | .write = native_apic_mem_write, | ||
387 | .icr_read = native_apic_icr_read, | ||
388 | .icr_write = native_apic_icr_write, | ||
389 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
390 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
377 | }; | 391 | }; |
diff --git a/arch/x86/kernel/genx2apic_cluster.c b/arch/x86/kernel/genx2apic_cluster.c index 7c87156b6411..dd6e8d685426 100644 --- a/arch/x86/kernel/genx2apic_cluster.c +++ b/arch/x86/kernel/genx2apic_cluster.c | |||
@@ -7,8 +7,8 @@ | |||
7 | #include <linux/dmar.h> | 7 | #include <linux/dmar.h> |
8 | 8 | ||
9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
10 | #include <asm/ipi.h> | ||
11 | #include <asm/genapic.h> | 10 | #include <asm/genapic.h> |
11 | #include <asm/ipi.h> | ||
12 | 12 | ||
13 | DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); | 13 | DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); |
14 | 14 | ||
@@ -46,7 +46,7 @@ static void | |||
46 | /* | 46 | /* |
47 | * send the IPI. | 47 | * send the IPI. |
48 | */ | 48 | */ |
49 | x2apic_icr_write(cfg, apicid); | 49 | native_x2apic_icr_write(cfg, apicid); |
50 | } | 50 | } |
51 | 51 | ||
52 | /* | 52 | /* |
@@ -234,4 +234,11 @@ struct genapic apic_x2apic_cluster = { | |||
234 | .smp_callin_clear_local_apic = NULL, | 234 | .smp_callin_clear_local_apic = NULL, |
235 | .store_NMI_vector = NULL, | 235 | .store_NMI_vector = NULL, |
236 | .inquire_remote_apic = NULL, | 236 | .inquire_remote_apic = NULL, |
237 | |||
238 | .read = native_apic_msr_read, | ||
239 | .write = native_apic_msr_write, | ||
240 | .icr_read = native_x2apic_icr_read, | ||
241 | .icr_write = native_x2apic_icr_write, | ||
242 | .wait_icr_idle = native_x2apic_wait_icr_idle, | ||
243 | .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, | ||
237 | }; | 244 | }; |
diff --git a/arch/x86/kernel/genx2apic_phys.c b/arch/x86/kernel/genx2apic_phys.c index 5cbae8aa0408..eb1486bb002e 100644 --- a/arch/x86/kernel/genx2apic_phys.c +++ b/arch/x86/kernel/genx2apic_phys.c | |||
@@ -7,8 +7,8 @@ | |||
7 | #include <linux/dmar.h> | 7 | #include <linux/dmar.h> |
8 | 8 | ||
9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
10 | #include <asm/ipi.h> | ||
11 | #include <asm/genapic.h> | 10 | #include <asm/genapic.h> |
11 | #include <asm/ipi.h> | ||
12 | 12 | ||
13 | static int x2apic_phys; | 13 | static int x2apic_phys; |
14 | 14 | ||
@@ -50,7 +50,7 @@ static void __x2apic_send_IPI_dest(unsigned int apicid, int vector, | |||
50 | /* | 50 | /* |
51 | * send the IPI. | 51 | * send the IPI. |
52 | */ | 52 | */ |
53 | x2apic_icr_write(cfg, apicid); | 53 | native_x2apic_icr_write(cfg, apicid); |
54 | } | 54 | } |
55 | 55 | ||
56 | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) | 56 | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) |
@@ -220,4 +220,11 @@ struct genapic apic_x2apic_phys = { | |||
220 | .smp_callin_clear_local_apic = NULL, | 220 | .smp_callin_clear_local_apic = NULL, |
221 | .store_NMI_vector = NULL, | 221 | .store_NMI_vector = NULL, |
222 | .inquire_remote_apic = NULL, | 222 | .inquire_remote_apic = NULL, |
223 | |||
224 | .read = native_apic_msr_read, | ||
225 | .write = native_apic_msr_write, | ||
226 | .icr_read = native_x2apic_icr_read, | ||
227 | .icr_write = native_x2apic_icr_write, | ||
228 | .wait_icr_idle = native_x2apic_wait_icr_idle, | ||
229 | .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, | ||
223 | }; | 230 | }; |
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 89b84e004f04..9ae4a92fac8c 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
@@ -22,8 +22,8 @@ | |||
22 | #include <linux/proc_fs.h> | 22 | #include <linux/proc_fs.h> |
23 | #include <asm/current.h> | 23 | #include <asm/current.h> |
24 | #include <asm/smp.h> | 24 | #include <asm/smp.h> |
25 | #include <asm/ipi.h> | ||
26 | #include <asm/genapic.h> | 25 | #include <asm/genapic.h> |
26 | #include <asm/ipi.h> | ||
27 | #include <asm/pgtable.h> | 27 | #include <asm/pgtable.h> |
28 | #include <asm/uv/uv.h> | 28 | #include <asm/uv/uv.h> |
29 | #include <asm/uv/uv_mmrs.h> | 29 | #include <asm/uv/uv_mmrs.h> |
@@ -292,6 +292,13 @@ struct genapic apic_x2apic_uv_x = { | |||
292 | .smp_callin_clear_local_apic = NULL, | 292 | .smp_callin_clear_local_apic = NULL, |
293 | .store_NMI_vector = NULL, | 293 | .store_NMI_vector = NULL, |
294 | .inquire_remote_apic = NULL, | 294 | .inquire_remote_apic = NULL, |
295 | |||
296 | .read = native_apic_msr_read, | ||
297 | .write = native_apic_msr_write, | ||
298 | .icr_read = native_x2apic_icr_read, | ||
299 | .icr_write = native_x2apic_icr_write, | ||
300 | .wait_icr_idle = native_x2apic_wait_icr_idle, | ||
301 | .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, | ||
295 | }; | 302 | }; |
296 | 303 | ||
297 | static __cpuinit void set_x2apic_extra_bits(int pnode) | 304 | static __cpuinit void set_x2apic_extra_bits(int pnode) |
diff --git a/arch/x86/kernel/ipi.c b/arch/x86/kernel/ipi.c index dbf5445727a9..1326272cae43 100644 --- a/arch/x86/kernel/ipi.c +++ b/arch/x86/kernel/ipi.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <asm/mtrr.h> | 15 | #include <asm/mtrr.h> |
16 | #include <asm/tlbflush.h> | 16 | #include <asm/tlbflush.h> |
17 | #include <asm/mmu_context.h> | 17 | #include <asm/mmu_context.h> |
18 | #include <asm/apic.h> | 18 | #include <asm/genapic.h> |
19 | #include <asm/proto.h> | 19 | #include <asm/proto.h> |
20 | #include <asm/ipi.h> | 20 | #include <asm/ipi.h> |
21 | 21 | ||
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index f13ca1650aaf..3957776b1930 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -8,7 +8,7 @@ | |||
8 | #include <linux/smp.h> | 8 | #include <linux/smp.h> |
9 | #include <linux/ftrace.h> | 9 | #include <linux/ftrace.h> |
10 | 10 | ||
11 | #include <asm/apic.h> | 11 | #include <asm/genapic.h> |
12 | #include <asm/io_apic.h> | 12 | #include <asm/io_apic.h> |
13 | #include <asm/irq.h> | 13 | #include <asm/irq.h> |
14 | #include <asm/idle.h> | 14 | #include <asm/idle.h> |
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index bdfad80c3cf1..48b9ca5e088c 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * Mikael Pettersson : PM converted to driver model. Disable/enable API. | 11 | * Mikael Pettersson : PM converted to driver model. Disable/enable API. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/apic.h> | 14 | #include <asm/genapic.h> |
15 | 15 | ||
16 | #include <linux/nmi.h> | 16 | #include <linux/nmi.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
diff --git a/arch/x86/kernel/numaq_32.c b/arch/x86/kernel/numaq_32.c index 0cc41a1d2550..f0f0c2f0596b 100644 --- a/arch/x86/kernel/numaq_32.c +++ b/arch/x86/kernel/numaq_32.c | |||
@@ -569,4 +569,11 @@ struct genapic apic_numaq = { | |||
569 | .smp_callin_clear_local_apic = numaq_smp_callin_clear_local_apic, | 569 | .smp_callin_clear_local_apic = numaq_smp_callin_clear_local_apic, |
570 | .store_NMI_vector = numaq_store_NMI_vector, | 570 | .store_NMI_vector = numaq_store_NMI_vector, |
571 | .inquire_remote_apic = NULL, | 571 | .inquire_remote_apic = NULL, |
572 | |||
573 | .read = native_apic_mem_read, | ||
574 | .write = native_apic_mem_write, | ||
575 | .icr_read = native_apic_icr_read, | ||
576 | .icr_write = native_apic_icr_write, | ||
577 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
578 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
572 | }; | 579 | }; |
diff --git a/arch/x86/kernel/probe_32.c b/arch/x86/kernel/probe_32.c index 22337b75de62..1f701caa95bc 100644 --- a/arch/x86/kernel/probe_32.c +++ b/arch/x86/kernel/probe_32.c | |||
@@ -127,6 +127,13 @@ struct genapic apic_default = { | |||
127 | .smp_callin_clear_local_apic = NULL, | 127 | .smp_callin_clear_local_apic = NULL, |
128 | .store_NMI_vector = NULL, | 128 | .store_NMI_vector = NULL, |
129 | .inquire_remote_apic = default_inquire_remote_apic, | 129 | .inquire_remote_apic = default_inquire_remote_apic, |
130 | |||
131 | .read = native_apic_mem_read, | ||
132 | .write = native_apic_mem_write, | ||
133 | .icr_read = native_apic_icr_read, | ||
134 | .icr_write = native_apic_icr_write, | ||
135 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
136 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
130 | }; | 137 | }; |
131 | 138 | ||
132 | extern struct genapic apic_numaq; | 139 | extern struct genapic apic_numaq; |
diff --git a/arch/x86/kernel/summit_32.c b/arch/x86/kernel/summit_32.c index 1e733eff9b33..1cf32c325d12 100644 --- a/arch/x86/kernel/summit_32.c +++ b/arch/x86/kernel/summit_32.c | |||
@@ -599,4 +599,11 @@ struct genapic apic_summit = { | |||
599 | .smp_callin_clear_local_apic = NULL, | 599 | .smp_callin_clear_local_apic = NULL, |
600 | .store_NMI_vector = NULL, | 600 | .store_NMI_vector = NULL, |
601 | .inquire_remote_apic = default_inquire_remote_apic, | 601 | .inquire_remote_apic = default_inquire_remote_apic, |
602 | |||
603 | .read = native_apic_mem_read, | ||
604 | .write = native_apic_mem_write, | ||
605 | .icr_read = native_apic_icr_read, | ||
606 | .icr_write = native_apic_icr_write, | ||
607 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
608 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
602 | }; | 609 | }; |
diff --git a/arch/x86/kernel/uv_irq.c b/arch/x86/kernel/uv_irq.c index aeef529917e4..75eb5ec5dd2a 100644 --- a/arch/x86/kernel/uv_irq.c +++ b/arch/x86/kernel/uv_irq.c | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
13 | 13 | ||
14 | #include <asm/apic.h> | 14 | #include <asm/genapic.h> |
15 | #include <asm/uv/uv_irq.h> | 15 | #include <asm/uv/uv_irq.h> |
16 | 16 | ||
17 | static void uv_noop(unsigned int irq) | 17 | static void uv_noop(unsigned int irq) |
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c index f052c84ecbe4..a1c7b71dc0d0 100644 --- a/arch/x86/kernel/vmi_32.c +++ b/arch/x86/kernel/vmi_32.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <asm/io.h> | 32 | #include <asm/io.h> |
33 | #include <asm/fixmap.h> | 33 | #include <asm/fixmap.h> |
34 | #include <asm/apicdef.h> | 34 | #include <asm/apicdef.h> |
35 | #include <asm/apic.h> | 35 | #include <asm/genapic.h> |
36 | #include <asm/processor.h> | 36 | #include <asm/processor.h> |
37 | #include <asm/timer.h> | 37 | #include <asm/timer.h> |
38 | #include <asm/vmi_time.h> | 38 | #include <asm/vmi_time.h> |
@@ -798,8 +798,8 @@ static inline int __init activate_vmi(void) | |||
798 | #endif | 798 | #endif |
799 | 799 | ||
800 | #ifdef CONFIG_X86_LOCAL_APIC | 800 | #ifdef CONFIG_X86_LOCAL_APIC |
801 | para_fill(apic_ops->read, APICRead); | 801 | para_fill(apic->read, APICRead); |
802 | para_fill(apic_ops->write, APICWrite); | 802 | para_fill(apic->write, APICWrite); |
803 | #endif | 803 | #endif |
804 | 804 | ||
805 | /* | 805 | /* |
diff --git a/arch/x86/kernel/vmiclock_32.c b/arch/x86/kernel/vmiclock_32.c index a4791ef412d1..2a5e0e6a7c0d 100644 --- a/arch/x86/kernel/vmiclock_32.c +++ b/arch/x86/kernel/vmiclock_32.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <asm/vmi_time.h> | 30 | #include <asm/vmi_time.h> |
31 | #include <asm/arch_hooks.h> | 31 | #include <asm/arch_hooks.h> |
32 | #include <asm/apicdef.h> | 32 | #include <asm/apicdef.h> |
33 | #include <asm/apic.h> | 33 | #include <asm/genapic.h> |
34 | #include <asm/timer.h> | 34 | #include <asm/timer.h> |
35 | #include <asm/i8253.h> | 35 | #include <asm/i8253.h> |
36 | #include <asm/irq_vectors.h> | 36 | #include <asm/irq_vectors.h> |
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index da2e314f61b5..bc9893f2c383 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
@@ -55,7 +55,7 @@ | |||
55 | #include <linux/lguest_launcher.h> | 55 | #include <linux/lguest_launcher.h> |
56 | #include <linux/virtio_console.h> | 56 | #include <linux/virtio_console.h> |
57 | #include <linux/pm.h> | 57 | #include <linux/pm.h> |
58 | #include <asm/apic.h> | 58 | #include <asm/genapic.h> |
59 | #include <asm/lguest.h> | 59 | #include <asm/lguest.h> |
60 | #include <asm/paravirt.h> | 60 | #include <asm/paravirt.h> |
61 | #include <asm/param.h> | 61 | #include <asm/param.h> |
@@ -828,13 +828,14 @@ static u32 lguest_apic_safe_wait_icr_idle(void) | |||
828 | return 0; | 828 | return 0; |
829 | } | 829 | } |
830 | 830 | ||
831 | static struct apic_ops lguest_basic_apic_ops = { | 831 | static void set_lguest_basic_apic_ops(void) |
832 | .read = lguest_apic_read, | 832 | { |
833 | .write = lguest_apic_write, | 833 | apic->read = lguest_apic_read; |
834 | .icr_read = lguest_apic_icr_read, | 834 | apic->write = lguest_apic_write; |
835 | .icr_write = lguest_apic_icr_write, | 835 | apic->icr_read = lguest_apic_icr_read; |
836 | .wait_icr_idle = lguest_apic_wait_icr_idle, | 836 | apic->icr_write = lguest_apic_icr_write; |
837 | .safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle, | 837 | apic->wait_icr_idle = lguest_apic_wait_icr_idle; |
838 | apic->safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle; | ||
838 | }; | 839 | }; |
839 | #endif | 840 | #endif |
840 | 841 | ||
@@ -1035,7 +1036,7 @@ __init void lguest_init(void) | |||
1035 | 1036 | ||
1036 | #ifdef CONFIG_X86_LOCAL_APIC | 1037 | #ifdef CONFIG_X86_LOCAL_APIC |
1037 | /* apic read/write intercepts */ | 1038 | /* apic read/write intercepts */ |
1038 | apic_ops = &lguest_basic_apic_ops; | 1039 | set_lguest_basic_apic_ops(); |
1039 | #endif | 1040 | #endif |
1040 | 1041 | ||
1041 | /* time operations */ | 1042 | /* time operations */ |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 95ff6a0e942a..e3dd3fb67290 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #include <xen/hvc-console.h> | 36 | #include <xen/hvc-console.h> |
37 | 37 | ||
38 | #include <asm/paravirt.h> | 38 | #include <asm/paravirt.h> |
39 | #include <asm/apic.h> | 39 | #include <asm/genapic.h> |
40 | #include <asm/page.h> | 40 | #include <asm/page.h> |
41 | #include <asm/xen/hypercall.h> | 41 | #include <asm/xen/hypercall.h> |
42 | #include <asm/xen/hypervisor.h> | 42 | #include <asm/xen/hypervisor.h> |
@@ -554,14 +554,15 @@ static u32 xen_safe_apic_wait_icr_idle(void) | |||
554 | return 0; | 554 | return 0; |
555 | } | 555 | } |
556 | 556 | ||
557 | static struct apic_ops xen_basic_apic_ops = { | 557 | static void set_xen_basic_apic_ops(void) |
558 | .read = xen_apic_read, | 558 | { |
559 | .write = xen_apic_write, | 559 | apic->read = xen_apic_read; |
560 | .icr_read = xen_apic_icr_read, | 560 | apic->write = xen_apic_write; |
561 | .icr_write = xen_apic_icr_write, | 561 | apic->icr_read = xen_apic_icr_read; |
562 | .wait_icr_idle = xen_apic_wait_icr_idle, | 562 | apic->icr_write = xen_apic_icr_write; |
563 | .safe_wait_icr_idle = xen_safe_apic_wait_icr_idle, | 563 | apic->wait_icr_idle = xen_apic_wait_icr_idle; |
564 | }; | 564 | apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle; |
565 | } | ||
565 | 566 | ||
566 | #endif | 567 | #endif |
567 | 568 | ||
@@ -898,7 +899,7 @@ asmlinkage void __init xen_start_kernel(void) | |||
898 | /* | 899 | /* |
899 | * set up the basic apic ops. | 900 | * set up the basic apic ops. |
900 | */ | 901 | */ |
901 | apic_ops = &xen_basic_apic_ops; | 902 | set_xen_basic_apic_ops(); |
902 | #endif | 903 | #endif |
903 | 904 | ||
904 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { | 905 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { |