[PATCH] x86_64: Only do the clustered systems have unsynchronized TSC assumption...
authorAndi Kleen <ak@suse.de>
Sun, 26 Feb 2006 03:18:31 +0000 (04:18 +0100)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 26 Feb 2006 17:53:30 +0000 (09:53 -0800)
Big Unisys systems have multiple clusters too, but they have an
synchronized TSC.

I'm using the SMBIOS to check for vendor == IBM.

Cc: Chris McDermott <lcm@us.ibm.com>
Cc: "Protasevich, Natalie" <Natalie.Protasevich@unisys.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/i386/kernel/acpi/boot.c
arch/x86_64/kernel/apic.c
include/asm-x86_64/acpi.h

index 79577f0..8309a7b 100644 (file)
@@ -44,9 +44,6 @@ extern void __init clustered_apic_check(void);
 extern int gsi_irq_sharing(int gsi);
 #include <asm/proto.h>
 
-static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return 0; }
-
-
 #else                          /* X86 */
 
 #ifdef CONFIG_X86_LOCAL_APIC
index e5b14c5..d70605e 100644 (file)
@@ -962,12 +962,14 @@ void smp_apic_timer_interrupt(struct pt_regs *regs)
        irq_exit();
 }
 
+int __initdata unsync_tsc_on_multicluster;
+
 /*
  * oem_force_hpet_timer -- force HPET mode for some boxes.
  *
  * Thus far, the major user of this is IBM's Summit2 series:
  *
- * Clustered boxes may have unsynced TSC problems if they are
+ * Some clustered boxes may have unsynced TSC problems if they are
  * multi-chassis. Use available data to take a good guess.
  * If in doubt, go HPET.
  */
@@ -977,6 +979,11 @@ __cpuinit int oem_force_hpet_timer(void)
        unsigned id;
        DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS);
 
+       /* Only do this check on IBM machines - big Unisys systems
+          use multiple clusters too, but have synchronized TSC */
+       if (!unsync_tsc_on_multicluster)
+               return 0;
+
        bitmap_zero(clustermap, NUM_APIC_CLUSTERS);
 
        for (i = 0; i < NR_CPUS; i++) {
index aa1c7b2..e2b9923 100644 (file)
@@ -164,6 +164,20 @@ extern u8 x86_acpiid_to_apicid[];
 
 extern int acpi_skip_timer_override;
 
+extern int unsync_tsc_on_multicluster;
+
+static inline int acpi_madt_oem_check(char *oem, char *productid) 
+{ 
+       /* Copied from i386. Probably has too many entries. */
+       if (!strncmp(oem, "IBM ENSW", 8) && 
+               (!strncmp(productid, "VIGIL SMP", 9) 
+                       || !strncmp(productid, "EXA", 3)
+                       || !strncmp(productid, "RUTHLESS SMP", 12))) {
+               unsync_tsc_on_multicluster = 1;
+        }
+        return 0;
+}
+
 #endif /*__KERNEL__*/
 
 #endif /*_ASM_ACPI_H*/