mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 11:30:54 +07:00
CPUFREQ: powernow-k8: Try to detect old BIOS, not supporting CPU freq on a recent AMD CPUs.
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>
This commit is contained in:
parent
910dfae298
commit
2fd47094f9
@ -45,7 +45,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PFX "powernow-k8: "
|
#define PFX "powernow-k8: "
|
||||||
#define BFX PFX "BIOS error: "
|
|
||||||
#define VERSION "version 2.20.00"
|
#define VERSION "version 2.20.00"
|
||||||
#include "powernow-k8.h"
|
#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++) {
|
for (j = 0; j < data->numps; j++) {
|
||||||
if (pst[j].vid > LEAST_VID) {
|
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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (pst[j].vid < data->rvo) { /* vid + rvo >= 0 */
|
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;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (pst[j].vid < maxvid + data->rvo) { /* vid + rvo >= maxvid */
|
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;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (pst[j].fid > MAX_FID) {
|
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;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) {
|
if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) {
|
||||||
/* Only first fid is allowed to be in "low" range */
|
/* 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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (pst[j].fid < lastfid)
|
if (pst[j].fid < lastfid)
|
||||||
lastfid = pst[j].fid;
|
lastfid = pst[j].fid;
|
||||||
}
|
}
|
||||||
if (lastfid & 1) {
|
if (lastfid & 1) {
|
||||||
printk(KERN_ERR BFX "lastfid invalid\n");
|
printk(KERN_ERR FW_BUG PFX "lastfid invalid\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (lastfid > LO_FID_TABLE_TOP)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -672,13 +676,13 @@ static int find_psb_table(struct powernow_k8_data *data)
|
|||||||
|
|
||||||
dprintk("table vers: 0x%x\n", psb->tableversion);
|
dprintk("table vers: 0x%x\n", psb->tableversion);
|
||||||
if (psb->tableversion != PSB_VERSION_1_4) {
|
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;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
dprintk("flags: 0x%x\n", psb->flags1);
|
dprintk("flags: 0x%x\n", psb->flags1);
|
||||||
if (psb->flags1) {
|
if (psb->flags1) {
|
||||||
printk(KERN_ERR BFX "unknown flags\n");
|
printk(KERN_ERR FW_BUG PFX "unknown flags\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -705,7 +709,7 @@ static int find_psb_table(struct powernow_k8_data *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cpst != 1) {
|
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;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1130,17 +1134,19 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
|||||||
"ACPI Processor module before starting this "
|
"ACPI Processor module before starting this "
|
||||||
"driver.\n");
|
"driver.\n");
|
||||||
#else
|
#else
|
||||||
printk(KERN_ERR PFX "Your BIOS does not provide ACPI "
|
printk(KERN_ERR FW_BUG PFX "Your BIOS does not provide"
|
||||||
"_PSS objects in a way that Linux understands. "
|
" ACPI _PSS objects in a way that Linux "
|
||||||
"Please report this to the Linux ACPI maintainers"
|
"understands. Please report this to the Linux "
|
||||||
" and complain to your BIOS vendor.\n");
|
"ACPI maintainers and complain to your BIOS "
|
||||||
|
"vendor.\n");
|
||||||
#endif
|
#endif
|
||||||
kfree(data);
|
kfree(data);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (pol->cpu != 0) {
|
if (pol->cpu != 0) {
|
||||||
printk(KERN_ERR PFX "No ACPI _PSS objects for CPU other than "
|
printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for "
|
||||||
"CPU0. Complain to your BIOS vendor.\n");
|
"CPU other than CPU0. Complain to your BIOS "
|
||||||
|
"vendor.\n");
|
||||||
kfree(data);
|
kfree(data);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
@ -1193,7 +1199,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
|||||||
|
|
||||||
/* min/max the cpu is capable of */
|
/* min/max the cpu is capable of */
|
||||||
if (cpufreq_frequency_table_cpuinfo(pol, data->powernow_table)) {
|
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);
|
powernow_k8_cpu_exit_acpi(data);
|
||||||
kfree(data->powernow_table);
|
kfree(data->powernow_table);
|
||||||
kfree(data);
|
kfree(data);
|
||||||
|
Loading…
Reference in New Issue
Block a user