]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
[CPUFREQ] powernow-k8: read P-state from HW
authorNaga Chumbalkar <nagananda.chumbalkar@hp.com>
Thu, 11 Jun 2009 15:26:48 +0000 (15:26 +0000)
committerDave Jones <davej@redhat.com>
Mon, 15 Jun 2009 15:49:42 +0000 (11:49 -0400)
By definition, "cpuinfo_cur_freq" should report the value from HW. So, don't
depend on the cached value. Instead read P-state directly from HW, while
taking into account the erratum 311 workaround for Fam 11h processors.

Cc: Andreas Herrmann <andreas.herrmann3@amd.com>
Cc: Langsdorf, Mark <mark.langsdorf@amd.com>
Cc: Thomas Renninger <trenn@suse.de>
Signed-off-by: Naga Chumbalkar <nagananda.chumbalkar@hp.com>
Reviewed-by: Andreas Herrmann <andreas.herrmann3@amd.com>
Tested-by: Andreas Herrmann <andreas.herrmann3@amd.com>
Acked-by: Langsdorf, Mark <mark.langsdorf@amd.com>
Signed-off-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Dave Jones <davej@redhat.com>
arch/x86/kernel/cpu/cpufreq/powernow-k8.c

index 2709b3c183b40672f7588fd37a63f19d1feb28fd..331021112f2b684717791cad4be5caf70c7e6b93 100644 (file)
@@ -118,20 +118,17 @@ static int query_current_values_with_pending_wait(struct powernow_k8_data *data)
        u32 i = 0;
 
        if (cpu_family == CPU_HW_PSTATE) {
-               if (data->currpstate == HW_PSTATE_INVALID) {
-                       /* read (initial) hw pstate if not yet set */
-                       rdmsr(MSR_PSTATE_STATUS, lo, hi);
-                       i = lo & HW_PSTATE_MASK;
-
-                       /*
-                        * a workaround for family 11h erratum 311 might cause
-                        * an "out-of-range Pstate if the core is in Pstate-0
-                        */
-                       if (i >= data->numps)
-                               data->currpstate = HW_PSTATE_0;
-                       else
-                               data->currpstate = i;
-               }
+               rdmsr(MSR_PSTATE_STATUS, lo, hi);
+               i = lo & HW_PSTATE_MASK;
+               data->currpstate = i;
+
+               /*
+                * a workaround for family 11h erratum 311 might cause
+                * an "out-of-range Pstate if the core is in Pstate-0
+                */
+               if ((boot_cpu_data.x86 == 0x11) && (i >= data->numps))
+                       data->currpstate = HW_PSTATE_0;
+
                return 0;
        }
        do {