diff options
author | Andi Kleen <ak@suse.de> | 2008-01-30 07:33:20 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:33:20 -0500 |
commit | 404ee5b14b68d3cba287c2596588b83790c49f7b (patch) | |
tree | 6007a5d2c461c3435edbc9335c84ff45ec4715ca | |
parent | 8424950b5e85543a494b5d940bb2f5f9f16f56a9 (diff) |
x86: convert TSC disabling to generic cpuid disable bitmap
Fix from: Ian Campbell <ijc@hellion.org.uk>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/cpu/bugs.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 9 | ||||
-rw-r--r-- | arch/x86/kernel/numaq_32.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/tsc_32.c | 14 | ||||
-rw-r--r-- | arch/x86/mach-voyager/setup.c | 2 | ||||
-rw-r--r-- | arch/x86/xen/time.c | 2 | ||||
-rw-r--r-- | include/asm-x86/cpufeature.h | 4 | ||||
-rw-r--r-- | include/asm-x86/tsc.h | 2 |
8 files changed, 11 insertions, 26 deletions
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index a96abd453e0d..9b95edcfc6ae 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c | |||
@@ -154,7 +154,7 @@ static void __init check_config(void) | |||
154 | * If we configured ourselves for a TSC, we'd better have one! | 154 | * If we configured ourselves for a TSC, we'd better have one! |
155 | */ | 155 | */ |
156 | #ifdef CONFIG_X86_TSC | 156 | #ifdef CONFIG_X86_TSC |
157 | if (!cpu_has_tsc && !tsc_disable) | 157 | if (!cpu_has_tsc) |
158 | panic("Kernel compiled for Pentium+, requires TSC feature!"); | 158 | panic("Kernel compiled for Pentium+, requires TSC feature!"); |
159 | #endif | 159 | #endif |
160 | 160 | ||
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index c66991a04a8a..dfc9563fc4f0 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -446,10 +446,6 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
446 | * we do "generic changes." | 446 | * we do "generic changes." |
447 | */ | 447 | */ |
448 | 448 | ||
449 | /* TSC disabled? */ | ||
450 | if ( tsc_disable ) | ||
451 | clear_bit(X86_FEATURE_TSC, c->x86_capability); | ||
452 | |||
453 | /* If the model name is still unset, do table lookup. */ | 449 | /* If the model name is still unset, do table lookup. */ |
454 | if ( !c->x86_model_id[0] ) { | 450 | if ( !c->x86_model_id[0] ) { |
455 | char *p; | 451 | char *p; |
@@ -650,11 +646,6 @@ void __cpuinit cpu_init(void) | |||
650 | 646 | ||
651 | if (cpu_has_vme || cpu_has_tsc || cpu_has_de) | 647 | if (cpu_has_vme || cpu_has_tsc || cpu_has_de) |
652 | clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); | 648 | clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); |
653 | if (tsc_disable && cpu_has_tsc) { | ||
654 | printk(KERN_NOTICE "Disabling TSC...\n"); | ||
655 | /**** FIX-HPA: DOES THIS REALLY BELONG HERE? ****/ | ||
656 | clear_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability); | ||
657 | } | ||
658 | 649 | ||
659 | load_idt(&idt_descr); | 650 | load_idt(&idt_descr); |
660 | switch_to_new_gdt(); | 651 | switch_to_new_gdt(); |
diff --git a/arch/x86/kernel/numaq_32.c b/arch/x86/kernel/numaq_32.c index 9000d82c6dc0..e65281b1634b 100644 --- a/arch/x86/kernel/numaq_32.c +++ b/arch/x86/kernel/numaq_32.c | |||
@@ -82,7 +82,7 @@ static int __init numaq_tsc_disable(void) | |||
82 | { | 82 | { |
83 | if (num_online_nodes() > 1) { | 83 | if (num_online_nodes() > 1) { |
84 | printk(KERN_DEBUG "NUMAQ: disabling TSC\n"); | 84 | printk(KERN_DEBUG "NUMAQ: disabling TSC\n"); |
85 | tsc_disable = 1; | 85 | setup_clear_cpu_cap(X86_FEATURE_TSC); |
86 | } | 86 | } |
87 | return 0; | 87 | return 0; |
88 | } | 88 | } |
diff --git a/arch/x86/kernel/tsc_32.c b/arch/x86/kernel/tsc_32.c index 2a7b95bd8509..43517e324be8 100644 --- a/arch/x86/kernel/tsc_32.c +++ b/arch/x86/kernel/tsc_32.c | |||
@@ -24,8 +24,6 @@ static int tsc_enabled; | |||
24 | unsigned int tsc_khz; | 24 | unsigned int tsc_khz; |
25 | EXPORT_SYMBOL_GPL(tsc_khz); | 25 | EXPORT_SYMBOL_GPL(tsc_khz); |
26 | 26 | ||
27 | int tsc_disable; | ||
28 | |||
29 | #ifdef CONFIG_X86_TSC | 27 | #ifdef CONFIG_X86_TSC |
30 | static int __init tsc_setup(char *str) | 28 | static int __init tsc_setup(char *str) |
31 | { | 29 | { |
@@ -40,8 +38,7 @@ static int __init tsc_setup(char *str) | |||
40 | */ | 38 | */ |
41 | static int __init tsc_setup(char *str) | 39 | static int __init tsc_setup(char *str) |
42 | { | 40 | { |
43 | tsc_disable = 1; | 41 | setup_clear_cpu_cap(X86_FEATURE_TSC); |
44 | |||
45 | return 1; | 42 | return 1; |
46 | } | 43 | } |
47 | #endif | 44 | #endif |
@@ -395,7 +392,7 @@ void __init tsc_init(void) | |||
395 | { | 392 | { |
396 | int cpu; | 393 | int cpu; |
397 | 394 | ||
398 | if (!cpu_has_tsc || tsc_disable) | 395 | if (!cpu_has_tsc) |
399 | goto out_no_tsc; | 396 | goto out_no_tsc; |
400 | 397 | ||
401 | cpu_khz = calculate_cpu_khz(); | 398 | cpu_khz = calculate_cpu_khz(); |
@@ -439,10 +436,5 @@ void __init tsc_init(void) | |||
439 | return; | 436 | return; |
440 | 437 | ||
441 | out_no_tsc: | 438 | out_no_tsc: |
442 | /* | 439 | setup_clear_cpu_cap(X86_FEATURE_TSC); |
443 | * Set the tsc_disable flag if there's no TSC support, this | ||
444 | * makes it a fast flag for the kernel to see whether it | ||
445 | * should be using the TSC. | ||
446 | */ | ||
447 | tsc_disable = 1; | ||
448 | } | 440 | } |
diff --git a/arch/x86/mach-voyager/setup.c b/arch/x86/mach-voyager/setup.c index 81257a861984..5ae5466b9eb9 100644 --- a/arch/x86/mach-voyager/setup.c +++ b/arch/x86/mach-voyager/setup.c | |||
@@ -37,7 +37,7 @@ void __init pre_setup_arch_hook(void) | |||
37 | { | 37 | { |
38 | /* Voyagers run their CPUs from independent clocks, so disable | 38 | /* Voyagers run their CPUs from independent clocks, so disable |
39 | * the TSC code because we can't sync them */ | 39 | * the TSC code because we can't sync them */ |
40 | tsc_disable = 1; | 40 | setup_clear_cpu_cap(X86_FEATURE_TSC); |
41 | } | 41 | } |
42 | 42 | ||
43 | void __init trap_init_hook(void) | 43 | void __init trap_init_hook(void) |
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index d083ff5ef088..b3721fd6877b 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c | |||
@@ -592,7 +592,7 @@ __init void xen_time_init(void) | |||
592 | set_normalized_timespec(&wall_to_monotonic, | 592 | set_normalized_timespec(&wall_to_monotonic, |
593 | -xtime.tv_sec, -xtime.tv_nsec); | 593 | -xtime.tv_sec, -xtime.tv_nsec); |
594 | 594 | ||
595 | tsc_disable = 0; | 595 | setup_force_cpu_cap(X86_FEATURE_TSC); |
596 | 596 | ||
597 | xen_setup_timer(cpu); | 597 | xen_setup_timer(cpu); |
598 | xen_setup_cpu_clockevents(); | 598 | xen_setup_cpu_clockevents(); |
diff --git a/include/asm-x86/cpufeature.h b/include/asm-x86/cpufeature.h index b8f53f869e1f..3fb7dfa7fc91 100644 --- a/include/asm-x86/cpufeature.h +++ b/include/asm-x86/cpufeature.h | |||
@@ -135,6 +135,10 @@ | |||
135 | clear_cpu_cap(&boot_cpu_data, bit); \ | 135 | clear_cpu_cap(&boot_cpu_data, bit); \ |
136 | set_bit(bit, cleared_cpu_caps); \ | 136 | set_bit(bit, cleared_cpu_caps); \ |
137 | } while (0) | 137 | } while (0) |
138 | #define setup_force_cpu_cap(bit) do { \ | ||
139 | set_cpu_cap(&boot_cpu_data, bit); \ | ||
140 | clear_bit(bit, cleared_cpu_caps); \ | ||
141 | } while (0) | ||
138 | 142 | ||
139 | #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) | 143 | #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) |
140 | #define cpu_has_vme boot_cpu_has(X86_FEATURE_VME) | 144 | #define cpu_has_vme boot_cpu_has(X86_FEATURE_VME) |
diff --git a/include/asm-x86/tsc.h b/include/asm-x86/tsc.h index 071e0ce5b664..a6e8d35c3f86 100644 --- a/include/asm-x86/tsc.h +++ b/include/asm-x86/tsc.h | |||
@@ -16,8 +16,6 @@ typedef unsigned long long cycles_t; | |||
16 | 16 | ||
17 | extern unsigned int cpu_khz; | 17 | extern unsigned int cpu_khz; |
18 | extern unsigned int tsc_khz; | 18 | extern unsigned int tsc_khz; |
19 | /* flag for disabling the tsc */ | ||
20 | extern int tsc_disable; | ||
21 | 19 | ||
22 | extern void disable_TSC(void); | 20 | extern void disable_TSC(void); |
23 | 21 | ||