]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cpufreq/amd-pstate: store all values in cpudata struct in khz
authorMario Limonciello <mario.limonciello@amd.com>
Mon, 9 Dec 2024 18:52:41 +0000 (12:52 -0600)
committerMario Limonciello <mario.limonciello@amd.com>
Wed, 11 Dec 2024 16:44:53 +0000 (10:44 -0600)
Storing values in the cpudata structure in different units leads
to confusion and hardcoded conversions elsewhere.  After ratios are
calculated store everything in khz for any future use. Adjust all
relevant consumers for this change as well.

Suggested-by: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Link: https://lore.kernel.org/r/20241209185248.16301-9-mario.limonciello@amd.com
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
drivers/cpufreq/amd-pstate-ut.c
drivers/cpufreq/amd-pstate.c

index a261d7300951e07eb4808fc8147809d1c7da93fe..3a0a380c3590c7fd15c81c8910417fde00c36290 100644 (file)
@@ -207,7 +207,6 @@ static void amd_pstate_ut_check_freq(u32 index)
        int cpu = 0;
        struct cpufreq_policy *policy = NULL;
        struct amd_cpudata *cpudata = NULL;
-       u32 nominal_freq_khz;
 
        for_each_possible_cpu(cpu) {
                policy = cpufreq_cpu_get(cpu);
@@ -215,14 +214,13 @@ static void amd_pstate_ut_check_freq(u32 index)
                        break;
                cpudata = policy->driver_data;
 
-               nominal_freq_khz = cpudata->nominal_freq*1000;
-               if (!((cpudata->max_freq >= nominal_freq_khz) &&
-                       (nominal_freq_khz > cpudata->lowest_nonlinear_freq) &&
+               if (!((cpudata->max_freq >= cpudata->nominal_freq) &&
+                       (cpudata->nominal_freq > cpudata->lowest_nonlinear_freq) &&
                        (cpudata->lowest_nonlinear_freq > cpudata->min_freq) &&
                        (cpudata->min_freq > 0))) {
                        amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
                        pr_err("%s cpu%d max=%d >= nominal=%d > lowest_nonlinear=%d > min=%d > 0, the formula is incorrect!\n",
-                               __func__, cpu, cpudata->max_freq, nominal_freq_khz,
+                               __func__, cpu, cpudata->max_freq, cpudata->nominal_freq,
                                cpudata->lowest_nonlinear_freq, cpudata->min_freq);
                        goto skip_test;
                }
@@ -236,13 +234,13 @@ static void amd_pstate_ut_check_freq(u32 index)
 
                if (cpudata->boost_supported) {
                        if ((policy->max == cpudata->max_freq) ||
-                                       (policy->max == nominal_freq_khz))
+                                       (policy->max == cpudata->nominal_freq))
                                amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
                        else {
                                amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_FAIL;
                                pr_err("%s cpu%d policy_max=%d should be equal cpu_max=%d or cpu_nominal=%d !\n",
                                        __func__, cpu, policy->max, cpudata->max_freq,
-                                       nominal_freq_khz);
+                                       cpudata->nominal_freq);
                                goto skip_test;
                        }
                } else {
index ebfc9e20b6cb5a61ff3e3dba804ba56f673b48ba..bf2512e1f117e609f279e070dff56aedd56991b2 100644 (file)
@@ -739,8 +739,8 @@ static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
 
        if (on)
                policy->cpuinfo.max_freq = max_freq;
-       else if (policy->cpuinfo.max_freq > nominal_freq * 1000)
-               policy->cpuinfo.max_freq = nominal_freq * 1000;
+       else if (policy->cpuinfo.max_freq > nominal_freq)
+               policy->cpuinfo.max_freq = nominal_freq;
 
        policy->max = policy->cpuinfo.max_freq;
 
@@ -940,29 +940,29 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
                return ret;
 
        if (quirks && quirks->lowest_freq)
-               min_freq = quirks->lowest_freq * 1000;
+               min_freq = quirks->lowest_freq;
        else
-               min_freq = cppc_perf.lowest_freq * 1000;
+               min_freq = cppc_perf.lowest_freq;
 
        if (quirks && quirks->nominal_freq)
-               nominal_freq = quirks->nominal_freq ;
+               nominal_freq = quirks->nominal_freq;
        else
                nominal_freq = cppc_perf.nominal_freq;
 
        nominal_perf = READ_ONCE(cpudata->nominal_perf);
 
        boost_ratio = div_u64(cpudata->highest_perf << SCHED_CAPACITY_SHIFT, nominal_perf);
-       max_freq = (nominal_freq * boost_ratio >> SCHED_CAPACITY_SHIFT) * 1000;
+       max_freq = (nominal_freq * boost_ratio >> SCHED_CAPACITY_SHIFT);
 
        lowest_nonlinear_perf = READ_ONCE(cpudata->lowest_nonlinear_perf);
        lowest_nonlinear_ratio = div_u64(lowest_nonlinear_perf << SCHED_CAPACITY_SHIFT,
                                         nominal_perf);
-       lowest_nonlinear_freq = (nominal_freq * lowest_nonlinear_ratio >> SCHED_CAPACITY_SHIFT) * 1000;
+       lowest_nonlinear_freq = (nominal_freq * lowest_nonlinear_ratio >> SCHED_CAPACITY_SHIFT);
 
-       WRITE_ONCE(cpudata->min_freq, min_freq);
-       WRITE_ONCE(cpudata->lowest_nonlinear_freq, lowest_nonlinear_freq);
-       WRITE_ONCE(cpudata->nominal_freq, nominal_freq);
-       WRITE_ONCE(cpudata->max_freq, max_freq);
+       WRITE_ONCE(cpudata->min_freq, min_freq * 1000);
+       WRITE_ONCE(cpudata->lowest_nonlinear_freq, lowest_nonlinear_freq * 1000);
+       WRITE_ONCE(cpudata->nominal_freq, nominal_freq * 1000);
+       WRITE_ONCE(cpudata->max_freq, max_freq * 1000);
 
        /**
         * Below values need to be initialized correctly, otherwise driver will fail to load
@@ -972,13 +972,13 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
         */
        if (min_freq <= 0 || max_freq <= 0 || nominal_freq <= 0 || min_freq > max_freq) {
                pr_err("min_freq(%d) or max_freq(%d) or nominal_freq(%d) value is incorrect\n",
-                       min_freq, max_freq, nominal_freq * 1000);
+                       min_freq, max_freq, nominal_freq);
                return -EINVAL;
        }
 
-       if (lowest_nonlinear_freq <= min_freq || lowest_nonlinear_freq > nominal_freq * 1000) {
+       if (lowest_nonlinear_freq <= min_freq || lowest_nonlinear_freq > nominal_freq) {
                pr_err("lowest_nonlinear_freq(%d) value is out of range [min_freq(%d), nominal_freq(%d)]\n",
-                       lowest_nonlinear_freq, min_freq, nominal_freq * 1000);
+                       lowest_nonlinear_freq, min_freq, nominal_freq);
                return -EINVAL;
        }