diff options
Diffstat (limited to 'arch/x86/kernel/cpu/cpufreq/speedstep-smi.c')
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-smi.c | 166 |
1 files changed, 101 insertions, 65 deletions
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); |