[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260120145623.2959636-10-sumitg@nvidia.com>
Date: Tue, 20 Jan 2026 20:26:23 +0530
From: Sumit Gupta <sumitg@...dia.com>
To: <rafael@...nel.org>, <viresh.kumar@...aro.org>, <pierre.gondois@....com>,
<zhenglifeng1@...wei.com>, <ionela.voinescu@....com>, <lenb@...nel.org>,
<robert.moore@...el.com>, <corbet@....net>, <rdunlap@...radead.org>,
<ray.huang@....com>, <gautham.shenoy@....com>, <mario.limonciello@....com>,
<perry.yuan@....com>, <zhanjie9@...ilicon.com>, <linux-pm@...r.kernel.org>,
<linux-acpi@...r.kernel.org>, <linux-doc@...r.kernel.org>,
<acpica-devel@...ts.linux.dev>, <linux-kernel@...r.kernel.org>
CC: <linux-tegra@...r.kernel.org>, <treding@...dia.com>,
<jonathanh@...dia.com>, <vsethi@...dia.com>, <ksitaraman@...dia.com>,
<sanjayc@...dia.com>, <nhartman@...dia.com>, <bbasu@...dia.com>,
<sumitg@...dia.com>
Subject: [PATCH v6 9/9] cpufreq: CPPC: Update cached perf_ctrls on sysfs write
Update the cached perf_ctrls values when writing via sysfs to keep
them in sync with hardware registers:
- store_auto_select(): update perf_ctrls.auto_sel
- store_energy_performance_preference_val(): update perf_ctrls.energy_perf
Add mutex protection to these functions to ensure hardware register
writes and cache updates are atomic.
This ensures consistent cached values after sysfs writes, which
complements the cppc_get_perf() initialization during policy setup.
Signed-off-by: Sumit Gupta <sumitg@...dia.com>
---
drivers/cpufreq/cppc_cpufreq.c | 35 ++++++++++++++++++++++++++++++++--
1 file changed, 33 insertions(+), 2 deletions(-)
diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
index afb2cdb67a2f..946fb93179d7 100644
--- a/drivers/cpufreq/cppc_cpufreq.c
+++ b/drivers/cpufreq/cppc_cpufreq.c
@@ -886,6 +886,7 @@ static ssize_t show_auto_select(struct cpufreq_policy *policy, char *buf)
static ssize_t store_auto_select(struct cpufreq_policy *policy,
const char *buf, size_t count)
{
+ struct cppc_cpudata *cpu_data = policy->driver_data;
bool val;
int ret;
@@ -893,10 +894,14 @@ static ssize_t store_auto_select(struct cpufreq_policy *policy,
if (ret)
return ret;
+ guard(mutex)(&cppc_cpufreq_autonomous_lock);
+
ret = cppc_set_auto_sel(policy->cpu, val);
if (ret)
return ret;
+ cpu_data->perf_ctrls.auto_sel = val;
+
return count;
}
@@ -946,8 +951,34 @@ static ssize_t store_##_name(struct cpufreq_policy *policy, \
CPPC_CPUFREQ_ATTR_RW_U64(auto_act_window, cppc_get_auto_act_window,
cppc_set_auto_act_window)
-CPPC_CPUFREQ_ATTR_RW_U64(energy_performance_preference_val,
- cppc_get_epp_perf, cppc_set_epp)
+static ssize_t
+show_energy_performance_preference_val(struct cpufreq_policy *policy, char *buf)
+{
+ return cppc_cpufreq_sysfs_show_u64(policy->cpu, cppc_get_epp_perf, buf);
+}
+
+static ssize_t
+store_energy_performance_preference_val(struct cpufreq_policy *policy,
+ const char *buf, size_t count)
+{
+ struct cppc_cpudata *cpu_data = policy->driver_data;
+ u64 val;
+ int ret;
+
+ ret = kstrtou64(buf, 0, &val);
+ if (ret)
+ return ret;
+
+ guard(mutex)(&cppc_cpufreq_autonomous_lock);
+
+ ret = cppc_set_epp(policy->cpu, val);
+ if (ret)
+ return ret;
+
+ cpu_data->perf_ctrls.energy_perf = val;
+
+ return count;
+}
/**
* show_min_perf - Show minimum performance as frequency (kHz)
--
2.34.1
Powered by blists - more mailing lists