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

[Xen-devel] [patch] make cpufreq with speedstep-centrino work under Xen



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

 


Rackspace

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