mirror of https://gitee.com/openkylin/linux.git
Merge branch 'FW_BUG' into test
This commit is contained in:
commit
6b3c4f8b9c
|
@ -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);
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
|
||||
#include <asm/uaccess.h>
|
||||
#endif
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/processor.h>
|
||||
|
@ -334,7 +335,6 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr)
|
|||
acpi_status status = AE_OK;
|
||||
acpi_handle handle = NULL;
|
||||
|
||||
|
||||
if (!pr || !pr->performance || !pr->handle)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -347,13 +347,25 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr)
|
|||
|
||||
result = acpi_processor_get_performance_control(pr);
|
||||
if (result)
|
||||
return result;
|
||||
goto update_bios;
|
||||
|
||||
result = acpi_processor_get_performance_states(pr);
|
||||
if (result)
|
||||
return result;
|
||||
goto update_bios;
|
||||
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Having _PPC but missing frequencies (_PSS, _PCT) is a very good hint that
|
||||
* the BIOS is older than the CPU and does not know its frequencies
|
||||
*/
|
||||
update_bios:
|
||||
if (ACPI_SUCCESS(acpi_get_handle(pr->handle, "_PPC", &handle))){
|
||||
if(boot_cpu_has(X86_FEATURE_EST))
|
||||
printk(KERN_WARNING FW_BUG "BIOS needs update for CPU "
|
||||
"frequency support\n");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int acpi_processor_notify_smm(struct module *calling_module)
|
||||
|
|
|
@ -190,6 +190,30 @@ extern int kernel_text_address(unsigned long addr);
|
|||
struct pid;
|
||||
extern struct pid *session_of_pgrp(struct pid *pgrp);
|
||||
|
||||
/*
|
||||
* FW_BUG
|
||||
* Add this to a message where you are sure the firmware is buggy or behaves
|
||||
* really stupid or out of spec. Be aware that the responsible BIOS developer
|
||||
* should be able to fix this issue or at least get a concrete idea of the
|
||||
* problem by reading your message without the need of looking at the kernel
|
||||
* code.
|
||||
*
|
||||
* Use it for definite and high priority BIOS bugs.
|
||||
*
|
||||
* FW_WARN
|
||||
* Use it for not that clear (e.g. could the kernel messed up things already?)
|
||||
* and medium priority BIOS bugs.
|
||||
*
|
||||
* FW_INFO
|
||||
* Use this one if you want to tell the user or vendor about something
|
||||
* suspicious, but generally harmless related to the firmware.
|
||||
*
|
||||
* Use it for information or very low priority BIOS bugs.
|
||||
*/
|
||||
#define FW_BUG "[Firmware Bug]: "
|
||||
#define FW_WARN "[Firmware Warn]: "
|
||||
#define FW_INFO "[Firmware Info]: "
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
asmlinkage int vprintk(const char *fmt, va_list args)
|
||||
__attribute__ ((format (printf, 1, 0)));
|
||||
|
|
Loading…
Reference in New Issue