diff options
Diffstat (limited to 'drivers/cpufreq/amd-pstate.c')
| -rw-r--r-- | drivers/cpufreq/amd-pstate.c | 50 | 
1 files changed, 26 insertions, 24 deletions
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c index d7630bab2516..66e5dfc711c0 100644 --- a/drivers/cpufreq/amd-pstate.c +++ b/drivers/cpufreq/amd-pstate.c @@ -374,15 +374,19 @@ static inline int amd_pstate_cppc_enable(bool enable)  static int msr_init_perf(struct amd_cpudata *cpudata)  { -	u64 cap1; +	u64 cap1, numerator;  	int ret = rdmsrl_safe_on_cpu(cpudata->cpu, MSR_AMD_CPPC_CAP1,  				     &cap1);  	if (ret)  		return ret; -	WRITE_ONCE(cpudata->highest_perf, AMD_CPPC_HIGHEST_PERF(cap1)); -	WRITE_ONCE(cpudata->max_limit_perf, AMD_CPPC_HIGHEST_PERF(cap1)); +	ret = amd_get_boost_ratio_numerator(cpudata->cpu, &numerator); +	if (ret) +		return ret; + +	WRITE_ONCE(cpudata->highest_perf, numerator); +	WRITE_ONCE(cpudata->max_limit_perf, numerator);  	WRITE_ONCE(cpudata->nominal_perf, AMD_CPPC_NOMINAL_PERF(cap1));  	WRITE_ONCE(cpudata->lowest_nonlinear_perf, AMD_CPPC_LOWNONLIN_PERF(cap1));  	WRITE_ONCE(cpudata->lowest_perf, AMD_CPPC_LOWEST_PERF(cap1)); @@ -394,13 +398,18 @@ static int msr_init_perf(struct amd_cpudata *cpudata)  static int shmem_init_perf(struct amd_cpudata *cpudata)  {  	struct cppc_perf_caps cppc_perf; +	u64 numerator;  	int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);  	if (ret)  		return ret; -	WRITE_ONCE(cpudata->highest_perf, cppc_perf.highest_perf); -	WRITE_ONCE(cpudata->max_limit_perf, cppc_perf.highest_perf); +	ret = amd_get_boost_ratio_numerator(cpudata->cpu, &numerator); +	if (ret) +		return ret; + +	WRITE_ONCE(cpudata->highest_perf, numerator); +	WRITE_ONCE(cpudata->max_limit_perf, numerator);  	WRITE_ONCE(cpudata->nominal_perf, cppc_perf.nominal_perf);  	WRITE_ONCE(cpudata->lowest_nonlinear_perf,  		   cppc_perf.lowest_nonlinear_perf); @@ -561,16 +570,13 @@ static int amd_pstate_verify(struct cpufreq_policy_data *policy_data)  static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)  { -	u32 max_limit_perf, min_limit_perf, lowest_perf, max_perf; +	u32 max_limit_perf, min_limit_perf, lowest_perf, max_perf, max_freq;  	struct amd_cpudata *cpudata = policy->driver_data; -	if (cpudata->boost_supported && !policy->boost_enabled) -		max_perf = READ_ONCE(cpudata->nominal_perf); -	else -		max_perf = READ_ONCE(cpudata->highest_perf); - -	max_limit_perf = div_u64(policy->max * max_perf, policy->cpuinfo.max_freq); -	min_limit_perf = div_u64(policy->min * max_perf, policy->cpuinfo.max_freq); +	max_perf = READ_ONCE(cpudata->highest_perf); +	max_freq = READ_ONCE(cpudata->max_freq); +	max_limit_perf = div_u64(policy->max * max_perf, max_freq); +	min_limit_perf = div_u64(policy->min * max_perf, max_freq);  	lowest_perf = READ_ONCE(cpudata->lowest_perf);  	if (min_limit_perf < lowest_perf) @@ -889,7 +895,6 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)  {  	int ret;  	u32 min_freq, max_freq; -	u64 numerator;  	u32 nominal_perf, nominal_freq;  	u32 lowest_nonlinear_perf, lowest_nonlinear_freq;  	u32 boost_ratio, lowest_nonlinear_ratio; @@ -911,10 +916,7 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)  	nominal_perf = READ_ONCE(cpudata->nominal_perf); -	ret = amd_get_boost_ratio_numerator(cpudata->cpu, &numerator); -	if (ret) -		return ret; -	boost_ratio = div_u64(numerator << SCHED_CAPACITY_SHIFT, nominal_perf); +	boost_ratio = div_u64(cpudata->highest_perf << SCHED_CAPACITY_SHIFT, nominal_perf);  	max_freq = (nominal_freq * boost_ratio >> SCHED_CAPACITY_SHIFT) * 1000;  	lowest_nonlinear_perf = READ_ONCE(cpudata->lowest_nonlinear_perf); @@ -1869,18 +1871,18 @@ static int __init amd_pstate_init(void)  		static_call_update(amd_pstate_update_perf, shmem_update_perf);  	} -	ret = amd_pstate_register_driver(cppc_state); -	if (ret) { -		pr_err("failed to register with return %d\n", ret); -		return ret; -	} -  	if (amd_pstate_prefcore) {  		ret = amd_detect_prefcore(&amd_pstate_prefcore);  		if (ret)  			return ret;  	} +	ret = amd_pstate_register_driver(cppc_state); +	if (ret) { +		pr_err("failed to register with return %d\n", ret); +		return ret; +	} +  	dev_root = bus_get_dev_root(&cpu_subsys);  	if (dev_root) {  		ret = sysfs_create_group(&dev_root->kobj, &amd_pstate_global_attr_group);  | 
