Loading arch/x86/kernel/cpu/cpufreq/powernow-k8.c +24 −18 Original line number Diff line number Diff line Loading @@ -45,7 +45,6 @@ #endif #define PFX "powernow-k8: " #define BFX PFX "BIOS error: " #define VERSION "version 2.20.00" #include "powernow-k8.h" Loading Loading @@ -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; } Loading Loading @@ -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; } Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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); Loading drivers/acpi/processor_perflib.c +15 −3 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include <asm/uaccess.h> #endif #include <asm/cpufeature.h> #include <acpi/acpi_bus.h> #include <acpi/processor.h> Loading Loading @@ -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; Loading @@ -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) Loading include/linux/kernel.h +24 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
arch/x86/kernel/cpu/cpufreq/powernow-k8.c +24 −18 Original line number Diff line number Diff line Loading @@ -45,7 +45,6 @@ #endif #define PFX "powernow-k8: " #define BFX PFX "BIOS error: " #define VERSION "version 2.20.00" #include "powernow-k8.h" Loading Loading @@ -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; } Loading Loading @@ -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; } Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -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); Loading
drivers/acpi/processor_perflib.c +15 −3 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include <asm/uaccess.h> #endif #include <asm/cpufeature.h> #include <acpi/acpi_bus.h> #include <acpi/processor.h> Loading Loading @@ -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; Loading @@ -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) Loading
include/linux/kernel.h +24 −0 Original line number Diff line number Diff line Loading @@ -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