diff mbox series

[4/7] cpufreq: amd-pstate: fix max_perf calculation for amd_get_max_freq()

Message ID 675807d1888f77d7d0f3bc335b5bb3bd2c023670.1706255676.git.perry.yuan@amd.com (mailing list archive)
State Changes Requested, archived
Headers show
Series AMD Pstate Driver Core Performance Boost | expand

Commit Message

Yuan, Perry Jan. 26, 2024, 8:08 a.m. UTC
From: Perry Yuan <Perry.Yuan@amd.com>

When CPU core Precision Boost state changed, the max frequency will also
need to be updated according to the current boost state, if boost is
disabled now, the max perf will be limited to nominal perf values.
otherwise the max frequency will be showed wrongly.

Signed-off-by: Perry Yuan <Perry.Yuan@amd.com>
---
 drivers/cpufreq/amd-pstate.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Mario Limonciello Jan. 26, 2024, 3:54 p.m. UTC | #1
On 1/26/2024 02:08, Perry Yuan wrote:
> From: Perry Yuan <Perry.Yuan@amd.com>
> 
> When CPU core Precision Boost state changed, the max frequency will also
> need to be updated according to the current boost state, if boost is
> disabled now, the max perf will be limited to nominal perf values.
> otherwise the max frequency will be showed wrongly.

What about the previous cppc_req?  Shouldn't it be explicitly updated as 
a result of this too?

> 
> Signed-off-by: Perry Yuan <Perry.Yuan@amd.com>
> ---
>   drivers/cpufreq/amd-pstate.c | 4 ++++
>   1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index b37bea7440b9..3286d72f375e 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -599,6 +599,10 @@ static int amd_get_max_freq(struct amd_cpudata *cpudata)
>   	nominal_perf = READ_ONCE(cpudata->nominal_perf);
>   	max_perf = READ_ONCE(cpudata->highest_perf);
>   
> +	/* when boost is off, the highest perf will be limited to nominal_perf */
> +	if (!global.cpb_boost)
> +		max_perf = nominal_perf;
> +
>   	boost_ratio = div_u64(max_perf << SCHED_CAPACITY_SHIFT,
>   			      nominal_perf);
>
Yuan, Perry Jan. 29, 2024, 5:16 a.m. UTC | #2
[AMD Official Use Only - General]

Hi  Mario,

> -----Original Message-----
> From: Limonciello, Mario <Mario.Limonciello@amd.com>
> Sent: Friday, January 26, 2024 11:54 PM
> To: Yuan, Perry <Perry.Yuan@amd.com>; rafael.j.wysocki@intel.com;
> viresh.kumar@linaro.org; Huang, Ray <Ray.Huang@amd.com>; Shenoy,
> Gautham Ranjal <gautham.shenoy@amd.com>; Petkov, Borislav
> <Borislav.Petkov@amd.com>
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>; Huang, Shimmer
> <Shimmer.Huang@amd.com>; Du, Xiaojian <Xiaojian.Du@amd.com>; Meng,
> Li (Jassmine) <Li.Meng@amd.com>; linux-pm@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH 4/7] cpufreq: amd-pstate: fix max_perf calculation for
> amd_get_max_freq()
>
> On 1/26/2024 02:08, Perry Yuan wrote:
> > From: Perry Yuan <Perry.Yuan@amd.com>
> >
> > When CPU core Precision Boost state changed, the max frequency will
> > also need to be updated according to the current boost state, if boost
> > is disabled now, the max perf will be limited to nominal perf values.
> > otherwise the max frequency will be showed wrongly.
>
> What about the previous cppc_req?  Shouldn't it be explicitly updated as a
> result of this too?

The CPPC REQ value has been updated in this function.
When boost state changed, the MSR will be updated firstly.

+static int amd_cpu_boost_update(struct amd_cpudata *cpudata, u32 on)
+{
+       struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpudata->cpu);
+       struct cppc_perf_ctrls perf_ctrls;
+       u32 highest_perf, nominal_perf;
+       int ret;
+
+       if (!policy)
+               return -ENODATA;
+
+       highest_perf = READ_ONCE(cpudata->highest_perf);
+       nominal_perf = READ_ONCE(cpudata->nominal_perf);
+
+       if (boot_cpu_has(X86_FEATURE_CPPC)) {
+               u64 value = READ_ONCE(cpudata->cppc_req_cached);
+
+               value &= ~GENMASK_ULL(7, 0);
+               value |= on ? highest_perf : nominal_perf;
+               WRITE_ONCE(cpudata->cppc_req_cached, value);
+
+               wrmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ, value);




>
> >
> > Signed-off-by: Perry Yuan <Perry.Yuan@amd.com>
> > ---
> >   drivers/cpufreq/amd-pstate.c | 4 ++++
> >   1 file changed, 4 insertions(+)
> >
> > diff --git a/drivers/cpufreq/amd-pstate.c
> > b/drivers/cpufreq/amd-pstate.c index b37bea7440b9..3286d72f375e
> 100644
> > --- a/drivers/cpufreq/amd-pstate.c
> > +++ b/drivers/cpufreq/amd-pstate.c
> > @@ -599,6 +599,10 @@ static int amd_get_max_freq(struct amd_cpudata
> *cpudata)
> >     nominal_perf = READ_ONCE(cpudata->nominal_perf);
> >     max_perf = READ_ONCE(cpudata->highest_perf);
> >
> > +   /* when boost is off, the highest perf will be limited to nominal_perf */
> > +   if (!global.cpb_boost)
> > +           max_perf = nominal_perf;
> > +
> >     boost_ratio = div_u64(max_perf << SCHED_CAPACITY_SHIFT,
> >                           nominal_perf);
> >
diff mbox series

Patch

diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index b37bea7440b9..3286d72f375e 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -599,6 +599,10 @@  static int amd_get_max_freq(struct amd_cpudata *cpudata)
 	nominal_perf = READ_ONCE(cpudata->nominal_perf);
 	max_perf = READ_ONCE(cpudata->highest_perf);
 
+	/* when boost is off, the highest perf will be limited to nominal_perf */
+	if (!global.cpb_boost)
+		max_perf = nominal_perf;
+
 	boost_ratio = div_u64(max_perf << SCHED_CAPACITY_SHIFT,
 			      nominal_perf);