aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-02-25 22:18:31 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-02-26 12:53:30 -0500
commit13a229abc25640813f1480c0478dfc6bdbc1c19e (patch)
treebdb9da6ba327bd4f6ee64aa3ca1548670be395f2
parent5342fba5412cead88b61ead07168615dbeba1ee3 (diff)
[PATCH] x86_64: Only do the clustered systems have unsynchronized TSC assumption on IBM systems
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>
-rw-r--r--arch/i386/kernel/acpi/boot.c3
-rw-r--r--arch/x86_64/kernel/apic.c9
-rw-r--r--include/asm-x86_64/acpi.h14
3 files changed, 22 insertions, 4 deletions
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c
index 79577f0ace98..8309a7b2cd63 100644
--- a/arch/i386/kernel/acpi/boot.c
+++ b/arch/i386/kernel/acpi/boot.c
@@ -44,9 +44,6 @@ extern void __init clustered_apic_check(void);
44extern int gsi_irq_sharing(int gsi); 44extern int gsi_irq_sharing(int gsi);
45#include <asm/proto.h> 45#include <asm/proto.h>
46 46
47static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return 0; }
48
49
50#else /* X86 */ 47#else /* X86 */
51 48
52#ifdef CONFIG_X86_LOCAL_APIC 49#ifdef CONFIG_X86_LOCAL_APIC
diff --git a/arch/x86_64/kernel/apic.c b/arch/x86_64/kernel/apic.c
index e5b14c57eaa0..d70605eda333 100644
--- a/arch/x86_64/kernel/apic.c
+++ b/arch/x86_64/kernel/apic.c
@@ -962,12 +962,14 @@ void smp_apic_timer_interrupt(struct pt_regs *regs)
962 irq_exit(); 962 irq_exit();
963} 963}
964 964
965int __initdata unsync_tsc_on_multicluster;
966
965/* 967/*
966 * oem_force_hpet_timer -- force HPET mode for some boxes. 968 * oem_force_hpet_timer -- force HPET mode for some boxes.
967 * 969 *
968 * Thus far, the major user of this is IBM's Summit2 series: 970 * Thus far, the major user of this is IBM's Summit2 series:
969 * 971 *
970 * Clustered boxes may have unsynced TSC problems if they are 972 * Some clustered boxes may have unsynced TSC problems if they are
971 * multi-chassis. Use available data to take a good guess. 973 * multi-chassis. Use available data to take a good guess.
972 * If in doubt, go HPET. 974 * If in doubt, go HPET.
973 */ 975 */
@@ -977,6 +979,11 @@ __cpuinit int oem_force_hpet_timer(void)
977 unsigned id; 979 unsigned id;
978 DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS); 980 DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS);
979 981
982 /* Only do this check on IBM machines - big Unisys systems
983 use multiple clusters too, but have synchronized TSC */
984 if (!unsync_tsc_on_multicluster)
985 return 0;
986
980 bitmap_zero(clustermap, NUM_APIC_CLUSTERS); 987 bitmap_zero(clustermap, NUM_APIC_CLUSTERS);
981 988
982 for (i = 0; i < NR_CPUS; i++) { 989 for (i = 0; i < NR_CPUS; i++) {
diff --git a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h
index aa1c7b2e438c..e2b9923189a0 100644
--- a/include/asm-x86_64/acpi.h
+++ b/include/asm-x86_64/acpi.h
@@ -164,6 +164,20 @@ extern u8 x86_acpiid_to_apicid[];
164 164
165extern int acpi_skip_timer_override; 165extern int acpi_skip_timer_override;
166 166
167extern int unsync_tsc_on_multicluster;
168
169static inline int acpi_madt_oem_check(char *oem, char *productid)
170{
171 /* Copied from i386. Probably has too many entries. */
172 if (!strncmp(oem, "IBM ENSW", 8) &&
173 (!strncmp(productid, "VIGIL SMP", 9)
174 || !strncmp(productid, "EXA", 3)
175 || !strncmp(productid, "RUTHLESS SMP", 12))) {
176 unsync_tsc_on_multicluster = 1;
177 }
178 return 0;
179}
180
167#endif /*__KERNEL__*/ 181#endif /*__KERNEL__*/
168 182
169#endif /*_ASM_ACPI_H*/ 183#endif /*_ASM_ACPI_H*/