[CPUFREQ] speedstep-centrino should ignore upper performance control bits
authorGary Hade <garyhade@us.ibm.com>
Mon, 6 Nov 2006 23:39:23 +0000 (15:39 -0800)
committerDave Jones <davej@redhat.com>
Wed, 8 Nov 2006 22:14:30 +0000 (17:14 -0500)
On some systems such as the IBM x3650 there are bits set in the
upper half of the control values provided by the _PSS object.
These bits are only relevant for cpufreq drivers that use IO ports
which are not currently supported by the speedstep-centrino driver.
The current MSR oriented code assumes that upper bits are not set
and thus fails to work correctly when they are.  e.g. the control
and status value equality check fails even though the ACPI spec
allows the inequality.

Signed-off-by: Gary Hade <garyh@us.ibm.com>
Signed-off-by: Dave Jones <davej@redhat.com>
arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c

index d2d9caf00a2fdd47b429cda443b04296f4067438..e3fa03ab19ab5f65c9d2ae91118f119c2f99e57d 100644 (file)
@@ -463,6 +463,10 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
        }
 
        for (i=0; i<p->state_count; i++) {
+               /* clear high bits (set by some BIOSes) that are non-relevant and
+                  problematic for this driver's MSR only frequency transition code */
+               p->states[i].control &= 0xffff;
+
                if (p->states[i].control != p->states[i].status) {
                        dprintk("Different control (%llu) and status values (%llu)\n",
                                p->states[i].control, p->states[i].status);