]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tools/power x86_energy_perf_policy: Prefer driver HWP limits
authorLen Brown <len.brown@intel.com>
Fri, 19 Sep 2025 19:56:46 +0000 (15:56 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Dec 2025 11:45:08 +0000 (12:45 +0100)
[ Upstream commit 2734fdbc9bb8a3aeb309ba0d62212d7f53f30bc7 ]

When we are successful in using cpufreq min/max limits,
skip setting the raw MSR limits entirely.

This is necessary to avoid undoing any modification that
the cpufreq driver makes to our sysfs request.

eg. intel_pstate may take our request for a limit
that is valid according to HWP.CAP.MIN/MAX and clip
it to be within the range available in PLATFORM_INFO.

Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c

index 0cb17e13c002b0847a4018f387bc594bc4cc9162..c878e2e1cabea0b7acaa0b790c42ee521846faf5 100644 (file)
@@ -62,6 +62,7 @@ unsigned char turbo_update_value;
 unsigned char update_hwp_epp;
 unsigned char update_hwp_min;
 unsigned char update_hwp_max;
+unsigned char hwp_limits_done_via_sysfs;
 unsigned char update_hwp_desired;
 unsigned char update_hwp_window;
 unsigned char update_hwp_use_pkg;
@@ -809,8 +810,10 @@ int ratio_2_sysfs_khz(int ratio)
 }
 /*
  * If HWP is enabled and cpufreq sysfs attribtes are present,
- * then update sysfs, so that it will not become
- * stale when we write to MSRs.
+ * then update via sysfs. The intel_pstate driver may modify (clip)
+ * this request, say, when HWP_CAP is outside of PLATFORM_INFO limits,
+ * and the driver-chosen value takes precidence.
+ *
  * (intel_pstate's max_perf_pct and min_perf_pct will follow cpufreq,
  *  so we don't have to touch that.)
  */
@@ -865,6 +868,8 @@ int update_sysfs(int cpu)
        if (update_hwp_max)
                update_cpufreq_scaling_freq(1, cpu, req_update.hwp_max);
 
+       hwp_limits_done_via_sysfs = 1;
+
        return 0;
 }
 
@@ -943,10 +948,10 @@ int update_hwp_request(int cpu)
        if (debug)
                print_hwp_request(cpu, &req, "old: ");
 
-       if (update_hwp_min)
+       if (update_hwp_min && !hwp_limits_done_via_sysfs)
                req.hwp_min = req_update.hwp_min;
 
-       if (update_hwp_max)
+       if (update_hwp_max && !hwp_limits_done_via_sysfs)
                req.hwp_max = req_update.hwp_max;
 
        if (update_hwp_desired)