| From 9e8ab0636dc9843ddde56dc6f8504d67381d2a53 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 22 Jul 2025 05:55:40 +0000 |
| Subject: cpufreq: CPPC: Mark driver with NEED_UPDATE_LIMITS flag |
| |
| From: Prashant Malani <pmalani@google.com> |
| |
| [ Upstream commit 0a1416a49e63c320f6e6c1c8d07e1b58c0d4a3f3 ] |
| |
| AMU counters on certain CPPC-based platforms tend to yield inaccurate |
| delivered performance measurements on systems that are idle/mostly idle. |
| This results in an inaccurate frequency being stored by cpufreq in its |
| policy structure when the CPU is brought online. [1] |
| |
| Consequently, if the userspace governor tries to set the frequency to a |
| new value, there is a possibility that it would be the erroneous value |
| stored earlier. In such a scenario, cpufreq would assume that the |
| requested frequency has already been set and return early, resulting in |
| the correct/new frequency request never making it to the hardware. |
| |
| Since the operating frequency is liable to this sort of inconsistency, |
| mark the CPPC driver with CPUFREQ_NEED_UPDATE_LIMITS so that it is always |
| invoked when a target frequency update is requested. |
| |
| Link: https://lore.kernel.org/linux-pm/20250619000925.415528-3-pmalani@google.com/ [1] |
| Suggested-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Prashant Malani <pmalani@google.com> |
| Acked-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Link: https://patch.msgid.link/20250722055611.130574-2-pmalani@google.com |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/cpufreq/cppc_cpufreq.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c |
| index aa34af940cb5..ea32bdf7cc24 100644 |
| --- a/drivers/cpufreq/cppc_cpufreq.c |
| +++ b/drivers/cpufreq/cppc_cpufreq.c |
| @@ -847,7 +847,7 @@ static struct freq_attr *cppc_cpufreq_attr[] = { |
| }; |
| |
| static struct cpufreq_driver cppc_cpufreq_driver = { |
| - .flags = CPUFREQ_CONST_LOOPS, |
| + .flags = CPUFREQ_CONST_LOOPS | CPUFREQ_NEED_UPDATE_LIMITS, |
| .verify = cppc_verify_policy, |
| .target = cppc_cpufreq_set_target, |
| .get = cppc_cpufreq_get_rate, |
| -- |
| 2.39.5 |
| |