diff options
Diffstat (limited to 'drivers/cpufreq/intel_pstate.c')
| -rw-r--r-- | drivers/cpufreq/intel_pstate.c | 32 | 
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index b7fb8b7c980d..65ee4fcace1f 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c @@ -225,6 +225,9 @@ struct global_params {   * @vid:		Stores VID limits for this CPU   * @pid:		Stores PID parameters for this CPU   * @last_sample_time:	Last Sample time + * @aperf_mperf_shift:	Number of clock cycles after aperf, merf is incremented + *			This shift is a multiplier to mperf delta to + *			calculate CPU busy.   * @prev_aperf:		Last APERF value read from APERF MSR   * @prev_mperf:		Last MPERF value read from MPERF MSR   * @prev_tsc:		Last timestamp counter (TSC) value @@ -259,6 +262,7 @@ struct cpudata {  	u64	last_update;  	u64	last_sample_time; +	u64	aperf_mperf_shift;  	u64	prev_aperf;  	u64	prev_mperf;  	u64	prev_tsc; @@ -321,6 +325,7 @@ struct pstate_funcs {  	int (*get_min)(void);  	int (*get_turbo)(void);  	int (*get_scaling)(void); +	int (*get_aperf_mperf_shift)(void);  	u64 (*get_val)(struct cpudata*, int pstate);  	void (*get_vid)(struct cpudata *);  	void (*update_util)(struct update_util_data *data, u64 time, @@ -1486,6 +1491,11 @@ static u64 core_get_val(struct cpudata *cpudata, int pstate)  	return val;  } +static int knl_get_aperf_mperf_shift(void) +{ +	return 10; +} +  static int knl_get_turbo_pstate(void)  {  	u64 value; @@ -1543,6 +1553,9 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)  	cpu->pstate.max_freq = cpu->pstate.max_pstate * cpu->pstate.scaling;  	cpu->pstate.turbo_freq = cpu->pstate.turbo_pstate * cpu->pstate.scaling; +	if (pstate_funcs.get_aperf_mperf_shift) +		cpu->aperf_mperf_shift = pstate_funcs.get_aperf_mperf_shift(); +  	if (pstate_funcs.get_vid)  		pstate_funcs.get_vid(cpu); @@ -1600,8 +1613,7 @@ static inline bool intel_pstate_sample(struct cpudata *cpu, u64 time)  static inline int32_t get_avg_frequency(struct cpudata *cpu)  { -	return mul_ext_fp(cpu->sample.core_avg_perf, -			  cpu->pstate.max_pstate_physical * cpu->pstate.scaling); +	return mul_ext_fp(cpu->sample.core_avg_perf, cpu_khz);  }  static inline int32_t get_avg_pstate(struct cpudata *cpu) @@ -1616,7 +1628,8 @@ static inline int32_t get_target_pstate_use_cpu_load(struct cpudata *cpu)  	int32_t busy_frac, boost;  	int target, avg_pstate; -	busy_frac = div_fp(sample->mperf, sample->tsc); +	busy_frac = div_fp(sample->mperf << cpu->aperf_mperf_shift, +			   sample->tsc);  	boost = cpu->iowait_boost;  	cpu->iowait_boost >>= 1; @@ -1675,7 +1688,8 @@ static inline int32_t get_target_pstate_use_performance(struct cpudata *cpu)  		sample_ratio = div_fp(pid_params.sample_rate_ns, duration_ns);  		perf_scaled = mul_fp(perf_scaled, sample_ratio);  	} else { -		sample_ratio = div_fp(100 * cpu->sample.mperf, cpu->sample.tsc); +		sample_ratio = div_fp(100 * (cpu->sample.mperf << cpu->aperf_mperf_shift), +				      cpu->sample.tsc);  		if (sample_ratio < int_tofp(1))  			perf_scaled = 0;  	} @@ -1807,6 +1821,7 @@ static const struct pstate_funcs knl_funcs = {  	.get_max_physical = core_get_max_pstate_physical,  	.get_min = core_get_min_pstate,  	.get_turbo = knl_get_turbo_pstate, +	.get_aperf_mperf_shift = knl_get_aperf_mperf_shift,  	.get_scaling = core_get_scaling,  	.get_val = core_get_val,  	.update_util = intel_pstate_update_util_pid, @@ -1906,13 +1921,6 @@ static int intel_pstate_init_cpu(unsigned int cpunum)  	return 0;  } -static unsigned int intel_pstate_get(unsigned int cpu_num) -{ -	struct cpudata *cpu = all_cpu_data[cpu_num]; - -	return cpu ? get_avg_frequency(cpu) : 0; -} -  static void intel_pstate_set_update_util_hook(unsigned int cpu_num)  {  	struct cpudata *cpu = all_cpu_data[cpu_num]; @@ -2153,7 +2161,6 @@ static struct cpufreq_driver intel_pstate = {  	.setpolicy	= intel_pstate_set_policy,  	.suspend	= intel_pstate_hwp_save_state,  	.resume		= intel_pstate_resume, -	.get		= intel_pstate_get,  	.init		= intel_pstate_cpu_init,  	.exit		= intel_pstate_cpu_exit,  	.stop_cpu	= intel_pstate_stop_cpu, @@ -2403,6 +2410,7 @@ static void __init copy_cpu_funcs(struct pstate_funcs *funcs)  	pstate_funcs.get_val   = funcs->get_val;  	pstate_funcs.get_vid   = funcs->get_vid;  	pstate_funcs.update_util = funcs->update_util; +	pstate_funcs.get_aperf_mperf_shift = funcs->get_aperf_mperf_shift;  	intel_pstate_use_acpi_profile();  }  |