aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c
diff options
context:
space:
mode:
authorMatthias-Christian Ott <ott@mirix.org>2009-02-20 20:52:17 -0500
committerDave Jones <davej@redhat.com>2009-02-24 22:47:32 -0500
commit199785eac892a1fa1b71cc22bec58e8b156d9311 (patch)
tree8e200f33cba62afb37a36d297b2a0224c7b8345b /arch/x86/kernel/cpu/cpufreq/speedstep-lib.c
parent0cb8bc256093e716d2a0a4a721f36c625a3f7634 (diff)
[CPUFREQ] p4-clockmod reports wrong frequency.
http://bugzilla.kernel.org/show_bug.cgi?id=10968 [ Updated for current tree, and fixed compile failure when p4-clockmod was built modular -- davej] From: Matthias-Christian Ott <ott@mirix.org> Signed-off-by: Dominik Brodowski <linux@brodo.de> Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'arch/x86/kernel/cpu/cpufreq/speedstep-lib.c')
-rw-r--r--arch/x86/kernel/cpu/cpufreq/speedstep-lib.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c
index 55c696daa05..2e3c6862657 100644
--- a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c
+++ b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c
@@ -16,6 +16,7 @@
16#include <linux/slab.h> 16#include <linux/slab.h>
17 17
18#include <asm/msr.h> 18#include <asm/msr.h>
19#include <asm/tsc.h>
19#include "speedstep-lib.h" 20#include "speedstep-lib.h"
20 21
21#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ 22#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \
@@ -178,6 +179,15 @@ static unsigned int pentium4_get_frequency(void)
178 u32 msr_lo, msr_hi, mult; 179 u32 msr_lo, msr_hi, mult;
179 unsigned int fsb = 0; 180 unsigned int fsb = 0;
180 unsigned int ret; 181 unsigned int ret;
182 u8 fsb_code;
183
184 /* Pentium 4 Model 0 and 1 do not have the Core Clock Frequency
185 * to System Bus Frequency Ratio Field in the Processor Frequency
186 * Configuration Register of the MSR. Therefore the current
187 * frequency cannot be calculated and has to be measured.
188 */
189 if (c->x86_model < 2)
190 return cpu_khz;
181 191
182 rdmsr(0x2c, msr_lo, msr_hi); 192 rdmsr(0x2c, msr_lo, msr_hi);
183 193
@@ -188,21 +198,17 @@ static unsigned int pentium4_get_frequency(void)
188 * revision #12 in Table B-1: MSRs in the Pentium 4 and 198 * revision #12 in Table B-1: MSRs in the Pentium 4 and
189 * Intel Xeon Processors, on page B-4 and B-5. 199 * Intel Xeon Processors, on page B-4 and B-5.
190 */ 200 */
191 if (c->x86_model < 2) 201 fsb_code = (msr_lo >> 16) & 0x7;
202 switch (fsb_code) {
203 case 0:
192 fsb = 100 * 1000; 204 fsb = 100 * 1000;
193 else { 205 break;
194 u8 fsb_code = (msr_lo >> 16) & 0x7; 206 case 1:
195 switch (fsb_code) { 207 fsb = 13333 * 10;
196 case 0: 208 break;
197 fsb = 100 * 1000; 209 case 2:
198 break; 210 fsb = 200 * 1000;
199 case 1: 211 break;
200 fsb = 13333 * 10;
201 break;
202 case 2:
203 fsb = 200 * 1000;
204 break;
205 }
206 } 212 }
207 213
208 if (!fsb) 214 if (!fsb)