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>
This commit is contained in:
Andi Kleen 2008-01-30 13:33:20 +01:00 committed by Ingo Molnar
parent 8424950b5e
commit 404ee5b14b
8 changed files with 11 additions and 26 deletions

View File

@ -154,7 +154,7 @@ static void __init check_config(void)
* If we configured ourselves for a TSC, we'd better have one! * If we configured ourselves for a TSC, we'd better have one!
*/ */
#ifdef CONFIG_X86_TSC #ifdef CONFIG_X86_TSC
if (!cpu_has_tsc && !tsc_disable) if (!cpu_has_tsc)
panic("Kernel compiled for Pentium+, requires TSC feature!"); panic("Kernel compiled for Pentium+, requires TSC feature!");
#endif #endif

View File

@ -446,10 +446,6 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
* we do "generic changes." * we do "generic changes."
*/ */
/* TSC disabled? */
if ( tsc_disable )
clear_bit(X86_FEATURE_TSC, c->x86_capability);
/* If the model name is still unset, do table lookup. */ /* If the model name is still unset, do table lookup. */
if ( !c->x86_model_id[0] ) { if ( !c->x86_model_id[0] ) {
char *p; char *p;
@ -650,11 +646,6 @@ void __cpuinit cpu_init(void)
if (cpu_has_vme || cpu_has_tsc || cpu_has_de) if (cpu_has_vme || cpu_has_tsc || cpu_has_de)
clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
if (tsc_disable && cpu_has_tsc) {
printk(KERN_NOTICE "Disabling TSC...\n");
/**** FIX-HPA: DOES THIS REALLY BELONG HERE? ****/
clear_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability);
}
load_idt(&idt_descr); load_idt(&idt_descr);
switch_to_new_gdt(); switch_to_new_gdt();

View File

@ -82,7 +82,7 @@ static int __init numaq_tsc_disable(void)
{ {
if (num_online_nodes() > 1) { if (num_online_nodes() > 1) {
printk(KERN_DEBUG "NUMAQ: disabling TSC\n"); printk(KERN_DEBUG "NUMAQ: disabling TSC\n");
tsc_disable = 1; setup_clear_cpu_cap(X86_FEATURE_TSC);
} }
return 0; return 0;
} }

View File

@ -24,8 +24,6 @@ static int tsc_enabled;
unsigned int tsc_khz; unsigned int tsc_khz;
EXPORT_SYMBOL_GPL(tsc_khz); EXPORT_SYMBOL_GPL(tsc_khz);
int tsc_disable;
#ifdef CONFIG_X86_TSC #ifdef CONFIG_X86_TSC
static int __init tsc_setup(char *str) static int __init tsc_setup(char *str)
{ {
@ -40,8 +38,7 @@ static int __init tsc_setup(char *str)
*/ */
static int __init tsc_setup(char *str) static int __init tsc_setup(char *str)
{ {
tsc_disable = 1; setup_clear_cpu_cap(X86_FEATURE_TSC);
return 1; return 1;
} }
#endif #endif
@ -395,7 +392,7 @@ void __init tsc_init(void)
{ {
int cpu; int cpu;
if (!cpu_has_tsc || tsc_disable) if (!cpu_has_tsc)
goto out_no_tsc; goto out_no_tsc;
cpu_khz = calculate_cpu_khz(); cpu_khz = calculate_cpu_khz();
@ -439,10 +436,5 @@ void __init tsc_init(void)
return; return;
out_no_tsc: out_no_tsc:
/* setup_clear_cpu_cap(X86_FEATURE_TSC);
* Set the tsc_disable flag if there's no TSC support, this
* makes it a fast flag for the kernel to see whether it
* should be using the TSC.
*/
tsc_disable = 1;
} }

View File

@ -37,7 +37,7 @@ void __init pre_setup_arch_hook(void)
{ {
/* Voyagers run their CPUs from independent clocks, so disable /* Voyagers run their CPUs from independent clocks, so disable
* the TSC code because we can't sync them */ * the TSC code because we can't sync them */
tsc_disable = 1; setup_clear_cpu_cap(X86_FEATURE_TSC);
} }
void __init trap_init_hook(void) void __init trap_init_hook(void)

View File

@ -592,7 +592,7 @@ __init void xen_time_init(void)
set_normalized_timespec(&wall_to_monotonic, set_normalized_timespec(&wall_to_monotonic,
-xtime.tv_sec, -xtime.tv_nsec); -xtime.tv_sec, -xtime.tv_nsec);
tsc_disable = 0; setup_force_cpu_cap(X86_FEATURE_TSC);
xen_setup_timer(cpu); xen_setup_timer(cpu);
xen_setup_cpu_clockevents(); xen_setup_cpu_clockevents();

View File

@ -135,6 +135,10 @@
clear_cpu_cap(&boot_cpu_data, bit); \ clear_cpu_cap(&boot_cpu_data, bit); \
set_bit(bit, cleared_cpu_caps); \ set_bit(bit, cleared_cpu_caps); \
} while (0) } while (0)
#define setup_force_cpu_cap(bit) do { \
set_cpu_cap(&boot_cpu_data, bit); \
clear_bit(bit, cleared_cpu_caps); \
} while (0)
#define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU)
#define cpu_has_vme boot_cpu_has(X86_FEATURE_VME) #define cpu_has_vme boot_cpu_has(X86_FEATURE_VME)

View File

@ -16,8 +16,6 @@ typedef unsigned long long cycles_t;
extern unsigned int cpu_khz; extern unsigned int cpu_khz;
extern unsigned int tsc_khz; extern unsigned int tsc_khz;
/* flag for disabling the tsc */
extern int tsc_disable;
extern void disable_TSC(void); extern void disable_TSC(void);