WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: xen-devel@xxxxxxxxxxxxxxxxxxx, ke.yu@xxxxxxxxx
Subject: [Xen-devel] [PATCH] [retry 4] 3/3 Add support for AMD MPERF/APERF
From: Mark Langsdorf <mark.langsdorf@xxxxxxx>
Date: Thu, 8 Apr 2010 12:52:04 -0500
Cc:
Delivery-date: Thu, 08 Apr 2010 10:57:03 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: KMail/1.12.4 (Linux/2.6.31-rc6-tip; KDE/4.3.5; x86_64; ; )
# 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

<Prev in Thread] Current Thread [Next in Thread>