: ACPI: Sort the ACPI P-state table in descending order by cpufre
PATCH 1/1 : ACPI: Sort the ACPI P-state table in descending order by cpufre
From: Zhao Yakui <[email protected]>
According to ACPI spec the the _PSS object indicates to OSPM the supported processor performance states. And they should be sorted in descending order by cpufreq.
But unfortunately on some boxes the cpufreq in _PSS object is sorted in ascending order, which causes that cpufreq driver can't work well.
Sort the ACPI P-state table in descending order by cpufreq.
http://bugzilla.kernel.org/show_bug.cgi?id=13529
Signed-off-by Zhao Yakui <[email protected]>
Tested-by Mukik182 <[email protected]>
cc Ling Ming <[email protected]>
--- drivers/acpi/processor_perflib.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)
drivers/acpi/processor_perflib.c +24 -1
@@ -38,6 +38,7 @@#include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> #include <acpi/processor.h> +#include <linux/sort.h> #define ACPI_PROCESSOR_CLASS "processor"#define ACPI_PROCESSOR_FILE_PERFORMANCE "performance"
@@ -246,6 +247,25 @@return result; } +static int pss_cmp_func (const void *a,const void *b) +{ +struct acpi_processor_px *pxa, *pxb; +acpi_integer acpi_value; + + pxa = (struct acpi_processor_px *)a; + pxb = (struct acpi_processor_px *)b; + + acpi_value = pxb->core_frequency - pxa->core_frequency; +return (int ) acpi_value; +} +static void pss_swap_func (void *a,void *b,int size) +{ +struct acpi_processor_px temp_px; + +memcpy ((void *)&temp_px, a, size); +memcpy (a, b, size); +memcpy (b, (void *)&temp_px, size); +}static int acpi_processor_get_performance_states (struct acpi_processor *pr) {int result =0 ;
@@ -323,7 +343,10 @@ goto end; } } - +sort ((void *)(pr->performance->states), pr->performance->state_count, +sizeof (struct acpi_processor_px ), + pss_cmp_func, + pss_swap_func); end:kfree (buffer.pointer);