Commit 9dcb3bd6 authored by Dave Jones's avatar Dave Jones Committed by Dave Jones

[CPUFREQ] on P4s no TSC adjustment is necessary

From Dominik Brodowski
parent c33ccf2d
...@@ -306,9 +306,17 @@ static void mark_offset_tsc_hpet(void) ...@@ -306,9 +306,17 @@ static void mark_offset_tsc_hpet(void)
} }
#endif #endif
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
/* If the CPU frequency is scaled, TSC-based delays will need a different
* loops_per_jiffy value to function properly. An exception to this
* are modern Intel Pentium 4 processors, where the TSC runs at a constant
* speed independent of frequency scaling.
*/
static unsigned int ref_freq = 0; static unsigned int ref_freq = 0;
static unsigned long loops_per_jiffy_ref = 0; static unsigned long loops_per_jiffy_ref = 0;
static unsigned int variable_tsc = 1;
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
static unsigned long fast_gettimeoffset_ref = 0; static unsigned long fast_gettimeoffset_ref = 0;
...@@ -333,13 +341,16 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, ...@@ -333,13 +341,16 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
if ((val == CPUFREQ_PRECHANGE && freq->old < freq->new) || if ((val == CPUFREQ_PRECHANGE && freq->old < freq->new) ||
(val == CPUFREQ_POSTCHANGE && freq->old > freq->new)) { (val == CPUFREQ_POSTCHANGE && freq->old > freq->new)) {
if (variable_tsc)
cpu_data[freq->cpu].loops_per_jiffy = cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new); cpu_data[freq->cpu].loops_per_jiffy = cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
if (use_tsc) { if (use_tsc) {
fast_gettimeoffset_quotient = cpufreq_scale(fast_gettimeoffset_ref, freq->new, ref_freq);
cpu_khz = cpufreq_scale(cpu_khz_ref, ref_freq, freq->new); cpu_khz = cpufreq_scale(cpu_khz_ref, ref_freq, freq->new);
if (variable_tsc) {
fast_gettimeoffset_quotient = cpufreq_scale(fast_gettimeoffset_ref, freq->new, ref_freq);
set_cyc2ns_scale(cpu_khz/1000); set_cyc2ns_scale(cpu_khz/1000);
} }
}
#endif #endif
} }
write_sequnlock_irq(&xtime_lock); write_sequnlock_irq(&xtime_lock);
...@@ -350,6 +361,18 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, ...@@ -350,6 +361,18 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
static struct notifier_block time_cpufreq_notifier_block = { static struct notifier_block time_cpufreq_notifier_block = {
.notifier_call = time_cpufreq_notifier .notifier_call = time_cpufreq_notifier
}; };
static int __init cpufreq_tsc(void)
{
/* P4 and above CPU TSC freq doesn't change when CPU frequency changes*/
if ((boot_cpu_data.x86 >= 15) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL))
variable_tsc = 0;
return cpufreq_register_notifier(&time_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
}
core_initcall(cpufreq_tsc);
#endif #endif
...@@ -393,10 +416,6 @@ static int __init init_tsc(char* override) ...@@ -393,10 +416,6 @@ static int __init init_tsc(char* override)
* moaned if you have the only one in the world - you fix it! * moaned if you have the only one in the world - you fix it!
*/ */
#ifdef CONFIG_CPU_FREQ
cpufreq_register_notifier(&time_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
#endif
count2 = LATCH; /* initialize counter for mark_offset_tsc() */ count2 = LATCH; /* initialize counter for mark_offset_tsc() */
if (cpu_has_tsc) { if (cpu_has_tsc) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment