diff options
author | Alex Chiang <achiang@hp.com> | 2008-05-08 16:03:23 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2008-05-14 18:42:07 -0400 |
commit | f13ae30e1397e3bfb38feb3b6e889af5d021f13d (patch) | |
tree | 4b82d1ee1e8bbb5f21d5f81bb0a73cf3daa8efb4 | |
parent | 8a3360f06cd4d3b1d57f73e029f2f8b6057fdcba (diff) |
[IA64] allow user to force_pal_cache_flush
The sequence executed in check_sal_cache_flush:
- pend a timer interrupt
- call SAL_CACHE_FLUSH
- see if interrupt is still pending
can hang HP machines with buggy SAL_CACHE_FLUSH implementations.
Provide a kernel command-line argument to allow users skip this
check if desired. Using this parameter will force ia64_sal_cache_flush
to call ia64_pal_cache_flush() instead of SAL_CACHE_FLUSH.
Signed-off-by: Alex Chiang <achiang@hp.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r-- | Documentation/kernel-parameters.txt | 6 | ||||
-rw-r--r-- | arch/ia64/kernel/sal.c | 11 |
2 files changed, 17 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index cdd5b934f43e..654d630f6751 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -689,6 +689,12 @@ and is between 256 and 4096 characters. It is defined in the file | |||
689 | floppy= [HW] | 689 | floppy= [HW] |
690 | See Documentation/floppy.txt. | 690 | See Documentation/floppy.txt. |
691 | 691 | ||
692 | force_pal_cache_flush | ||
693 | [IA-64] Avoid check_sal_cache_flush which may hang on | ||
694 | buggy SAL_CACHE_FLUSH implementations. Using this | ||
695 | parameter will force ia64_sal_cache_flush to call | ||
696 | ia64_pal_cache_flush instead of SAL_CACHE_FLUSH. | ||
697 | |||
692 | gamecon.map[2|3]= | 698 | gamecon.map[2|3]= |
693 | [HW,JOY] Multisystem joystick and NES/SNES/PSX pad | 699 | [HW,JOY] Multisystem joystick and NES/SNES/PSX pad |
694 | support via parallel port (up to 5 devices per port) | 700 | support via parallel port (up to 5 devices per port) |
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index a3022dc48ef8..7e0259709c04 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,6 +245,9 @@ 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 | ||