3/3 Add support for AMD MPERF/APERF
PATCH 1/1 3/3 Add support for AMD MPERF/APERF
# HG changeset patch
# User [email protected]
# Date 1270782828 18000
# Node ID 8ac3bfb7382cf46831844050ba148cae7869f909
# Parent 5a13dbfb4b7d7d5514dd91708a0f4f96f9a50cbe Starting with Family 0x10, model 10 processors, some AMD processors will have support for the APERF/MPERF MSRs. This patch adds the checks necessary to support those MSRs.
It also makes the get_measured_perf function defined inside cpufreq.c driver independent. max_freq is taken from the policy definition instead of being a private argument in struct acpi_cpufreq_data. The struct member is entirely removed from the function since it is no longer used.
xen/arch/x86/acpi/cpufreq/cpufreq.c +2 -3
@@ -269,7 +269,7 @@* Only IA32_APERF/IA32_MPERF ratio is architecturally defined and * no meaning should be associated with absolute values of these MSRs. */ -static unsigned int get_measured_perf (unsigned int cpu,unsigned int flag) +unsigned int get_measured_perf (unsigned int cpu,unsigned int flag) {struct cpufreq_policy *policy;struct perf_pair readin, cur, *saved;
@@ -353,7 +353,7 @@#endif - retval = drv_data[policy->cpu]->max_freq * perf_percent /100 ; + retval = policy->cpuinfo.max_freq * perf_percent /100 ;return retval; }
@@ -582,7 +582,6 @@ policy->governor = cpufreq_opt_governor ? :CPUFREQ_DEFAULT_GOVERNOR ; - data->max_freq = perf->states[0 ].core_frequency *1000 ;/* table init */ for (i=0; i<perf->state_count; i++) { if (i>0 && perf->states[i].core_frequency >=
xen/arch/x86/acpi/cpufreq/powernow.c +7 -0
@@ -38,6 +38,7 @@#include <acpi/acpi.h> #include <acpi/cpufreq/cpufreq.h> +#define CPUID_6_ECX_APERFMPERF_CAPABILITY (0x1)#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007#define CPB_CAPABLE 0x00000200#define USE_HW_PSTATE 0x00000080
@@ -61,6 +62,8 @@static struct powernow_cpufreq_data *drv_data[NR_CPUS ]; +static struct cpufreq_driver powernow_cpufreq_driver; +struct drv_cmd {unsigned int type;cpumask_t mask;
@@ -249,6 +252,10 @@if (c->cpuid_level >=6 ) {unsigned int edx; +unsigned int ecx; + ecx =cpuid_ecx (6 ); +if (ecx &CPUID_6_ECX_APERFMPERF_CAPABILITY ) + powernow_cpufreq_driver.getavg = get_measured_perf; edx =cpuid_edx (CPUID_FREQ_VOLT_CAPABILITIES );if ((edx &CPB_CAPABLE ) ==CPB_CAPABLE ) { policy->turbo =CPUFREQ_TURBO_ENABLED ;
xen/include/acpi/cpufreq/cpufreq.h +0 -1
@@ -29,7 +29,6 @@struct acpi_cpufreq_data {struct processor_performance *acpi_data;struct cpufreq_frequency_table *freq_table; -unsigned int max_freq;unsigned int cpu_feature; };
xen/include/acpi/cpufreq/processor_perf.h +1 -0
@@ -9,6 +9,7 @@int get_cpu_id (u8 );int powernow_cpufreq_init (void );unsigned int powernow_register_driver (void ); +unsigned int get_measured_perf (unsigned int cpu,unsigned int flag);void cpufreq_residency_update (unsigned int ,uint8_t );void cpufreq_statistic_update (unsigned int ,uint8_t ,uint8_t );int cpufreq_statistic_init (unsigned int );
It looks fine to me.
Best Regards
Ke
-----Original Message-----
From: Mark Langsdorf [mailto:[email protected]]
Sent: Friday, April 09, 2010 1:52 AM
To: [email protected]; Yu, Ke
Subject: [PATCH] [retry 4] 3/3 Add support for AMD MPERF/APERF
# HG changeset patch
# User [email protected]
# Date 1270782828 18000
# Node ID 8ac3bfb7382cf46831844050ba148cae7869f909
# Parent 5a13dbfb4b7d7d5514dd91708a0f4f96f9a50cbe Starting with Family 0x10, model 10 processors, some AMD processors will have support for the APERF/MPERF MSRs. This patch adds the checks necessary to support those MSRs.
It also makes the get_measured_perf function defined inside cpufreq.c driver independent. max_freq is taken from the policy definition instead of being a private argument in struct acpi_cpufreq_data. The struct member is entirely removed from the function since it is no longer used.
xen/arch/x86/acpi/cpufreq/cpufreq.c +2 -3
@@ -269,7 +269,7 @@* Only IA32_APERF/IA32_MPERF ratio is architecturally defined and * no meaning should be associated with absolute values of these MSRs. */ -static unsigned int get_measured_perf (unsigned int cpu,unsigned int flag) +unsigned int get_measured_perf (unsigned int cpu,unsigned int flag) {struct cpufreq_policy *policy;struct perf_pair readin, cur, *saved;
@@ -353,7 +353,7 @@#endif - retval = drv_data[policy->cpu]->max_freq * perf_percent /100 ; + retval = policy->cpuinfo.max_freq * perf_percent /100 ;return retval; }
@@ -582,7 +582,6 @@ policy->governor = cpufreq_opt_governor ? :CPUFREQ_DEFAULT_GOVERNOR ; - data->max_freq = perf->states[0 ].core_frequency *1000 ;/* table init */ for (i=0; i<perf->state_count; i++) { if (i>0 && perf->states[i].core_frequency >=
xen/arch/x86/acpi/cpufreq/powernow.c +7 -0
@@ -38,6 +38,7 @@#include <acpi/acpi.h> #include <acpi/cpufreq/cpufreq.h> +#define CPUID_6_ECX_APERFMPERF_CAPABILITY (0x1)#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007#define CPB_CAPABLE 0x00000200#define USE_HW_PSTATE 0x00000080
@@ -61,6 +62,8 @@static struct powernow_cpufreq_data *drv_data[NR_CPUS ]; +static struct cpufreq_driver powernow_cpufreq_driver; +struct drv_cmd {unsigned int type;cpumask_t mask;
@@ -249,6 +252,10 @@if (c->cpuid_level >=6 ) {unsigned int edx; +unsigned int ecx; + ecx =cpuid_ecx (6 ); +if (ecx &CPUID_6_ECX_APERFMPERF_CAPABILITY ) + powernow_cpufreq_driver.getavg = get_measured_perf; edx =cpuid_edx (CPUID_FREQ_VOLT_CAPABILITIES );if ((edx &CPB_CAPABLE ) ==CPB_CAPABLE ) { policy->turbo =CPUFREQ_TURBO_ENABLED ;
xen/include/acpi/cpufreq/cpufreq.h +0 -1
@@ -29,7 +29,6 @@struct acpi_cpufreq_data {struct processor_performance *acpi_data;struct cpufreq_frequency_table *freq_table; -unsigned int max_freq;unsigned int cpu_feature; };
xen/include/acpi/cpufreq/processor_perf.h +1 -0
@@ -9,6 +9,7 @@int get_cpu_id (u8 );int powernow_cpufreq_init (void );unsigned int powernow_register_driver (void ); +unsigned int get_measured_perf (unsigned int cpu,unsigned int flag);void cpufreq_residency_update (unsigned int ,uint8_t );void cpufreq_statistic_update (unsigned int ,uint8_t ,uint8_t );int cpufreq_statistic_init (unsigned int );