diff options
-rw-r--r-- | arch/i386/kernel/acpi/boot.c | 3 | ||||
-rw-r--r-- | arch/x86_64/kernel/apic.c | 9 | ||||
-rw-r--r-- | include/asm-x86_64/acpi.h | 14 |
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); | |||
44 | extern int gsi_irq_sharing(int gsi); | 44 | extern int gsi_irq_sharing(int gsi); |
45 | #include <asm/proto.h> | 45 | #include <asm/proto.h> |
46 | 46 | ||
47 | static 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 | ||
965 | int __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 | ||
165 | extern int acpi_skip_timer_override; | 165 | extern int acpi_skip_timer_override; |
166 | 166 | ||
167 | extern int unsync_tsc_on_multicluster; | ||
168 | |||
169 | static 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*/ |