cpufreq/amd-pstate: Cache the max frequency in cpudata
Subsystems (2)
PATCH v2 1/1 cpufreq/amd-pstate: Cache the max frequency in cpudata
The value of maximum frequency is fixed and never changes. Doing calculations every time based off of perf is unnecessary.
Signed-off-by Mario Limonciello (AMD) <[email protected]>
---
v2:
* Remove unused variable
--- drivers/cpufreq/amd-pstate.c | 27 +++++++++------------------ drivers/cpufreq/amd-pstate.h | 1 + 2 files changed, 10 insertions(+), 18 deletions(-)
drivers/cpufreq/amd-pstate.c +9 -18
@@ -757,15 +757,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;
@@ -952,13 +950,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 */
@@ -1021,9 +1021,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; ret =amd_pstate_cppc_enable (policy);if (ret)
@@ -1090,14 +1088,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,
@@ -1503,9 +1496,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);
drivers/cpufreq/amd-pstate.h +1 -0
@@ -94,6 +94,7 @@ struct amd_cpudata {u32 min_limit_freq;u32 max_limit_freq;u32 nominal_freq; +u32 max_freq;u32 lowest_nonlinear_freq;struct amd_aperf_mperf cur;
Signature · 1 line
2.43.0
Quoted 95 lines · Mario Limonciello (AMD)
The value of maximum frequency is fixed and never changes. Doing calculations every time based off of perf is unnecessary.
Signed-off-by Mario Limonciello (AMD) <[email protected]>---
v2:
* Remove unused variable--- drivers/cpufreq/amd-pstate.c | 27 +++++++++------------------ drivers/cpufreq/amd-pstate.h | 1 + 2 files changed, 10 insertions(+), 18 deletions(-)drivers/cpufreq/amd-pstate.c +9
-18@@ -757,15 +757,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;@@ -952,13 +950,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 */ @@ -1021,9 +1021,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; ret =amd_pstate_cppc_enable (policy);if (ret)@@ -1090,14 +1088,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,@@ -1503,9 +1496,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);drivers/cpufreq/amd-pstate.h +0
-0
drivers/cpufreq/amd-pstate.h struct amd_cpudata { · line 97
Quoted 4 lines
drivers/cpufreq/amd-pstate.h +1
-0@@ -94,6 +94,7 @@ struct amd_cpudata {u32 min_limit_freq;u32 max_limit_freq;u32 nominal_freq; +u32 max_freq;
Hi Mario,
A minor finding: the new u32 max_freq field is missing a kdoc entry in struct amd_cpudata.
Quoted 3 lines
drivers/cpufreq/amd-pstate.h +0
-0u32 lowest_nonlinear_freq;struct amd_aperf_mperf cur;
Signature · 2 lines
Thx and BRs, Zhongqiu Han