intel_pstate: honor user space min_perf_pct override on resume
authorKristen Carlson Accardi <kristen@linux.intel.com>
Thu, 29 Jan 2015 21:03:52 +0000 (13:03 -0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 30 Jan 2015 00:52:17 +0000 (01:52 +0100)
If the user has requested an override of the min_perf_pct via
sysfs, then it should be restored whenever policy is updated,
such as on resume.  Take the max of whatever the user requested
and whatever the policy is.

Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/intel_pstate.c

index dfee5725903b7060a9f8f417944ee6d3babadabb..e7e808d9a8afb4f1a17391715df40ab5a4a3c3ac 100644 (file)
@@ -148,6 +148,8 @@ struct perf_limits {
        int32_t min_perf;
        int max_policy_pct;
        int max_sysfs_pct;
+       int min_policy_pct;
+       int min_sysfs_pct;
 };
 
 static struct perf_limits limits = {
@@ -159,6 +161,8 @@ static struct perf_limits limits = {
        .min_perf = 0,
        .max_policy_pct = 100,
        .max_sysfs_pct = 100,
+       .min_policy_pct = 0,
+       .min_sysfs_pct = 0,
 };
 
 static inline void pid_reset(struct _pid *pid, int setpoint, int busy,
@@ -431,7 +435,9 @@ static ssize_t store_min_perf_pct(struct kobject *a, struct attribute *b,
        ret = sscanf(buf, "%u", &input);
        if (ret != 1)
                return -EINVAL;
-       limits.min_perf_pct = clamp_t(int, input, 0 , 100);
+
+       limits.min_sysfs_pct = clamp_t(int, input, 0 , 100);
+       limits.min_perf_pct = max(limits.min_policy_pct, limits.min_sysfs_pct);
        limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
 
        if (hwp_active)
@@ -921,6 +927,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
 
        if (policy->policy == CPUFREQ_POLICY_PERFORMANCE &&
            policy->max >= policy->cpuinfo.max_freq) {
+               limits.min_policy_pct = 100;
                limits.min_perf_pct = 100;
                limits.min_perf = int_tofp(1);
                limits.max_policy_pct = 100;
@@ -930,8 +937,9 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
                return 0;
        }
 
-       limits.min_perf_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
-       limits.min_perf_pct = clamp_t(int, limits.min_perf_pct, 0 , 100);
+       limits.min_policy_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
+       limits.min_policy_pct = clamp_t(int, limits.min_policy_pct, 0 , 100);
+       limits.min_perf_pct = max(limits.min_policy_pct, limits.min_sysfs_pct);
        limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
 
        limits.max_policy_pct = (policy->max * 100) / policy->cpuinfo.max_freq;