p4_clockmod: detect speed without relying on cpu_khz or user input
PATCH 5/8 p4_clockmod: detect speed without relying on cpu_khz or user input
Other cpufreq drivers don't rely on cpu_khz, but use the "decoded"/theoretical CPU frequency as base for all calculations.
arch/i386/kernel/cpu/cpufreq/p4-clockmod.c | 66 +++++++++++++++++++++++------ 1 files changed, 53 insertions(+), 13 deletions(-)
arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +53 -13
@@ -48,8 +48,7 @@static int has_N44_O17_errata[NR_CPUS ]; -static int stock_freq; - +unsigned int stock_freq;static int cpufreq_p4_setdc (unsigned int cpu,unsigned int newstate) {
@@ -175,6 +174,54 @@return cpufreq_frequency_table_verify (policy, &p4clockmod_table[0 ]); } +/* copied from speedstep_lib, made SMP-compatible */ +static unsigned int cpufreq_p4_get_frequency (struct cpuinfo_x86 *c) +{ +u32 msr_lo, msr_hi, mult; +unsigned int fsb =0 ; + +if (c->x86 !=0xF ) { + printk(KERN_DEBUG PFX "Unknown P4. Please send an e-mail to <[email protected]>\n"); +return 0 ; + } + +rdmsr (0x2c , msr_lo, msr_hi); + +/* printk(KERN_DEBUG PFX "P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi); */ +/* decode the FSB: see IA-32 Intel (C) Architecture Software +* Developer's Manual, Volume 3: System Prgramming Guide, +* revision #12 in Table B-1: MSRs in the Pentium 4 and +* Intel Xeon Processors, on page B-4 and B-5. +*/ +if (c->x86_model <2 ) + fsb =100 *1000 ; +else { +u8 fsb_code = (msr_lo >>16 ) &0x7 ; +switch (fsb_code) { +case 0 : + fsb =100 *1000 ; +break ; +case 1 : + fsb =13333 *10 ; +break ; +case 2 : + fsb =200 *1000 ; +break ; + } + } + +if (!fsb) { + printk(KERN_DEBUG PFX "couldn't detect FSB speed. Please send an e-mail to <[email protected]>\n"); + printk(KERN_DEBUG PFX "P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi); + } + +/* Multiplier. */ + mult = msr_lo >>24 ; + +return (fsb * mult); +} + +static int cpufreq_p4_cpu_init (struct cpufreq_policy *policy) {
@@ -192,15 +239,10 @@ has_N44_O17_errata[policy->cpu] =1 ; } -/* get frequency */ -if (!stock_freq) { -if (cpu_khz) - stock_freq = cpu_khz; -else { - printk(KERN_INFO PFX "unknown core frequency - please use module parameter 'stock_freq'\n"); -return -EINVAL ; - } - } +/* get max frequency */ + stock_freq =cpufreq_p4_get_frequency (c); +if (!stock_freq) +return -EINVAL ;/* table init */ for (i=1 ; (p4clockmod_table[i].frequency !=CPUFREQ_TABLE_END ); i++) {
@@ -269,8 +311,6 @@ } -MODULE_PARM (stock_freq,"i" ); -MODULE_AUTHOR ("Zwane Mwaikambo <[email protected]>" );MODULE_DESCRIPTION ("cpufreq driver for Pentium(TM) 4/Xeon(TM)" );MODULE_LICENSE ("GPL" );
Quoted 19 lines · Dominik Brodowski
arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +19
-0+rdmsr (0x2c , msr_lo, msr_hi); + +/* printk(KERN_DEBUG PFX "P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi); */ +/* decode the FSB: see IA-32 Intel (C) Architecture Software +* Developer's Manual, Volume 3: System Prgramming Guide, +* revision #12 in Table B-1: MSRs in the Pentium 4 and +* Intel Xeon Processors, on page B-4 and B-5. +*/ +if (c->x86_model <2 ) + fsb =100 *1000 ; +else { +u8 fsb_code = (msr_lo >>16 ) &0x7 ; +switch (fsb_code) { +case 0 : + fsb =100 *1000 ; +break ; +case 1 : + fsb =13333 *10 ; +break ;
arch/i386/kernel/cpu/cpufreq/p4-clockmod.c line 216
Quoted 10 lines
arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +10
-0+case 2 : + fsb =200 *1000 ; +break ; + } + } + +if (!fsb) { + printk(KERN_DEBUG PFX "couldn't detect FSB speed. Please send an e-mail to <[email protected]>\n"); + printk(KERN_DEBUG PFX "P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi); + }
patch 4/8 introduced what seems to be the exact same code in the speedstep-lib. Perhaps it belongs in an fsb.o instead that they can both share ? I don't mind duplicating it twice in object code, but having two copies in the source seems a bit silly.
Dave
Quoted 5 lines · Dave Jones
patch 4/8 introduced what seems to be the exact same code in the speedstep-lib. Perhaps it belongs in an fsb.o instead that they can both share ? I don't mind duplicating it twice in object code, but having two copies in the source seems a bit silly.
Usually, I agree to this topic. However, I don't want to create just another file for just this function, and it doesn't belong to speedstep-lib either as a plain p4 isn't a valid processor for speedstep-lib. So I'd prefer to have this source code duplication as an exception here.
Dominik
Quoted 11 lines · Dominik Brodowski
Quoted 5 lines · Dave Jones
patch 4/8 introduced what seems to be the exact same code in the speedstep-lib. Perhaps it belongs in an fsb.o instead that they can both share ? I don't mind duplicating it twice in object code, but having two copies in the source seems a bit silly.
Usually, I agree to this topic. However, I don't want to create just another file for just this function, and it doesn't belong to speedstep-lib either as a plain p4 isn't a valid processor for speedstep-lib. So I'd prefer to have this source code duplication as an exception here.
Your call. I'm just concerned with the maintainence effort as this routine grows.
As a sidenote, this could be useful outside of cpufreq at some point too. Alan tried adding 'overclocking detection' using these registers a while back. It is very difficult to get correct however, so it never came to anything. If we took the "perfect is the enemy of 'good enough'" approach and just did these checks for cpus we knew we do it correctly on, this would become feasable to pull off for 2.7.
Dave
Quoted 16 lines · Dave Jones
Quoted 11 lines · Dominik Brodowski
Quoted 5 lines · Dave Jones
patch 4/8 introduced what seems to be the exact same code in the speedstep-lib. Perhaps it belongs in an fsb.o instead that they can both share ? I don't mind duplicating it twice in object code, but having two copies in the source seems a bit silly.
Usually, I agree to this topic. However, I don't want to create just another file for just this function, and it doesn't belong to speedstep-lib either as a plain p4 isn't a valid processor for speedstep-lib. So I'd prefer to have this source code duplication as an exception here.
Your call. I'm just concerned with the maintainence effort as this routine grows.
Quoted 6 lines
As a sidenote, this could be useful outside of cpufreq at some point too. Alan tried adding 'overclocking detection' using these registers a while back. It is very difficult to get correct however, so it never came to anything. If we took the "perfect is the enemy of 'good enough'" approach and just did these checks for cpus we knew we do it correctly on, this would become feasable to pull off for 2.7.
Well, for Intel P3s and P4s the MSRs are eithre documented or reverse- engineered quite well, so it should be something good to do in 2.7.[*]
Dominik
[*] which will hopefully be soon!