diff options
| -rw-r--r-- | drivers/cpufreq/intel_pstate.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index c6e10d02b79..4a437ffc518 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c @@ -117,6 +117,8 @@ struct perf_limits {  	int min_perf_pct;  	int32_t max_perf;  	int32_t min_perf; +	int max_policy_pct; +	int max_sysfs_pct;  };  static struct perf_limits limits = { @@ -125,6 +127,8 @@ static struct perf_limits limits = {  	.max_perf = int_tofp(1),  	.min_perf_pct = 0,  	.min_perf = 0, +	.max_policy_pct = 100, +	.max_sysfs_pct = 100,  };  static inline void pid_reset(struct _pid *pid, int setpoint, int busy, @@ -295,7 +299,8 @@ static ssize_t store_max_perf_pct(struct kobject *a, struct attribute *b,  	if (ret != 1)  		return -EINVAL; -	limits.max_perf_pct = clamp_t(int, input, 0 , 100); +	limits.max_sysfs_pct = clamp_t(int, input, 0 , 100); +	limits.max_perf_pct = min(limits.max_policy_pct, limits.max_sysfs_pct);  	limits.max_perf = div_fp(int_tofp(limits.max_perf_pct), int_tofp(100));  	return count;  } @@ -646,8 +651,9 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)  	limits.min_perf_pct = clamp_t(int, limits.min_perf_pct, 0 , 100);  	limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100)); -	limits.max_perf_pct = policy->max * 100 / policy->cpuinfo.max_freq; -	limits.max_perf_pct = clamp_t(int, limits.max_perf_pct, 0 , 100); +	limits.max_policy_pct = policy->max * 100 / policy->cpuinfo.max_freq; +	limits.max_policy_pct = clamp_t(int, limits.max_policy_pct, 0 , 100); +	limits.max_perf_pct = min(limits.max_policy_pct, limits.max_sysfs_pct);  	limits.max_perf = div_fp(int_tofp(limits.max_perf_pct), int_tofp(100));  	return 0;  |