Messages in this thread Patch in this message | | | From | "Yuan, Perry" <> | Subject | RE: [PATCH 4/7] cpufreq: amd-pstate: fix max_perf calculation for amd_get_max_freq() | Date | Mon, 29 Jan 2024 05:16:37 +0000 |
| |
[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); > >
| |