diff options
author | Troy Heber <troy.heber@hp.com> | 2006-10-25 16:46:15 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2006-10-31 17:32:10 -0500 |
commit | fa1d19e5d9a94120f31e5783ab44758f46892d94 (patch) | |
tree | cb685f4b1cc31d633d04561ea9f31e40e43a3fc1 /arch/ia64/kernel | |
parent | 264b0f99308436deaee38bab99e586612d012fc1 (diff) |
[IA64] move SAL_CACHE_FLUSH check later in boot
The check to see if the firmware drops interrupts during a
SAL_CACHE_FLUSH is done to early in the boot. SAL_CACHE_FLUSH expects
to be able to make PAL calls in virtual mode, on some cell based
machines a fault occurs causing a MCA. This patch moves the check
after mmu_context_init so the TLB and VHPT are properly setup.
Signed-off-by Troy Heber <troy.heber@hp.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel')
-rw-r--r-- | arch/ia64/kernel/sal.c | 11 | ||||
-rw-r--r-- | arch/ia64/kernel/setup.c | 2 |
2 files changed, 9 insertions, 4 deletions
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index 642fdc7b969d..20bad78b5073 100644 --- a/arch/ia64/kernel/sal.c +++ b/arch/ia64/kernel/sal.c | |||
@@ -223,12 +223,13 @@ static void __init sal_desc_ap_wakeup(void *p) { } | |||
223 | */ | 223 | */ |
224 | static int sal_cache_flush_drops_interrupts; | 224 | static int sal_cache_flush_drops_interrupts; |
225 | 225 | ||
226 | static void __init | 226 | void __init |
227 | check_sal_cache_flush (void) | 227 | check_sal_cache_flush (void) |
228 | { | 228 | { |
229 | unsigned long flags; | 229 | unsigned long flags; |
230 | int cpu; | 230 | int cpu; |
231 | u64 vector; | 231 | u64 vector, cache_type = 3; |
232 | struct ia64_sal_retval isrv; | ||
232 | 233 | ||
233 | cpu = get_cpu(); | 234 | cpu = get_cpu(); |
234 | local_irq_save(flags); | 235 | local_irq_save(flags); |
@@ -243,7 +244,10 @@ check_sal_cache_flush (void) | |||
243 | while (!ia64_get_irr(IA64_TIMER_VECTOR)) | 244 | while (!ia64_get_irr(IA64_TIMER_VECTOR)) |
244 | cpu_relax(); | 245 | cpu_relax(); |
245 | 246 | ||
246 | ia64_sal_cache_flush(3); | 247 | SAL_CALL(isrv, SAL_CACHE_FLUSH, cache_type, 0, 0, 0, 0, 0, 0); |
248 | |||
249 | if (isrv.status) | ||
250 | printk(KERN_ERR "SAL_CAL_FLUSH failed with %ld\n", isrv.status); | ||
247 | 251 | ||
248 | if (ia64_get_irr(IA64_TIMER_VECTOR)) { | 252 | if (ia64_get_irr(IA64_TIMER_VECTOR)) { |
249 | vector = ia64_get_ivr(); | 253 | vector = ia64_get_ivr(); |
@@ -331,7 +335,6 @@ ia64_sal_init (struct ia64_sal_systab *systab) | |||
331 | p += SAL_DESC_SIZE(*p); | 335 | p += SAL_DESC_SIZE(*p); |
332 | } | 336 | } |
333 | 337 | ||
334 | check_sal_cache_flush(); | ||
335 | } | 338 | } |
336 | 339 | ||
337 | int | 340 | int |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index c4caa8003492..d10404a41756 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -457,6 +457,8 @@ setup_arch (char **cmdline_p) | |||
457 | cpu_init(); /* initialize the bootstrap CPU */ | 457 | cpu_init(); /* initialize the bootstrap CPU */ |
458 | mmu_context_init(); /* initialize context_id bitmap */ | 458 | mmu_context_init(); /* initialize context_id bitmap */ |
459 | 459 | ||
460 | check_sal_cache_flush(); | ||
461 | |||
460 | #ifdef CONFIG_ACPI | 462 | #ifdef CONFIG_ACPI |
461 | acpi_boot_init(); | 463 | acpi_boot_init(); |
462 | #endif | 464 | #endif |