diff options
Diffstat (limited to 'arch/ia64/kernel/sal.c')
-rw-r--r-- | arch/ia64/kernel/sal.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index a3022dc48ef8..0464173ea568 100644 --- a/arch/ia64/kernel/sal.c +++ b/arch/ia64/kernel/sal.c | |||
@@ -229,6 +229,14 @@ static void __init sal_desc_ap_wakeup(void *p) { } | |||
229 | */ | 229 | */ |
230 | static int sal_cache_flush_drops_interrupts; | 230 | static int sal_cache_flush_drops_interrupts; |
231 | 231 | ||
232 | static int __init | ||
233 | force_pal_cache_flush(char *str) | ||
234 | { | ||
235 | sal_cache_flush_drops_interrupts = 1; | ||
236 | return 0; | ||
237 | } | ||
238 | early_param("force_pal_cache_flush", force_pal_cache_flush); | ||
239 | |||
232 | void __init | 240 | void __init |
233 | check_sal_cache_flush (void) | 241 | check_sal_cache_flush (void) |
234 | { | 242 | { |
@@ -237,15 +245,17 @@ check_sal_cache_flush (void) | |||
237 | u64 vector, cache_type = 3; | 245 | u64 vector, cache_type = 3; |
238 | struct ia64_sal_retval isrv; | 246 | struct ia64_sal_retval isrv; |
239 | 247 | ||
248 | if (sal_cache_flush_drops_interrupts) | ||
249 | return; | ||
250 | |||
240 | cpu = get_cpu(); | 251 | cpu = get_cpu(); |
241 | local_irq_save(flags); | 252 | local_irq_save(flags); |
242 | 253 | ||
243 | /* | 254 | /* |
244 | * Schedule a timer interrupt, wait until it's reported, and see if | 255 | * Send ourselves a timer interrupt, wait until it's reported, and see |
245 | * SAL_CACHE_FLUSH drops it. | 256 | * if SAL_CACHE_FLUSH drops it. |
246 | */ | 257 | */ |
247 | ia64_set_itv(IA64_TIMER_VECTOR); | 258 | platform_send_ipi(cpu, IA64_TIMER_VECTOR, IA64_IPI_DM_INT, 0); |
248 | ia64_set_itm(ia64_get_itc() + 1000); | ||
249 | 259 | ||
250 | while (!ia64_get_irr(IA64_TIMER_VECTOR)) | 260 | while (!ia64_get_irr(IA64_TIMER_VECTOR)) |
251 | cpu_relax(); | 261 | cpu_relax(); |