diff options
Diffstat (limited to 'arch/x86/kernel/es7000_32.c')
-rw-r--r-- | arch/x86/kernel/es7000_32.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c index f454c78fcef6..bed10dddf099 100644 --- a/arch/x86/kernel/es7000_32.c +++ b/arch/x86/kernel/es7000_32.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <asm/smp.h> | 40 | #include <asm/smp.h> |
41 | #include <asm/apicdef.h> | 41 | #include <asm/apicdef.h> |
42 | #include <mach_mpparse.h> | 42 | #include <mach_mpparse.h> |
43 | #include <asm/setup.h> | ||
43 | 44 | ||
44 | /* | 45 | /* |
45 | * ES7000 chipsets | 46 | * ES7000 chipsets |
@@ -161,6 +162,26 @@ es7000_rename_gsi(int ioapic, int gsi) | |||
161 | return gsi; | 162 | return gsi; |
162 | } | 163 | } |
163 | 164 | ||
165 | #ifdef CONFIG_ES7000_CLUSTERED_APIC | ||
166 | static int wakeup_secondary_cpu_via_mip(int cpu, unsigned long eip) | ||
167 | { | ||
168 | unsigned long vect = 0, psaival = 0; | ||
169 | |||
170 | if (psai == NULL) | ||
171 | return -1; | ||
172 | |||
173 | vect = ((unsigned long)__pa(eip)/0x1000) << 16; | ||
174 | psaival = (0x1000000 | vect | cpu); | ||
175 | |||
176 | while (*psai & 0x1000000) | ||
177 | ; | ||
178 | |||
179 | *psai = psaival; | ||
180 | |||
181 | return 0; | ||
182 | } | ||
183 | #endif | ||
184 | |||
164 | void __init | 185 | void __init |
165 | setup_unisys(void) | 186 | setup_unisys(void) |
166 | { | 187 | { |
@@ -176,6 +197,9 @@ setup_unisys(void) | |||
176 | else | 197 | else |
177 | es7000_plat = ES7000_CLASSIC; | 198 | es7000_plat = ES7000_CLASSIC; |
178 | ioapic_renumber_irq = es7000_rename_gsi; | 199 | ioapic_renumber_irq = es7000_rename_gsi; |
200 | #ifdef CONFIG_ES7000_CLUSTERED_APIC | ||
201 | x86_quirks->wakeup_secondary_cpu = wakeup_secondary_cpu_via_mip; | ||
202 | #endif | ||
179 | } | 203 | } |
180 | 204 | ||
181 | /* | 205 | /* |
@@ -324,26 +348,6 @@ es7000_mip_write(struct mip_reg *mip_reg) | |||
324 | return status; | 348 | return status; |
325 | } | 349 | } |
326 | 350 | ||
327 | int | ||
328 | es7000_start_cpu(int cpu, unsigned long eip) | ||
329 | { | ||
330 | unsigned long vect = 0, psaival = 0; | ||
331 | |||
332 | if (psai == NULL) | ||
333 | return -1; | ||
334 | |||
335 | vect = ((unsigned long)__pa(eip)/0x1000) << 16; | ||
336 | psaival = (0x1000000 | vect | cpu); | ||
337 | |||
338 | while (*psai & 0x1000000) | ||
339 | ; | ||
340 | |||
341 | *psai = psaival; | ||
342 | |||
343 | return 0; | ||
344 | |||
345 | } | ||
346 | |||
347 | void __init | 351 | void __init |
348 | es7000_sw_apic(void) | 352 | es7000_sw_apic(void) |
349 | { | 353 | { |