diff options
| author | David S. Miller <davem@davemloft.net> | 2009-05-18 21:08:20 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-05-18 21:08:20 -0700 | 
| commit | bb803cfbecb03a0cf8dc7e1864f18dda6631af00 (patch) | |
| tree | 6c0989693bea6f50cfa5c6bb14f52ec19668def3 /arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |
| parent | 3878fb6fdbceecca20b15748f807340854220f06 (diff) | |
| parent | 511e11e396dc596825ce04d53d7f6d579404bc01 (diff) | |
| download | olio-linux-3.10-bb803cfbecb03a0cf8dc7e1864f18dda6631af00.tar.xz olio-linux-3.10-bb803cfbecb03a0cf8dc7e1864f18dda6631af00.zip  | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
	drivers/scsi/fcoe/fcoe.c
Diffstat (limited to 'arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c')
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 38 | 
1 files changed, 23 insertions, 15 deletions
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 3e3cd3db7a0..208ecf6643d 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c @@ -65,14 +65,18 @@ enum {  struct acpi_cpufreq_data {  	struct acpi_processor_performance *acpi_data;  	struct cpufreq_frequency_table *freq_table; -	unsigned int max_freq;  	unsigned int resume;  	unsigned int cpu_feature; -	u64 saved_aperf, saved_mperf;  };  static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data); +struct acpi_msr_data { +	u64 saved_aperf, saved_mperf; +}; + +static DEFINE_PER_CPU(struct acpi_msr_data, msr_data); +  DEFINE_TRACE(power_mark);  /* acpi_perf_data is a pointer to percpu data. */ @@ -204,7 +208,13 @@ static void drv_read(struct drv_cmd *cmd)  static void drv_write(struct drv_cmd *cmd)  { +	int this_cpu; + +	this_cpu = get_cpu(); +	if (cpumask_test_cpu(this_cpu, cmd->mask)) +		do_drv_write(cmd);  	smp_call_function_many(cmd->mask, do_drv_write, cmd, 1); +	put_cpu();  }  static u32 get_cur_val(const struct cpumask *mask) @@ -277,15 +287,15 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy,  	unsigned int perf_percent;  	unsigned int retval; -	if (smp_call_function_single(cpu, read_measured_perf_ctrs, &cur, 1)) +	if (smp_call_function_single(cpu, read_measured_perf_ctrs, &readin, 1))  		return 0;  	cur.aperf.whole = readin.aperf.whole - -				per_cpu(drv_data, cpu)->saved_aperf; +				per_cpu(msr_data, cpu).saved_aperf;  	cur.mperf.whole = readin.mperf.whole - -				per_cpu(drv_data, cpu)->saved_mperf; -	per_cpu(drv_data, cpu)->saved_aperf = readin.aperf.whole; -	per_cpu(drv_data, cpu)->saved_mperf = readin.mperf.whole; +				per_cpu(msr_data, cpu).saved_mperf; +	per_cpu(msr_data, cpu).saved_aperf = readin.aperf.whole; +	per_cpu(msr_data, cpu).saved_mperf = readin.mperf.whole;  #ifdef __i386__  	/* @@ -329,7 +339,7 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy,  #endif -	retval = per_cpu(drv_data, policy->cpu)->max_freq * perf_percent / 100; +	retval = (policy->cpuinfo.max_freq * perf_percent) / 100;  	return retval;  } @@ -682,16 +692,11 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)  	/* Check for high latency (>20uS) from buggy BIOSes, like on T42 */  	if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE &&  	    policy->cpuinfo.transition_latency > 20 * 1000) { -		static int print_once;  		policy->cpuinfo.transition_latency = 20 * 1000; -		if (!print_once) { -			print_once = 1; -			printk(KERN_INFO "Capping off P-state tranision latency" -				" at 20 uS\n"); -		} +			printk_once(KERN_INFO "Capping off P-state tranision" +				    " latency at 20 uS\n");  	} -	data->max_freq = perf->states[0].core_frequency * 1000;  	/* table init */  	for (i = 0; i < perf->state_count; i++) {  		if (i > 0 && perf->states[i].core_frequency >= @@ -710,6 +715,9 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)  	if (result)  		goto err_freqfree; +	if (perf->states[0].core_frequency * 1000 != policy->cpuinfo.max_freq) +		printk(KERN_WARNING FW_WARN "P-state 0 is not max freq\n"); +  	switch (perf->control_register.space_id) {  	case ACPI_ADR_SPACE_SYSTEM_IO:  		/* Current speed is unknown and not detectable by IO port */  |