[IA64] allow user to force_pal_cache_flush
authorAlex Chiang <achiang@hp.com>
Thu, 8 May 2008 20:03:23 +0000 (14:03 -0600)
committerTony Luck <tony.luck@intel.com>
Wed, 14 May 2008 22:42:07 +0000 (15:42 -0700)
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>
Documentation/kernel-parameters.txt
arch/ia64/kernel/sal.c

index cdd5b934f43ea89865f1f605ecc5f295b03192d3..654d630f67514ff09fdb9ad2b18c811352a35b59 100644 (file)
@@ -689,6 +689,12 @@ and is between 256 and 4096 characters. It is defined in the file
        floppy=         [HW]
                        See Documentation/floppy.txt.
 
+       force_pal_cache_flush
+                       [IA-64] Avoid check_sal_cache_flush which may hang on
+                       buggy SAL_CACHE_FLUSH implementations. Using this
+                       parameter will force ia64_sal_cache_flush to call
+                       ia64_pal_cache_flush instead of SAL_CACHE_FLUSH.
+
        gamecon.map[2|3]=
                        [HW,JOY] Multisystem joystick and NES/SNES/PSX pad
                        support via parallel port (up to 5 devices per port)
index a3022dc48ef8432a437256948d5a25080b1cf24d..7e0259709c0415081c6f42396e7e2d446c9c5479 100644 (file)
@@ -229,6 +229,14 @@ static void __init sal_desc_ap_wakeup(void *p) { }
  */
 static int sal_cache_flush_drops_interrupts;
 
+static int __init
+force_pal_cache_flush(char *str)
+{
+       sal_cache_flush_drops_interrupts = 1;
+       return 0;
+}
+early_param("force_pal_cache_flush", force_pal_cache_flush);
+
 void __init
 check_sal_cache_flush (void)
 {
@@ -237,6 +245,9 @@ check_sal_cache_flush (void)
        u64 vector, cache_type = 3;
        struct ia64_sal_retval isrv;
 
+       if (sal_cache_flush_drops_interrupts)
+               return;
+
        cpu = get_cpu();
        local_irq_save(flags);