]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cpufreq: CPPC: Update cached perf_ctrls on sysfs write
authorSumit Gupta <sumitg@nvidia.com>
Fri, 6 Feb 2026 14:26:55 +0000 (19:56 +0530)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 27 Feb 2026 19:50:42 +0000 (20:50 +0100)
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

This ensures consistent cached values after sysfs writes, which
complements the cppc_get_perf() initialization during policy setup.

Signed-off-by: Sumit Gupta <sumitg@nvidia.com>
Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
Reviewed-by: Lifeng Zheng <zhenglifeng1@huawei.com>
Link: https://patch.msgid.link/20260206142658.72583-5-sumitg@nvidia.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/cppc_cpufreq.c

index a61a24e0dcaedcfb418246ce1f4e10b6560c1c20..ebb5746df220e1bab6e7c2b2c6e171a220a53789 100644 (file)
@@ -855,6 +855,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;
 
@@ -866,6 +867,8 @@ static ssize_t store_auto_select(struct cpufreq_policy *policy,
        if (ret)
                return ret;
 
+       cpu_data->perf_ctrls.auto_sel = val;
+
        return count;
 }
 
@@ -916,8 +919,32 @@ 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;
+
+       ret = cppc_set_epp(policy->cpu, val);
+       if (ret)
+               return ret;
+
+       cpu_data->perf_ctrls.energy_perf = val;
+
+       return count;
+}
 
 cpufreq_freq_attr_ro(freqdomain_cpus);
 cpufreq_freq_attr_rw(auto_select);