aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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*/