Commit 308f5c73 authored by Dave Jones's avatar Dave Jones

Merge bk://linux-dj.bkbits.net/cpufreq

into delerium.codemonkey.org.uk:/mnt/data/src/bk/cpufreq
parents 20e743bb 5a9e6dcf
...@@ -75,7 +75,6 @@ ...@@ -75,7 +75,6 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/sched.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
......
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -30,25 +31,25 @@ ...@@ -30,25 +31,25 @@
#include "longhaul.h" #include "longhaul.h"
#define DEBUG
#ifdef DEBUG
#define dprintk(msg...) printk(msg)
#else
#define dprintk(msg...) do { } while(0)
#endif
#define PFX "longhaul: " #define PFX "longhaul: "
static unsigned int numscales=16, numvscales; static unsigned int numscales=16, numvscales;
static unsigned int fsb;
static int minvid, maxvid; static int minvid, maxvid;
static int can_scale_voltage; static int can_scale_voltage;
static int vrmrev; static int vrmrev;
/* Module parameters */ /* Module parameters */
static int dont_scale_voltage; static int dont_scale_voltage;
static unsigned int fsb; static int debug;
static int debug;
static void dprintk(const char *msg, ...)
{
if (debug == 1)
printk(msg);
}
#define __hlt() __asm__ __volatile__("hlt": : :"memory") #define __hlt() __asm__ __volatile__("hlt": : :"memory")
...@@ -78,11 +79,7 @@ static int longhaul_get_cpu_mult (void) ...@@ -78,11 +79,7 @@ static int longhaul_get_cpu_mult (void)
rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi); rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi);
invalue = (lo & (1<<22|1<<23|1<<24|1<<25)) >>22; invalue = (lo & (1<<22|1<<23|1<<24|1<<25)) >>22;
if (longhaul_version==2) { if (longhaul_version==2 || longhaul_version==4) {
if (lo & (1<<27))
invalue+=16;
}
if (longhaul_version==4) {
if (lo & (1<<27)) if (lo & (1<<27))
invalue+=16; invalue+=16;
} }
...@@ -118,8 +115,7 @@ static void longhaul_setstate (unsigned int clock_ratio_index) ...@@ -118,8 +115,7 @@ static void longhaul_setstate (unsigned int clock_ratio_index)
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
dprintk (KERN_INFO PFX "FSB:%d Mult:%d.%dx\n", fsb, dprintk (KERN_INFO PFX "FSB:%d Mult:%d.%dx\n", fsb, mult/10, mult%10);
mult/10, mult%10);
switch (longhaul_version) { switch (longhaul_version) {
case 1: case 1:
...@@ -167,16 +163,16 @@ static void longhaul_setstate (unsigned int clock_ratio_index) ...@@ -167,16 +163,16 @@ static void longhaul_setstate (unsigned int clock_ratio_index)
longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf; longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf;
longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4;
longhaul.bits.EnableSoftBusRatio = 1; longhaul.bits.EnableSoftBusRatio = 1;
longhaul.bits.RevisionKey = 0x0; longhaul.bits.RevisionKey = 0x0;
wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
__hlt(); __hlt();
rdmsrl (MSR_VIA_LONGHAUL, longhaul.val); rdmsrl (MSR_VIA_LONGHAUL, longhaul.val);
longhaul.bits.EnableSoftBusRatio = 0; longhaul.bits.EnableSoftBusRatio = 0;
longhaul.bits.RevisionKey = 0xf; longhaul.bits.RevisionKey = 0xf;
wrmsrl (MSR_VIA_LONGHAUL, longhaul.val); wrmsrl (MSR_VIA_LONGHAUL, longhaul.val);
break; break;
} }
...@@ -276,26 +272,26 @@ static int __init longhaul_get_ranges (void) ...@@ -276,26 +272,26 @@ static int __init longhaul_get_ranges (void)
break; break;
} }
break; break;
case 4: case 4:
rdmsrl (MSR_VIA_LONGHAUL, longhaul.val); rdmsrl (MSR_VIA_LONGHAUL, longhaul.val);
//TODO: Nehemiah may have borken MaxMHzBR. //TODO: Nehemiah may have borken MaxMHzBR.
// need to extrapolate from FSB. // need to extrapolate from FSB.
invalue2 = longhaul.bits.MinMHzBR; invalue2 = longhaul.bits.MinMHzBR;
invalue = longhaul.bits.MaxMHzBR; invalue = longhaul.bits.MaxMHzBR;
if (longhaul.bits.MaxMHzBR4) if (longhaul.bits.MaxMHzBR4)
invalue += 16; invalue += 16;
maxmult=multipliers[invalue]; maxmult=multipliers[invalue];
maxmult=longhaul_get_cpu_mult(); maxmult=longhaul_get_cpu_mult();
printk(KERN_INFO PFX " invalue: %ld maxmult: %d \n", invalue, maxmult); printk(KERN_INFO PFX " invalue: %ld maxmult: %d \n", invalue, maxmult);
printk(KERN_INFO PFX " invalue2: %ld \n", invalue2); printk(KERN_INFO PFX " invalue2: %ld \n", invalue2);
minmult=50; minmult=50;
switch (longhaul.bits.MaxMHzFSB) { switch (longhaul.bits.MaxMHzFSB) {
case 0x0: fsb=133; case 0x0: fsb=133;
break; break;
...@@ -306,8 +302,8 @@ static int __init longhaul_get_ranges (void) ...@@ -306,8 +302,8 @@ static int __init longhaul_get_ranges (void)
case 0x3: fsb=66; case 0x3: fsb=66;
break; break;
} }
break; break;
} }
dprintk (KERN_INFO PFX "MinMult=%d.%dx MaxMult=%d.%dx\n", dprintk (KERN_INFO PFX "MinMult=%d.%dx MaxMult=%d.%dx\n",
...@@ -418,13 +414,13 @@ static int longhaul_target (struct cpufreq_policy *policy, ...@@ -418,13 +414,13 @@ static int longhaul_target (struct cpufreq_policy *policy,
unsigned int relation) unsigned int relation)
{ {
unsigned int table_index = 0; unsigned int table_index = 0;
unsigned int new_clock_ratio = 0; unsigned int new_clock_ratio = 0;
if (cpufreq_frequency_table_target(policy, longhaul_table, target_freq, relation, &table_index)) if (cpufreq_frequency_table_target(policy, longhaul_table, target_freq, relation, &table_index))
return -EINVAL; return -EINVAL;
new_clock_ratio = longhaul_table[table_index].index & 0xFF; new_clock_ratio = longhaul_table[table_index].index & 0xFF;
longhaul_setstate(new_clock_ratio); longhaul_setstate(new_clock_ratio);
return 0; return 0;
...@@ -500,7 +496,6 @@ static int __init longhaul_cpu_init (struct cpufreq_policy *policy) ...@@ -500,7 +496,6 @@ static int __init longhaul_cpu_init (struct cpufreq_policy *policy)
break; break;
} }
break; break;
default: default:
cpuname = "Unknown"; cpuname = "Unknown";
...@@ -514,11 +509,11 @@ static int __init longhaul_cpu_init (struct cpufreq_policy *policy) ...@@ -514,11 +509,11 @@ static int __init longhaul_cpu_init (struct cpufreq_policy *policy)
if (ret != 0) if (ret != 0)
return ret; return ret;
if ((longhaul_version==2) && (dont_scale_voltage==0)) if ((longhaul_version==2) && (dont_scale_voltage==0))
longhaul_setup_voltagescaling(); longhaul_setup_voltagescaling();
policy->governor = CPUFREQ_DEFAULT_GOVERNOR; policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
policy->cur = calc_speed (longhaul_get_cpu_mult(), fsb); policy->cur = calc_speed (longhaul_get_cpu_mult(), fsb);
ret = cpufreq_frequency_table_cpuinfo(policy, longhaul_table); ret = cpufreq_frequency_table_cpuinfo(policy, longhaul_table);
...@@ -530,7 +525,7 @@ static int __init longhaul_cpu_init (struct cpufreq_policy *policy) ...@@ -530,7 +525,7 @@ static int __init longhaul_cpu_init (struct cpufreq_policy *policy)
return 0; return 0;
} }
static int __exit longhaul_cpu_exit(struct cpufreq_policy *policy) static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy)
{ {
cpufreq_frequency_table_put_attr(policy->cpu); cpufreq_frequency_table_put_attr(policy->cpu);
return 0; return 0;
...@@ -542,14 +537,14 @@ static struct freq_attr* longhaul_attr[] = { ...@@ -542,14 +537,14 @@ static struct freq_attr* longhaul_attr[] = {
}; };
static struct cpufreq_driver longhaul_driver = { static struct cpufreq_driver longhaul_driver = {
.verify = longhaul_verify, .verify = longhaul_verify,
.target = longhaul_target, .target = longhaul_target,
.get = longhaul_get, .get = longhaul_get,
.init = longhaul_cpu_init, .init = longhaul_cpu_init,
.exit = longhaul_cpu_exit, .exit = __devexit_p(longhaul_cpu_exit),
.name = "longhaul", .name = "longhaul",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.attr = longhaul_attr, .attr = longhaul_attr,
}; };
static int __init longhaul_init (void) static int __init longhaul_init (void)
...@@ -560,12 +555,8 @@ static int __init longhaul_init (void) ...@@ -560,12 +555,8 @@ static int __init longhaul_init (void)
return -ENODEV; return -ENODEV;
switch (c->x86_model) { switch (c->x86_model) {
case 6 ... 8: case 6 ... 9:
return cpufreq_register_driver(&longhaul_driver); return cpufreq_register_driver(&longhaul_driver);
case 9:
printk (KERN_INFO PFX "Nehemiah unsupported: Waiting on working silicon "
"from VIA before this is usable.\n");
break;
default: default:
printk (KERN_INFO PFX "Unknown VIA CPU. Contact davej@codemonkey.org.uk\n"); printk (KERN_INFO PFX "Unknown VIA CPU. Contact davej@codemonkey.org.uk\n");
} }
...@@ -579,7 +570,11 @@ static void __exit longhaul_exit (void) ...@@ -579,7 +570,11 @@ static void __exit longhaul_exit (void)
kfree(longhaul_table); kfree(longhaul_table);
} }
MODULE_PARM (dont_scale_voltage, "i"); module_param (dont_scale_voltage, int, 0644);
MODULE_PARM_DESC(dont_scale_voltage, "Don't scale voltage of processor");
module_param (debug, int, 0644);
MODULE_PARM_DESC(debug, "Dump debugging information.");
MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>"); MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>");
MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors.");
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sched.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/msr.h> #include <asm/msr.h>
...@@ -35,7 +34,7 @@ ...@@ -35,7 +34,7 @@
#include "speedstep-lib.h" #include "speedstep-lib.h"
#define PFX "cpufreq: " #define PFX "p4-clockmod: "
/* /*
* Duty Cycle (3bits), note DC_DISABLE is not specified in * Duty Cycle (3bits), note DC_DISABLE is not specified in
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
...@@ -86,7 +86,7 @@ static int mobile_vid_table[32] = { ...@@ -86,7 +86,7 @@ static int mobile_vid_table[32] = {
/* divide by 10 to get FID. */ /* divide by 10 to get FID. */
static int fid_codes[32] = { static int fid_codes[32] = {
110, 115, 120, 125, 50, 55, 60, 65, 110, 115, 120, 125, 50, 55, 60, 65,
70, 75, 80, 85, 90, 95, 100, 105, 70, 75, 80, 85, 90, 95, 100, 105,
30, 190, 40, 200, 130, 135, 140, 210, 30, 190, 40, 200, 130, 135, 140, 210,
150, 225, 160, 165, 170, 180, -1, -1, 150, 225, 160, 165, 170, 180, -1, -1,
}; };
...@@ -95,7 +95,7 @@ static int fid_codes[32] = { ...@@ -95,7 +95,7 @@ static int fid_codes[32] = {
* configuration purpose. * configuration purpose.
*/ */
static int powernow_acpi_force; static int acpi_force;
static struct cpufreq_frequency_table *powernow_table; static struct cpufreq_frequency_table *powernow_table;
...@@ -144,6 +144,11 @@ static int check_powernow(void) ...@@ -144,6 +144,11 @@ static int check_powernow(void)
} }
cpuid(0x80000007, &eax, &ebx, &ecx, &edx); cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
/* Check we can actually do something before we say anything.*/
if (!(edx & (1 << 1 | 1 << 2)))
return 0;
printk (KERN_INFO PFX "PowerNOW! Technology present. Can scale: "); printk (KERN_INFO PFX "PowerNOW! Technology present. Can scale: ");
if (edx & 1 << 1) { if (edx & 1 << 1) {
...@@ -159,11 +164,6 @@ static int check_powernow(void) ...@@ -159,11 +164,6 @@ static int check_powernow(void)
can_scale_vid=1; can_scale_vid=1;
} }
if (!(edx & (1 << 1 | 1 << 2))) {
printk ("nothing.\n");
return 0;
}
printk (".\n"); printk (".\n");
return 1; return 1;
} }
...@@ -572,7 +572,7 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy) ...@@ -572,7 +572,7 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy)
} }
dprintk(KERN_INFO PFX "FSB: %3d.%03d MHz\n", fsb/1000, fsb%1000); dprintk(KERN_INFO PFX "FSB: %3d.%03d MHz\n", fsb/1000, fsb%1000);
if ((dmi_broken & BROKEN_CPUFREQ) || powernow_acpi_force) { if ((dmi_broken & BROKEN_CPUFREQ) || acpi_force) {
printk (KERN_INFO PFX "PSB/PST known to be broken. Trying ACPI instead\n"); printk (KERN_INFO PFX "PSB/PST known to be broken. Trying ACPI instead\n");
result = powernow_acpi_init(); result = powernow_acpi_init();
} else { } else {
...@@ -653,8 +653,7 @@ static void __exit powernow_exit (void) ...@@ -653,8 +653,7 @@ static void __exit powernow_exit (void)
kfree(powernow_table); kfree(powernow_table);
} }
module_param(powernow_acpi_force, int, 0444); module_param(acpi_force, int, 0444);
MODULE_PARM_DESC(acpi_force, "Force ACPI to be used"); MODULE_PARM_DESC(acpi_force, "Force ACPI to be used");
MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>"); MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>");
......
...@@ -553,7 +553,7 @@ static int fill_powernow_table(struct powernow_k8_data *data, struct pst_s *pst, ...@@ -553,7 +553,7 @@ static int fill_powernow_table(struct powernow_k8_data *data, struct pst_s *pst,
printk(KERN_ERR PFX "no p states to transition\n"); printk(KERN_ERR PFX "no p states to transition\n");
return -ENODEV; return -ENODEV;
} }
if (check_pst_table(data, pst, maxvid)) if (check_pst_table(data, pst, maxvid))
return -EINVAL; return -EINVAL;
...@@ -736,9 +736,9 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) ...@@ -736,9 +736,9 @@ 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) && (cntlofreq++)) { if ((fid < HI_FID_TABLE_BOTTOM) && (cntlofreq++)) {
printk(KERN_ERR PFX "Too many lo freq table entries\n"); printk(KERN_ERR PFX "Too many lo freq table entries\n");
goto err_out; goto err_out_mem;
} }
if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) { if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) {
printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n", printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n",
powernow_table[i].frequency, powernow_table[i].frequency,
...@@ -757,12 +757,16 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) ...@@ -757,12 +757,16 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
print_basics(data); print_basics(data);
powernow_k8_acpi_pst_values(data, 0); powernow_k8_acpi_pst_values(data, 0);
return 0; return 0;
err_out_mem:
kfree(powernow_table);
err_out: err_out:
acpi_processor_unregister_performance(&data->acpi_data, data->cpu); acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
/* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */ /* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */
data->acpi_data.state_count = 0; data->acpi_data.state_count = 0;
return -ENODEV; return -ENODEV;
} }
...@@ -945,7 +949,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol) ...@@ -945,7 +949,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
if ((num_online_cpus() != 1) || (num_possible_cpus() != 1)) { if ((num_online_cpus() != 1) || (num_possible_cpus() != 1)) {
printk(KERN_INFO PFX "MP systems not supported by PSB BIOS structure\n"); printk(KERN_INFO PFX "MP systems not supported by PSB BIOS structure\n");
kfree(data); kfree(data);
return 0; return -ENODEV;
} }
rc = find_psb_table(data); rc = find_psb_table(data);
if (rc) { if (rc) {
...@@ -1047,7 +1051,7 @@ static unsigned int powernowk8_get (unsigned int cpu) ...@@ -1047,7 +1051,7 @@ static unsigned int powernowk8_get (unsigned int cpu)
if (query_current_values_with_pending_wait(data)) if (query_current_values_with_pending_wait(data))
goto out; goto out;
khz = find_khz_freq_from_fid(data->currfid); khz = find_khz_freq_from_fid(data->currfid);
out: out:
preempt_enable_no_resched(); preempt_enable_no_resched();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment