diff options
author | Dave Jones <davej@redhat.com> | 2009-01-17 23:55:22 -0500 |
---|---|---|
committer | Dave Jones <davej@redhat.com> | 2009-02-24 22:47:30 -0500 |
commit | bbfebd66554b934b270c4c49442f4fe5e62df0e5 (patch) | |
tree | 1178b97ad9396259597cbb82023b4acc6f9faca9 /arch/x86/kernel/cpu/cpufreq | |
parent | 97acec55de8b168548665f267c9dd45ed863b179 (diff) |
[CPUFREQ] checkpatch cleanups for speedstep related drivers.
Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'arch/x86/kernel/cpu/cpufreq')
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/p4-clockmod.c | 60 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | 70 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-lib.c | 129 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-lib.h | 18 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-smi.c | 166 |
5 files changed, 258 insertions, 185 deletions
diff --git a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c index b585e04cbc9e..46a2a7a53148 100644 --- a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c | |||
@@ -27,15 +27,16 @@ | |||
27 | #include <linux/cpufreq.h> | 27 | #include <linux/cpufreq.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/cpumask.h> | 29 | #include <linux/cpumask.h> |
30 | #include <linux/timex.h> | ||
30 | 31 | ||
31 | #include <asm/processor.h> | 32 | #include <asm/processor.h> |
32 | #include <asm/msr.h> | 33 | #include <asm/msr.h> |
33 | #include <asm/timex.h> | ||
34 | 34 | ||
35 | #include "speedstep-lib.h" | 35 | #include "speedstep-lib.h" |
36 | 36 | ||
37 | #define PFX "p4-clockmod: " | 37 | #define PFX "p4-clockmod: " |
38 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "p4-clockmod", msg) | 38 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
39 | "p4-clockmod", msg) | ||
39 | 40 | ||
40 | /* | 41 | /* |
41 | * Duty Cycle (3bits), note DC_DISABLE is not specified in | 42 | * Duty Cycle (3bits), note DC_DISABLE is not specified in |
@@ -58,7 +59,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) | |||
58 | { | 59 | { |
59 | u32 l, h; | 60 | u32 l, h; |
60 | 61 | ||
61 | if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV)) | 62 | if (!cpu_online(cpu) || |
63 | (newstate > DC_DISABLE) || (newstate == DC_RESV)) | ||
62 | return -EINVAL; | 64 | return -EINVAL; |
63 | 65 | ||
64 | rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h); | 66 | rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h); |
@@ -66,7 +68,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) | |||
66 | if (l & 0x01) | 68 | if (l & 0x01) |
67 | dprintk("CPU#%d currently thermal throttled\n", cpu); | 69 | dprintk("CPU#%d currently thermal throttled\n", cpu); |
68 | 70 | ||
69 | if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT)) | 71 | if (has_N44_O17_errata[cpu] && |
72 | (newstate == DC_25PT || newstate == DC_DFLT)) | ||
70 | newstate = DC_38PT; | 73 | newstate = DC_38PT; |
71 | 74 | ||
72 | rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h); | 75 | rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h); |
@@ -112,7 +115,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, | |||
112 | struct cpufreq_freqs freqs; | 115 | struct cpufreq_freqs freqs; |
113 | int i; | 116 | int i; |
114 | 117 | ||
115 | if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate)) | 118 | if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], |
119 | target_freq, relation, &newstate)) | ||
116 | return -EINVAL; | 120 | return -EINVAL; |
117 | 121 | ||
118 | freqs.old = cpufreq_p4_get(policy->cpu); | 122 | freqs.old = cpufreq_p4_get(policy->cpu); |
@@ -127,7 +131,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, | |||
127 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 131 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
128 | } | 132 | } |
129 | 133 | ||
130 | /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software | 134 | /* run on each logical CPU, |
135 | * see section 13.15.3 of IA32 Intel Architecture Software | ||
131 | * Developer's Manual, Volume 3 | 136 | * Developer's Manual, Volume 3 |
132 | */ | 137 | */ |
133 | for_each_cpu(i, policy->cpus) | 138 | for_each_cpu(i, policy->cpus) |
@@ -153,28 +158,30 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) | |||
153 | { | 158 | { |
154 | if (c->x86 == 0x06) { | 159 | if (c->x86 == 0x06) { |
155 | if (cpu_has(c, X86_FEATURE_EST)) | 160 | if (cpu_has(c, X86_FEATURE_EST)) |
156 | printk(KERN_WARNING PFX "Warning: EST-capable CPU detected. " | 161 | printk(KERN_WARNING PFX "Warning: EST-capable CPU " |
157 | "The acpi-cpufreq module offers voltage scaling" | 162 | "detected. The acpi-cpufreq module offers " |
158 | " in addition of frequency scaling. You should use " | 163 | "voltage scaling in addition of frequency " |
159 | "that instead of p4-clockmod, if possible.\n"); | 164 | "scaling. You should use that instead of " |
165 | "p4-clockmod, if possible.\n"); | ||
160 | switch (c->x86_model) { | 166 | switch (c->x86_model) { |
161 | case 0x0E: /* Core */ | 167 | case 0x0E: /* Core */ |
162 | case 0x0F: /* Core Duo */ | 168 | case 0x0F: /* Core Duo */ |
163 | case 0x16: /* Celeron Core */ | 169 | case 0x16: /* Celeron Core */ |
164 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; | 170 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; |
165 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PCORE); | 171 | return speedstep_get_frequency(SPEEDSTEP_CPU_PCORE); |
166 | case 0x0D: /* Pentium M (Dothan) */ | 172 | case 0x0D: /* Pentium M (Dothan) */ |
167 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; | 173 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; |
168 | /* fall through */ | 174 | /* fall through */ |
169 | case 0x09: /* Pentium M (Banias) */ | 175 | case 0x09: /* Pentium M (Banias) */ |
170 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM); | 176 | return speedstep_get_frequency(SPEEDSTEP_CPU_PM); |
171 | } | 177 | } |
172 | } | 178 | } |
173 | 179 | ||
174 | if (c->x86 != 0xF) { | 180 | if (c->x86 != 0xF) { |
175 | if (!cpu_has(c, X86_FEATURE_EST)) | 181 | if (!cpu_has(c, X86_FEATURE_EST)) |
176 | printk(KERN_WARNING PFX "Unknown p4-clockmod-capable CPU. " | 182 | printk(KERN_WARNING PFX "Unknown CPU. " |
177 | "Please send an e-mail to <cpufreq@vger.kernel.org>\n"); | 183 | "Please send an e-mail to " |
184 | "<cpufreq@vger.kernel.org>\n"); | ||
178 | return 0; | 185 | return 0; |
179 | } | 186 | } |
180 | 187 | ||
@@ -182,16 +189,16 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) | |||
182 | * throttling is active or not. */ | 189 | * throttling is active or not. */ |
183 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; | 190 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; |
184 | 191 | ||
185 | if (speedstep_detect_processor() == SPEEDSTEP_PROCESSOR_P4M) { | 192 | if (speedstep_detect_processor() == SPEEDSTEP_CPU_P4M) { |
186 | printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. " | 193 | printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. " |
187 | "The speedstep-ich or acpi cpufreq modules offer " | 194 | "The speedstep-ich or acpi cpufreq modules offer " |
188 | "voltage scaling in addition of frequency scaling. " | 195 | "voltage scaling in addition of frequency scaling. " |
189 | "You should use either one instead of p4-clockmod, " | 196 | "You should use either one instead of p4-clockmod, " |
190 | "if possible.\n"); | 197 | "if possible.\n"); |
191 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4M); | 198 | return speedstep_get_frequency(SPEEDSTEP_CPU_P4M); |
192 | } | 199 | } |
193 | 200 | ||
194 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4D); | 201 | return speedstep_get_frequency(SPEEDSTEP_CPU_P4D); |
195 | } | 202 | } |
196 | 203 | ||
197 | 204 | ||
@@ -223,8 +230,8 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | |||
223 | return -EINVAL; | 230 | return -EINVAL; |
224 | 231 | ||
225 | /* table init */ | 232 | /* table init */ |
226 | for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) { | 233 | for (i = 1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) { |
227 | if ((i<2) && (has_N44_O17_errata[policy->cpu])) | 234 | if ((i < 2) && (has_N44_O17_errata[policy->cpu])) |
228 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 235 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
229 | else | 236 | else |
230 | p4clockmod_table[i].frequency = (stock_freq * i)/8; | 237 | p4clockmod_table[i].frequency = (stock_freq * i)/8; |
@@ -258,12 +265,12 @@ static unsigned int cpufreq_p4_get(unsigned int cpu) | |||
258 | l = DC_DISABLE; | 265 | l = DC_DISABLE; |
259 | 266 | ||
260 | if (l != DC_DISABLE) | 267 | if (l != DC_DISABLE) |
261 | return (stock_freq * l / 8); | 268 | return stock_freq * l / 8; |
262 | 269 | ||
263 | return stock_freq; | 270 | return stock_freq; |
264 | } | 271 | } |
265 | 272 | ||
266 | static struct freq_attr* p4clockmod_attr[] = { | 273 | static struct freq_attr *p4clockmod_attr[] = { |
267 | &cpufreq_freq_attr_scaling_available_freqs, | 274 | &cpufreq_freq_attr_scaling_available_freqs, |
268 | NULL, | 275 | NULL, |
269 | }; | 276 | }; |
@@ -299,9 +306,10 @@ static int __init cpufreq_p4_init(void) | |||
299 | 306 | ||
300 | ret = cpufreq_register_driver(&p4clockmod_driver); | 307 | ret = cpufreq_register_driver(&p4clockmod_driver); |
301 | if (!ret) | 308 | if (!ret) |
302 | printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock Modulation available\n"); | 309 | printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock " |
310 | "Modulation available\n"); | ||
303 | 311 | ||
304 | return (ret); | 312 | return ret; |
305 | } | 313 | } |
306 | 314 | ||
307 | 315 | ||
@@ -311,9 +319,9 @@ static void __exit cpufreq_p4_exit(void) | |||
311 | } | 319 | } |
312 | 320 | ||
313 | 321 | ||
314 | MODULE_AUTHOR ("Zwane Mwaikambo <zwane@commfireservices.com>"); | 322 | MODULE_AUTHOR("Zwane Mwaikambo <zwane@commfireservices.com>"); |
315 | MODULE_DESCRIPTION ("cpufreq driver for Pentium(TM) 4/Xeon(TM)"); | 323 | MODULE_DESCRIPTION("cpufreq driver for Pentium(TM) 4/Xeon(TM)"); |
316 | MODULE_LICENSE ("GPL"); | 324 | MODULE_LICENSE("GPL"); |
317 | 325 | ||
318 | late_initcall(cpufreq_p4_init); | 326 | late_initcall(cpufreq_p4_init); |
319 | module_exit(cpufreq_p4_exit); | 327 | module_exit(cpufreq_p4_exit); |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c index dedc1e98f168..8bbb11adb315 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | |||
@@ -39,7 +39,7 @@ static struct pci_dev *speedstep_chipset_dev; | |||
39 | 39 | ||
40 | /* speedstep_processor | 40 | /* speedstep_processor |
41 | */ | 41 | */ |
42 | static unsigned int speedstep_processor = 0; | 42 | static unsigned int speedstep_processor; |
43 | 43 | ||
44 | static u32 pmbase; | 44 | static u32 pmbase; |
45 | 45 | ||
@@ -54,7 +54,8 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { | |||
54 | }; | 54 | }; |
55 | 55 | ||
56 | 56 | ||
57 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-ich", msg) | 57 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
58 | "speedstep-ich", msg) | ||
58 | 59 | ||
59 | 60 | ||
60 | /** | 61 | /** |
@@ -62,7 +63,7 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { | |||
62 | * | 63 | * |
63 | * Returns: -ENODEV if no register could be found | 64 | * Returns: -ENODEV if no register could be found |
64 | */ | 65 | */ |
65 | static int speedstep_find_register (void) | 66 | static int speedstep_find_register(void) |
66 | { | 67 | { |
67 | if (!speedstep_chipset_dev) | 68 | if (!speedstep_chipset_dev) |
68 | return -ENODEV; | 69 | return -ENODEV; |
@@ -90,7 +91,7 @@ static int speedstep_find_register (void) | |||
90 | * | 91 | * |
91 | * Tries to change the SpeedStep state. | 92 | * Tries to change the SpeedStep state. |
92 | */ | 93 | */ |
93 | static void speedstep_set_state (unsigned int state) | 94 | static void speedstep_set_state(unsigned int state) |
94 | { | 95 | { |
95 | u8 pm2_blk; | 96 | u8 pm2_blk; |
96 | u8 value; | 97 | u8 value; |
@@ -133,11 +134,11 @@ static void speedstep_set_state (unsigned int state) | |||
133 | 134 | ||
134 | dprintk("read at pmbase 0x%x + 0x50 returned 0x%x\n", pmbase, value); | 135 | dprintk("read at pmbase 0x%x + 0x50 returned 0x%x\n", pmbase, value); |
135 | 136 | ||
136 | if (state == (value & 0x1)) { | 137 | if (state == (value & 0x1)) |
137 | dprintk("change to %u MHz succeeded\n", (speedstep_get_processor_frequency(speedstep_processor) / 1000)); | 138 | dprintk("change to %u MHz succeeded\n", |
138 | } else { | 139 | speedstep_get_frequency(speedstep_processor) / 1000); |
139 | printk (KERN_ERR "cpufreq: change failed - I/O error\n"); | 140 | else |
140 | } | 141 | printk(KERN_ERR "cpufreq: change failed - I/O error\n"); |
141 | 142 | ||
142 | return; | 143 | return; |
143 | } | 144 | } |
@@ -149,7 +150,7 @@ static void speedstep_set_state (unsigned int state) | |||
149 | * Tries to activate the SpeedStep status and control registers. | 150 | * Tries to activate the SpeedStep status and control registers. |
150 | * Returns -EINVAL on an unsupported chipset, and zero on success. | 151 | * Returns -EINVAL on an unsupported chipset, and zero on success. |
151 | */ | 152 | */ |
152 | static int speedstep_activate (void) | 153 | static int speedstep_activate(void) |
153 | { | 154 | { |
154 | u16 value = 0; | 155 | u16 value = 0; |
155 | 156 | ||
@@ -175,20 +176,18 @@ static int speedstep_activate (void) | |||
175 | * functions. Returns the SPEEDSTEP_CHIPSET_-number for the detected | 176 | * functions. Returns the SPEEDSTEP_CHIPSET_-number for the detected |
176 | * chipset, or zero on failure. | 177 | * chipset, or zero on failure. |
177 | */ | 178 | */ |
178 | static unsigned int speedstep_detect_chipset (void) | 179 | static unsigned int speedstep_detect_chipset(void) |
179 | { | 180 | { |
180 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | 181 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, |
181 | PCI_DEVICE_ID_INTEL_82801DB_12, | 182 | PCI_DEVICE_ID_INTEL_82801DB_12, |
182 | PCI_ANY_ID, | 183 | PCI_ANY_ID, PCI_ANY_ID, |
183 | PCI_ANY_ID, | ||
184 | NULL); | 184 | NULL); |
185 | if (speedstep_chipset_dev) | 185 | if (speedstep_chipset_dev) |
186 | return 4; /* 4-M */ | 186 | return 4; /* 4-M */ |
187 | 187 | ||
188 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | 188 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, |
189 | PCI_DEVICE_ID_INTEL_82801CA_12, | 189 | PCI_DEVICE_ID_INTEL_82801CA_12, |
190 | PCI_ANY_ID, | 190 | PCI_ANY_ID, PCI_ANY_ID, |
191 | PCI_ANY_ID, | ||
192 | NULL); | 191 | NULL); |
193 | if (speedstep_chipset_dev) | 192 | if (speedstep_chipset_dev) |
194 | return 3; /* 3-M */ | 193 | return 3; /* 3-M */ |
@@ -196,8 +195,7 @@ static unsigned int speedstep_detect_chipset (void) | |||
196 | 195 | ||
197 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | 196 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, |
198 | PCI_DEVICE_ID_INTEL_82801BA_10, | 197 | PCI_DEVICE_ID_INTEL_82801BA_10, |
199 | PCI_ANY_ID, | 198 | PCI_ANY_ID, PCI_ANY_ID, |
200 | PCI_ANY_ID, | ||
201 | NULL); | 199 | NULL); |
202 | if (speedstep_chipset_dev) { | 200 | if (speedstep_chipset_dev) { |
203 | /* speedstep.c causes lockups on Dell Inspirons 8000 and | 201 | /* speedstep.c causes lockups on Dell Inspirons 8000 and |
@@ -208,8 +206,7 @@ static unsigned int speedstep_detect_chipset (void) | |||
208 | 206 | ||
209 | hostbridge = pci_get_subsys(PCI_VENDOR_ID_INTEL, | 207 | hostbridge = pci_get_subsys(PCI_VENDOR_ID_INTEL, |
210 | PCI_DEVICE_ID_INTEL_82815_MC, | 208 | PCI_DEVICE_ID_INTEL_82815_MC, |
211 | PCI_ANY_ID, | 209 | PCI_ANY_ID, PCI_ANY_ID, |
212 | PCI_ANY_ID, | ||
213 | NULL); | 210 | NULL); |
214 | 211 | ||
215 | if (!hostbridge) | 212 | if (!hostbridge) |
@@ -236,7 +233,7 @@ static unsigned int _speedstep_get(const struct cpumask *cpus) | |||
236 | 233 | ||
237 | cpus_allowed = current->cpus_allowed; | 234 | cpus_allowed = current->cpus_allowed; |
238 | set_cpus_allowed_ptr(current, cpus); | 235 | set_cpus_allowed_ptr(current, cpus); |
239 | speed = speedstep_get_processor_frequency(speedstep_processor); | 236 | speed = speedstep_get_frequency(speedstep_processor); |
240 | set_cpus_allowed_ptr(current, &cpus_allowed); | 237 | set_cpus_allowed_ptr(current, &cpus_allowed); |
241 | dprintk("detected %u kHz as current frequency\n", speed); | 238 | dprintk("detected %u kHz as current frequency\n", speed); |
242 | return speed; | 239 | return speed; |
@@ -251,11 +248,12 @@ static unsigned int speedstep_get(unsigned int cpu) | |||
251 | * speedstep_target - set a new CPUFreq policy | 248 | * speedstep_target - set a new CPUFreq policy |
252 | * @policy: new policy | 249 | * @policy: new policy |
253 | * @target_freq: the target frequency | 250 | * @target_freq: the target frequency |
254 | * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) | 251 | * @relation: how that frequency relates to achieved frequency |
252 | * (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) | ||
255 | * | 253 | * |
256 | * Sets a new CPUFreq policy. | 254 | * Sets a new CPUFreq policy. |
257 | */ | 255 | */ |
258 | static int speedstep_target (struct cpufreq_policy *policy, | 256 | static int speedstep_target(struct cpufreq_policy *policy, |
259 | unsigned int target_freq, | 257 | unsigned int target_freq, |
260 | unsigned int relation) | 258 | unsigned int relation) |
261 | { | 259 | { |
@@ -264,7 +262,8 @@ static int speedstep_target (struct cpufreq_policy *policy, | |||
264 | cpumask_t cpus_allowed; | 262 | cpumask_t cpus_allowed; |
265 | int i; | 263 | int i; |
266 | 264 | ||
267 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) | 265 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], |
266 | target_freq, relation, &newstate)) | ||
268 | return -EINVAL; | 267 | return -EINVAL; |
269 | 268 | ||
270 | freqs.old = _speedstep_get(policy->cpus); | 269 | freqs.old = _speedstep_get(policy->cpus); |
@@ -308,7 +307,7 @@ static int speedstep_target (struct cpufreq_policy *policy, | |||
308 | * Limit must be within speedstep_low_freq and speedstep_high_freq, with | 307 | * Limit must be within speedstep_low_freq and speedstep_high_freq, with |
309 | * at least one border included. | 308 | * at least one border included. |
310 | */ | 309 | */ |
311 | static int speedstep_verify (struct cpufreq_policy *policy) | 310 | static int speedstep_verify(struct cpufreq_policy *policy) |
312 | { | 311 | { |
313 | return cpufreq_frequency_table_verify(policy, &speedstep_freqs[0]); | 312 | return cpufreq_frequency_table_verify(policy, &speedstep_freqs[0]); |
314 | } | 313 | } |
@@ -344,7 +343,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
344 | return -EIO; | 343 | return -EIO; |
345 | 344 | ||
346 | dprintk("currently at %s speed setting - %i MHz\n", | 345 | dprintk("currently at %s speed setting - %i MHz\n", |
347 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", | 346 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) |
347 | ? "low" : "high", | ||
348 | (speed / 1000)); | 348 | (speed / 1000)); |
349 | 349 | ||
350 | /* cpuinfo and default policy values */ | 350 | /* cpuinfo and default policy values */ |
@@ -352,9 +352,9 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
352 | 352 | ||
353 | result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); | 353 | result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); |
354 | if (result) | 354 | if (result) |
355 | return (result); | 355 | return result; |
356 | 356 | ||
357 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); | 357 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); |
358 | 358 | ||
359 | return 0; | 359 | return 0; |
360 | } | 360 | } |
@@ -366,7 +366,7 @@ static int speedstep_cpu_exit(struct cpufreq_policy *policy) | |||
366 | return 0; | 366 | return 0; |
367 | } | 367 | } |
368 | 368 | ||
369 | static struct freq_attr* speedstep_attr[] = { | 369 | static struct freq_attr *speedstep_attr[] = { |
370 | &cpufreq_freq_attr_scaling_available_freqs, | 370 | &cpufreq_freq_attr_scaling_available_freqs, |
371 | NULL, | 371 | NULL, |
372 | }; | 372 | }; |
@@ -396,13 +396,15 @@ static int __init speedstep_init(void) | |||
396 | /* detect processor */ | 396 | /* detect processor */ |
397 | speedstep_processor = speedstep_detect_processor(); | 397 | speedstep_processor = speedstep_detect_processor(); |
398 | if (!speedstep_processor) { | 398 | if (!speedstep_processor) { |
399 | dprintk("Intel(R) SpeedStep(TM) capable processor not found\n"); | 399 | dprintk("Intel(R) SpeedStep(TM) capable processor " |
400 | "not found\n"); | ||
400 | return -ENODEV; | 401 | return -ENODEV; |
401 | } | 402 | } |
402 | 403 | ||
403 | /* detect chipset */ | 404 | /* detect chipset */ |
404 | if (!speedstep_detect_chipset()) { | 405 | if (!speedstep_detect_chipset()) { |
405 | dprintk("Intel(R) SpeedStep(TM) for this chipset not (yet) available.\n"); | 406 | dprintk("Intel(R) SpeedStep(TM) for this chipset not " |
407 | "(yet) available.\n"); | ||
406 | return -ENODEV; | 408 | return -ENODEV; |
407 | } | 409 | } |
408 | 410 | ||
@@ -431,9 +433,11 @@ static void __exit speedstep_exit(void) | |||
431 | } | 433 | } |
432 | 434 | ||
433 | 435 | ||
434 | MODULE_AUTHOR ("Dave Jones <davej@redhat.com>, Dominik Brodowski <linux@brodo.de>"); | 436 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>, " |
435 | MODULE_DESCRIPTION ("Speedstep driver for Intel mobile processors on chipsets with ICH-M southbridges."); | 437 | "Dominik Brodowski <linux@brodo.de>"); |
436 | MODULE_LICENSE ("GPL"); | 438 | MODULE_DESCRIPTION("Speedstep driver for Intel mobile processors on chipsets " |
439 | "with ICH-M southbridges."); | ||
440 | MODULE_LICENSE("GPL"); | ||
437 | 441 | ||
438 | module_init(speedstep_init); | 442 | module_init(speedstep_init); |
439 | module_exit(speedstep_exit); | 443 | module_exit(speedstep_exit); |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c index cdac7d62369b..55c696daa05c 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c | |||
@@ -18,10 +18,13 @@ | |||
18 | #include <asm/msr.h> | 18 | #include <asm/msr.h> |
19 | #include "speedstep-lib.h" | 19 | #include "speedstep-lib.h" |
20 | 20 | ||
21 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-lib", msg) | 21 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
22 | "speedstep-lib", msg) | ||
23 | |||
24 | #define PFX "speedstep-lib: " | ||
22 | 25 | ||
23 | #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK | 26 | #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK |
24 | static int relaxed_check = 0; | 27 | static int relaxed_check; |
25 | #else | 28 | #else |
26 | #define relaxed_check 0 | 29 | #define relaxed_check 0 |
27 | #endif | 30 | #endif |
@@ -30,14 +33,14 @@ static int relaxed_check = 0; | |||
30 | * GET PROCESSOR CORE SPEED IN KHZ * | 33 | * GET PROCESSOR CORE SPEED IN KHZ * |
31 | *********************************************************************/ | 34 | *********************************************************************/ |
32 | 35 | ||
33 | static unsigned int pentium3_get_frequency (unsigned int processor) | 36 | static unsigned int pentium3_get_frequency(unsigned int processor) |
34 | { | 37 | { |
35 | /* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */ | 38 | /* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */ |
36 | struct { | 39 | struct { |
37 | unsigned int ratio; /* Frequency Multiplier (x10) */ | 40 | unsigned int ratio; /* Frequency Multiplier (x10) */ |
38 | u8 bitmap; /* power on configuration bits | 41 | u8 bitmap; /* power on configuration bits |
39 | [27, 25:22] (in MSR 0x2a) */ | 42 | [27, 25:22] (in MSR 0x2a) */ |
40 | } msr_decode_mult [] = { | 43 | } msr_decode_mult[] = { |
41 | { 30, 0x01 }, | 44 | { 30, 0x01 }, |
42 | { 35, 0x05 }, | 45 | { 35, 0x05 }, |
43 | { 40, 0x02 }, | 46 | { 40, 0x02 }, |
@@ -52,7 +55,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
52 | { 85, 0x26 }, | 55 | { 85, 0x26 }, |
53 | { 90, 0x20 }, | 56 | { 90, 0x20 }, |
54 | { 100, 0x2b }, | 57 | { 100, 0x2b }, |
55 | { 0, 0xff } /* error or unknown value */ | 58 | { 0, 0xff } /* error or unknown value */ |
56 | }; | 59 | }; |
57 | 60 | ||
58 | /* PIII(-M) FSB settings: see table b1-b of 24547206.pdf */ | 61 | /* PIII(-M) FSB settings: see table b1-b of 24547206.pdf */ |
@@ -60,7 +63,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
60 | unsigned int value; /* Front Side Bus speed in MHz */ | 63 | unsigned int value; /* Front Side Bus speed in MHz */ |
61 | u8 bitmap; /* power on configuration bits [18: 19] | 64 | u8 bitmap; /* power on configuration bits [18: 19] |
62 | (in MSR 0x2a) */ | 65 | (in MSR 0x2a) */ |
63 | } msr_decode_fsb [] = { | 66 | } msr_decode_fsb[] = { |
64 | { 66, 0x0 }, | 67 | { 66, 0x0 }, |
65 | { 100, 0x2 }, | 68 | { 100, 0x2 }, |
66 | { 133, 0x1 }, | 69 | { 133, 0x1 }, |
@@ -85,7 +88,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
85 | } | 88 | } |
86 | 89 | ||
87 | /* decode the multiplier */ | 90 | /* decode the multiplier */ |
88 | if (processor == SPEEDSTEP_PROCESSOR_PIII_C_EARLY) { | 91 | if (processor == SPEEDSTEP_CPU_PIII_C_EARLY) { |
89 | dprintk("workaround for early PIIIs\n"); | 92 | dprintk("workaround for early PIIIs\n"); |
90 | msr_lo &= 0x03c00000; | 93 | msr_lo &= 0x03c00000; |
91 | } else | 94 | } else |
@@ -97,9 +100,10 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
97 | j++; | 100 | j++; |
98 | } | 101 | } |
99 | 102 | ||
100 | dprintk("speed is %u\n", (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100)); | 103 | dprintk("speed is %u\n", |
104 | (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100)); | ||
101 | 105 | ||
102 | return (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100); | 106 | return msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100; |
103 | } | 107 | } |
104 | 108 | ||
105 | 109 | ||
@@ -112,20 +116,23 @@ static unsigned int pentiumM_get_frequency(void) | |||
112 | 116 | ||
113 | /* see table B-2 of 24547212.pdf */ | 117 | /* see table B-2 of 24547212.pdf */ |
114 | if (msr_lo & 0x00040000) { | 118 | if (msr_lo & 0x00040000) { |
115 | printk(KERN_DEBUG "speedstep-lib: PM - invalid FSB: 0x%x 0x%x\n", msr_lo, msr_tmp); | 119 | printk(KERN_DEBUG PFX "PM - invalid FSB: 0x%x 0x%x\n", |
120 | msr_lo, msr_tmp); | ||
116 | return 0; | 121 | return 0; |
117 | } | 122 | } |
118 | 123 | ||
119 | msr_tmp = (msr_lo >> 22) & 0x1f; | 124 | msr_tmp = (msr_lo >> 22) & 0x1f; |
120 | dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * 100 * 1000)); | 125 | dprintk("bits 22-26 are 0x%x, speed is %u\n", |
126 | msr_tmp, (msr_tmp * 100 * 1000)); | ||
121 | 127 | ||
122 | return (msr_tmp * 100 * 1000); | 128 | return msr_tmp * 100 * 1000; |
123 | } | 129 | } |
124 | 130 | ||
125 | static unsigned int pentium_core_get_frequency(void) | 131 | static unsigned int pentium_core_get_frequency(void) |
126 | { | 132 | { |
127 | u32 fsb = 0; | 133 | u32 fsb = 0; |
128 | u32 msr_lo, msr_tmp; | 134 | u32 msr_lo, msr_tmp; |
135 | int ret; | ||
129 | 136 | ||
130 | rdmsr(MSR_FSB_FREQ, msr_lo, msr_tmp); | 137 | rdmsr(MSR_FSB_FREQ, msr_lo, msr_tmp); |
131 | /* see table B-2 of 25366920.pdf */ | 138 | /* see table B-2 of 25366920.pdf */ |
@@ -153,12 +160,15 @@ static unsigned int pentium_core_get_frequency(void) | |||
153 | } | 160 | } |
154 | 161 | ||
155 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); | 162 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); |
156 | dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); | 163 | dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", |
164 | msr_lo, msr_tmp); | ||
157 | 165 | ||
158 | msr_tmp = (msr_lo >> 22) & 0x1f; | 166 | msr_tmp = (msr_lo >> 22) & 0x1f; |
159 | dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * fsb)); | 167 | dprintk("bits 22-26 are 0x%x, speed is %u\n", |
168 | msr_tmp, (msr_tmp * fsb)); | ||
160 | 169 | ||
161 | return (msr_tmp * fsb); | 170 | ret = (msr_tmp * fsb); |
171 | return ret; | ||
162 | } | 172 | } |
163 | 173 | ||
164 | 174 | ||
@@ -167,6 +177,7 @@ static unsigned int pentium4_get_frequency(void) | |||
167 | struct cpuinfo_x86 *c = &boot_cpu_data; | 177 | struct cpuinfo_x86 *c = &boot_cpu_data; |
168 | u32 msr_lo, msr_hi, mult; | 178 | u32 msr_lo, msr_hi, mult; |
169 | unsigned int fsb = 0; | 179 | unsigned int fsb = 0; |
180 | unsigned int ret; | ||
170 | 181 | ||
171 | rdmsr(0x2c, msr_lo, msr_hi); | 182 | rdmsr(0x2c, msr_lo, msr_hi); |
172 | 183 | ||
@@ -195,44 +206,47 @@ static unsigned int pentium4_get_frequency(void) | |||
195 | } | 206 | } |
196 | 207 | ||
197 | if (!fsb) | 208 | if (!fsb) |
198 | printk(KERN_DEBUG "speedstep-lib: couldn't detect FSB speed. Please send an e-mail to <linux@brodo.de>\n"); | 209 | printk(KERN_DEBUG PFX "couldn't detect FSB speed. " |
210 | "Please send an e-mail to <linux@brodo.de>\n"); | ||
199 | 211 | ||
200 | /* Multiplier. */ | 212 | /* Multiplier. */ |
201 | mult = msr_lo >> 24; | 213 | mult = msr_lo >> 24; |
202 | 214 | ||
203 | dprintk("P4 - FSB %u kHz; Multiplier %u; Speed %u kHz\n", fsb, mult, (fsb * mult)); | 215 | dprintk("P4 - FSB %u kHz; Multiplier %u; Speed %u kHz\n", |
216 | fsb, mult, (fsb * mult)); | ||
204 | 217 | ||
205 | return (fsb * mult); | 218 | ret = (fsb * mult); |
219 | return ret; | ||
206 | } | 220 | } |
207 | 221 | ||
208 | 222 | ||
209 | unsigned int speedstep_get_processor_frequency(unsigned int processor) | 223 | unsigned int speedstep_get_frequency(unsigned int processor) |
210 | { | 224 | { |
211 | switch (processor) { | 225 | switch (processor) { |
212 | case SPEEDSTEP_PROCESSOR_PCORE: | 226 | case SPEEDSTEP_CPU_PCORE: |
213 | return pentium_core_get_frequency(); | 227 | return pentium_core_get_frequency(); |
214 | case SPEEDSTEP_PROCESSOR_PM: | 228 | case SPEEDSTEP_CPU_PM: |
215 | return pentiumM_get_frequency(); | 229 | return pentiumM_get_frequency(); |
216 | case SPEEDSTEP_PROCESSOR_P4D: | 230 | case SPEEDSTEP_CPU_P4D: |
217 | case SPEEDSTEP_PROCESSOR_P4M: | 231 | case SPEEDSTEP_CPU_P4M: |
218 | return pentium4_get_frequency(); | 232 | return pentium4_get_frequency(); |
219 | case SPEEDSTEP_PROCESSOR_PIII_T: | 233 | case SPEEDSTEP_CPU_PIII_T: |
220 | case SPEEDSTEP_PROCESSOR_PIII_C: | 234 | case SPEEDSTEP_CPU_PIII_C: |
221 | case SPEEDSTEP_PROCESSOR_PIII_C_EARLY: | 235 | case SPEEDSTEP_CPU_PIII_C_EARLY: |
222 | return pentium3_get_frequency(processor); | 236 | return pentium3_get_frequency(processor); |
223 | default: | 237 | default: |
224 | return 0; | 238 | return 0; |
225 | }; | 239 | }; |
226 | return 0; | 240 | return 0; |
227 | } | 241 | } |
228 | EXPORT_SYMBOL_GPL(speedstep_get_processor_frequency); | 242 | EXPORT_SYMBOL_GPL(speedstep_get_frequency); |
229 | 243 | ||
230 | 244 | ||
231 | /********************************************************************* | 245 | /********************************************************************* |
232 | * DETECT SPEEDSTEP-CAPABLE PROCESSOR * | 246 | * DETECT SPEEDSTEP-CAPABLE PROCESSOR * |
233 | *********************************************************************/ | 247 | *********************************************************************/ |
234 | 248 | ||
235 | unsigned int speedstep_detect_processor (void) | 249 | unsigned int speedstep_detect_processor(void) |
236 | { | 250 | { |
237 | struct cpuinfo_x86 *c = &cpu_data(0); | 251 | struct cpuinfo_x86 *c = &cpu_data(0); |
238 | u32 ebx, msr_lo, msr_hi; | 252 | u32 ebx, msr_lo, msr_hi; |
@@ -261,7 +275,7 @@ unsigned int speedstep_detect_processor (void) | |||
261 | * sample has ebx = 0x0f, production has 0x0e. | 275 | * sample has ebx = 0x0f, production has 0x0e. |
262 | */ | 276 | */ |
263 | if ((ebx == 0x0e) || (ebx == 0x0f)) | 277 | if ((ebx == 0x0e) || (ebx == 0x0f)) |
264 | return SPEEDSTEP_PROCESSOR_P4M; | 278 | return SPEEDSTEP_CPU_P4M; |
265 | break; | 279 | break; |
266 | case 7: | 280 | case 7: |
267 | /* | 281 | /* |
@@ -272,7 +286,7 @@ unsigned int speedstep_detect_processor (void) | |||
272 | * samples are only of B-stepping... | 286 | * samples are only of B-stepping... |
273 | */ | 287 | */ |
274 | if (ebx == 0x0e) | 288 | if (ebx == 0x0e) |
275 | return SPEEDSTEP_PROCESSOR_P4M; | 289 | return SPEEDSTEP_CPU_P4M; |
276 | break; | 290 | break; |
277 | case 9: | 291 | case 9: |
278 | /* | 292 | /* |
@@ -288,10 +302,13 @@ unsigned int speedstep_detect_processor (void) | |||
288 | * M-P4-Ms may have either ebx=0xe or 0xf [see above] | 302 | * M-P4-Ms may have either ebx=0xe or 0xf [see above] |
289 | * M-P4/533 have either ebx=0xe or 0xf. [25317607.pdf] | 303 | * M-P4/533 have either ebx=0xe or 0xf. [25317607.pdf] |
290 | * also, M-P4M HTs have ebx=0x8, too | 304 | * also, M-P4M HTs have ebx=0x8, too |
291 | * For now, they are distinguished by the model_id string | 305 | * For now, they are distinguished by the model_id |
306 | * string | ||
292 | */ | 307 | */ |
293 | if ((ebx == 0x0e) || (strstr(c->x86_model_id,"Mobile Intel(R) Pentium(R) 4") != NULL)) | 308 | if ((ebx == 0x0e) || |
294 | return SPEEDSTEP_PROCESSOR_P4M; | 309 | (strstr(c->x86_model_id, |
310 | "Mobile Intel(R) Pentium(R) 4") != NULL)) | ||
311 | return SPEEDSTEP_CPU_P4M; | ||
295 | break; | 312 | break; |
296 | default: | 313 | default: |
297 | break; | 314 | break; |
@@ -301,7 +318,8 @@ unsigned int speedstep_detect_processor (void) | |||
301 | 318 | ||
302 | switch (c->x86_model) { | 319 | switch (c->x86_model) { |
303 | case 0x0B: /* Intel PIII [Tualatin] */ | 320 | case 0x0B: /* Intel PIII [Tualatin] */ |
304 | /* cpuid_ebx(1) is 0x04 for desktop PIII, 0x06 for mobile PIII-M */ | 321 | /* cpuid_ebx(1) is 0x04 for desktop PIII, |
322 | * 0x06 for mobile PIII-M */ | ||
305 | ebx = cpuid_ebx(0x00000001); | 323 | ebx = cpuid_ebx(0x00000001); |
306 | dprintk("ebx is %x\n", ebx); | 324 | dprintk("ebx is %x\n", ebx); |
307 | 325 | ||
@@ -313,14 +331,15 @@ unsigned int speedstep_detect_processor (void) | |||
313 | /* So far all PIII-M processors support SpeedStep. See | 331 | /* So far all PIII-M processors support SpeedStep. See |
314 | * Intel's 24540640.pdf of June 2003 | 332 | * Intel's 24540640.pdf of June 2003 |
315 | */ | 333 | */ |
316 | return SPEEDSTEP_PROCESSOR_PIII_T; | 334 | return SPEEDSTEP_CPU_PIII_T; |
317 | 335 | ||
318 | case 0x08: /* Intel PIII [Coppermine] */ | 336 | case 0x08: /* Intel PIII [Coppermine] */ |
319 | 337 | ||
320 | /* all mobile PIII Coppermines have FSB 100 MHz | 338 | /* all mobile PIII Coppermines have FSB 100 MHz |
321 | * ==> sort out a few desktop PIIIs. */ | 339 | * ==> sort out a few desktop PIIIs. */ |
322 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_hi); | 340 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_hi); |
323 | dprintk("Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x\n", msr_lo, msr_hi); | 341 | dprintk("Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x\n", |
342 | msr_lo, msr_hi); | ||
324 | msr_lo &= 0x00c0000; | 343 | msr_lo &= 0x00c0000; |
325 | if (msr_lo != 0x0080000) | 344 | if (msr_lo != 0x0080000) |
326 | return 0; | 345 | return 0; |
@@ -332,13 +351,15 @@ unsigned int speedstep_detect_processor (void) | |||
332 | * bit 56 or 57 is set | 351 | * bit 56 or 57 is set |
333 | */ | 352 | */ |
334 | rdmsr(MSR_IA32_PLATFORM_ID, msr_lo, msr_hi); | 353 | rdmsr(MSR_IA32_PLATFORM_ID, msr_lo, msr_hi); |
335 | dprintk("Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", msr_lo, msr_hi); | 354 | dprintk("Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", |
336 | if ((msr_hi & (1<<18)) && (relaxed_check ? 1 : (msr_hi & (3<<24)))) { | 355 | msr_lo, msr_hi); |
356 | if ((msr_hi & (1<<18)) && | ||
357 | (relaxed_check ? 1 : (msr_hi & (3<<24)))) { | ||
337 | if (c->x86_mask == 0x01) { | 358 | if (c->x86_mask == 0x01) { |
338 | dprintk("early PIII version\n"); | 359 | dprintk("early PIII version\n"); |
339 | return SPEEDSTEP_PROCESSOR_PIII_C_EARLY; | 360 | return SPEEDSTEP_CPU_PIII_C_EARLY; |
340 | } else | 361 | } else |
341 | return SPEEDSTEP_PROCESSOR_PIII_C; | 362 | return SPEEDSTEP_CPU_PIII_C; |
342 | } | 363 | } |
343 | 364 | ||
344 | default: | 365 | default: |
@@ -369,7 +390,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
369 | dprintk("trying to determine both speeds\n"); | 390 | dprintk("trying to determine both speeds\n"); |
370 | 391 | ||
371 | /* get current speed */ | 392 | /* get current speed */ |
372 | prev_speed = speedstep_get_processor_frequency(processor); | 393 | prev_speed = speedstep_get_frequency(processor); |
373 | if (!prev_speed) | 394 | if (!prev_speed) |
374 | return -EIO; | 395 | return -EIO; |
375 | 396 | ||
@@ -379,7 +400,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
379 | 400 | ||
380 | /* switch to low state */ | 401 | /* switch to low state */ |
381 | set_state(SPEEDSTEP_LOW); | 402 | set_state(SPEEDSTEP_LOW); |
382 | *low_speed = speedstep_get_processor_frequency(processor); | 403 | *low_speed = speedstep_get_frequency(processor); |
383 | if (!*low_speed) { | 404 | if (!*low_speed) { |
384 | ret = -EIO; | 405 | ret = -EIO; |
385 | goto out; | 406 | goto out; |
@@ -398,7 +419,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
398 | if (transition_latency) | 419 | if (transition_latency) |
399 | do_gettimeofday(&tv2); | 420 | do_gettimeofday(&tv2); |
400 | 421 | ||
401 | *high_speed = speedstep_get_processor_frequency(processor); | 422 | *high_speed = speedstep_get_frequency(processor); |
402 | if (!*high_speed) { | 423 | if (!*high_speed) { |
403 | ret = -EIO; | 424 | ret = -EIO; |
404 | goto out; | 425 | goto out; |
@@ -426,9 +447,12 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
426 | /* check if the latency measurement is too high or too low | 447 | /* check if the latency measurement is too high or too low |
427 | * and set it to a safe value (500uSec) in that case | 448 | * and set it to a safe value (500uSec) in that case |
428 | */ | 449 | */ |
429 | if (*transition_latency > 10000000 || *transition_latency < 50000) { | 450 | if (*transition_latency > 10000000 || |
430 | printk (KERN_WARNING "speedstep: frequency transition measured seems out of " | 451 | *transition_latency < 50000) { |
431 | "range (%u nSec), falling back to a safe one of %u nSec.\n", | 452 | printk(KERN_WARNING PFX "frequency transition " |
453 | "measured seems out of range (%u " | ||
454 | "nSec), falling back to a safe one of" | ||
455 | "%u nSec.\n", | ||
432 | *transition_latency, 500000); | 456 | *transition_latency, 500000); |
433 | *transition_latency = 500000; | 457 | *transition_latency = 500000; |
434 | } | 458 | } |
@@ -436,15 +460,16 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
436 | 460 | ||
437 | out: | 461 | out: |
438 | local_irq_restore(flags); | 462 | local_irq_restore(flags); |
439 | return (ret); | 463 | return ret; |
440 | } | 464 | } |
441 | EXPORT_SYMBOL_GPL(speedstep_get_freqs); | 465 | EXPORT_SYMBOL_GPL(speedstep_get_freqs); |
442 | 466 | ||
443 | #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK | 467 | #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK |
444 | module_param(relaxed_check, int, 0444); | 468 | module_param(relaxed_check, int, 0444); |
445 | MODULE_PARM_DESC(relaxed_check, "Don't do all checks for speedstep capability."); | 469 | MODULE_PARM_DESC(relaxed_check, |
470 | "Don't do all checks for speedstep capability."); | ||
446 | #endif | 471 | #endif |
447 | 472 | ||
448 | MODULE_AUTHOR ("Dominik Brodowski <linux@brodo.de>"); | 473 | MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); |
449 | MODULE_DESCRIPTION ("Library for Intel SpeedStep 1 or 2 cpufreq drivers."); | 474 | MODULE_DESCRIPTION("Library for Intel SpeedStep 1 or 2 cpufreq drivers."); |
450 | MODULE_LICENSE ("GPL"); | 475 | MODULE_LICENSE("GPL"); |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.h b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.h index b11bcc608cac..2b6c04e5a304 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.h +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.h | |||
@@ -12,17 +12,17 @@ | |||
12 | 12 | ||
13 | /* processors */ | 13 | /* processors */ |
14 | 14 | ||
15 | #define SPEEDSTEP_PROCESSOR_PIII_C_EARLY 0x00000001 /* Coppermine core */ | 15 | #define SPEEDSTEP_CPU_PIII_C_EARLY 0x00000001 /* Coppermine core */ |
16 | #define SPEEDSTEP_PROCESSOR_PIII_C 0x00000002 /* Coppermine core */ | 16 | #define SPEEDSTEP_CPU_PIII_C 0x00000002 /* Coppermine core */ |
17 | #define SPEEDSTEP_PROCESSOR_PIII_T 0x00000003 /* Tualatin core */ | 17 | #define SPEEDSTEP_CPU_PIII_T 0x00000003 /* Tualatin core */ |
18 | #define SPEEDSTEP_PROCESSOR_P4M 0x00000004 /* P4-M */ | 18 | #define SPEEDSTEP_CPU_P4M 0x00000004 /* P4-M */ |
19 | 19 | ||
20 | /* the following processors are not speedstep-capable and are not auto-detected | 20 | /* the following processors are not speedstep-capable and are not auto-detected |
21 | * in speedstep_detect_processor(). However, their speed can be detected using | 21 | * in speedstep_detect_processor(). However, their speed can be detected using |
22 | * the speedstep_get_processor_frequency() call. */ | 22 | * the speedstep_get_frequency() call. */ |
23 | #define SPEEDSTEP_PROCESSOR_PM 0xFFFFFF03 /* Pentium M */ | 23 | #define SPEEDSTEP_CPU_PM 0xFFFFFF03 /* Pentium M */ |
24 | #define SPEEDSTEP_PROCESSOR_P4D 0xFFFFFF04 /* desktop P4 */ | 24 | #define SPEEDSTEP_CPU_P4D 0xFFFFFF04 /* desktop P4 */ |
25 | #define SPEEDSTEP_PROCESSOR_PCORE 0xFFFFFF05 /* Core */ | 25 | #define SPEEDSTEP_CPU_PCORE 0xFFFFFF05 /* Core */ |
26 | 26 | ||
27 | /* speedstep states -- only two of them */ | 27 | /* speedstep states -- only two of them */ |
28 | 28 | ||
@@ -34,7 +34,7 @@ | |||
34 | extern unsigned int speedstep_detect_processor (void); | 34 | extern unsigned int speedstep_detect_processor (void); |
35 | 35 | ||
36 | /* detect the current speed (in khz) of the processor */ | 36 | /* detect the current speed (in khz) of the processor */ |
37 | extern unsigned int speedstep_get_processor_frequency(unsigned int processor); | 37 | extern unsigned int speedstep_get_frequency(unsigned int processor); |
38 | 38 | ||
39 | 39 | ||
40 | /* detect the low and high speeds of the processor. The callback | 40 | /* detect the low and high speeds of the processor. The callback |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c b/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c index 8a85c93bd62a..befea088e4f5 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c | |||
@@ -19,8 +19,8 @@ | |||
19 | #include <linux/cpufreq.h> | 19 | #include <linux/cpufreq.h> |
20 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
21 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
22 | #include <linux/io.h> | ||
22 | #include <asm/ist.h> | 23 | #include <asm/ist.h> |
23 | #include <asm/io.h> | ||
24 | 24 | ||
25 | #include "speedstep-lib.h" | 25 | #include "speedstep-lib.h" |
26 | 26 | ||
@@ -30,12 +30,12 @@ | |||
30 | * If user gives it, these are used. | 30 | * If user gives it, these are used. |
31 | * | 31 | * |
32 | */ | 32 | */ |
33 | static int smi_port = 0; | 33 | static int smi_port; |
34 | static int smi_cmd = 0; | 34 | static int smi_cmd; |
35 | static unsigned int smi_sig = 0; | 35 | static unsigned int smi_sig; |
36 | 36 | ||
37 | /* info about the processor */ | 37 | /* info about the processor */ |
38 | static unsigned int speedstep_processor = 0; | 38 | static unsigned int speedstep_processor; |
39 | 39 | ||
40 | /* | 40 | /* |
41 | * There are only two frequency states for each processor. Values | 41 | * There are only two frequency states for each processor. Values |
@@ -56,12 +56,13 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { | |||
56 | * of DMA activity going on? */ | 56 | * of DMA activity going on? */ |
57 | #define SMI_TRIES 5 | 57 | #define SMI_TRIES 5 |
58 | 58 | ||
59 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-smi", msg) | 59 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
60 | "speedstep-smi", msg) | ||
60 | 61 | ||
61 | /** | 62 | /** |
62 | * speedstep_smi_ownership | 63 | * speedstep_smi_ownership |
63 | */ | 64 | */ |
64 | static int speedstep_smi_ownership (void) | 65 | static int speedstep_smi_ownership(void) |
65 | { | 66 | { |
66 | u32 command, result, magic, dummy; | 67 | u32 command, result, magic, dummy; |
67 | u32 function = GET_SPEEDSTEP_OWNER; | 68 | u32 function = GET_SPEEDSTEP_OWNER; |
@@ -70,16 +71,18 @@ static int speedstep_smi_ownership (void) | |||
70 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 71 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
71 | magic = virt_to_phys(magic_data); | 72 | magic = virt_to_phys(magic_data); |
72 | 73 | ||
73 | dprintk("trying to obtain ownership with command %x at port %x\n", command, smi_port); | 74 | dprintk("trying to obtain ownership with command %x at port %x\n", |
75 | command, smi_port); | ||
74 | 76 | ||
75 | __asm__ __volatile__( | 77 | __asm__ __volatile__( |
76 | "push %%ebp\n" | 78 | "push %%ebp\n" |
77 | "out %%al, (%%dx)\n" | 79 | "out %%al, (%%dx)\n" |
78 | "pop %%ebp\n" | 80 | "pop %%ebp\n" |
79 | : "=D" (result), "=a" (dummy), "=b" (dummy), "=c" (dummy), "=d" (dummy), | 81 | : "=D" (result), |
80 | "=S" (dummy) | 82 | "=a" (dummy), "=b" (dummy), "=c" (dummy), "=d" (dummy), |
83 | "=S" (dummy) | ||
81 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), | 84 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), |
82 | "D" (0), "S" (magic) | 85 | "D" (0), "S" (magic) |
83 | : "memory" | 86 | : "memory" |
84 | ); | 87 | ); |
85 | 88 | ||
@@ -97,10 +100,10 @@ static int speedstep_smi_ownership (void) | |||
97 | * even hangs [cf. bugme.osdl.org # 1422] on earlier systems. Empirical testing | 100 | * even hangs [cf. bugme.osdl.org # 1422] on earlier systems. Empirical testing |
98 | * shows that the latter occurs if !(ist_info.event & 0xFFFF). | 101 | * shows that the latter occurs if !(ist_info.event & 0xFFFF). |
99 | */ | 102 | */ |
100 | static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | 103 | static int speedstep_smi_get_freqs(unsigned int *low, unsigned int *high) |
101 | { | 104 | { |
102 | u32 command, result = 0, edi, high_mhz, low_mhz, dummy; | 105 | u32 command, result = 0, edi, high_mhz, low_mhz, dummy; |
103 | u32 state=0; | 106 | u32 state = 0; |
104 | u32 function = GET_SPEEDSTEP_FREQS; | 107 | u32 function = GET_SPEEDSTEP_FREQS; |
105 | 108 | ||
106 | if (!(ist_info.event & 0xFFFF)) { | 109 | if (!(ist_info.event & 0xFFFF)) { |
@@ -110,17 +113,25 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
110 | 113 | ||
111 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 114 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
112 | 115 | ||
113 | dprintk("trying to determine frequencies with command %x at port %x\n", command, smi_port); | 116 | dprintk("trying to determine frequencies with command %x at port %x\n", |
117 | command, smi_port); | ||
114 | 118 | ||
115 | __asm__ __volatile__( | 119 | __asm__ __volatile__( |
116 | "push %%ebp\n" | 120 | "push %%ebp\n" |
117 | "out %%al, (%%dx)\n" | 121 | "out %%al, (%%dx)\n" |
118 | "pop %%ebp" | 122 | "pop %%ebp" |
119 | : "=a" (result), "=b" (high_mhz), "=c" (low_mhz), "=d" (state), "=D" (edi), "=S" (dummy) | 123 | : "=a" (result), |
120 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0), "D" (0) | 124 | "=b" (high_mhz), |
125 | "=c" (low_mhz), | ||
126 | "=d" (state), "=D" (edi), "=S" (dummy) | ||
127 | : "a" (command), | ||
128 | "b" (function), | ||
129 | "c" (state), | ||
130 | "d" (smi_port), "S" (0), "D" (0) | ||
121 | ); | 131 | ); |
122 | 132 | ||
123 | dprintk("result %x, low_freq %u, high_freq %u\n", result, low_mhz, high_mhz); | 133 | dprintk("result %x, low_freq %u, high_freq %u\n", |
134 | result, low_mhz, high_mhz); | ||
124 | 135 | ||
125 | /* abort if results are obviously incorrect... */ | 136 | /* abort if results are obviously incorrect... */ |
126 | if ((high_mhz + low_mhz) < 600) | 137 | if ((high_mhz + low_mhz) < 600) |
@@ -137,26 +148,30 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
137 | * @state: processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH) | 148 | * @state: processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH) |
138 | * | 149 | * |
139 | */ | 150 | */ |
140 | static int speedstep_get_state (void) | 151 | static int speedstep_get_state(void) |
141 | { | 152 | { |
142 | u32 function=GET_SPEEDSTEP_STATE; | 153 | u32 function = GET_SPEEDSTEP_STATE; |
143 | u32 result, state, edi, command, dummy; | 154 | u32 result, state, edi, command, dummy; |
144 | 155 | ||
145 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 156 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
146 | 157 | ||
147 | dprintk("trying to determine current setting with command %x at port %x\n", command, smi_port); | 158 | dprintk("trying to determine current setting with command %x " |
159 | "at port %x\n", command, smi_port); | ||
148 | 160 | ||
149 | __asm__ __volatile__( | 161 | __asm__ __volatile__( |
150 | "push %%ebp\n" | 162 | "push %%ebp\n" |
151 | "out %%al, (%%dx)\n" | 163 | "out %%al, (%%dx)\n" |
152 | "pop %%ebp\n" | 164 | "pop %%ebp\n" |
153 | : "=a" (result), "=b" (state), "=D" (edi), "=c" (dummy), "=d" (dummy), "=S" (dummy) | 165 | : "=a" (result), |
154 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), "S" (0), "D" (0) | 166 | "=b" (state), "=D" (edi), |
167 | "=c" (dummy), "=d" (dummy), "=S" (dummy) | ||
168 | : "a" (command), "b" (function), "c" (0), | ||
169 | "d" (smi_port), "S" (0), "D" (0) | ||
155 | ); | 170 | ); |
156 | 171 | ||
157 | dprintk("state is %x, result is %x\n", state, result); | 172 | dprintk("state is %x, result is %x\n", state, result); |
158 | 173 | ||
159 | return (state & 1); | 174 | return state & 1; |
160 | } | 175 | } |
161 | 176 | ||
162 | 177 | ||
@@ -165,11 +180,11 @@ static int speedstep_get_state (void) | |||
165 | * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH) | 180 | * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH) |
166 | * | 181 | * |
167 | */ | 182 | */ |
168 | static void speedstep_set_state (unsigned int state) | 183 | static void speedstep_set_state(unsigned int state) |
169 | { | 184 | { |
170 | unsigned int result = 0, command, new_state, dummy; | 185 | unsigned int result = 0, command, new_state, dummy; |
171 | unsigned long flags; | 186 | unsigned long flags; |
172 | unsigned int function=SET_SPEEDSTEP_STATE; | 187 | unsigned int function = SET_SPEEDSTEP_STATE; |
173 | unsigned int retry = 0; | 188 | unsigned int retry = 0; |
174 | 189 | ||
175 | if (state > 0x1) | 190 | if (state > 0x1) |
@@ -180,11 +195,14 @@ static void speedstep_set_state (unsigned int state) | |||
180 | 195 | ||
181 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 196 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
182 | 197 | ||
183 | dprintk("trying to set frequency to state %u with command %x at port %x\n", state, command, smi_port); | 198 | dprintk("trying to set frequency to state %u " |
199 | "with command %x at port %x\n", | ||
200 | state, command, smi_port); | ||
184 | 201 | ||
185 | do { | 202 | do { |
186 | if (retry) { | 203 | if (retry) { |
187 | dprintk("retry %u, previous result %u, waiting...\n", retry, result); | 204 | dprintk("retry %u, previous result %u, waiting...\n", |
205 | retry, result); | ||
188 | mdelay(retry * 50); | 206 | mdelay(retry * 50); |
189 | } | 207 | } |
190 | retry++; | 208 | retry++; |
@@ -192,20 +210,26 @@ static void speedstep_set_state (unsigned int state) | |||
192 | "push %%ebp\n" | 210 | "push %%ebp\n" |
193 | "out %%al, (%%dx)\n" | 211 | "out %%al, (%%dx)\n" |
194 | "pop %%ebp" | 212 | "pop %%ebp" |
195 | : "=b" (new_state), "=D" (result), "=c" (dummy), "=a" (dummy), | 213 | : "=b" (new_state), "=D" (result), |
196 | "=d" (dummy), "=S" (dummy) | 214 | "=c" (dummy), "=a" (dummy), |
197 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0), "D" (0) | 215 | "=d" (dummy), "=S" (dummy) |
216 | : "a" (command), "b" (function), "c" (state), | ||
217 | "d" (smi_port), "S" (0), "D" (0) | ||
198 | ); | 218 | ); |
199 | } while ((new_state != state) && (retry <= SMI_TRIES)); | 219 | } while ((new_state != state) && (retry <= SMI_TRIES)); |
200 | 220 | ||
201 | /* enable IRQs */ | 221 | /* enable IRQs */ |
202 | local_irq_restore(flags); | 222 | local_irq_restore(flags); |
203 | 223 | ||
204 | if (new_state == state) { | 224 | if (new_state == state) |
205 | dprintk("change to %u MHz succeeded after %u tries with result %u\n", (speedstep_freqs[new_state].frequency / 1000), retry, result); | 225 | dprintk("change to %u MHz succeeded after %u tries " |
206 | } else { | 226 | "with result %u\n", |
207 | printk(KERN_ERR "cpufreq: change to state %u failed with new_state %u and result %u\n", state, new_state, result); | 227 | (speedstep_freqs[new_state].frequency / 1000), |
208 | } | 228 | retry, result); |
229 | else | ||
230 | printk(KERN_ERR "cpufreq: change to state %u " | ||
231 | "failed with new_state %u and result %u\n", | ||
232 | state, new_state, result); | ||
209 | 233 | ||
210 | return; | 234 | return; |
211 | } | 235 | } |
@@ -219,13 +243,14 @@ static void speedstep_set_state (unsigned int state) | |||
219 | * | 243 | * |
220 | * Sets a new CPUFreq policy/freq. | 244 | * Sets a new CPUFreq policy/freq. |
221 | */ | 245 | */ |
222 | static int speedstep_target (struct cpufreq_policy *policy, | 246 | static int speedstep_target(struct cpufreq_policy *policy, |
223 | unsigned int target_freq, unsigned int relation) | 247 | unsigned int target_freq, unsigned int relation) |
224 | { | 248 | { |
225 | unsigned int newstate = 0; | 249 | unsigned int newstate = 0; |
226 | struct cpufreq_freqs freqs; | 250 | struct cpufreq_freqs freqs; |
227 | 251 | ||
228 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) | 252 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], |
253 | target_freq, relation, &newstate)) | ||
229 | return -EINVAL; | 254 | return -EINVAL; |
230 | 255 | ||
231 | freqs.old = speedstep_freqs[speedstep_get_state()].frequency; | 256 | freqs.old = speedstep_freqs[speedstep_get_state()].frequency; |
@@ -250,7 +275,7 @@ static int speedstep_target (struct cpufreq_policy *policy, | |||
250 | * Limit must be within speedstep_low_freq and speedstep_high_freq, with | 275 | * Limit must be within speedstep_low_freq and speedstep_high_freq, with |
251 | * at least one border included. | 276 | * at least one border included. |
252 | */ | 277 | */ |
253 | static int speedstep_verify (struct cpufreq_policy *policy) | 278 | static int speedstep_verify(struct cpufreq_policy *policy) |
254 | { | 279 | { |
255 | return cpufreq_frequency_table_verify(policy, &speedstep_freqs[0]); | 280 | return cpufreq_frequency_table_verify(policy, &speedstep_freqs[0]); |
256 | } | 281 | } |
@@ -259,7 +284,8 @@ static int speedstep_verify (struct cpufreq_policy *policy) | |||
259 | static int speedstep_cpu_init(struct cpufreq_policy *policy) | 284 | static int speedstep_cpu_init(struct cpufreq_policy *policy) |
260 | { | 285 | { |
261 | int result; | 286 | int result; |
262 | unsigned int speed,state; | 287 | unsigned int speed, state; |
288 | unsigned int *low, *high; | ||
263 | 289 | ||
264 | /* capability check */ | 290 | /* capability check */ |
265 | if (policy->cpu != 0) | 291 | if (policy->cpu != 0) |
@@ -272,19 +298,23 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
272 | } | 298 | } |
273 | 299 | ||
274 | /* detect low and high frequency */ | 300 | /* detect low and high frequency */ |
275 | result = speedstep_smi_get_freqs(&speedstep_freqs[SPEEDSTEP_LOW].frequency, | 301 | low = &speedstep_freqs[SPEEDSTEP_LOW].frequency; |
276 | &speedstep_freqs[SPEEDSTEP_HIGH].frequency); | 302 | high = &speedstep_freqs[SPEEDSTEP_HIGH].frequency; |
303 | |||
304 | result = speedstep_smi_get_freqs(low, high); | ||
277 | if (result) { | 305 | if (result) { |
278 | /* fall back to speedstep_lib.c dection mechanism: try both states out */ | 306 | /* fall back to speedstep_lib.c dection mechanism: |
279 | dprintk("could not detect low and high frequencies by SMI call.\n"); | 307 | * try both states out */ |
308 | dprintk("could not detect low and high frequencies " | ||
309 | "by SMI call.\n"); | ||
280 | result = speedstep_get_freqs(speedstep_processor, | 310 | result = speedstep_get_freqs(speedstep_processor, |
281 | &speedstep_freqs[SPEEDSTEP_LOW].frequency, | 311 | low, high, |
282 | &speedstep_freqs[SPEEDSTEP_HIGH].frequency, | ||
283 | NULL, | 312 | NULL, |
284 | &speedstep_set_state); | 313 | &speedstep_set_state); |
285 | 314 | ||
286 | if (result) { | 315 | if (result) { |
287 | dprintk("could not detect two different speeds -- aborting.\n"); | 316 | dprintk("could not detect two different speeds" |
317 | " -- aborting.\n"); | ||
288 | return result; | 318 | return result; |
289 | } else | 319 | } else |
290 | dprintk("workaround worked.\n"); | 320 | dprintk("workaround worked.\n"); |
@@ -295,7 +325,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
295 | speed = speedstep_freqs[state].frequency; | 325 | speed = speedstep_freqs[state].frequency; |
296 | 326 | ||
297 | dprintk("currently at %s speed setting - %i MHz\n", | 327 | dprintk("currently at %s speed setting - %i MHz\n", |
298 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", | 328 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) |
329 | ? "low" : "high", | ||
299 | (speed / 1000)); | 330 | (speed / 1000)); |
300 | 331 | ||
301 | /* cpuinfo and default policy values */ | 332 | /* cpuinfo and default policy values */ |
@@ -304,7 +335,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
304 | 335 | ||
305 | result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); | 336 | result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); |
306 | if (result) | 337 | if (result) |
307 | return (result); | 338 | return result; |
308 | 339 | ||
309 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); | 340 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); |
310 | 341 | ||
@@ -321,7 +352,7 @@ static unsigned int speedstep_get(unsigned int cpu) | |||
321 | { | 352 | { |
322 | if (cpu) | 353 | if (cpu) |
323 | return -ENODEV; | 354 | return -ENODEV; |
324 | return speedstep_get_processor_frequency(speedstep_processor); | 355 | return speedstep_get_frequency(speedstep_processor); |
325 | } | 356 | } |
326 | 357 | ||
327 | 358 | ||
@@ -335,7 +366,7 @@ static int speedstep_resume(struct cpufreq_policy *policy) | |||
335 | return result; | 366 | return result; |
336 | } | 367 | } |
337 | 368 | ||
338 | static struct freq_attr* speedstep_attr[] = { | 369 | static struct freq_attr *speedstep_attr[] = { |
339 | &cpufreq_freq_attr_scaling_available_freqs, | 370 | &cpufreq_freq_attr_scaling_available_freqs, |
340 | NULL, | 371 | NULL, |
341 | }; | 372 | }; |
@@ -364,21 +395,23 @@ static int __init speedstep_init(void) | |||
364 | speedstep_processor = speedstep_detect_processor(); | 395 | speedstep_processor = speedstep_detect_processor(); |
365 | 396 | ||
366 | switch (speedstep_processor) { | 397 | switch (speedstep_processor) { |
367 | case SPEEDSTEP_PROCESSOR_PIII_T: | 398 | case SPEEDSTEP_CPU_PIII_T: |
368 | case SPEEDSTEP_PROCESSOR_PIII_C: | 399 | case SPEEDSTEP_CPU_PIII_C: |
369 | case SPEEDSTEP_PROCESSOR_PIII_C_EARLY: | 400 | case SPEEDSTEP_CPU_PIII_C_EARLY: |
370 | break; | 401 | break; |
371 | default: | 402 | default: |
372 | speedstep_processor = 0; | 403 | speedstep_processor = 0; |
373 | } | 404 | } |
374 | 405 | ||
375 | if (!speedstep_processor) { | 406 | if (!speedstep_processor) { |
376 | dprintk ("No supported Intel CPU detected.\n"); | 407 | dprintk("No supported Intel CPU detected.\n"); |
377 | return -ENODEV; | 408 | return -ENODEV; |
378 | } | 409 | } |
379 | 410 | ||
380 | dprintk("signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.\n", | 411 | dprintk("signature:0x%.8lx, command:0x%.8lx, " |
381 | ist_info.signature, ist_info.command, ist_info.event, ist_info.perf_level); | 412 | "event:0x%.8lx, perf_level:0x%.8lx.\n", |
413 | ist_info.signature, ist_info.command, | ||
414 | ist_info.event, ist_info.perf_level); | ||
382 | 415 | ||
383 | /* Error if no IST-SMI BIOS or no PARM | 416 | /* Error if no IST-SMI BIOS or no PARM |
384 | sig= 'ISGE' aka 'Intel Speedstep Gate E' */ | 417 | sig= 'ISGE' aka 'Intel Speedstep Gate E' */ |
@@ -416,17 +449,20 @@ static void __exit speedstep_exit(void) | |||
416 | cpufreq_unregister_driver(&speedstep_driver); | 449 | cpufreq_unregister_driver(&speedstep_driver); |
417 | } | 450 | } |
418 | 451 | ||
419 | module_param(smi_port, int, 0444); | 452 | module_param(smi_port, int, 0444); |
420 | module_param(smi_cmd, int, 0444); | 453 | module_param(smi_cmd, int, 0444); |
421 | module_param(smi_sig, uint, 0444); | 454 | module_param(smi_sig, uint, 0444); |
422 | 455 | ||
423 | MODULE_PARM_DESC(smi_port, "Override the BIOS-given IST port with this value -- Intel's default setting is 0xb2"); | 456 | MODULE_PARM_DESC(smi_port, "Override the BIOS-given IST port with this value " |
424 | MODULE_PARM_DESC(smi_cmd, "Override the BIOS-given IST command with this value -- Intel's default setting is 0x82"); | 457 | "-- Intel's default setting is 0xb2"); |
425 | MODULE_PARM_DESC(smi_sig, "Set to 1 to fake the IST signature when using the SMI interface."); | 458 | MODULE_PARM_DESC(smi_cmd, "Override the BIOS-given IST command with this value " |
459 | "-- Intel's default setting is 0x82"); | ||
460 | MODULE_PARM_DESC(smi_sig, "Set to 1 to fake the IST signature when using the " | ||
461 | "SMI interface."); | ||
426 | 462 | ||
427 | MODULE_AUTHOR ("Hiroshi Miura"); | 463 | MODULE_AUTHOR("Hiroshi Miura"); |
428 | MODULE_DESCRIPTION ("Speedstep driver for IST applet SMI interface."); | 464 | MODULE_DESCRIPTION("Speedstep driver for IST applet SMI interface."); |
429 | MODULE_LICENSE ("GPL"); | 465 | MODULE_LICENSE("GPL"); |
430 | 466 | ||
431 | module_init(speedstep_init); | 467 | module_init(speedstep_init); |
432 | module_exit(speedstep_exit); | 468 | module_exit(speedstep_exit); |