CPUFREQ: powernow-k8: Try to detect old BIOS, not supporting CPU freq on a recent...
authorThomas Renninger <trenn@suse.de>
Mon, 1 Sep 2008 12:27:03 +0000 (14:27 +0200)
committerLen Brown <len.brown@intel.com>
Mon, 22 Sep 2008 22:50:52 +0000 (18:50 -0400)
Make use of FW_BUG interface to give vendors and users the ability to
automatically check for powernow-k8 related BIOS bugs by:
dmesg |grep "Firmware Bug"

Signed-off-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
arch/x86/kernel/cpu/cpufreq/powernow-k8.c

index 84bb395..4e0c6ab 100644 (file)
@@ -45,7 +45,6 @@
 #endif
 
 #define PFX "powernow-k8: "
-#define BFX PFX "BIOS error: "
 #define VERSION "version 2.20.00"
 #include "powernow-k8.h"
 
@@ -536,35 +535,40 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8
 
        for (j = 0; j < data->numps; j++) {
                if (pst[j].vid > LEAST_VID) {
-                       printk(KERN_ERR PFX "vid %d invalid : 0x%x\n", j, pst[j].vid);
+                       printk(KERN_ERR FW_BUG PFX "vid %d invalid : 0x%x\n",
+                              j, pst[j].vid);
                        return -EINVAL;
                }
                if (pst[j].vid < data->rvo) {   /* vid + rvo >= 0 */
-                       printk(KERN_ERR BFX "0 vid exceeded with pstate %d\n", j);
+                       printk(KERN_ERR FW_BUG PFX "0 vid exceeded with pstate"
+                              " %d\n", j);
                        return -ENODEV;
                }
                if (pst[j].vid < maxvid + data->rvo) {  /* vid + rvo >= maxvid */
-                       printk(KERN_ERR BFX "maxvid exceeded with pstate %d\n", j);
+                       printk(KERN_ERR FW_BUG PFX "maxvid exceeded with pstate"
+                              " %d\n", j);
                        return -ENODEV;
                }
                if (pst[j].fid > MAX_FID) {
-                       printk(KERN_ERR BFX "maxfid exceeded with pstate %d\n", j);
+                       printk(KERN_ERR FW_BUG PFX "maxfid exceeded with pstate"
+                              " %d\n", j);
                        return -ENODEV;
                }
                if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) {
                        /* Only first fid is allowed to be in "low" range */
-                       printk(KERN_ERR BFX "two low fids - %d : 0x%x\n", j, pst[j].fid);
+                       printk(KERN_ERR FW_BUG PFX "two low fids - %d : "
+                              "0x%x\n", j, pst[j].fid);
                        return -EINVAL;
                }
                if (pst[j].fid < lastfid)
                        lastfid = pst[j].fid;
        }
        if (lastfid & 1) {
-               printk(KERN_ERR BFX "lastfid invalid\n");
+               printk(KERN_ERR FW_BUG PFX "lastfid invalid\n");
                return -EINVAL;
        }
        if (lastfid > LO_FID_TABLE_TOP)
-               printk(KERN_INFO BFX  "first fid not from lo freq table\n");
+               printk(KERN_INFO FW_BUG PFX  "first fid not from lo freq table\n");
 
        return 0;
 }
@@ -672,13 +676,13 @@ static int find_psb_table(struct powernow_k8_data *data)
 
                dprintk("table vers: 0x%x\n", psb->tableversion);
                if (psb->tableversion != PSB_VERSION_1_4) {
-                       printk(KERN_ERR BFX "PSB table is not v1.4\n");
+                       printk(KERN_ERR FW_BUG PFX "PSB table is not v1.4\n");
                        return -ENODEV;
                }
 
                dprintk("flags: 0x%x\n", psb->flags1);
                if (psb->flags1) {
-                       printk(KERN_ERR BFX "unknown flags\n");
+                       printk(KERN_ERR FW_BUG PFX "unknown flags\n");
                        return -ENODEV;
                }
 
@@ -705,7 +709,7 @@ static int find_psb_table(struct powernow_k8_data *data)
                        }
                }
                if (cpst != 1) {
-                       printk(KERN_ERR BFX "numpst must be 1\n");
+                       printk(KERN_ERR FW_BUG PFX "numpst must be 1\n");
                        return -ENODEV;
                }
 
@@ -1130,17 +1134,19 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
                               "ACPI Processor module before starting this "
                               "driver.\n");
 #else
-                       printk(KERN_ERR PFX "Your BIOS does not provide ACPI "
-                              "_PSS objects in a way that Linux understands. "
-                              "Please report this to the Linux ACPI maintainers"
-                              " and complain to your BIOS vendor.\n");
+                       printk(KERN_ERR FW_BUG PFX "Your BIOS does not provide"
+                              " ACPI _PSS objects in a way that Linux "
+                              "understands. Please report this to the Linux "
+                              "ACPI maintainers and complain to your BIOS "
+                              "vendor.\n");
 #endif
                        kfree(data);
                        return -ENODEV;
                }
                if (pol->cpu != 0) {
-                       printk(KERN_ERR PFX "No ACPI _PSS objects for CPU other than "
-                              "CPU0. Complain to your BIOS vendor.\n");
+                       printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for "
+                              "CPU other than CPU0. Complain to your BIOS "
+                              "vendor.\n");
                        kfree(data);
                        return -ENODEV;
                }
@@ -1193,7 +1199,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
 
        /* min/max the cpu is capable of */
        if (cpufreq_frequency_table_cpuinfo(pol, data->powernow_table)) {
-               printk(KERN_ERR PFX "invalid powernow_table\n");
+               printk(KERN_ERR FW_BUG PFX "invalid powernow_table\n");
                powernow_k8_cpu_exit_acpi(data);
                kfree(data->powernow_table);
                kfree(data);