Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
* master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq: [CPUFREQ] kzalloc conversion for gx-suspmod [CPUFREQ] Whitespace cleanup [CPUFREQ] Mark longhaul driver as broken. [PATCH] cpufreq: fix section mismatch warnings [CPUFREQ] Fix the p4-clockmod N60 errata workaround. [CPUFREQ] Fix handling for CPU hotplug [CPUFREQ] powernow-k8: Let cpufreq driver handle affected CPUs [CPUFREQ] Lots of whitespace & CodingStyle cleanup. [CPUFREQ] Remove duplicate cpuinfo struct [CPUFREQ] Silence powernow-k8 warning on k7's.
This commit is contained in:
@@ -96,7 +96,6 @@ config X86_POWERNOW_K8_ACPI
|
|||||||
|
|
||||||
config X86_GX_SUSPMOD
|
config X86_GX_SUSPMOD
|
||||||
tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
|
tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
|
||||||
depends on PCI
|
|
||||||
help
|
help
|
||||||
This add the CPUFreq driver for NatSemi Geode processors which
|
This add the CPUFreq driver for NatSemi Geode processors which
|
||||||
support suspend modulation.
|
support suspend modulation.
|
||||||
@@ -203,6 +202,7 @@ config X86_LONGRUN
|
|||||||
config X86_LONGHAUL
|
config X86_LONGHAUL
|
||||||
tristate "VIA Cyrix III Longhaul"
|
tristate "VIA Cyrix III Longhaul"
|
||||||
select CPU_FREQ_TABLE
|
select CPU_FREQ_TABLE
|
||||||
|
depends on BROKEN
|
||||||
help
|
help
|
||||||
This adds the CPUFreq driver for VIA Samuel/CyrixIII,
|
This adds the CPUFreq driver for VIA Samuel/CyrixIII,
|
||||||
VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T
|
VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T
|
||||||
|
@@ -57,7 +57,7 @@ MODULE_PARM_DESC(min_fsb,
|
|||||||
|
|
||||||
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "cpufreq-nforce2", msg)
|
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "cpufreq-nforce2", msg)
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* nforce2_calc_fsb - calculate FSB
|
* nforce2_calc_fsb - calculate FSB
|
||||||
* @pll: PLL value
|
* @pll: PLL value
|
||||||
*
|
*
|
||||||
@@ -76,7 +76,7 @@ static int nforce2_calc_fsb(int pll)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* nforce2_calc_pll - calculate PLL value
|
* nforce2_calc_pll - calculate PLL value
|
||||||
* @fsb: FSB
|
* @fsb: FSB
|
||||||
*
|
*
|
||||||
@@ -106,7 +106,7 @@ static int nforce2_calc_pll(unsigned int fsb)
|
|||||||
return NFORCE2_PLL(mul, div);
|
return NFORCE2_PLL(mul, div);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* nforce2_write_pll - write PLL value to chipset
|
* nforce2_write_pll - write PLL value to chipset
|
||||||
* @pll: PLL value
|
* @pll: PLL value
|
||||||
*
|
*
|
||||||
@@ -121,15 +121,13 @@ static void nforce2_write_pll(int pll)
|
|||||||
pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLADR, temp);
|
pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLADR, temp);
|
||||||
|
|
||||||
/* Now write the value in all 64 registers */
|
/* Now write the value in all 64 registers */
|
||||||
for (temp = 0; temp <= 0x3f; temp++) {
|
for (temp = 0; temp <= 0x3f; temp++)
|
||||||
pci_write_config_dword(nforce2_chipset_dev,
|
pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLREG, pll);
|
||||||
NFORCE2_PLLREG, pll);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* nforce2_fsb_read - Read FSB
|
* nforce2_fsb_read - Read FSB
|
||||||
*
|
*
|
||||||
* Read FSB from chipset
|
* Read FSB from chipset
|
||||||
@@ -140,14 +138,9 @@ static unsigned int nforce2_fsb_read(int bootfsb)
|
|||||||
struct pci_dev *nforce2_sub5;
|
struct pci_dev *nforce2_sub5;
|
||||||
u32 fsb, temp = 0;
|
u32 fsb, temp = 0;
|
||||||
|
|
||||||
|
|
||||||
/* Get chipset boot FSB from subdevice 5 (FSB at boot-time) */
|
/* Get chipset boot FSB from subdevice 5 (FSB at boot-time) */
|
||||||
nforce2_sub5 = pci_get_subsys(PCI_VENDOR_ID_NVIDIA,
|
nforce2_sub5 = pci_get_subsys(PCI_VENDOR_ID_NVIDIA,
|
||||||
0x01EF,
|
0x01EF,PCI_ANY_ID,PCI_ANY_ID,NULL);
|
||||||
PCI_ANY_ID,
|
|
||||||
PCI_ANY_ID,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (!nforce2_sub5)
|
if (!nforce2_sub5)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -155,21 +148,19 @@ static unsigned int nforce2_fsb_read(int bootfsb)
|
|||||||
fsb /= 1000000;
|
fsb /= 1000000;
|
||||||
|
|
||||||
/* Check if PLL register is already set */
|
/* Check if PLL register is already set */
|
||||||
pci_read_config_byte(nforce2_chipset_dev,
|
pci_read_config_byte(nforce2_chipset_dev,NFORCE2_PLLENABLE, (u8 *)&temp);
|
||||||
NFORCE2_PLLENABLE, (u8 *)&temp);
|
|
||||||
|
|
||||||
if(bootfsb || !temp)
|
if(bootfsb || !temp)
|
||||||
return fsb;
|
return fsb;
|
||||||
|
|
||||||
/* Use PLL register FSB value */
|
/* Use PLL register FSB value */
|
||||||
pci_read_config_dword(nforce2_chipset_dev,
|
pci_read_config_dword(nforce2_chipset_dev,NFORCE2_PLLREG, &temp);
|
||||||
NFORCE2_PLLREG, &temp);
|
|
||||||
fsb = nforce2_calc_fsb(temp);
|
fsb = nforce2_calc_fsb(temp);
|
||||||
|
|
||||||
return fsb;
|
return fsb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* nforce2_set_fsb - set new FSB
|
* nforce2_set_fsb - set new FSB
|
||||||
* @fsb: New FSB
|
* @fsb: New FSB
|
||||||
*
|
*
|
||||||
@@ -194,8 +185,7 @@ static int nforce2_set_fsb(unsigned int fsb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* First write? Then set actual value */
|
/* First write? Then set actual value */
|
||||||
pci_read_config_byte(nforce2_chipset_dev,
|
pci_read_config_byte(nforce2_chipset_dev,NFORCE2_PLLENABLE, (u8 *)&temp);
|
||||||
NFORCE2_PLLENABLE, (u8 *)&temp);
|
|
||||||
if (!temp) {
|
if (!temp) {
|
||||||
pll = nforce2_calc_pll(tfsb);
|
pll = nforce2_calc_pll(tfsb);
|
||||||
|
|
||||||
@@ -406,9 +396,7 @@ static unsigned int nforce2_detect_chipset(void)
|
|||||||
|
|
||||||
nforce2_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_NVIDIA,
|
nforce2_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_NVIDIA,
|
||||||
PCI_DEVICE_ID_NVIDIA_NFORCE2,
|
PCI_DEVICE_ID_NVIDIA_NFORCE2,
|
||||||
PCI_ANY_ID,
|
PCI_ANY_ID, PCI_ANY_ID, NULL);
|
||||||
PCI_ANY_ID,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (nforce2_chipset_dev == NULL)
|
if (nforce2_chipset_dev == NULL)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@@ -86,16 +86,16 @@ static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu)
|
|||||||
clockspeed_reg = inb_p(REG_CSCDR);
|
clockspeed_reg = inb_p(REG_CSCDR);
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
if ((clockspeed_reg & 0xE0) == 0xE0) { return 0; }
|
if ((clockspeed_reg & 0xE0) == 0xE0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Are we in CPU clock multiplied mode (66/99 MHz)? */
|
/* Are we in CPU clock multiplied mode (66/99 MHz)? */
|
||||||
if ((clockspeed_reg & 0xE0) == 0xC0) {
|
if ((clockspeed_reg & 0xE0) == 0xC0) {
|
||||||
if ((clockspeed_reg & 0x01) == 0) {
|
if ((clockspeed_reg & 0x01) == 0)
|
||||||
return 66000;
|
return 66000;
|
||||||
} else {
|
else
|
||||||
return 99000;
|
return 99000;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* 33 MHz is not 32 MHz... */
|
/* 33 MHz is not 32 MHz... */
|
||||||
if ((clockspeed_reg & 0xE0)==0xA0)
|
if ((clockspeed_reg & 0xE0)==0xA0)
|
||||||
@@ -117,8 +117,8 @@ static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu)
|
|||||||
* There is no return value.
|
* There is no return value.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void elanfreq_set_cpu_state (unsigned int state) {
|
static void elanfreq_set_cpu_state (unsigned int state)
|
||||||
|
{
|
||||||
struct cpufreq_freqs freqs;
|
struct cpufreq_freqs freqs;
|
||||||
|
|
||||||
freqs.old = elanfreq_get_cpu_frequency(0);
|
freqs.old = elanfreq_get_cpu_frequency(0);
|
||||||
@@ -127,7 +127,8 @@ static void elanfreq_set_cpu_state (unsigned int state) {
|
|||||||
|
|
||||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||||
|
|
||||||
printk(KERN_INFO "elanfreq: attempting to set frequency to %i kHz\n",elan_multiplier[state].clock);
|
printk(KERN_INFO "elanfreq: attempting to set frequency to %i kHz\n",
|
||||||
|
elan_multiplier[state].clock);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -227,7 +228,6 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy)
|
|||||||
return (result);
|
return (result);
|
||||||
|
|
||||||
cpufreq_frequency_table_get_attr(elanfreq_table, policy->cpu);
|
cpufreq_frequency_table_get_attr(elanfreq_table, policy->cpu);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,12 +285,10 @@ static int __init elanfreq_init(void)
|
|||||||
|
|
||||||
/* Test if we have the right hardware */
|
/* Test if we have the right hardware */
|
||||||
if ((c->x86_vendor != X86_VENDOR_AMD) ||
|
if ((c->x86_vendor != X86_VENDOR_AMD) ||
|
||||||
(c->x86 != 4) || (c->x86_model!=10))
|
(c->x86 != 4) || (c->x86_model!=10)) {
|
||||||
{
|
|
||||||
printk(KERN_INFO "elanfreq: error: no Elan processor found!\n");
|
printk(KERN_INFO "elanfreq: error: no Elan processor found!\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cpufreq_register_driver(&elanfreq_driver);
|
return cpufreq_register_driver(&elanfreq_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,4 +307,3 @@ MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs");
|
|||||||
|
|
||||||
module_init(elanfreq_init);
|
module_init(elanfreq_init);
|
||||||
module_exit(elanfreq_exit);
|
module_exit(elanfreq_exit);
|
||||||
|
|
||||||
|
@@ -190,10 +190,9 @@ static __init struct pci_dev *gx_detect_chipset(void)
|
|||||||
|
|
||||||
/* detect which companion chip is used */
|
/* detect which companion chip is used */
|
||||||
while ((gx_pci = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, gx_pci)) != NULL) {
|
while ((gx_pci = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, gx_pci)) != NULL) {
|
||||||
if ((pci_match_id(gx_chipset_tbl, gx_pci)) != NULL) {
|
if ((pci_match_id(gx_chipset_tbl, gx_pci)) != NULL)
|
||||||
return gx_pci;
|
return gx_pci;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
dprintk("error: no supported chipset found!\n");
|
dprintk("error: no supported chipset found!\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -217,7 +216,7 @@ static unsigned int gx_get_cpuspeed(unsigned int cpu)
|
|||||||
* gx_validate_speed:
|
* gx_validate_speed:
|
||||||
* determine current cpu speed
|
* determine current cpu speed
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off_duration)
|
static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off_duration)
|
||||||
{
|
{
|
||||||
@@ -258,7 +257,6 @@ static void gx_set_cpuspeed(unsigned int khz)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct cpufreq_freqs freqs;
|
struct cpufreq_freqs freqs;
|
||||||
|
|
||||||
|
|
||||||
freqs.cpu = 0;
|
freqs.cpu = 0;
|
||||||
freqs.old = gx_get_cpuspeed(0);
|
freqs.old = gx_get_cpuspeed(0);
|
||||||
|
|
||||||
@@ -461,10 +459,9 @@ static int __init cpufreq_gx_init(void)
|
|||||||
|
|
||||||
dprintk("geode suspend modulation available.\n");
|
dprintk("geode suspend modulation available.\n");
|
||||||
|
|
||||||
params = kmalloc(sizeof(struct gxfreq_params), GFP_KERNEL);
|
params = kzalloc(sizeof(struct gxfreq_params), GFP_KERNEL);
|
||||||
if (params == NULL)
|
if (params == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
memset(params, 0, sizeof(struct gxfreq_params));
|
|
||||||
|
|
||||||
params->cs55x0 = gx_pci;
|
params->cs55x0 = gx_pci;
|
||||||
gx_params = params;
|
gx_params = params;
|
||||||
|
@@ -244,7 +244,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
|
|||||||
for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
||||||
if ((i<2) && (has_N44_O17_errata[policy->cpu]))
|
if ((i<2) && (has_N44_O17_errata[policy->cpu]))
|
||||||
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||||
else if (has_N60_errata[policy->cpu] && p4clockmod_table[i].frequency < 2000000)
|
else if (has_N60_errata[policy->cpu] && ((stock_freq * i)/8) < 2000000)
|
||||||
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||||
else
|
else
|
||||||
p4clockmod_table[i].frequency = (stock_freq * i)/8;
|
p4clockmod_table[i].frequency = (stock_freq * i)/8;
|
||||||
|
@@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
#define PFX "powernow-k8: "
|
#define PFX "powernow-k8: "
|
||||||
#define BFX PFX "BIOS error: "
|
#define BFX PFX "BIOS error: "
|
||||||
#define VERSION "version 1.60.0"
|
#define VERSION "version 1.60.1"
|
||||||
#include "powernow-k8.h"
|
#include "powernow-k8.h"
|
||||||
|
|
||||||
/* serialize freq changes */
|
/* serialize freq changes */
|
||||||
@@ -83,11 +83,10 @@ static u32 find_millivolts_from_vid(struct powernow_k8_data *data, u32 vid)
|
|||||||
*/
|
*/
|
||||||
static u32 convert_fid_to_vco_fid(u32 fid)
|
static u32 convert_fid_to_vco_fid(u32 fid)
|
||||||
{
|
{
|
||||||
if (fid < HI_FID_TABLE_BOTTOM) {
|
if (fid < HI_FID_TABLE_BOTTOM)
|
||||||
return 8 + (2 * fid);
|
return 8 + (2 * fid);
|
||||||
} else {
|
else
|
||||||
return fid;
|
return fid;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -474,8 +473,10 @@ static int check_supported_cpu(unsigned int cpu)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
|
eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
|
||||||
|
if ((eax & CPUID_XFAM) != CPUID_XFAM_K8)
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
|
if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
|
||||||
((eax & CPUID_XFAM) != CPUID_XFAM_K8) ||
|
|
||||||
((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) {
|
((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) {
|
||||||
printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax);
|
printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax);
|
||||||
goto out;
|
goto out;
|
||||||
@@ -780,9 +781,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
|||||||
/* verify only 1 entry from the lo frequency table */
|
/* verify only 1 entry from the lo frequency table */
|
||||||
if (fid < HI_FID_TABLE_BOTTOM) {
|
if (fid < HI_FID_TABLE_BOTTOM) {
|
||||||
if (cntlofreq) {
|
if (cntlofreq) {
|
||||||
/* if both entries are the same, ignore this
|
/* if both entries are the same, ignore this one ... */
|
||||||
* one...
|
|
||||||
*/
|
|
||||||
if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) ||
|
if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) ||
|
||||||
(powernow_table[i].index != powernow_table[cntlofreq].index)) {
|
(powernow_table[i].index != powernow_table[cntlofreq].index)) {
|
||||||
printk(KERN_ERR PFX "Too many lo freq table entries\n");
|
printk(KERN_ERR PFX "Too many lo freq table entries\n");
|
||||||
@@ -909,7 +908,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
|
|||||||
u32 checkvid = data->currvid;
|
u32 checkvid = data->currvid;
|
||||||
unsigned int newstate;
|
unsigned int newstate;
|
||||||
int ret = -EIO;
|
int ret = -EIO;
|
||||||
int i;
|
|
||||||
|
|
||||||
/* only run on specific CPU from here on */
|
/* only run on specific CPU from here on */
|
||||||
oldmask = current->cpus_allowed;
|
oldmask = current->cpus_allowed;
|
||||||
@@ -955,12 +953,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
|
|||||||
up(&fidvid_sem);
|
up(&fidvid_sem);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update all the fid/vids of our siblings */
|
|
||||||
for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
|
|
||||||
powernow_data[i]->currvid = data->currvid;
|
|
||||||
powernow_data[i]->currfid = data->currfid;
|
|
||||||
}
|
|
||||||
up(&fidvid_sem);
|
up(&fidvid_sem);
|
||||||
|
|
||||||
pol->cur = find_khz_freq_from_fid(data->currfid);
|
pol->cur = find_khz_freq_from_fid(data->currfid);
|
||||||
@@ -984,7 +976,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
|||||||
{
|
{
|
||||||
struct powernow_k8_data *data;
|
struct powernow_k8_data *data;
|
||||||
cpumask_t oldmask = CPU_MASK_ALL;
|
cpumask_t oldmask = CPU_MASK_ALL;
|
||||||
int rc, i;
|
int rc;
|
||||||
|
|
||||||
if (!cpu_online(pol->cpu))
|
if (!cpu_online(pol->cpu))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
@@ -1070,9 +1062,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
|||||||
printk("cpu_init done, current fid 0x%x, vid 0x%x\n",
|
printk("cpu_init done, current fid 0x%x, vid 0x%x\n",
|
||||||
data->currfid, data->currvid);
|
data->currfid, data->currvid);
|
||||||
|
|
||||||
for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
|
powernow_data[pol->cpu] = data;
|
||||||
powernow_data[i] = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@@ -479,15 +479,13 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
|
|||||||
unsigned l, h;
|
unsigned l, h;
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
|
|
||||||
|
|
||||||
/* Only Intel makes Enhanced Speedstep-capable CPUs */
|
/* Only Intel makes Enhanced Speedstep-capable CPUs */
|
||||||
if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST))
|
if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) {
|
if (cpu_has(cpu, X86_FEATURE_CONSTANT_TSC))
|
||||||
centrino_driver.flags |= CPUFREQ_CONST_LOOPS;
|
centrino_driver.flags |= CPUFREQ_CONST_LOOPS;
|
||||||
}
|
|
||||||
|
|
||||||
if (centrino_cpu_init_acpi(policy)) {
|
if (centrino_cpu_init_acpi(policy)) {
|
||||||
if (policy->cpu != 0)
|
if (policy->cpu != 0)
|
||||||
|
@@ -264,8 +264,7 @@ unsigned int speedstep_detect_processor (void)
|
|||||||
|
|
||||||
switch (c->x86_model) {
|
switch (c->x86_model) {
|
||||||
case 0x0B: /* Intel PIII [Tualatin] */
|
case 0x0B: /* Intel PIII [Tualatin] */
|
||||||
/* cpuid_ebx(1) is 0x04 for desktop PIII,
|
/* cpuid_ebx(1) is 0x04 for desktop PIII, 0x06 for mobile PIII-M */
|
||||||
0x06 for mobile PIII-M */
|
|
||||||
ebx = cpuid_ebx(0x00000001);
|
ebx = cpuid_ebx(0x00000001);
|
||||||
dprintk("ebx is %x\n", ebx);
|
dprintk("ebx is %x\n", ebx);
|
||||||
|
|
||||||
@@ -277,7 +276,6 @@ unsigned int speedstep_detect_processor (void)
|
|||||||
/* So far all PIII-M processors support SpeedStep. See
|
/* So far all PIII-M processors support SpeedStep. See
|
||||||
* Intel's 24540640.pdf of June 2003
|
* Intel's 24540640.pdf of June 2003
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return SPEEDSTEP_PROCESSOR_PIII_T;
|
return SPEEDSTEP_PROCESSOR_PIII_T;
|
||||||
|
|
||||||
case 0x08: /* Intel PIII [Coppermine] */
|
case 0x08: /* Intel PIII [Coppermine] */
|
||||||
@@ -399,7 +397,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
@@ -375,7 +375,6 @@ static int __init speedstep_init(void)
|
|||||||
dprintk("signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.\n",
|
dprintk("signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.\n",
|
||||||
ist_info.signature, ist_info.command, ist_info.event, ist_info.perf_level);
|
ist_info.signature, ist_info.command, ist_info.event, ist_info.perf_level);
|
||||||
|
|
||||||
|
|
||||||
/* Error if no IST-SMI BIOS or no PARM
|
/* Error if no IST-SMI BIOS or no PARM
|
||||||
sig= 'ISGE' aka 'Intel Speedstep Gate E' */
|
sig= 'ISGE' aka 'Intel Speedstep Gate E' */
|
||||||
if ((ist_info.signature != 0x47534943) && (
|
if ((ist_info.signature != 0x47534943) && (
|
||||||
@@ -388,17 +387,15 @@ static int __init speedstep_init(void)
|
|||||||
smi_sig = ist_info.signature;
|
smi_sig = ist_info.signature;
|
||||||
|
|
||||||
/* setup smi_port from MODLULE_PARM or BIOS */
|
/* setup smi_port from MODLULE_PARM or BIOS */
|
||||||
if ((smi_port > 0xff) || (smi_port < 0)) {
|
if ((smi_port > 0xff) || (smi_port < 0))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
} else if (smi_port == 0) {
|
else if (smi_port == 0)
|
||||||
smi_port = ist_info.command & 0xff;
|
smi_port = ist_info.command & 0xff;
|
||||||
}
|
|
||||||
|
|
||||||
if ((smi_cmd > 0xff) || (smi_cmd < 0)) {
|
if ((smi_cmd > 0xff) || (smi_cmd < 0))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
} else if (smi_cmd == 0) {
|
else if (smi_cmd == 0)
|
||||||
smi_cmd = (ist_info.command >> 16) & 0xff;
|
smi_cmd = (ist_info.command >> 16) & 0xff;
|
||||||
}
|
|
||||||
|
|
||||||
return cpufreq_register_driver(&speedstep_driver);
|
return cpufreq_register_driver(&speedstep_driver);
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,8 @@
|
|||||||
*
|
*
|
||||||
* Oct 2005 - Ashok Raj <ashok.raj@intel.com>
|
* Oct 2005 - Ashok Raj <ashok.raj@intel.com>
|
||||||
* Added handling for CPU hotplug
|
* Added handling for CPU hotplug
|
||||||
|
* Feb 2006 - Jacob Shin <jacob.shin@amd.com>
|
||||||
|
* Fix handling for CPU hotplug -- affected CPUs
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
@@ -573,8 +575,12 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
|||||||
struct cpufreq_policy new_policy;
|
struct cpufreq_policy new_policy;
|
||||||
struct cpufreq_policy *policy;
|
struct cpufreq_policy *policy;
|
||||||
struct freq_attr **drv_attr;
|
struct freq_attr **drv_attr;
|
||||||
|
struct sys_device *cpu_sys_dev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
struct cpufreq_policy *managed_policy;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (cpu_is_offline(cpu))
|
if (cpu_is_offline(cpu))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -587,8 +593,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
|||||||
* CPU because it is in the same boat. */
|
* CPU because it is in the same boat. */
|
||||||
policy = cpufreq_cpu_get(cpu);
|
policy = cpufreq_cpu_get(cpu);
|
||||||
if (unlikely(policy)) {
|
if (unlikely(policy)) {
|
||||||
dprintk("CPU already managed, adding link\n");
|
cpufreq_cpu_put(policy);
|
||||||
sysfs_create_link(&sys_dev->kobj, &policy->kobj, "cpufreq");
|
|
||||||
cpufreq_debug_enable_ratelimit();
|
cpufreq_debug_enable_ratelimit();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -623,6 +628,32 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
|||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
for_each_cpu_mask(j, policy->cpus) {
|
||||||
|
if (cpu == j)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* check for existing affected CPUs. They may not be aware
|
||||||
|
* of it due to CPU Hotplug.
|
||||||
|
*/
|
||||||
|
managed_policy = cpufreq_cpu_get(j);
|
||||||
|
if (unlikely(managed_policy)) {
|
||||||
|
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||||
|
managed_policy->cpus = policy->cpus;
|
||||||
|
cpufreq_cpu_data[cpu] = managed_policy;
|
||||||
|
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||||
|
|
||||||
|
dprintk("CPU already managed, adding link\n");
|
||||||
|
sysfs_create_link(&sys_dev->kobj,
|
||||||
|
&managed_policy->kobj, "cpufreq");
|
||||||
|
|
||||||
|
cpufreq_debug_enable_ratelimit();
|
||||||
|
mutex_unlock(&policy->lock);
|
||||||
|
ret = 0;
|
||||||
|
goto err_out_driver_exit; /* call driver->exit() */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
|
memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
|
||||||
|
|
||||||
/* prepare interface data */
|
/* prepare interface data */
|
||||||
@@ -650,6 +681,21 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
|||||||
for_each_cpu_mask(j, policy->cpus)
|
for_each_cpu_mask(j, policy->cpus)
|
||||||
cpufreq_cpu_data[j] = policy;
|
cpufreq_cpu_data[j] = policy;
|
||||||
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||||
|
|
||||||
|
/* symlink affected CPUs */
|
||||||
|
for_each_cpu_mask(j, policy->cpus) {
|
||||||
|
if (j == cpu)
|
||||||
|
continue;
|
||||||
|
if (!cpu_online(j))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dprintk("CPU already managed, adding link\n");
|
||||||
|
cpufreq_cpu_get(cpu);
|
||||||
|
cpu_sys_dev = get_cpu_sysdev(j);
|
||||||
|
sysfs_create_link(&cpu_sys_dev->kobj, &policy->kobj,
|
||||||
|
"cpufreq");
|
||||||
|
}
|
||||||
|
|
||||||
policy->governor = NULL; /* to assure that the starting sequence is
|
policy->governor = NULL; /* to assure that the starting sequence is
|
||||||
* run in cpufreq_set_policy */
|
* run in cpufreq_set_policy */
|
||||||
mutex_unlock(&policy->lock);
|
mutex_unlock(&policy->lock);
|
||||||
@@ -728,6 +774,7 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
|
|||||||
*/
|
*/
|
||||||
if (unlikely(cpu != data->cpu)) {
|
if (unlikely(cpu != data->cpu)) {
|
||||||
dprintk("removing link\n");
|
dprintk("removing link\n");
|
||||||
|
cpu_clear(cpu, data->cpus);
|
||||||
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||||
sysfs_remove_link(&sys_dev->kobj, "cpufreq");
|
sysfs_remove_link(&sys_dev->kobj, "cpufreq");
|
||||||
cpufreq_cpu_put(data);
|
cpufreq_cpu_put(data);
|
||||||
|
@@ -303,7 +303,7 @@ cpufreq_stat_notifier_trans (struct notifier_block *nb, unsigned long val,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __cpuinit cpufreq_stat_cpu_callback(struct notifier_block *nfb,
|
static int cpufreq_stat_cpu_callback(struct notifier_block *nfb,
|
||||||
unsigned long action, void *hcpu)
|
unsigned long action, void *hcpu)
|
||||||
{
|
{
|
||||||
unsigned int cpu = (unsigned long)hcpu;
|
unsigned int cpu = (unsigned long)hcpu;
|
||||||
|
@@ -60,8 +60,7 @@ int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
cpufreq_verify_within_limits(policy,
|
cpufreq_verify_within_limits(policy,
|
||||||
policy->cpuinfo.min_freq,
|
policy->cpuinfo.min_freq, policy->cpuinfo.max_freq);
|
||||||
policy->cpuinfo.max_freq);
|
|
||||||
|
|
||||||
for (i=0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
for (i=0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
||||||
unsigned int freq = table[i].frequency;
|
unsigned int freq = table[i].frequency;
|
||||||
@@ -77,8 +76,7 @@ int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
|
|||||||
policy->max = next_larger;
|
policy->max = next_larger;
|
||||||
|
|
||||||
cpufreq_verify_within_limits(policy,
|
cpufreq_verify_within_limits(policy,
|
||||||
policy->cpuinfo.min_freq,
|
policy->cpuinfo.min_freq, policy->cpuinfo.max_freq);
|
||||||
policy->cpuinfo.max_freq);
|
|
||||||
|
|
||||||
dprintk("verification lead to (%u - %u kHz) for cpu %u\n", policy->min, policy->max, policy->cpu);
|
dprintk("verification lead to (%u - %u kHz) for cpu %u\n", policy->min, policy->max, policy->cpu);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user