|
@@ -27,7 +27,6 @@
|
|
#include <linux/cpufreq.h>
|
|
#include <linux/cpufreq.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/cpumask.h>
|
|
#include <linux/cpumask.h>
|
|
-#include <linux/sched.h> /* current / set_cpus_allowed() */
|
|
|
|
|
|
|
|
#include <asm/processor.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/msr.h>
|
|
#include <asm/msr.h>
|
|
@@ -62,7 +61,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
|
|
if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV))
|
|
if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV))
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- rdmsr(MSR_IA32_THERM_STATUS, l, h);
|
|
|
|
|
|
+ rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h);
|
|
|
|
|
|
if (l & 0x01)
|
|
if (l & 0x01)
|
|
dprintk("CPU#%d currently thermal throttled\n", cpu);
|
|
dprintk("CPU#%d currently thermal throttled\n", cpu);
|
|
@@ -70,10 +69,10 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
|
|
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;
|
|
newstate = DC_38PT;
|
|
|
|
|
|
- rdmsr(MSR_IA32_THERM_CONTROL, l, h);
|
|
|
|
|
|
+ rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h);
|
|
if (newstate == DC_DISABLE) {
|
|
if (newstate == DC_DISABLE) {
|
|
dprintk("CPU#%d disabling modulation\n", cpu);
|
|
dprintk("CPU#%d disabling modulation\n", cpu);
|
|
- wrmsr(MSR_IA32_THERM_CONTROL, l & ~(1<<4), h);
|
|
|
|
|
|
+ wrmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, l & ~(1<<4), h);
|
|
} else {
|
|
} else {
|
|
dprintk("CPU#%d setting duty cycle to %d%%\n",
|
|
dprintk("CPU#%d setting duty cycle to %d%%\n",
|
|
cpu, ((125 * newstate) / 10));
|
|
cpu, ((125 * newstate) / 10));
|
|
@@ -84,7 +83,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
|
|
*/
|
|
*/
|
|
l = (l & ~14);
|
|
l = (l & ~14);
|
|
l = l | (1<<4) | ((newstate & 0x7)<<1);
|
|
l = l | (1<<4) | ((newstate & 0x7)<<1);
|
|
- wrmsr(MSR_IA32_THERM_CONTROL, l, h);
|
|
|
|
|
|
+ wrmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, l, h);
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -111,7 +110,6 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
|
|
{
|
|
{
|
|
unsigned int newstate = DC_RESV;
|
|
unsigned int newstate = DC_RESV;
|
|
struct cpufreq_freqs freqs;
|
|
struct cpufreq_freqs freqs;
|
|
- cpumask_t cpus_allowed;
|
|
|
|
int i;
|
|
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))
|
|
@@ -132,17 +130,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
|
|
/* 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
|
|
* Developer's Manual, Volume 3
|
|
*/
|
|
*/
|
|
- cpus_allowed = current->cpus_allowed;
|
|
|
|
-
|
|
|
|
- for_each_cpu_mask(i, policy->cpus) {
|
|
|
|
- cpumask_t this_cpu = cpumask_of_cpu(i);
|
|
|
|
-
|
|
|
|
- set_cpus_allowed(current, this_cpu);
|
|
|
|
- BUG_ON(smp_processor_id() != i);
|
|
|
|
-
|
|
|
|
|
|
+ for_each_cpu_mask(i, policy->cpus)
|
|
cpufreq_p4_setdc(i, p4clockmod_table[newstate].index);
|
|
cpufreq_p4_setdc(i, p4clockmod_table[newstate].index);
|
|
- }
|
|
|
|
- set_cpus_allowed(current, cpus_allowed);
|
|
|
|
|
|
|
|
/* notifiers */
|
|
/* notifiers */
|
|
for_each_cpu_mask(i, policy->cpus) {
|
|
for_each_cpu_mask(i, policy->cpus) {
|
|
@@ -256,17 +245,9 @@ static int cpufreq_p4_cpu_exit(struct cpufreq_policy *policy)
|
|
|
|
|
|
static unsigned int cpufreq_p4_get(unsigned int cpu)
|
|
static unsigned int cpufreq_p4_get(unsigned int cpu)
|
|
{
|
|
{
|
|
- cpumask_t cpus_allowed;
|
|
|
|
u32 l, h;
|
|
u32 l, h;
|
|
|
|
|
|
- cpus_allowed = current->cpus_allowed;
|
|
|
|
-
|
|
|
|
- set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
|
|
|
- BUG_ON(smp_processor_id() != cpu);
|
|
|
|
-
|
|
|
|
- rdmsr(MSR_IA32_THERM_CONTROL, l, h);
|
|
|
|
-
|
|
|
|
- set_cpus_allowed(current, cpus_allowed);
|
|
|
|
|
|
+ rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h);
|
|
|
|
|
|
if (l & 0x10) {
|
|
if (l & 0x10) {
|
|
l = l >> 1;
|
|
l = l >> 1;
|