diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-smi.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c b/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c index f2b5a621d27b..8a85c93bd62a 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c | |||
@@ -63,7 +63,7 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { | |||
63 | */ | 63 | */ |
64 | static int speedstep_smi_ownership (void) | 64 | static int speedstep_smi_ownership (void) |
65 | { | 65 | { |
66 | u32 command, result, magic; | 66 | u32 command, result, magic, dummy; |
67 | u32 function = GET_SPEEDSTEP_OWNER; | 67 | u32 function = GET_SPEEDSTEP_OWNER; |
68 | unsigned char magic_data[] = "Copyright (c) 1999 Intel Corporation"; | 68 | unsigned char magic_data[] = "Copyright (c) 1999 Intel Corporation"; |
69 | 69 | ||
@@ -73,8 +73,11 @@ static int speedstep_smi_ownership (void) | |||
73 | dprintk("trying to obtain ownership with command %x at port %x\n", command, smi_port); | 73 | dprintk("trying to obtain ownership with command %x at port %x\n", command, smi_port); |
74 | 74 | ||
75 | __asm__ __volatile__( | 75 | __asm__ __volatile__( |
76 | "push %%ebp\n" | ||
76 | "out %%al, (%%dx)\n" | 77 | "out %%al, (%%dx)\n" |
77 | : "=D" (result) | 78 | "pop %%ebp\n" |
79 | : "=D" (result), "=a" (dummy), "=b" (dummy), "=c" (dummy), "=d" (dummy), | ||
80 | "=S" (dummy) | ||
78 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), | 81 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), |
79 | "D" (0), "S" (magic) | 82 | "D" (0), "S" (magic) |
80 | : "memory" | 83 | : "memory" |
@@ -96,7 +99,7 @@ static int speedstep_smi_ownership (void) | |||
96 | */ | 99 | */ |
97 | static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | 100 | static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) |
98 | { | 101 | { |
99 | u32 command, result = 0, edi, high_mhz, low_mhz; | 102 | u32 command, result = 0, edi, high_mhz, low_mhz, dummy; |
100 | u32 state=0; | 103 | u32 state=0; |
101 | u32 function = GET_SPEEDSTEP_FREQS; | 104 | u32 function = GET_SPEEDSTEP_FREQS; |
102 | 105 | ||
@@ -109,10 +112,12 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
109 | 112 | ||
110 | dprintk("trying to determine frequencies with command %x at port %x\n", command, smi_port); | 113 | dprintk("trying to determine frequencies with command %x at port %x\n", command, smi_port); |
111 | 114 | ||
112 | __asm__ __volatile__("movl $0, %%edi\n" | 115 | __asm__ __volatile__( |
116 | "push %%ebp\n" | ||
113 | "out %%al, (%%dx)\n" | 117 | "out %%al, (%%dx)\n" |
114 | : "=a" (result), "=b" (high_mhz), "=c" (low_mhz), "=d" (state), "=D" (edi) | 118 | "pop %%ebp" |
115 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0) | 119 | : "=a" (result), "=b" (high_mhz), "=c" (low_mhz), "=d" (state), "=D" (edi), "=S" (dummy) |
120 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0), "D" (0) | ||
116 | ); | 121 | ); |
117 | 122 | ||
118 | dprintk("result %x, low_freq %u, high_freq %u\n", result, low_mhz, high_mhz); | 123 | dprintk("result %x, low_freq %u, high_freq %u\n", result, low_mhz, high_mhz); |
@@ -135,16 +140,18 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
135 | static int speedstep_get_state (void) | 140 | static int speedstep_get_state (void) |
136 | { | 141 | { |
137 | u32 function=GET_SPEEDSTEP_STATE; | 142 | u32 function=GET_SPEEDSTEP_STATE; |
138 | u32 result, state, edi, command; | 143 | u32 result, state, edi, command, dummy; |
139 | 144 | ||
140 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 145 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
141 | 146 | ||
142 | dprintk("trying to determine current setting with command %x at port %x\n", command, smi_port); | 147 | dprintk("trying to determine current setting with command %x at port %x\n", command, smi_port); |
143 | 148 | ||
144 | __asm__ __volatile__("movl $0, %%edi\n" | 149 | __asm__ __volatile__( |
150 | "push %%ebp\n" | ||
145 | "out %%al, (%%dx)\n" | 151 | "out %%al, (%%dx)\n" |
146 | : "=a" (result), "=b" (state), "=D" (edi) | 152 | "pop %%ebp\n" |
147 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), "S" (0) | 153 | : "=a" (result), "=b" (state), "=D" (edi), "=c" (dummy), "=d" (dummy), "=S" (dummy) |
154 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), "S" (0), "D" (0) | ||
148 | ); | 155 | ); |
149 | 156 | ||
150 | dprintk("state is %x, result is %x\n", state, result); | 157 | dprintk("state is %x, result is %x\n", state, result); |
@@ -160,7 +167,7 @@ static int speedstep_get_state (void) | |||
160 | */ | 167 | */ |
161 | static void speedstep_set_state (unsigned int state) | 168 | static void speedstep_set_state (unsigned int state) |
162 | { | 169 | { |
163 | unsigned int result = 0, command, new_state; | 170 | unsigned int result = 0, command, new_state, dummy; |
164 | unsigned long flags; | 171 | unsigned long flags; |
165 | unsigned int function=SET_SPEEDSTEP_STATE; | 172 | unsigned int function=SET_SPEEDSTEP_STATE; |
166 | unsigned int retry = 0; | 173 | unsigned int retry = 0; |
@@ -182,10 +189,12 @@ static void speedstep_set_state (unsigned int state) | |||
182 | } | 189 | } |
183 | retry++; | 190 | retry++; |
184 | __asm__ __volatile__( | 191 | __asm__ __volatile__( |
185 | "movl $0, %%edi\n" | 192 | "push %%ebp\n" |
186 | "out %%al, (%%dx)\n" | 193 | "out %%al, (%%dx)\n" |
187 | : "=b" (new_state), "=D" (result) | 194 | "pop %%ebp" |
188 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0) | 195 | : "=b" (new_state), "=D" (result), "=c" (dummy), "=a" (dummy), |
196 | "=d" (dummy), "=S" (dummy) | ||
197 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0), "D" (0) | ||
189 | ); | 198 | ); |
190 | } while ((new_state != state) && (retry <= SMI_TRIES)); | 199 | } while ((new_state != state) && (retry <= SMI_TRIES)); |
191 | 200 | ||
@@ -195,7 +204,7 @@ static void speedstep_set_state (unsigned int state) | |||
195 | if (new_state == state) { | 204 | if (new_state == state) { |
196 | dprintk("change to %u MHz succeeded after %u tries with result %u\n", (speedstep_freqs[new_state].frequency / 1000), retry, result); | 205 | dprintk("change to %u MHz succeeded after %u tries with result %u\n", (speedstep_freqs[new_state].frequency / 1000), retry, result); |
197 | } else { | 206 | } else { |
198 | printk(KERN_ERR "cpufreq: change failed with new_state %u and result %u\n", new_state, result); | 207 | printk(KERN_ERR "cpufreq: change to state %u failed with new_state %u and result %u\n", state, new_state, result); |
199 | } | 208 | } |
200 | 209 | ||
201 | return; | 210 | return; |