diff options
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/p4-clockmod.c | 38 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/speedstep-lib.c | 32 | ||||
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/speedstep-lib.h | 1 | ||||
| -rw-r--r-- | include/asm-i386/msr.h | 2 |
4 files changed, 53 insertions, 20 deletions
diff --git a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c index 304d2eaa4a1b..bec50170b75a 100644 --- a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c | |||
| @@ -163,29 +163,27 @@ static int cpufreq_p4_verify(struct cpufreq_policy *policy) | |||
| 163 | 163 | ||
| 164 | static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) | 164 | static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) |
| 165 | { | 165 | { |
| 166 | if ((c->x86 == 0x06) && (c->x86_model == 0x09)) { | 166 | if (c->x86 == 0x06) { |
| 167 | /* Pentium M (Banias) */ | 167 | if (cpu_has(c, X86_FEATURE_EST)) |
| 168 | printk(KERN_WARNING PFX "Warning: Pentium M detected. " | 168 | printk(KERN_WARNING PFX "Warning: EST-capable CPU detected. " |
| 169 | "The speedstep_centrino module offers voltage scaling" | 169 | "The acpi-cpufreq module offers voltage scaling" |
| 170 | " in addition of frequency scaling. You should use " | 170 | " in addition of frequency scaling. You should use " |
| 171 | "that instead of p4-clockmod, if possible.\n"); | 171 | "that instead of p4-clockmod, if possible.\n"); |
| 172 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM); | 172 | switch (c->x86_model) { |
| 173 | } | 173 | case 0x0E: /* Core */ |
| 174 | 174 | case 0x0F: /* Core Duo */ | |
| 175 | if ((c->x86 == 0x06) && (c->x86_model == 0x0D)) { | 175 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; |
| 176 | /* Pentium M (Dothan) */ | 176 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PCORE); |
| 177 | printk(KERN_WARNING PFX "Warning: Pentium M detected. " | 177 | case 0x0D: /* Pentium M (Dothan) */ |
| 178 | "The speedstep_centrino module offers voltage scaling" | 178 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; |
| 179 | " in addition of frequency scaling. You should use " | 179 | /* fall through */ |
| 180 | "that instead of p4-clockmod, if possible.\n"); | 180 | case 0x09: /* Pentium M (Banias) */ |
| 181 | /* on P-4s, the TSC runs with constant frequency independent whether | 181 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM); |
| 182 | * throttling is active or not. */ | 182 | } |
| 183 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; | ||
| 184 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM); | ||
| 185 | } | 183 | } |
| 186 | 184 | ||
| 187 | if (c->x86 != 0xF) { | 185 | if (c->x86 != 0xF) { |
| 188 | printk(KERN_WARNING PFX "Unknown p4-clockmod-capable CPU. Please send an e-mail to <linux@brodo.de>\n"); | 186 | printk(KERN_WARNING PFX "Unknown p4-clockmod-capable CPU. Please send an e-mail to <cpufreq@lists.linux.org.uk>\n"); |
| 189 | return 0; | 187 | return 0; |
| 190 | } | 188 | } |
| 191 | 189 | ||
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c index 4f46cac155c4..6623a564f6fd 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c | |||
| @@ -123,6 +123,36 @@ static unsigned int pentiumM_get_frequency(void) | |||
| 123 | return (msr_tmp * 100 * 1000); | 123 | return (msr_tmp * 100 * 1000); |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | static unsigned int pentium_core_get_frequency(void) | ||
| 127 | { | ||
| 128 | u32 fsb = 0; | ||
| 129 | u32 msr_lo, msr_tmp; | ||
| 130 | |||
| 131 | rdmsr(MSR_FSB_FREQ, msr_lo, msr_tmp); | ||
| 132 | /* see table B-2 of 24547212.pdf */ | ||
| 133 | switch (msr_lo & 0x07) { | ||
| 134 | case 5: | ||
| 135 | fsb = 400; | ||
| 136 | break; | ||
| 137 | case 1: | ||
| 138 | fsb = 533; | ||
| 139 | break; | ||
| 140 | case 3: | ||
| 141 | fsb = 667; | ||
| 142 | break; | ||
| 143 | default: | ||
| 144 | printk(KERN_ERR "PCORE - MSR_FSB_FREQ undefined value"); | ||
| 145 | } | ||
| 146 | |||
| 147 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); | ||
| 148 | dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); | ||
| 149 | |||
| 150 | msr_tmp = (msr_lo >> 22) & 0x1f; | ||
| 151 | dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * fsb * 1000)); | ||
| 152 | |||
| 153 | return (msr_tmp * fsb * 1000); | ||
| 154 | } | ||
| 155 | |||
| 126 | 156 | ||
| 127 | static unsigned int pentium4_get_frequency(void) | 157 | static unsigned int pentium4_get_frequency(void) |
| 128 | { | 158 | { |
| @@ -174,6 +204,8 @@ static unsigned int pentium4_get_frequency(void) | |||
| 174 | unsigned int speedstep_get_processor_frequency(unsigned int processor) | 204 | unsigned int speedstep_get_processor_frequency(unsigned int processor) |
| 175 | { | 205 | { |
| 176 | switch (processor) { | 206 | switch (processor) { |
| 207 | case SPEEDSTEP_PROCESSOR_PCORE: | ||
| 208 | return pentium_core_get_frequency(); | ||
| 177 | case SPEEDSTEP_PROCESSOR_PM: | 209 | case SPEEDSTEP_PROCESSOR_PM: |
| 178 | return pentiumM_get_frequency(); | 210 | return pentiumM_get_frequency(); |
| 179 | case SPEEDSTEP_PROCESSOR_P4D: | 211 | case SPEEDSTEP_PROCESSOR_P4D: |
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h index b735429c50b4..b11bcc608cac 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | * the speedstep_get_processor_frequency() call. */ | 22 | * the speedstep_get_processor_frequency() call. */ |
| 23 | #define SPEEDSTEP_PROCESSOR_PM 0xFFFFFF03 /* Pentium M */ | 23 | #define SPEEDSTEP_PROCESSOR_PM 0xFFFFFF03 /* Pentium M */ |
| 24 | #define SPEEDSTEP_PROCESSOR_P4D 0xFFFFFF04 /* desktop P4 */ | 24 | #define SPEEDSTEP_PROCESSOR_P4D 0xFFFFFF04 /* desktop P4 */ |
| 25 | #define SPEEDSTEP_PROCESSOR_PCORE 0xFFFFFF05 /* Core */ | ||
| 25 | 26 | ||
| 26 | /* speedstep states -- only two of them */ | 27 | /* speedstep states -- only two of them */ |
| 27 | 28 | ||
diff --git a/include/asm-i386/msr.h b/include/asm-i386/msr.h index 0aa15fc8d918..8c31887e1cfa 100644 --- a/include/asm-i386/msr.h +++ b/include/asm-i386/msr.h | |||
| @@ -95,6 +95,8 @@ static inline void wrmsrl (unsigned long msr, unsigned long long val) | |||
| 95 | 95 | ||
| 96 | #define MSR_P6_PERFCTR0 0xc1 | 96 | #define MSR_P6_PERFCTR0 0xc1 |
| 97 | #define MSR_P6_PERFCTR1 0xc2 | 97 | #define MSR_P6_PERFCTR1 0xc2 |
| 98 | #define MSR_FSB_FREQ 0xcd | ||
| 99 | |||
| 98 | 100 | ||
| 99 | #define MSR_IA32_BBL_CR_CTL 0x119 | 101 | #define MSR_IA32_BBL_CR_CTL 0x119 |
| 100 | 102 | ||
