Loading arch/x86/kernel/cpu/cpufreq/p4-clockmod.c +34 −26 Original line number Diff line number Diff line Loading @@ -27,15 +27,16 @@ #include <linux/cpufreq.h> #include <linux/slab.h> #include <linux/cpumask.h> #include <linux/timex.h> #include <asm/processor.h> #include <asm/msr.h> #include <asm/timex.h> #include "speedstep-lib.h" #define PFX "p4-clockmod: " #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "p4-clockmod", msg) #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ "p4-clockmod", msg) /* * Duty Cycle (3bits), note DC_DISABLE is not specified in Loading @@ -58,7 +59,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) { u32 l, h; if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV)) if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV)) return -EINVAL; rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h); Loading @@ -66,7 +68,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) if (l & 0x01) dprintk("CPU#%d currently thermal throttled\n", cpu); if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT)) if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT)) newstate = DC_38PT; rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h); Loading Loading @@ -112,7 +115,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, struct cpufreq_freqs freqs; int i; if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate)) if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate)) return -EINVAL; freqs.old = cpufreq_p4_get(policy->cpu); Loading @@ -127,7 +131,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); } /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software /* run on each logical CPU, * see section 13.15.3 of IA32 Intel Architecture Software * Developer's Manual, Volume 3 */ for_each_cpu(i, policy->cpus) Loading @@ -153,28 +158,30 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) { if (c->x86 == 0x06) { if (cpu_has(c, X86_FEATURE_EST)) printk(KERN_WARNING PFX "Warning: EST-capable CPU detected. " "The acpi-cpufreq module offers voltage scaling" " in addition of frequency scaling. You should use " "that instead of p4-clockmod, if possible.\n"); printk(KERN_WARNING PFX "Warning: EST-capable CPU " "detected. The acpi-cpufreq module offers " "voltage scaling in addition of frequency " "scaling. You should use that instead of " "p4-clockmod, if possible.\n"); switch (c->x86_model) { case 0x0E: /* Core */ case 0x0F: /* Core Duo */ case 0x16: /* Celeron Core */ p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PCORE); return speedstep_get_frequency(SPEEDSTEP_CPU_PCORE); case 0x0D: /* Pentium M (Dothan) */ p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; /* fall through */ case 0x09: /* Pentium M (Banias) */ return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM); return speedstep_get_frequency(SPEEDSTEP_CPU_PM); } } if (c->x86 != 0xF) { if (!cpu_has(c, X86_FEATURE_EST)) printk(KERN_WARNING PFX "Unknown p4-clockmod-capable CPU. " "Please send an e-mail to <cpufreq@vger.kernel.org>\n"); printk(KERN_WARNING PFX "Unknown CPU. " "Please send an e-mail to " "<cpufreq@vger.kernel.org>\n"); return 0; } Loading @@ -182,16 +189,16 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) * throttling is active or not. */ p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; if (speedstep_detect_processor() == SPEEDSTEP_PROCESSOR_P4M) { if (speedstep_detect_processor() == SPEEDSTEP_CPU_P4M) { printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. " "The speedstep-ich or acpi cpufreq modules offer " "voltage scaling in addition of frequency scaling. " "You should use either one instead of p4-clockmod, " "if possible.\n"); return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4M); return speedstep_get_frequency(SPEEDSTEP_CPU_P4M); } return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4D); return speedstep_get_frequency(SPEEDSTEP_CPU_P4D); } Loading Loading @@ -258,7 +265,7 @@ static unsigned int cpufreq_p4_get(unsigned int cpu) l = DC_DISABLE; if (l != DC_DISABLE) return (stock_freq * l / 8); return stock_freq * l / 8; return stock_freq; } Loading Loading @@ -299,9 +306,10 @@ static int __init cpufreq_p4_init(void) ret = cpufreq_register_driver(&p4clockmod_driver); if (!ret) printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock Modulation available\n"); printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock " "Modulation available\n"); return (ret); return ret; } Loading arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +37 −33 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ static struct pci_dev *speedstep_chipset_dev; /* speedstep_processor */ static unsigned int speedstep_processor = 0; static unsigned int speedstep_processor; static u32 pmbase; Loading @@ -54,7 +54,8 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { }; #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-ich", msg) #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ "speedstep-ich", msg) /** Loading Loading @@ -133,11 +134,11 @@ static void speedstep_set_state (unsigned int state) dprintk("read at pmbase 0x%x + 0x50 returned 0x%x\n", pmbase, value); if (state == (value & 0x1)) { dprintk("change to %u MHz succeeded\n", (speedstep_get_processor_frequency(speedstep_processor) / 1000)); } else { if (state == (value & 0x1)) dprintk("change to %u MHz succeeded\n", speedstep_get_frequency(speedstep_processor) / 1000); else printk(KERN_ERR "cpufreq: change failed - I/O error\n"); } return; } Loading Loading @@ -179,16 +180,14 @@ static unsigned int speedstep_detect_chipset (void) { speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, NULL); if (speedstep_chipset_dev) return 4; /* 4-M */ speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, NULL); if (speedstep_chipset_dev) return 3; /* 3-M */ Loading @@ -196,8 +195,7 @@ static unsigned int speedstep_detect_chipset (void) speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_10, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, NULL); if (speedstep_chipset_dev) { /* speedstep.c causes lockups on Dell Inspirons 8000 and Loading @@ -208,8 +206,7 @@ static unsigned int speedstep_detect_chipset (void) hostbridge = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82815_MC, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, NULL); if (!hostbridge) Loading @@ -236,7 +233,7 @@ static unsigned int _speedstep_get(const struct cpumask *cpus) cpus_allowed = current->cpus_allowed; set_cpus_allowed_ptr(current, cpus); speed = speedstep_get_processor_frequency(speedstep_processor); speed = speedstep_get_frequency(speedstep_processor); set_cpus_allowed_ptr(current, &cpus_allowed); dprintk("detected %u kHz as current frequency\n", speed); return speed; Loading @@ -251,7 +248,8 @@ static unsigned int speedstep_get(unsigned int cpu) * speedstep_target - set a new CPUFreq policy * @policy: new policy * @target_freq: the target frequency * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) * @relation: how that frequency relates to achieved frequency * (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) * * Sets a new CPUFreq policy. */ Loading @@ -264,7 +262,8 @@ static int speedstep_target (struct cpufreq_policy *policy, cpumask_t cpus_allowed; int i; if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) return -EINVAL; freqs.old = _speedstep_get(policy->cpus); Loading Loading @@ -344,7 +343,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) return -EIO; dprintk("currently at %s speed setting - %i MHz\n", (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", (speed / 1000)); /* cpuinfo and default policy values */ Loading @@ -352,7 +352,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); if (result) return (result); return result; cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); Loading Loading @@ -396,13 +396,15 @@ static int __init speedstep_init(void) /* detect processor */ speedstep_processor = speedstep_detect_processor(); if (!speedstep_processor) { dprintk("Intel(R) SpeedStep(TM) capable processor not found\n"); dprintk("Intel(R) SpeedStep(TM) capable processor " "not found\n"); return -ENODEV; } /* detect chipset */ if (!speedstep_detect_chipset()) { dprintk("Intel(R) SpeedStep(TM) for this chipset not (yet) available.\n"); dprintk("Intel(R) SpeedStep(TM) for this chipset not " "(yet) available.\n"); return -ENODEV; } Loading Loading @@ -431,8 +433,10 @@ static void __exit speedstep_exit(void) } MODULE_AUTHOR ("Dave Jones <davej@redhat.com>, Dominik Brodowski <linux@brodo.de>"); MODULE_DESCRIPTION ("Speedstep driver for Intel mobile processors on chipsets with ICH-M southbridges."); MODULE_AUTHOR("Dave Jones <davej@redhat.com>, " "Dominik Brodowski <linux@brodo.de>"); MODULE_DESCRIPTION("Speedstep driver for Intel mobile processors on chipsets " "with ICH-M southbridges."); MODULE_LICENSE("GPL"); module_init(speedstep_init); Loading arch/x86/kernel/cpu/cpufreq/speedstep-lib.c +77 −52 Original line number Diff line number Diff line Loading @@ -18,10 +18,13 @@ #include <asm/msr.h> #include "speedstep-lib.h" #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-lib", msg) #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ "speedstep-lib", msg) #define PFX "speedstep-lib: " #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK static int relaxed_check = 0; static int relaxed_check; #else #define relaxed_check 0 #endif Loading Loading @@ -85,7 +88,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) } /* decode the multiplier */ if (processor == SPEEDSTEP_PROCESSOR_PIII_C_EARLY) { if (processor == SPEEDSTEP_CPU_PIII_C_EARLY) { dprintk("workaround for early PIIIs\n"); msr_lo &= 0x03c00000; } else Loading @@ -97,9 +100,10 @@ static unsigned int pentium3_get_frequency (unsigned int processor) j++; } dprintk("speed is %u\n", (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100)); dprintk("speed is %u\n", (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100)); return (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100); return msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100; } Loading @@ -112,20 +116,23 @@ static unsigned int pentiumM_get_frequency(void) /* see table B-2 of 24547212.pdf */ if (msr_lo & 0x00040000) { printk(KERN_DEBUG "speedstep-lib: PM - invalid FSB: 0x%x 0x%x\n", msr_lo, msr_tmp); printk(KERN_DEBUG PFX "PM - invalid FSB: 0x%x 0x%x\n", msr_lo, msr_tmp); return 0; } msr_tmp = (msr_lo >> 22) & 0x1f; dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * 100 * 1000)); dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * 100 * 1000)); return (msr_tmp * 100 * 1000); return msr_tmp * 100 * 1000; } static unsigned int pentium_core_get_frequency(void) { u32 fsb = 0; u32 msr_lo, msr_tmp; int ret; rdmsr(MSR_FSB_FREQ, msr_lo, msr_tmp); /* see table B-2 of 25366920.pdf */ Loading Loading @@ -153,12 +160,15 @@ static unsigned int pentium_core_get_frequency(void) } rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); msr_tmp = (msr_lo >> 22) & 0x1f; dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * fsb)); dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * fsb)); return (msr_tmp * fsb); ret = (msr_tmp * fsb); return ret; } Loading @@ -167,6 +177,7 @@ static unsigned int pentium4_get_frequency(void) struct cpuinfo_x86 *c = &boot_cpu_data; u32 msr_lo, msr_hi, mult; unsigned int fsb = 0; unsigned int ret; rdmsr(0x2c, msr_lo, msr_hi); Loading Loading @@ -195,37 +206,40 @@ static unsigned int pentium4_get_frequency(void) } if (!fsb) printk(KERN_DEBUG "speedstep-lib: couldn't detect FSB speed. Please send an e-mail to <linux@brodo.de>\n"); printk(KERN_DEBUG PFX "couldn't detect FSB speed. " "Please send an e-mail to <linux@brodo.de>\n"); /* Multiplier. */ mult = msr_lo >> 24; dprintk("P4 - FSB %u kHz; Multiplier %u; Speed %u kHz\n", fsb, mult, (fsb * mult)); dprintk("P4 - FSB %u kHz; Multiplier %u; Speed %u kHz\n", fsb, mult, (fsb * mult)); return (fsb * mult); ret = (fsb * mult); return ret; } unsigned int speedstep_get_processor_frequency(unsigned int processor) unsigned int speedstep_get_frequency(unsigned int processor) { switch (processor) { case SPEEDSTEP_PROCESSOR_PCORE: case SPEEDSTEP_CPU_PCORE: return pentium_core_get_frequency(); case SPEEDSTEP_PROCESSOR_PM: case SPEEDSTEP_CPU_PM: return pentiumM_get_frequency(); case SPEEDSTEP_PROCESSOR_P4D: case SPEEDSTEP_PROCESSOR_P4M: case SPEEDSTEP_CPU_P4D: case SPEEDSTEP_CPU_P4M: return pentium4_get_frequency(); case SPEEDSTEP_PROCESSOR_PIII_T: case SPEEDSTEP_PROCESSOR_PIII_C: case SPEEDSTEP_PROCESSOR_PIII_C_EARLY: case SPEEDSTEP_CPU_PIII_T: case SPEEDSTEP_CPU_PIII_C: case SPEEDSTEP_CPU_PIII_C_EARLY: return pentium3_get_frequency(processor); default: return 0; }; return 0; } EXPORT_SYMBOL_GPL(speedstep_get_processor_frequency); EXPORT_SYMBOL_GPL(speedstep_get_frequency); /********************************************************************* Loading Loading @@ -261,7 +275,7 @@ unsigned int speedstep_detect_processor (void) * sample has ebx = 0x0f, production has 0x0e. */ if ((ebx == 0x0e) || (ebx == 0x0f)) return SPEEDSTEP_PROCESSOR_P4M; return SPEEDSTEP_CPU_P4M; break; case 7: /* Loading @@ -272,7 +286,7 @@ unsigned int speedstep_detect_processor (void) * samples are only of B-stepping... */ if (ebx == 0x0e) return SPEEDSTEP_PROCESSOR_P4M; return SPEEDSTEP_CPU_P4M; break; case 9: /* Loading @@ -288,10 +302,13 @@ unsigned int speedstep_detect_processor (void) * M-P4-Ms may have either ebx=0xe or 0xf [see above] * M-P4/533 have either ebx=0xe or 0xf. [25317607.pdf] * also, M-P4M HTs have ebx=0x8, too * For now, they are distinguished by the model_id string * For now, they are distinguished by the model_id * string */ if ((ebx == 0x0e) || (strstr(c->x86_model_id,"Mobile Intel(R) Pentium(R) 4") != NULL)) return SPEEDSTEP_PROCESSOR_P4M; if ((ebx == 0x0e) || (strstr(c->x86_model_id, "Mobile Intel(R) Pentium(R) 4") != NULL)) return SPEEDSTEP_CPU_P4M; break; default: break; Loading @@ -301,7 +318,8 @@ unsigned int speedstep_detect_processor (void) switch (c->x86_model) { case 0x0B: /* Intel PIII [Tualatin] */ /* cpuid_ebx(1) is 0x04 for desktop PIII, 0x06 for mobile PIII-M */ /* cpuid_ebx(1) is 0x04 for desktop PIII, * 0x06 for mobile PIII-M */ ebx = cpuid_ebx(0x00000001); dprintk("ebx is %x\n", ebx); Loading @@ -313,14 +331,15 @@ unsigned int speedstep_detect_processor (void) /* So far all PIII-M processors support SpeedStep. See * Intel's 24540640.pdf of June 2003 */ return SPEEDSTEP_PROCESSOR_PIII_T; return SPEEDSTEP_CPU_PIII_T; case 0x08: /* Intel PIII [Coppermine] */ /* all mobile PIII Coppermines have FSB 100 MHz * ==> sort out a few desktop PIIIs. */ rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_hi); dprintk("Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x\n", msr_lo, msr_hi); dprintk("Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x\n", msr_lo, msr_hi); msr_lo &= 0x00c0000; if (msr_lo != 0x0080000) return 0; Loading @@ -332,13 +351,15 @@ unsigned int speedstep_detect_processor (void) * bit 56 or 57 is set */ rdmsr(MSR_IA32_PLATFORM_ID, msr_lo, msr_hi); dprintk("Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", msr_lo, msr_hi); if ((msr_hi & (1<<18)) && (relaxed_check ? 1 : (msr_hi & (3<<24)))) { dprintk("Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", msr_lo, msr_hi); if ((msr_hi & (1<<18)) && (relaxed_check ? 1 : (msr_hi & (3<<24)))) { if (c->x86_mask == 0x01) { dprintk("early PIII version\n"); return SPEEDSTEP_PROCESSOR_PIII_C_EARLY; return SPEEDSTEP_CPU_PIII_C_EARLY; } else return SPEEDSTEP_PROCESSOR_PIII_C; return SPEEDSTEP_CPU_PIII_C; } default: Loading Loading @@ -369,7 +390,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, dprintk("trying to determine both speeds\n"); /* get current speed */ prev_speed = speedstep_get_processor_frequency(processor); prev_speed = speedstep_get_frequency(processor); if (!prev_speed) return -EIO; Loading @@ -379,7 +400,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, /* switch to low state */ set_state(SPEEDSTEP_LOW); *low_speed = speedstep_get_processor_frequency(processor); *low_speed = speedstep_get_frequency(processor); if (!*low_speed) { ret = -EIO; goto out; Loading @@ -398,7 +419,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, if (transition_latency) do_gettimeofday(&tv2); *high_speed = speedstep_get_processor_frequency(processor); *high_speed = speedstep_get_frequency(processor); if (!*high_speed) { ret = -EIO; goto out; Loading Loading @@ -426,9 +447,12 @@ unsigned int speedstep_get_freqs(unsigned int processor, /* check if the latency measurement is too high or too low * and set it to a safe value (500uSec) in that case */ if (*transition_latency > 10000000 || *transition_latency < 50000) { printk (KERN_WARNING "speedstep: frequency transition measured seems out of " "range (%u nSec), falling back to a safe one of %u nSec.\n", if (*transition_latency > 10000000 || *transition_latency < 50000) { printk(KERN_WARNING PFX "frequency transition " "measured seems out of range (%u " "nSec), falling back to a safe one of" "%u nSec.\n", *transition_latency, 500000); *transition_latency = 500000; } Loading @@ -436,13 +460,14 @@ unsigned int speedstep_get_freqs(unsigned int processor, out: local_irq_restore(flags); return (ret); return ret; } EXPORT_SYMBOL_GPL(speedstep_get_freqs); #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK module_param(relaxed_check, int, 0444); MODULE_PARM_DESC(relaxed_check, "Don't do all checks for speedstep capability."); MODULE_PARM_DESC(relaxed_check, "Don't do all checks for speedstep capability."); #endif MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); Loading arch/x86/kernel/cpu/cpufreq/speedstep-lib.h +9 −9 Original line number Diff line number Diff line Loading @@ -12,17 +12,17 @@ /* processors */ #define SPEEDSTEP_PROCESSOR_PIII_C_EARLY 0x00000001 /* Coppermine core */ #define SPEEDSTEP_PROCESSOR_PIII_C 0x00000002 /* Coppermine core */ #define SPEEDSTEP_PROCESSOR_PIII_T 0x00000003 /* Tualatin core */ #define SPEEDSTEP_PROCESSOR_P4M 0x00000004 /* P4-M */ #define SPEEDSTEP_CPU_PIII_C_EARLY 0x00000001 /* Coppermine core */ #define SPEEDSTEP_CPU_PIII_C 0x00000002 /* Coppermine core */ #define SPEEDSTEP_CPU_PIII_T 0x00000003 /* Tualatin core */ #define SPEEDSTEP_CPU_P4M 0x00000004 /* P4-M */ /* the following processors are not speedstep-capable and are not auto-detected * in speedstep_detect_processor(). However, their speed can be detected using * the speedstep_get_processor_frequency() call. */ #define SPEEDSTEP_PROCESSOR_PM 0xFFFFFF03 /* Pentium M */ #define SPEEDSTEP_PROCESSOR_P4D 0xFFFFFF04 /* desktop P4 */ #define SPEEDSTEP_PROCESSOR_PCORE 0xFFFFFF05 /* Core */ * the speedstep_get_frequency() call. */ #define SPEEDSTEP_CPU_PM 0xFFFFFF03 /* Pentium M */ #define SPEEDSTEP_CPU_P4D 0xFFFFFF04 /* desktop P4 */ #define SPEEDSTEP_CPU_PCORE 0xFFFFFF05 /* Core */ /* speedstep states -- only two of them */ Loading @@ -34,7 +34,7 @@ extern unsigned int speedstep_detect_processor (void); /* detect the current speed (in khz) of the processor */ extern unsigned int speedstep_get_processor_frequency(unsigned int processor); extern unsigned int speedstep_get_frequency(unsigned int processor); /* detect the low and high speeds of the processor. The callback Loading arch/x86/kernel/cpu/cpufreq/speedstep-smi.c +101 −65 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
arch/x86/kernel/cpu/cpufreq/p4-clockmod.c +34 −26 Original line number Diff line number Diff line Loading @@ -27,15 +27,16 @@ #include <linux/cpufreq.h> #include <linux/slab.h> #include <linux/cpumask.h> #include <linux/timex.h> #include <asm/processor.h> #include <asm/msr.h> #include <asm/timex.h> #include "speedstep-lib.h" #define PFX "p4-clockmod: " #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "p4-clockmod", msg) #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ "p4-clockmod", msg) /* * Duty Cycle (3bits), note DC_DISABLE is not specified in Loading @@ -58,7 +59,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) { u32 l, h; if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV)) if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV)) return -EINVAL; rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h); Loading @@ -66,7 +68,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) if (l & 0x01) dprintk("CPU#%d currently thermal throttled\n", cpu); if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT)) if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT)) newstate = DC_38PT; rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h); Loading Loading @@ -112,7 +115,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, struct cpufreq_freqs freqs; int i; if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate)) if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate)) return -EINVAL; freqs.old = cpufreq_p4_get(policy->cpu); Loading @@ -127,7 +131,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); } /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software /* run on each logical CPU, * see section 13.15.3 of IA32 Intel Architecture Software * Developer's Manual, Volume 3 */ for_each_cpu(i, policy->cpus) Loading @@ -153,28 +158,30 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) { if (c->x86 == 0x06) { if (cpu_has(c, X86_FEATURE_EST)) printk(KERN_WARNING PFX "Warning: EST-capable CPU detected. " "The acpi-cpufreq module offers voltage scaling" " in addition of frequency scaling. You should use " "that instead of p4-clockmod, if possible.\n"); printk(KERN_WARNING PFX "Warning: EST-capable CPU " "detected. The acpi-cpufreq module offers " "voltage scaling in addition of frequency " "scaling. You should use that instead of " "p4-clockmod, if possible.\n"); switch (c->x86_model) { case 0x0E: /* Core */ case 0x0F: /* Core Duo */ case 0x16: /* Celeron Core */ p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PCORE); return speedstep_get_frequency(SPEEDSTEP_CPU_PCORE); case 0x0D: /* Pentium M (Dothan) */ p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; /* fall through */ case 0x09: /* Pentium M (Banias) */ return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM); return speedstep_get_frequency(SPEEDSTEP_CPU_PM); } } if (c->x86 != 0xF) { if (!cpu_has(c, X86_FEATURE_EST)) printk(KERN_WARNING PFX "Unknown p4-clockmod-capable CPU. " "Please send an e-mail to <cpufreq@vger.kernel.org>\n"); printk(KERN_WARNING PFX "Unknown CPU. " "Please send an e-mail to " "<cpufreq@vger.kernel.org>\n"); return 0; } Loading @@ -182,16 +189,16 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) * throttling is active or not. */ p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; if (speedstep_detect_processor() == SPEEDSTEP_PROCESSOR_P4M) { if (speedstep_detect_processor() == SPEEDSTEP_CPU_P4M) { printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. " "The speedstep-ich or acpi cpufreq modules offer " "voltage scaling in addition of frequency scaling. " "You should use either one instead of p4-clockmod, " "if possible.\n"); return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4M); return speedstep_get_frequency(SPEEDSTEP_CPU_P4M); } return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4D); return speedstep_get_frequency(SPEEDSTEP_CPU_P4D); } Loading Loading @@ -258,7 +265,7 @@ static unsigned int cpufreq_p4_get(unsigned int cpu) l = DC_DISABLE; if (l != DC_DISABLE) return (stock_freq * l / 8); return stock_freq * l / 8; return stock_freq; } Loading Loading @@ -299,9 +306,10 @@ static int __init cpufreq_p4_init(void) ret = cpufreq_register_driver(&p4clockmod_driver); if (!ret) printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock Modulation available\n"); printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock " "Modulation available\n"); return (ret); return ret; } Loading
arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +37 −33 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ static struct pci_dev *speedstep_chipset_dev; /* speedstep_processor */ static unsigned int speedstep_processor = 0; static unsigned int speedstep_processor; static u32 pmbase; Loading @@ -54,7 +54,8 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { }; #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-ich", msg) #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ "speedstep-ich", msg) /** Loading Loading @@ -133,11 +134,11 @@ static void speedstep_set_state (unsigned int state) dprintk("read at pmbase 0x%x + 0x50 returned 0x%x\n", pmbase, value); if (state == (value & 0x1)) { dprintk("change to %u MHz succeeded\n", (speedstep_get_processor_frequency(speedstep_processor) / 1000)); } else { if (state == (value & 0x1)) dprintk("change to %u MHz succeeded\n", speedstep_get_frequency(speedstep_processor) / 1000); else printk(KERN_ERR "cpufreq: change failed - I/O error\n"); } return; } Loading Loading @@ -179,16 +180,14 @@ static unsigned int speedstep_detect_chipset (void) { speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, NULL); if (speedstep_chipset_dev) return 4; /* 4-M */ speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, NULL); if (speedstep_chipset_dev) return 3; /* 3-M */ Loading @@ -196,8 +195,7 @@ static unsigned int speedstep_detect_chipset (void) speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_10, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, NULL); if (speedstep_chipset_dev) { /* speedstep.c causes lockups on Dell Inspirons 8000 and Loading @@ -208,8 +206,7 @@ static unsigned int speedstep_detect_chipset (void) hostbridge = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82815_MC, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, NULL); if (!hostbridge) Loading @@ -236,7 +233,7 @@ static unsigned int _speedstep_get(const struct cpumask *cpus) cpus_allowed = current->cpus_allowed; set_cpus_allowed_ptr(current, cpus); speed = speedstep_get_processor_frequency(speedstep_processor); speed = speedstep_get_frequency(speedstep_processor); set_cpus_allowed_ptr(current, &cpus_allowed); dprintk("detected %u kHz as current frequency\n", speed); return speed; Loading @@ -251,7 +248,8 @@ static unsigned int speedstep_get(unsigned int cpu) * speedstep_target - set a new CPUFreq policy * @policy: new policy * @target_freq: the target frequency * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) * @relation: how that frequency relates to achieved frequency * (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) * * Sets a new CPUFreq policy. */ Loading @@ -264,7 +262,8 @@ static int speedstep_target (struct cpufreq_policy *policy, cpumask_t cpus_allowed; int i; if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) return -EINVAL; freqs.old = _speedstep_get(policy->cpus); Loading Loading @@ -344,7 +343,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) return -EIO; dprintk("currently at %s speed setting - %i MHz\n", (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", (speed / 1000)); /* cpuinfo and default policy values */ Loading @@ -352,7 +352,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); if (result) return (result); return result; cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); Loading Loading @@ -396,13 +396,15 @@ static int __init speedstep_init(void) /* detect processor */ speedstep_processor = speedstep_detect_processor(); if (!speedstep_processor) { dprintk("Intel(R) SpeedStep(TM) capable processor not found\n"); dprintk("Intel(R) SpeedStep(TM) capable processor " "not found\n"); return -ENODEV; } /* detect chipset */ if (!speedstep_detect_chipset()) { dprintk("Intel(R) SpeedStep(TM) for this chipset not (yet) available.\n"); dprintk("Intel(R) SpeedStep(TM) for this chipset not " "(yet) available.\n"); return -ENODEV; } Loading Loading @@ -431,8 +433,10 @@ static void __exit speedstep_exit(void) } MODULE_AUTHOR ("Dave Jones <davej@redhat.com>, Dominik Brodowski <linux@brodo.de>"); MODULE_DESCRIPTION ("Speedstep driver for Intel mobile processors on chipsets with ICH-M southbridges."); MODULE_AUTHOR("Dave Jones <davej@redhat.com>, " "Dominik Brodowski <linux@brodo.de>"); MODULE_DESCRIPTION("Speedstep driver for Intel mobile processors on chipsets " "with ICH-M southbridges."); MODULE_LICENSE("GPL"); module_init(speedstep_init); Loading
arch/x86/kernel/cpu/cpufreq/speedstep-lib.c +77 −52 Original line number Diff line number Diff line Loading @@ -18,10 +18,13 @@ #include <asm/msr.h> #include "speedstep-lib.h" #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-lib", msg) #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ "speedstep-lib", msg) #define PFX "speedstep-lib: " #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK static int relaxed_check = 0; static int relaxed_check; #else #define relaxed_check 0 #endif Loading Loading @@ -85,7 +88,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) } /* decode the multiplier */ if (processor == SPEEDSTEP_PROCESSOR_PIII_C_EARLY) { if (processor == SPEEDSTEP_CPU_PIII_C_EARLY) { dprintk("workaround for early PIIIs\n"); msr_lo &= 0x03c00000; } else Loading @@ -97,9 +100,10 @@ static unsigned int pentium3_get_frequency (unsigned int processor) j++; } dprintk("speed is %u\n", (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100)); dprintk("speed is %u\n", (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100)); return (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100); return msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100; } Loading @@ -112,20 +116,23 @@ static unsigned int pentiumM_get_frequency(void) /* see table B-2 of 24547212.pdf */ if (msr_lo & 0x00040000) { printk(KERN_DEBUG "speedstep-lib: PM - invalid FSB: 0x%x 0x%x\n", msr_lo, msr_tmp); printk(KERN_DEBUG PFX "PM - invalid FSB: 0x%x 0x%x\n", msr_lo, msr_tmp); return 0; } msr_tmp = (msr_lo >> 22) & 0x1f; dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * 100 * 1000)); dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * 100 * 1000)); return (msr_tmp * 100 * 1000); return msr_tmp * 100 * 1000; } static unsigned int pentium_core_get_frequency(void) { u32 fsb = 0; u32 msr_lo, msr_tmp; int ret; rdmsr(MSR_FSB_FREQ, msr_lo, msr_tmp); /* see table B-2 of 25366920.pdf */ Loading Loading @@ -153,12 +160,15 @@ static unsigned int pentium_core_get_frequency(void) } rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); msr_tmp = (msr_lo >> 22) & 0x1f; dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * fsb)); dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * fsb)); return (msr_tmp * fsb); ret = (msr_tmp * fsb); return ret; } Loading @@ -167,6 +177,7 @@ static unsigned int pentium4_get_frequency(void) struct cpuinfo_x86 *c = &boot_cpu_data; u32 msr_lo, msr_hi, mult; unsigned int fsb = 0; unsigned int ret; rdmsr(0x2c, msr_lo, msr_hi); Loading Loading @@ -195,37 +206,40 @@ static unsigned int pentium4_get_frequency(void) } if (!fsb) printk(KERN_DEBUG "speedstep-lib: couldn't detect FSB speed. Please send an e-mail to <linux@brodo.de>\n"); printk(KERN_DEBUG PFX "couldn't detect FSB speed. " "Please send an e-mail to <linux@brodo.de>\n"); /* Multiplier. */ mult = msr_lo >> 24; dprintk("P4 - FSB %u kHz; Multiplier %u; Speed %u kHz\n", fsb, mult, (fsb * mult)); dprintk("P4 - FSB %u kHz; Multiplier %u; Speed %u kHz\n", fsb, mult, (fsb * mult)); return (fsb * mult); ret = (fsb * mult); return ret; } unsigned int speedstep_get_processor_frequency(unsigned int processor) unsigned int speedstep_get_frequency(unsigned int processor) { switch (processor) { case SPEEDSTEP_PROCESSOR_PCORE: case SPEEDSTEP_CPU_PCORE: return pentium_core_get_frequency(); case SPEEDSTEP_PROCESSOR_PM: case SPEEDSTEP_CPU_PM: return pentiumM_get_frequency(); case SPEEDSTEP_PROCESSOR_P4D: case SPEEDSTEP_PROCESSOR_P4M: case SPEEDSTEP_CPU_P4D: case SPEEDSTEP_CPU_P4M: return pentium4_get_frequency(); case SPEEDSTEP_PROCESSOR_PIII_T: case SPEEDSTEP_PROCESSOR_PIII_C: case SPEEDSTEP_PROCESSOR_PIII_C_EARLY: case SPEEDSTEP_CPU_PIII_T: case SPEEDSTEP_CPU_PIII_C: case SPEEDSTEP_CPU_PIII_C_EARLY: return pentium3_get_frequency(processor); default: return 0; }; return 0; } EXPORT_SYMBOL_GPL(speedstep_get_processor_frequency); EXPORT_SYMBOL_GPL(speedstep_get_frequency); /********************************************************************* Loading Loading @@ -261,7 +275,7 @@ unsigned int speedstep_detect_processor (void) * sample has ebx = 0x0f, production has 0x0e. */ if ((ebx == 0x0e) || (ebx == 0x0f)) return SPEEDSTEP_PROCESSOR_P4M; return SPEEDSTEP_CPU_P4M; break; case 7: /* Loading @@ -272,7 +286,7 @@ unsigned int speedstep_detect_processor (void) * samples are only of B-stepping... */ if (ebx == 0x0e) return SPEEDSTEP_PROCESSOR_P4M; return SPEEDSTEP_CPU_P4M; break; case 9: /* Loading @@ -288,10 +302,13 @@ unsigned int speedstep_detect_processor (void) * M-P4-Ms may have either ebx=0xe or 0xf [see above] * M-P4/533 have either ebx=0xe or 0xf. [25317607.pdf] * also, M-P4M HTs have ebx=0x8, too * For now, they are distinguished by the model_id string * For now, they are distinguished by the model_id * string */ if ((ebx == 0x0e) || (strstr(c->x86_model_id,"Mobile Intel(R) Pentium(R) 4") != NULL)) return SPEEDSTEP_PROCESSOR_P4M; if ((ebx == 0x0e) || (strstr(c->x86_model_id, "Mobile Intel(R) Pentium(R) 4") != NULL)) return SPEEDSTEP_CPU_P4M; break; default: break; Loading @@ -301,7 +318,8 @@ unsigned int speedstep_detect_processor (void) switch (c->x86_model) { case 0x0B: /* Intel PIII [Tualatin] */ /* cpuid_ebx(1) is 0x04 for desktop PIII, 0x06 for mobile PIII-M */ /* cpuid_ebx(1) is 0x04 for desktop PIII, * 0x06 for mobile PIII-M */ ebx = cpuid_ebx(0x00000001); dprintk("ebx is %x\n", ebx); Loading @@ -313,14 +331,15 @@ unsigned int speedstep_detect_processor (void) /* So far all PIII-M processors support SpeedStep. See * Intel's 24540640.pdf of June 2003 */ return SPEEDSTEP_PROCESSOR_PIII_T; return SPEEDSTEP_CPU_PIII_T; case 0x08: /* Intel PIII [Coppermine] */ /* all mobile PIII Coppermines have FSB 100 MHz * ==> sort out a few desktop PIIIs. */ rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_hi); dprintk("Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x\n", msr_lo, msr_hi); dprintk("Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x\n", msr_lo, msr_hi); msr_lo &= 0x00c0000; if (msr_lo != 0x0080000) return 0; Loading @@ -332,13 +351,15 @@ unsigned int speedstep_detect_processor (void) * bit 56 or 57 is set */ rdmsr(MSR_IA32_PLATFORM_ID, msr_lo, msr_hi); dprintk("Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", msr_lo, msr_hi); if ((msr_hi & (1<<18)) && (relaxed_check ? 1 : (msr_hi & (3<<24)))) { dprintk("Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", msr_lo, msr_hi); if ((msr_hi & (1<<18)) && (relaxed_check ? 1 : (msr_hi & (3<<24)))) { if (c->x86_mask == 0x01) { dprintk("early PIII version\n"); return SPEEDSTEP_PROCESSOR_PIII_C_EARLY; return SPEEDSTEP_CPU_PIII_C_EARLY; } else return SPEEDSTEP_PROCESSOR_PIII_C; return SPEEDSTEP_CPU_PIII_C; } default: Loading Loading @@ -369,7 +390,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, dprintk("trying to determine both speeds\n"); /* get current speed */ prev_speed = speedstep_get_processor_frequency(processor); prev_speed = speedstep_get_frequency(processor); if (!prev_speed) return -EIO; Loading @@ -379,7 +400,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, /* switch to low state */ set_state(SPEEDSTEP_LOW); *low_speed = speedstep_get_processor_frequency(processor); *low_speed = speedstep_get_frequency(processor); if (!*low_speed) { ret = -EIO; goto out; Loading @@ -398,7 +419,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, if (transition_latency) do_gettimeofday(&tv2); *high_speed = speedstep_get_processor_frequency(processor); *high_speed = speedstep_get_frequency(processor); if (!*high_speed) { ret = -EIO; goto out; Loading Loading @@ -426,9 +447,12 @@ unsigned int speedstep_get_freqs(unsigned int processor, /* check if the latency measurement is too high or too low * and set it to a safe value (500uSec) in that case */ if (*transition_latency > 10000000 || *transition_latency < 50000) { printk (KERN_WARNING "speedstep: frequency transition measured seems out of " "range (%u nSec), falling back to a safe one of %u nSec.\n", if (*transition_latency > 10000000 || *transition_latency < 50000) { printk(KERN_WARNING PFX "frequency transition " "measured seems out of range (%u " "nSec), falling back to a safe one of" "%u nSec.\n", *transition_latency, 500000); *transition_latency = 500000; } Loading @@ -436,13 +460,14 @@ unsigned int speedstep_get_freqs(unsigned int processor, out: local_irq_restore(flags); return (ret); return ret; } EXPORT_SYMBOL_GPL(speedstep_get_freqs); #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK module_param(relaxed_check, int, 0444); MODULE_PARM_DESC(relaxed_check, "Don't do all checks for speedstep capability."); MODULE_PARM_DESC(relaxed_check, "Don't do all checks for speedstep capability."); #endif MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); Loading
arch/x86/kernel/cpu/cpufreq/speedstep-lib.h +9 −9 Original line number Diff line number Diff line Loading @@ -12,17 +12,17 @@ /* processors */ #define SPEEDSTEP_PROCESSOR_PIII_C_EARLY 0x00000001 /* Coppermine core */ #define SPEEDSTEP_PROCESSOR_PIII_C 0x00000002 /* Coppermine core */ #define SPEEDSTEP_PROCESSOR_PIII_T 0x00000003 /* Tualatin core */ #define SPEEDSTEP_PROCESSOR_P4M 0x00000004 /* P4-M */ #define SPEEDSTEP_CPU_PIII_C_EARLY 0x00000001 /* Coppermine core */ #define SPEEDSTEP_CPU_PIII_C 0x00000002 /* Coppermine core */ #define SPEEDSTEP_CPU_PIII_T 0x00000003 /* Tualatin core */ #define SPEEDSTEP_CPU_P4M 0x00000004 /* P4-M */ /* the following processors are not speedstep-capable and are not auto-detected * in speedstep_detect_processor(). However, their speed can be detected using * the speedstep_get_processor_frequency() call. */ #define SPEEDSTEP_PROCESSOR_PM 0xFFFFFF03 /* Pentium M */ #define SPEEDSTEP_PROCESSOR_P4D 0xFFFFFF04 /* desktop P4 */ #define SPEEDSTEP_PROCESSOR_PCORE 0xFFFFFF05 /* Core */ * the speedstep_get_frequency() call. */ #define SPEEDSTEP_CPU_PM 0xFFFFFF03 /* Pentium M */ #define SPEEDSTEP_CPU_P4D 0xFFFFFF04 /* desktop P4 */ #define SPEEDSTEP_CPU_PCORE 0xFFFFFF05 /* Core */ /* speedstep states -- only two of them */ Loading @@ -34,7 +34,7 @@ extern unsigned int speedstep_detect_processor (void); /* detect the current speed (in khz) of the processor */ extern unsigned int speedstep_get_processor_frequency(unsigned int processor); extern unsigned int speedstep_get_frequency(unsigned int processor); /* detect the low and high speeds of the processor. The callback Loading
arch/x86/kernel/cpu/cpufreq/speedstep-smi.c +101 −65 File changed.Preview size limit exceeded, changes collapsed. Show changes