diff options
| -rw-r--r-- | drivers/acpi/processor_core.c | 6 | ||||
| -rw-r--r-- | drivers/acpi/processor_perflib.c | 50 | ||||
| -rw-r--r-- | include/acpi/processor.h | 5 |
3 files changed, 53 insertions, 8 deletions
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index c567b46dfa0f..773d7e76f301 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -722,7 +722,7 @@ static void acpi_processor_notify(struct acpi_device *device, u32 event) | |||
| 722 | switch (event) { | 722 | switch (event) { |
| 723 | case ACPI_PROCESSOR_NOTIFY_PERFORMANCE: | 723 | case ACPI_PROCESSOR_NOTIFY_PERFORMANCE: |
| 724 | saved = pr->performance_platform_limit; | 724 | saved = pr->performance_platform_limit; |
| 725 | acpi_processor_ppc_has_changed(pr); | 725 | acpi_processor_ppc_has_changed(pr, 1); |
| 726 | if (saved == pr->performance_platform_limit) | 726 | if (saved == pr->performance_platform_limit) |
| 727 | break; | 727 | break; |
| 728 | acpi_bus_generate_proc_event(device, event, | 728 | acpi_bus_generate_proc_event(device, event, |
| @@ -758,7 +758,7 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb, | |||
| 758 | struct acpi_processor *pr = per_cpu(processors, cpu); | 758 | struct acpi_processor *pr = per_cpu(processors, cpu); |
| 759 | 759 | ||
| 760 | if (action == CPU_ONLINE && pr) { | 760 | if (action == CPU_ONLINE && pr) { |
| 761 | acpi_processor_ppc_has_changed(pr); | 761 | acpi_processor_ppc_has_changed(pr, 0); |
| 762 | acpi_processor_cst_has_changed(pr); | 762 | acpi_processor_cst_has_changed(pr); |
| 763 | acpi_processor_tstate_has_changed(pr); | 763 | acpi_processor_tstate_has_changed(pr); |
| 764 | } | 764 | } |
| @@ -830,7 +830,7 @@ static int acpi_processor_add(struct acpi_device *device) | |||
| 830 | arch_acpi_processor_cleanup_pdc(pr); | 830 | arch_acpi_processor_cleanup_pdc(pr); |
| 831 | 831 | ||
| 832 | #ifdef CONFIG_CPU_FREQ | 832 | #ifdef CONFIG_CPU_FREQ |
| 833 | acpi_processor_ppc_has_changed(pr); | 833 | acpi_processor_ppc_has_changed(pr, 0); |
| 834 | #endif | 834 | #endif |
| 835 | acpi_processor_get_throttling_info(pr); | 835 | acpi_processor_get_throttling_info(pr); |
| 836 | acpi_processor_get_limit_info(pr); | 836 | acpi_processor_get_limit_info(pr); |
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index 8ba0ed0b9ddb..fc1f49bbbeef 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 |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 740ac3ad8fd0..a920237f7c62 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
| @@ -294,7 +294,7 @@ static inline void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx | |||
| 294 | #ifdef CONFIG_CPU_FREQ | 294 | #ifdef CONFIG_CPU_FREQ |
| 295 | void acpi_processor_ppc_init(void); | 295 | void acpi_processor_ppc_init(void); |
| 296 | void acpi_processor_ppc_exit(void); | 296 | void acpi_processor_ppc_exit(void); |
| 297 | int acpi_processor_ppc_has_changed(struct acpi_processor *pr); | 297 | int acpi_processor_ppc_has_changed(struct acpi_processor *pr, int event_flag); |
| 298 | #else | 298 | #else |
| 299 | static inline void acpi_processor_ppc_init(void) | 299 | static inline void acpi_processor_ppc_init(void) |
| 300 | { | 300 | { |
| @@ -304,7 +304,8 @@ static inline void acpi_processor_ppc_exit(void) | |||
| 304 | { | 304 | { |
| 305 | return; | 305 | return; |
| 306 | } | 306 | } |
| 307 | static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr) | 307 | static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr, |
| 308 | int event_flag) | ||
| 308 | { | 309 | { |
| 309 | static unsigned int printout = 1; | 310 | static unsigned int printout = 1; |
| 310 | if (printout) { | 311 | if (printout) { |
