[PATCH] 2.6.14 - Fix for incorrect CPU speed determination in powernow for i386

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On an HP ze1115 notebook with a Mobile AMD K7, the CPU speed is measured twice, once when the CPU is initialized, and a second time when the powerrnow system is started. Sometimes the two readings agree; however, the second reading is usually higher, sometimes by very large factors. The dmesg excerpts below show one case where the difference is small.

Initializing CPU#0
PID hash table entries: 4096 (order: 12, 65536 bytes)
Detected 1100.134 MHz process


powernow: PowerNOW! Technology present. Can scale: frequency and voltage.
Detected 1148.044 MHz processor.
powernow: SGTC: 10000
powernow: Minimum speed 521 MHz. Maximum speed 1148 MHz.

The cpu frequency on this machine is measured using calibrate_tsc, which calls mach_countup between rdtsc calls. When the second speed determination is made, interrupts have been enabled, which makes the loop counter value in mach_count to be too small and the cpu frequency to be too high.

The two-line patch against 2.6.14 is shown below. With it, a second (faulty) determination of cpu_khz is avoided. BTW, this fix handles Bugzilla bugs #5266 and 5435.


Signed-off-by: Larry Finger <[email protected]>

---

diff --git a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
--- a/arch/i386/kernel/time.c
+++ b/arch/i386/kernel/time.c
@@ -78,7 +78,7 @@ u64 jiffies_64 = INITIAL_JIFFIES;

 EXPORT_SYMBOL(jiffies_64);

-unsigned int cpu_khz;  /* Detected as we calibrate the TSC */
+unsigned int cpu_khz=0; /* Detected as we calibrate the TSC */
 EXPORT_SYMBOL(cpu_khz);

 extern unsigned long wall_jiffies;
diff --git a/arch/i386/kernel/timers/common.c b/arch/i386/kernel/timers/common.c
--- a/arch/i386/kernel/timers/common.c
+++ b/arch/i386/kernel/timers/common.c
@@ -151,7 +151,7 @@ unsigned long read_timer_tsc(void)
 /* calculate cpu_khz */
 void init_cpu_khz(void)
 {
-       if (cpu_has_tsc) {
+       if (cpu_has_tsc && !cpu_khz) {
                unsigned long tsc_quotient = calibrate_tsc();
                if (tsc_quotient) {
                        /* report CPU clock rate in Hz.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux