Message ID | 20241003083952.3186-3-Dhananjay.Ugwekar@amd.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | cpufreq/amd-pstate: Set initial min_freq to lowest_nonlinear_freq | expand |
On Thu, Oct 03, 2024 at 08:39:54AM +0000, Dhananjay Ugwekar wrote: > According to the AMD architectural programmer's manual volume 2 [1], in > section "17.6.4.1 CPPC_CAPABILITY_1" lowest_nonlinear_perf is described > as "Reports the most energy efficient performance level (in terms of > performance per watt). Above this threshold, lower performance levels > generally result in increased energy efficiency. Reducing performance > below this threshold does not result in total energy savings for a given > computation, although it reduces instantaneous power consumption". So > lowest_nonlinear_perf is the most power efficient performance level, and > going below that would lead to a worse performance/watt. > > Also, setting the minimum frequency to lowest_nonlinear_freq (instead of > lowest_freq) allows the CPU to idle at a higher frequency which leads > to more time being spent in a deeper idle state (as trivial idle tasks > are completed sooner). This has shown a power benefit in some systems, > in other systems, power consumption has increased but so has the > throughput/watt. > > Use the get_init_min_freq() callback to set the initial lower limit for > amd-pstate driver to lowest_nonlinear_freq instead of lowest_freq. > > Link: https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24593.pdf [1] It is good enough to quote "AMD64 Architecture Programmer's Manual, Volume 2, Revision 3.42" instead of providing a link. Other than that, Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com> > > Signed-off-by: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com> -- Thanks and Regards gautham. > --- > drivers/cpufreq/amd-pstate.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c > index b7a17a3ef122..f8abae9a0156 100644 > --- a/drivers/cpufreq/amd-pstate.c > +++ b/drivers/cpufreq/amd-pstate.c > @@ -995,13 +995,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy) > if (cpu_feature_enabled(X86_FEATURE_CPPC)) > policy->fast_switch_possible = true; > > - ret = freq_qos_add_request(&policy->constraints, &cpudata->req[0], > - FREQ_QOS_MIN, policy->cpuinfo.min_freq); > - if (ret < 0) { > - dev_err(dev, "Failed to add min-freq constraint (%d)\n", ret); > - goto free_cpudata1; > - } > - > ret = freq_qos_add_request(&policy->constraints, &cpudata->req[1], > FREQ_QOS_MAX, policy->cpuinfo.max_freq); > if (ret < 0) { > @@ -1706,6 +1699,13 @@ static int amd_pstate_epp_resume(struct cpufreq_policy *policy) > return 0; > } > > +static int amd_pstate_get_init_min_freq(struct cpufreq_policy *policy) > +{ > + struct amd_cpudata *cpudata = policy->driver_data; > + > + return READ_ONCE(cpudata->lowest_nonlinear_freq); > +} > + > static struct cpufreq_driver amd_pstate_driver = { > .flags = CPUFREQ_CONST_LOOPS | CPUFREQ_NEED_UPDATE_LIMITS, > .verify = amd_pstate_verify, > @@ -1719,6 +1719,7 @@ static struct cpufreq_driver amd_pstate_driver = { > .update_limits = amd_pstate_update_limits, > .name = "amd-pstate", > .attr = amd_pstate_attr, > + .get_init_min_freq = amd_pstate_get_init_min_freq, > }; > > static struct cpufreq_driver amd_pstate_epp_driver = { > @@ -1735,6 +1736,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = { > .set_boost = amd_pstate_set_boost, > .name = "amd-pstate-epp", > .attr = amd_pstate_epp_attr, > + .get_init_min_freq = amd_pstate_get_init_min_freq, > }; > > static int __init amd_pstate_set_driver(int mode_idx) > -- > 2.34.1 >
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c index b7a17a3ef122..f8abae9a0156 100644 --- a/drivers/cpufreq/amd-pstate.c +++ b/drivers/cpufreq/amd-pstate.c @@ -995,13 +995,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy) if (cpu_feature_enabled(X86_FEATURE_CPPC)) policy->fast_switch_possible = true; - ret = freq_qos_add_request(&policy->constraints, &cpudata->req[0], - FREQ_QOS_MIN, policy->cpuinfo.min_freq); - if (ret < 0) { - dev_err(dev, "Failed to add min-freq constraint (%d)\n", ret); - goto free_cpudata1; - } - ret = freq_qos_add_request(&policy->constraints, &cpudata->req[1], FREQ_QOS_MAX, policy->cpuinfo.max_freq); if (ret < 0) { @@ -1706,6 +1699,13 @@ static int amd_pstate_epp_resume(struct cpufreq_policy *policy) return 0; } +static int amd_pstate_get_init_min_freq(struct cpufreq_policy *policy) +{ + struct amd_cpudata *cpudata = policy->driver_data; + + return READ_ONCE(cpudata->lowest_nonlinear_freq); +} + static struct cpufreq_driver amd_pstate_driver = { .flags = CPUFREQ_CONST_LOOPS | CPUFREQ_NEED_UPDATE_LIMITS, .verify = amd_pstate_verify, @@ -1719,6 +1719,7 @@ static struct cpufreq_driver amd_pstate_driver = { .update_limits = amd_pstate_update_limits, .name = "amd-pstate", .attr = amd_pstate_attr, + .get_init_min_freq = amd_pstate_get_init_min_freq, }; static struct cpufreq_driver amd_pstate_epp_driver = { @@ -1735,6 +1736,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = { .set_boost = amd_pstate_set_boost, .name = "amd-pstate-epp", .attr = amd_pstate_epp_attr, + .get_init_min_freq = amd_pstate_get_init_min_freq, }; static int __init amd_pstate_set_driver(int mode_idx)
According to the AMD architectural programmer's manual volume 2 [1], in section "17.6.4.1 CPPC_CAPABILITY_1" lowest_nonlinear_perf is described as "Reports the most energy efficient performance level (in terms of performance per watt). Above this threshold, lower performance levels generally result in increased energy efficiency. Reducing performance below this threshold does not result in total energy savings for a given computation, although it reduces instantaneous power consumption". So lowest_nonlinear_perf is the most power efficient performance level, and going below that would lead to a worse performance/watt. Also, setting the minimum frequency to lowest_nonlinear_freq (instead of lowest_freq) allows the CPU to idle at a higher frequency which leads to more time being spent in a deeper idle state (as trivial idle tasks are completed sooner). This has shown a power benefit in some systems, in other systems, power consumption has increased but so has the throughput/watt. Use the get_init_min_freq() callback to set the initial lower limit for amd-pstate driver to lowest_nonlinear_freq instead of lowest_freq. Link: https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24593.pdf [1] Signed-off-by: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com> --- drivers/cpufreq/amd-pstate.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)