[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] RE: [PATCH] [retry 4] 3/3 Add support for AMD MPERF/APERF



It looks fine to me.

Best Regards
Ke

-----Original Message-----
From: Mark Langsdorf [mailto:mark.langsdorf@xxxxxxx] 
Sent: Friday, April 09, 2010 1:52 AM
To: xen-devel@xxxxxxxxxxxxxxxxxxx; Yu, Ke
Subject: [PATCH] [retry 4] 3/3 Add support for AMD MPERF/APERF

# HG changeset patch
# User mark.langsdorf@xxxxxxx
# 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.

Signed-off-by: Mark Langsdorf <mark.langsdorf@xxxxxxx>

diff -r 5a13dbfb4b7d -r 8ac3bfb7382c xen/arch/x86/acpi/cpufreq/cpufreq.c
--- a/xen/arch/x86/acpi/cpufreq/cpufreq.c       Thu Apr 08 16:38:14 2010 -0500
+++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c       Thu Apr 08 22:13:48 2010 -0500
@@ -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 >=
diff -r 5a13dbfb4b7d -r 8ac3bfb7382c xen/arch/x86/acpi/cpufreq/powernow.c
--- a/xen/arch/x86/acpi/cpufreq/powernow.c      Thu Apr 08 16:38:14 2010 -0500
+++ b/xen/arch/x86/acpi/cpufreq/powernow.c      Thu Apr 08 22:13:48 2010 -0500
@@ -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;
diff -r 5a13dbfb4b7d -r 8ac3bfb7382c xen/include/acpi/cpufreq/cpufreq.h
--- a/xen/include/acpi/cpufreq/cpufreq.h        Thu Apr 08 16:38:14 2010 -0500
+++ b/xen/include/acpi/cpufreq/cpufreq.h        Thu Apr 08 22:13:48 2010 -0500
@@ -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;
 };
 
diff -r 5a13dbfb4b7d -r 8ac3bfb7382c xen/include/acpi/cpufreq/processor_perf.h
--- a/xen/include/acpi/cpufreq/processor_perf.h Thu Apr 08 16:38:14 2010 -0500
+++ b/xen/include/acpi/cpufreq/processor_perf.h Thu Apr 08 22:13:48 2010 -0500
@@ -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);


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.