All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] 3/3 [retry 1] Add support for AMD MPERF/APERF
@ 2010-03-29 18:28 Mark Langsdorf
  2010-03-30  9:16 ` Yu, Ke
  0 siblings, 1 reply; 2+ messages in thread
From: Mark Langsdorf @ 2010-03-29 18:28 UTC (permalink / raw)
  To: xen-devel, osrc-patches

# HG changeset patch
# User mark.langsdorf@amd.com
# Date 1269570377 18000
# Node ID 4009c47dfed487f0432b7cbe3b5bac2f805ada73
# Parent  d7401eeeac32a315aa9228d012dea2e78052120d
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.  The max_freq is passed to the function by the caller
instead of being taking from the acpi-cpufreq only drv_data structure.

This patch supersedes the patch "Add APERF/MPERF support for AMD processors"
I sent on March 1, 2010.

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

diff -r d7401eeeac32 -r 4009c47dfed4 xen/arch/x86/acpi/cpufreq/cpufreq.c
--- a/xen/arch/x86/acpi/cpufreq/cpufreq.c	Thu Mar 25 13:02:43 2010 -0500
+++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c	Thu Mar 25 21:26:17 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, unsigned 
int max_freq)
 {
     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 = max_freq * perf_percent / 100;
 
     return retval;
 }
diff -r d7401eeeac32 -r 4009c47dfed4 xen/arch/x86/acpi/cpufreq/powernow.c
--- a/xen/arch/x86/acpi/cpufreq/powernow.c	Thu Mar 25 13:02:43 2010 -0500
+++ b/xen/arch/x86/acpi/cpufreq/powernow.c	Thu Mar 25 21:26:17 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 = 1;
diff -r d7401eeeac32 -r 4009c47dfed4 xen/drivers/cpufreq/utility.c
--- a/xen/drivers/cpufreq/utility.c	Thu Mar 25 13:02:43 2010 -0500
+++ b/xen/drivers/cpufreq/utility.c	Thu Mar 25 21:26:17 2010 -0500
@@ -382,7 +382,8 @@
 
     if (cpufreq_driver->getavg)
     {
-        freq_avg = cpufreq_driver->getavg(cpu, flag);
+        freq_avg = cpufreq_driver->getavg(cpu, flag,
+                                         policy->cpuinfo.max_freq);
         if (freq_avg > 0)
             return freq_avg;
     }
diff -r d7401eeeac32 -r 4009c47dfed4 xen/include/acpi/cpufreq/cpufreq.h
--- a/xen/include/acpi/cpufreq/cpufreq.h	Thu Mar 25 13:02:43 2010 -0500
+++ b/xen/include/acpi/cpufreq/cpufreq.h	Thu Mar 25 21:26:17 2010 -0500
@@ -138,7 +138,8 @@
                      unsigned int target_freq,
                      unsigned int relation);
     unsigned int    (*get)(unsigned int cpu);
-    unsigned int    (*getavg)(unsigned int cpu, unsigned int flag);
+    unsigned int    (*getavg)(unsigned int cpu, unsigned int flag,
+                              unsigned int max_freq);
     int    (*exit)(struct cpufreq_policy *policy);
 };
 
diff -r d7401eeeac32 -r 4009c47dfed4 xen/include/acpi/cpufreq/processor_perf.h
--- a/xen/include/acpi/cpufreq/processor_perf.h	Thu Mar 25 13:02:43 2010 -0500
+++ b/xen/include/acpi/cpufreq/processor_perf.h	Thu Mar 25 21:26:17 2010 -0500
@@ -9,6 +9,8 @@
 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,
+                               unsigned int max_freq);
 
 void cpufreq_residency_update(unsigned int, uint8_t);
 void cpufreq_statistic_update(unsigned int, uint8_t, uint8_t);

-------------------------------------------------------

^ permalink raw reply	[flat|nested] 2+ messages in thread

* RE: [PATCH] 3/3 [retry 1] Add support for AMD MPERF/APERF
  2010-03-29 18:28 [PATCH] 3/3 [retry 1] Add support for AMD MPERF/APERF Mark Langsdorf
@ 2010-03-30  9:16 ` Yu, Ke
  0 siblings, 0 replies; 2+ messages in thread
From: Yu, Ke @ 2010-03-30  9:16 UTC (permalink / raw)
  To: Mark Langsdorf, xen-devel, osrc-patches

> -----Original Message-----
> From: xen-devel-bounces@lists.xensource.com [mailto:xen-devel-
> bounces@lists.xensource.com] On Behalf Of Mark Langsdorf
> Sent: Tuesday, March 30, 2010 2:29 AM
> To: xen-devel@lists.xensource.com; osrc-patches@elbe.amd.com
> Subject: [Xen-devel] [PATCH] 3/3 [retry 1] Add support for AMD
> MPERF/APERF
> 
> # HG changeset patch
> # User mark.langsdorf@amd.com
> # Date 1269570377 18000
> # Node ID 4009c47dfed487f0432b7cbe3b5bac2f805ada73
> # Parent  d7401eeeac32a315aa9228d012dea2e78052120d
> 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.  The max_freq is passed to the function by the caller
> instead of being taking from the acpi-cpufreq only drv_data structure.
> 
> This patch supersedes the patch "Add APERF/MPERF support for AMD
> processors"
> I sent on March 1, 2010.
> 
> Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
> 
> diff -r d7401eeeac32 -r 4009c47dfed4 xen/arch/x86/acpi/cpufreq/cpufreq.c
> --- a/xen/arch/x86/acpi/cpufreq/cpufreq.c	Thu Mar 25 13:02:43 2010 -0500
> +++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c	Thu Mar 25 21:26:17
> 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,
> unsigned
> int max_freq)
>  {
>      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 = max_freq * perf_percent / 100;
> 
>      return retval;
>  }

Changing the get_measured_perf interface definition looks not good idea.  Leaving interface unchanged and modifying the implementation is more reasonable to me, e.g. 

-    retval = drv_data[policy->cpu]->max_freq * perf_percent / 100;
+    retval = policy->cpuinfo.max_freq * perf_percent / 100;

Best Regards
Ke

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-03-30  9:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-29 18:28 [PATCH] 3/3 [retry 1] Add support for AMD MPERF/APERF Mark Langsdorf
2010-03-30  9:16 ` Yu, Ke

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.