]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cpufreq/amd-pstate: Cache the max frequency in cpudata
authorMario Limonciello (AMD) <superm1@kernel.org>
Thu, 26 Mar 2026 19:36:20 +0000 (14:36 -0500)
committerMario Limonciello (AMD) <superm1@kernel.org>
Thu, 2 Apr 2026 16:28:54 +0000 (11:28 -0500)
The value of maximum frequency is fixed and never changes. Doing
calculations every time based off of perf is unnecessary.

Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Link: https://lore.kernel.org/r/20260326193620.649441-1-mario.limonciello@amd.com
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
drivers/cpufreq/amd-pstate.c
drivers/cpufreq/amd-pstate.h

index ed9fd4155a256965b31fbbc3b27585ca15aec876..f207252eb5f5fbc0d0eb08febf74906b312a3cc7 100644 (file)
@@ -826,15 +826,13 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
 static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
 {
        struct amd_cpudata *cpudata = policy->driver_data;
-       union perf_cached perf = READ_ONCE(cpudata->perf);
-       u32 nominal_freq, max_freq;
+       u32 nominal_freq;
        int ret = 0;
 
        nominal_freq = READ_ONCE(cpudata->nominal_freq);
-       max_freq = perf_to_freq(perf, cpudata->nominal_freq, perf.highest_perf);
 
        if (on)
-               policy->cpuinfo.max_freq = max_freq;
+               policy->cpuinfo.max_freq = cpudata->max_freq;
        else if (policy->cpuinfo.max_freq > nominal_freq)
                policy->cpuinfo.max_freq = nominal_freq;
 
@@ -1021,13 +1019,15 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
 
        WRITE_ONCE(cpudata->nominal_freq, nominal_freq);
 
+       /* max_freq is calculated according to (nominal_freq * highest_perf)/nominal_perf */
        max_freq = perf_to_freq(perf, nominal_freq, perf.highest_perf);
+       WRITE_ONCE(cpudata->max_freq, max_freq);
+
        lowest_nonlinear_freq = perf_to_freq(perf, nominal_freq, perf.lowest_nonlinear_perf);
        WRITE_ONCE(cpudata->lowest_nonlinear_freq, lowest_nonlinear_freq);
 
        /**
         * Below values need to be initialized correctly, otherwise driver will fail to load
-        * max_freq is calculated according to (nominal_freq * highest_perf)/nominal_perf
         * lowest_nonlinear_freq is a value between [min_freq, nominal_freq]
         * Check _CPC in ACPI table objects if any values are incorrect
         */
@@ -1090,9 +1090,7 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
        policy->cpuinfo.min_freq = policy->min = perf_to_freq(perf,
                                                              cpudata->nominal_freq,
                                                              perf.lowest_perf);
-       policy->cpuinfo.max_freq = policy->max = perf_to_freq(perf,
-                                                             cpudata->nominal_freq,
-                                                             perf.highest_perf);
+       policy->cpuinfo.max_freq = policy->max = cpudata->max_freq;
 
        policy->driver_data = cpudata;
        ret = amd_pstate_cppc_enable(policy);
@@ -1167,14 +1165,9 @@ static void amd_pstate_cpu_exit(struct cpufreq_policy *policy)
 static ssize_t show_amd_pstate_max_freq(struct cpufreq_policy *policy,
                                        char *buf)
 {
-       struct amd_cpudata *cpudata;
-       union perf_cached perf;
-
-       cpudata = policy->driver_data;
-       perf = READ_ONCE(cpudata->perf);
+       struct amd_cpudata *cpudata = policy->driver_data;
 
-       return sysfs_emit(buf, "%u\n",
-                         perf_to_freq(perf, cpudata->nominal_freq, perf.highest_perf));
+       return sysfs_emit(buf, "%u\n", cpudata->max_freq);
 }
 
 static ssize_t show_amd_pstate_lowest_nonlinear_freq(struct cpufreq_policy *policy,
@@ -1702,9 +1695,7 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
        policy->cpuinfo.min_freq = policy->min = perf_to_freq(perf,
                                                              cpudata->nominal_freq,
                                                              perf.lowest_perf);
-       policy->cpuinfo.max_freq = policy->max = perf_to_freq(perf,
-                                                             cpudata->nominal_freq,
-                                                             perf.highest_perf);
+       policy->cpuinfo.max_freq = policy->max = cpudata->max_freq;
        policy->driver_data = cpudata;
 
        ret = amd_pstate_cppc_enable(policy);
index faead0b19a8a4fcf91f668ace4f4e84640302c7f..32b8b26ce388f080f7e421ebe5b2325496ac77b9 100644 (file)
@@ -73,6 +73,7 @@ struct amd_aperf_mperf {
  * @min_limit_freq: Cached value of policy->min (in khz)
  * @max_limit_freq: Cached value of policy->max (in khz)
  * @nominal_freq: the frequency (in khz) that mapped to nominal_perf
+ * @max_freq: in ideal conditions the maximum frequency (in khz) possible frequency
  * @lowest_nonlinear_freq: the frequency (in khz) that mapped to lowest_nonlinear_perf
  * @floor_freq: Cached value of the user requested floor_freq
  * @cur: Difference of Aperf/Mperf/tsc count between last and current sample
@@ -103,6 +104,7 @@ struct amd_cpudata {
        u32     min_limit_freq;
        u32     max_limit_freq;
        u32     nominal_freq;
+       u32     max_freq;
        u32     lowest_nonlinear_freq;
        u32     floor_freq;