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] make cpufreq with speedstep-centrino work under Xen

To: Xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [patch] make cpufreq with speedstep-centrino work under Xen
From: Christian Krafft <parabelboi@xxxxxxxxxxxxxxx>
Date: Mon, 17 Apr 2006 18:27:18 +0200
Delivery-date: Mon, 17 Apr 2006 09:27:41 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
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/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla Thunderbird 1.0.7 (X11/20060301)
Hi,

The attached patch fixes the speedstep-centrino driver, to use the hypervisors MSR's instead of direct MSR access. Without the patch the frequency seems to have changed, but the powerconsumption of the CPU has not. Thanks to the patch of Matt T. Yourst found here http://lists.xensource.com/archives/html/xen-devel/2006-03/msg01410.html
It was easy to fix the centrino driver, too.

If someone could review the patch and bring it upsream (if it's ok), it would be very nice.

cheers,
ck
Subject: Make speedstep-centrino driver work under Xen

Signed-off-by: Christian Krafft <parabelboi@xxxxxxxxxxxxxxx>
---

Index: linux/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
===================================================================
--- linux.orig/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
+++ linux/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
@@ -41,6 +41,37 @@
 #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, 
"speedstep-centrino", msg)
 
 
+/* Xen support */
+
+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
+int xen_access_msr(u32 msr, int write, u32* out1, u32* out2, u32 in1, u32 in2) 
{
+       dom0_op_t op;
+       op.cmd = DOM0_MSR;
+       op.u.msr.write = write;
+       op.u.msr.cpu_mask = 1; /* only first CPU: not clear how to read 
multiple CPUs */
+       op.u.msr.msr = msr;
+       op.u.msr.in1 = in1;
+       op.u.msr.in2 = in2;
+       BUG_ON(HYPERVISOR_dom0_op(&op));
+
+       if (!write) {
+               *out1 = op.u.msr.out1; /* low 32 bits */
+               *out2 = op.u.msr.out2; /* high 32 bits */
+       }
+
+       return 0;
+}
+
+#define cpu_rdmsr(msr, val1, val2) xen_access_msr((msr), 0, &(val1), &(val2), 
0, 0)
+#define cpu_wrmsr(msr, val1, val2) xen_access_msr((msr), 1, NULL, NULL, 
(val1), (val2))
+
+#else
+
+#define cpu_rdmsr(msr, val1, val2) rdmsr(msr, val1, val2)
+#define cpu_wrmsr(msr, val1, val2) wrmsr(msr, val1, val2)
+
+#endif
+
 struct cpu_id
 {
        __u8    x86;            /* CPU family */
@@ -330,7 +361,7 @@ static unsigned int get_cur_freq(unsigne
        if (smp_processor_id() != cpu)
                return 0;
 
-       rdmsr(MSR_IA32_PERF_STATUS, l, h);
+       cpu_rdmsr(MSR_IA32_PERF_STATUS, l, h);
        clock_freq = extract_clock(l, cpu, 0);
 
        if (unlikely(clock_freq == 0)) {
@@ -340,7 +371,7 @@ static unsigned int get_cur_freq(unsigne
                 * P-state transition (like TM2). Get the last freq set 
                 * in PERF_CTL.
                 */
-               rdmsr(MSR_IA32_PERF_CTL, l, h);
+               cpu_rdmsr(MSR_IA32_PERF_CTL, l, h);
                clock_freq = extract_clock(l, cpu, 1);
        }
 
@@ -514,15 +545,15 @@ static int centrino_cpu_init(struct cpuf
 
        /* Check to see if Enhanced SpeedStep is enabled, and try to
           enable it if not. */
-       rdmsr(MSR_IA32_MISC_ENABLE, l, h);
+       cpu_rdmsr(MSR_IA32_MISC_ENABLE, l, h);
 
        if (!(l & (1<<16))) {
                l |= (1<<16);
                dprintk("trying to enable Enhanced SpeedStep (%x)\n", l);
-               wrmsr(MSR_IA32_MISC_ENABLE, l, h);
+               cpu_wrmsr(MSR_IA32_MISC_ENABLE, l, h);
 
                /* check to see if it stuck */
-               rdmsr(MSR_IA32_MISC_ENABLE, l, h);
+               cpu_rdmsr(MSR_IA32_MISC_ENABLE, l, h);
                if (!(l & (1<<16))) {
                        printk(KERN_INFO PFX "couldn't enable Enhanced 
SpeedStep\n");
                        return -ENODEV;
@@ -620,7 +651,7 @@ static int centrino_target (struct cpufr
        }
 
        msr = centrino_model[cpu]->op_points[newstate].index;
-       rdmsr(MSR_IA32_PERF_CTL, oldmsr, h);
+       cpu_rdmsr(MSR_IA32_PERF_CTL, oldmsr, h);
 
        if (msr == (oldmsr & 0xffff)) {
                retval = 0;
@@ -643,7 +674,7 @@ static int centrino_target (struct cpufr
        msr &= 0xffff;
        oldmsr |= msr;
 
-       wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);
+       cpu_wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);
 
        cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [patch] make cpufreq with speedstep-centrino work under Xen, Christian Krafft <=