diff options
Diffstat (limited to 'drivers/acpi/processor_perflib.c')
-rw-r--r-- | drivers/acpi/processor_perflib.c | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index 01e366d2b6fb..2cabadcc4d8c 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c | |||
@@ -152,15 +152,59 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr) | |||
152 | return 0; | 152 | return 0; |
153 | } | 153 | } |
154 | 154 | ||
155 | int acpi_processor_ppc_has_changed(struct acpi_processor *pr) | 155 | #define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80 |
156 | /* | ||
157 | * acpi_processor_ppc_ost: Notify firmware the _PPC evaluation status | ||
158 | * @handle: ACPI processor handle | ||
159 | * @status: the status code of _PPC evaluation | ||
160 | * 0: success. OSPM is now using the performance state specificed. | ||
161 | * 1: failure. OSPM has not changed the number of P-states in use | ||
162 | */ | ||
163 | static void acpi_processor_ppc_ost(acpi_handle handle, int status) | ||
164 | { | ||
165 | union acpi_object params[2] = { | ||
166 | {.type = ACPI_TYPE_INTEGER,}, | ||
167 | {.type = ACPI_TYPE_INTEGER,}, | ||
168 | }; | ||
169 | struct acpi_object_list arg_list = {2, params}; | ||
170 | acpi_handle temp; | ||
171 | |||
172 | params[0].integer.value = ACPI_PROCESSOR_NOTIFY_PERFORMANCE; | ||
173 | params[1].integer.value = status; | ||
174 | |||
175 | /* when there is no _OST , skip it */ | ||
176 | if (ACPI_FAILURE(acpi_get_handle(handle, "_OST", &temp))) | ||
177 | return; | ||
178 | |||
179 | acpi_evaluate_object(handle, "_OST", &arg_list, NULL); | ||
180 | return; | ||
181 | } | ||
182 | |||
183 | int acpi_processor_ppc_has_changed(struct acpi_processor *pr, int event_flag) | ||
156 | { | 184 | { |
157 | int ret; | 185 | int ret; |
158 | 186 | ||
159 | if (ignore_ppc) | 187 | if (ignore_ppc) { |
188 | /* | ||
189 | * Only when it is notification event, the _OST object | ||
190 | * will be evaluated. Otherwise it is skipped. | ||
191 | */ | ||
192 | if (event_flag) | ||
193 | acpi_processor_ppc_ost(pr->handle, 1); | ||
160 | return 0; | 194 | return 0; |
195 | } | ||
161 | 196 | ||
162 | ret = acpi_processor_get_platform_limit(pr); | 197 | ret = acpi_processor_get_platform_limit(pr); |
163 | 198 | /* | |
199 | * Only when it is notification event, the _OST object | ||
200 | * will be evaluated. Otherwise it is skipped. | ||
201 | */ | ||
202 | if (event_flag) { | ||
203 | if (ret < 0) | ||
204 | acpi_processor_ppc_ost(pr->handle, 1); | ||
205 | else | ||
206 | acpi_processor_ppc_ost(pr->handle, 0); | ||
207 | } | ||
164 | if (ret < 0) | 208 | if (ret < 0) |
165 | return (ret); | 209 | return (ret); |
166 | else | 210 | else |