mbox series

[v10,0/7] AMD Pstate Driver Core Performance Boost

Message ID cover.1715152592.git.perry.yuan@amd.com
Headers show
Series AMD Pstate Driver Core Performance Boost | expand

Message

Perry Yuan May 8, 2024, 7:21 a.m. UTC
Hi all,
The patchset series add core performance boost feature for AMD pstate
driver including passisve ,guide and active mode support.

User can change core frequency boost control with a new sysfs entry:

"/sys/devices/system/cpu/amd_pstate/cpb_boost"


1) globally disable core boost:
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
$ lscpu -ae
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ      MHZ
  0    0      0    0 0:0:0:0          yes 4201.0000 400.0000 2983.578
  1    0      0    1 1:1:1:0          yes 4201.0000 400.0000 2983.578
  2    0      0    2 2:2:2:0          yes 4201.0000 400.0000 2583.855
  3    0      0    3 3:3:3:0          yes 4201.0000 400.0000 2983.578
  4    0      0    4 4:4:4:0          yes 4201.0000 400.0000 2983.578

2) globally enable core boost:
$ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
$ lscpu -ae
   0    0      0    0 0:0:0:0          yes 5759.0000 400.0000 2983.578
  1    0      0    1 1:1:1:0          yes 5759.0000 400.0000 2983.578
  2    0      0    2 2:2:2:0          yes 5759.0000 400.0000 2983.578
  3    0      0    3 3:3:3:0          yes 5759.0000 400.0000 2983.578
  4    0      0    4 4:4:4:0          yes 5759.0000 400.0000 2983.578


============================================================================
The V9 patches add per CPU boost control, user can enable/disable CPUs boost
as the below command tested on a laptop system.
# before
  CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
  0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000
  2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3386.1260
  3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
$ sudo rdmsr 0xc00102b3 -p 0
10a6

$ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
# after
  CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
    0    0      0    0 0:0:0:0          yes 3501.0000 400.0000  400.0000
    1    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1391.0690
    2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3654.4541
    3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
$ sudo rdmsr 0xc00102b3 -p 0
108a


The patches have been tested with the AMD 7950X processor and many users
would like to get core boost control enabled for power saving.

Perry.


Changes from v9:
 * change per CPU boost sysfs file name to `boost` (Mario)
 * rebased to latest linux-pm/bleeding-edge

Changes from v8:
 * pick RB flag for patch 4 (Mario)
 * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
 * merge patch 6 into patch 3 (Mario)
 * add two patch for per CPU boost control patch 6 & 7(Mario)
 * rebased to latest linux-pm/bleeding-edge

Changes from v7:
 * fix the mutext locking issue in the sysfs file update(Ray, Mario)
 * pick ack flag from Ray
 * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
 * rerun the testing to check function works well
 * rebased to linux-pm/bleeding-edge latest

Changes from v6:
 * reword patch 2 commit log (Gautham)
 * update cover letter description(Gautham)
 * rebase to kernel v6.9-rc5

Changes from v4:
 * drop the legacy boost remove patch, let us keep the legacy interface
   in case some applications break.
 * rebase to linux-pm/bleeding-edge branch
 * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
   Enhancements which has some intial work done there.

Changes from v4:
 * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
 * pick RB flag from Gautham R. Shenoy
 * add Cc Oleksandr Natalenko <oleksandr@natalenko.name>
 * rebase to latest linux-pm/bleeding-edge branch
 * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And Enhancements
 * update  [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT

Changes from v3:
 * rebased to linux-pm/bleeding-edge v6.8
 * rename global to amd_pstate_global_params(Oleksandr Natalenko)
 * remove comments for boot_supported in amd_pstate.h
 * fix the compiler warning for amd-pstate-ut.ko
 * use for_each_online_cpu in cpb_boost_store which fix the null pointer
   error during testing
 * fix the max frequency value to be KHz when cpb boost disabled(Gautham R. Shenoy)

Changes from v2:
 * move global struct to amd-pstate.h
 * fix the amd-pstate-ut with new cpb control interface

Changes from v1:
 * drop suspend/resume fix patch 6/7 because of the fix should be in
   another fix series instead of CPB feature
 * move the set_boost remove patch to the last(Mario)
 * Fix commit info with "Closes:" (Mario)
 * simplified global.cpb_supported initialization(Mario)
 * Add guide mode support for CPB control
 * Fixed some Doc typos and add guide mode info to Doc as well.

v1: https://lore.kernel.org/all/cover.1706255676.git.perry.yuan@amd.com/
v2: https://lore.kernel.org/lkml/cover.1707047943.git.perry.yuan@amd.com/
v3: https://lore.kernel.org/lkml/cover.1707297581.git.perry.yuan@amd.com/
v4: https://lore.kernel.org/lkml/cover.1710322310.git.perry.yuan@amd.com/
v5: https://lore.kernel.org/lkml/cover.1710473712.git.perry.yuan@amd.com/
v6: https://lore.kernel.org/lkml/cover.1710754236.git.perry.yuan@amd.com/
v7: https://lore.kernel.org/lkml/cover.1713861200.git.perry.yuan@amd.com/
v8: https://lore.kernel.org/lkml/cover.1714112854.git.perry.yuan@amd.com/
v9: https://lore.kernel.org/lkml/cover.1714989803.git.perry.yuan@amd.com/

Perry Yuan (7):
  cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
  cpufreq: amd-pstate: initialize new core precision boost state
  cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
  cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
    while cpb boost off
  Documentation: cpufreq: amd-pstate: introduce the new cpu boost
    control method
  cpufreq: amd-pstate: introduce per CPU frequency boost control
  Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
    control method

 Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
 arch/x86/include/asm/msr-index.h            |   2 +
 drivers/cpufreq/acpi-cpufreq.c              |   2 -
 drivers/cpufreq/amd-pstate-ut.c             |   2 +-
 drivers/cpufreq/amd-pstate.c                | 189 ++++++++++++++++++--
 include/linux/amd-pstate.h                  |  14 ++
 6 files changed, 225 insertions(+), 14 deletions(-)

Comments

Borislav Petkov May 8, 2024, 8:18 a.m. UTC | #1
On Wed, May 08, 2024 at 03:21:05PM +0800, Perry Yuan wrote:
> The patchset series add core performance boost feature for AMD pstate
> driver including passisve ,guide and active mode support.

Can you please slow down, wait to collect as much feedback as possible
and only *then* spam again with your patchset?

https://kernel.org/doc/html/latest/process/submitting-patches.html#don-t-get-discouraged-or-impatient

"You should receive comments within a few weeks (typically 2-3); if that
does not happen, make sure that you have sent your patches to the right
place. Wait for a minimum of one week before resubmitting or pinging
reviewers - possibly longer during busy times like merge windows."

Maintainers are not a shooting gallery.

While waiting, you can read this:

https://kernel.org/doc/html/latest/process/development-process.html

Thanks.
Oleksandr Natalenko May 8, 2024, 9:39 a.m. UTC | #2
Hello.

On středa 8. května 2024 9:21:08, SELČ Perry Yuan wrote:
> From: Perry Yuan <Perry.Yuan@amd.com>
> 
> With this new sysfs entry `cpb_boost`created, user can change CPU boost
> state dynamically under `active`, `guided` and `passive` modes.
> And the highest perf and frequency will also be updated as the boost
> state changing.
> 
> 0): check current boost state
> cat /sys/devices/system/cpu/amd_pstate/cpb_boost
> 
> 1): disable CPU boost
> sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> 
> 2): enable CPU boost
> sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> 
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=217931
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=217618
> Signed-off-by: Perry Yuan <Perry.Yuan@amd.com>
> ---
>  drivers/cpufreq/amd-pstate-ut.c |   2 +-
>  drivers/cpufreq/amd-pstate.c    | 114 +++++++++++++++++++++++++++++++-
>  include/linux/amd-pstate.h      |   1 +
>  3 files changed, 115 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/cpufreq/amd-pstate-ut.c b/drivers/cpufreq/amd-pstate-ut.c
> index f04ae67dda37..b3601b0e6dd3 100644
> --- a/drivers/cpufreq/amd-pstate-ut.c
> +++ b/drivers/cpufreq/amd-pstate-ut.c
> @@ -226,7 +226,7 @@ static void amd_pstate_ut_check_freq(u32 index)
>  			goto skip_test;
>  		}
>  
> -		if (cpudata->boost_supported) {
> +		if (amd_pstate_global_params.cpb_boost) {
>  			if ((policy->max == cpudata->max_freq) ||
>  					(policy->max == cpudata->nominal_freq))
>  				amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index f7dab0f7b452..f81fd61dd2a9 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -686,8 +686,10 @@ static int amd_pstate_boost_init(struct amd_cpudata *cpudata)
>  	}
>  
>  	amd_pstate_global_params.cpb_supported = !(boost_val & MSR_K7_HWCR_CPB_DIS);
> -	if (amd_pstate_global_params.cpb_supported)
> +	if (amd_pstate_global_params.cpb_supported) {
>  		current_pstate_driver->boost_enabled = true;
> +		cpudata->boost_state = true;
> +	}
>  
>  	amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported;
>  
> @@ -1293,6 +1295,114 @@ static ssize_t prefcore_show(struct device *dev,
>  	return sysfs_emit(buf, "%s\n", str_enabled_disabled(amd_pstate_prefcore));
>  }
>  
> +static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
> +{
> +	struct amd_cpudata *cpudata = policy->driver_data;
> +	struct cppc_perf_ctrls perf_ctrls;
> +	u32 highest_perf, nominal_perf, nominal_freq, max_freq;
> +	int ret;
> +
> +	if (!policy) {
> +		pr_err("policy is null\n");
> +		return -ENODATA;
> +	}
> +
> +	highest_perf = READ_ONCE(cpudata->highest_perf);
> +	nominal_perf = READ_ONCE(cpudata->nominal_perf);
> +	nominal_freq = READ_ONCE(cpudata->nominal_freq);
> +	max_freq = READ_ONCE(cpudata->max_freq);
> +
> +	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);
> +	} else {
> +		perf_ctrls.max_perf = on ? highest_perf : nominal_perf;
> +		ret = cppc_set_epp_perf(cpudata->cpu, &perf_ctrls, 1);
> +		if (ret) {
> +			cpufreq_cpu_release(policy);
> +			pr_debug("failed to set energy perf value (%d)\n", ret);
> +			return ret;
> +		}
> +	}
> +
> +	if (on)
> +		policy->cpuinfo.max_freq = max_freq;
> +	else
> +		policy->cpuinfo.max_freq = nominal_freq * 1000;
> +
> +	policy->max = policy->cpuinfo.max_freq;
> +
> +	if (cppc_state == AMD_PSTATE_PASSIVE) {
> +		ret = freq_qos_update_request(&cpudata->req[1],
> +				      policy->cpuinfo.max_freq);
> +	}
> +
> +	return ret;
> +}
> +
> +static int amd_pstate_cpu_boost(int cpu, bool state)
> +{
> +	int ret;
> +	struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
> +	struct amd_cpudata *cpudata = policy->driver_data;
> +
> +	if (!policy) {
> +		pr_err("policy is NULL\n");
> +		ret = -ENODATA;
> +		goto err_exit;
> +	}
> +
> +	ret = amd_pstate_cpu_boost_update(policy, state);
> +	refresh_frequency_limits(policy);
> +	cpudata->boost_state = !!state;
> +
> +err_exit:
> +	cpufreq_cpu_put(policy);
> +	return ret < 0 ? ret : 0;
> +}
> +
> +static ssize_t cpb_boost_show(struct device *dev,
> +			   struct device_attribute *attr, char *buf)
> +{
> +	return sysfs_emit(buf, "%u\n", amd_pstate_global_params.cpb_boost);
> +}
> +
> +static ssize_t cpb_boost_store(struct device *dev, struct device_attribute *b,
> +			    const char *buf, size_t count)
> +{
> +	bool new_state;
> +	ssize_t ret;
> +	int cpu;
> +
> +	if (!amd_pstate_global_params.cpb_supported) {
> +		pr_err("Boost mode is not supported by this processor or SBIOS\n");
> +		return -EINVAL;
> +	}
> +
> +	ret = kstrtobool(buf, &new_state);
> +	if (ret)
> +		return ret;
> +
> +	mutex_lock(&amd_pstate_driver_lock);
> +	for_each_present_cpu(cpu) {
> +		ret = amd_pstate_cpu_boost(cpu, new_state);
> +		if (ret < 0) {
> +			pr_warn("failed to update cpu boost for CPU%d (%d)\n", cpu, ret);

Note ret is ssize_t, so %d should be %ld (or %z/%zd/%zi?) instead.

> +			goto err_exit;
> +		}
> +	}
> +	amd_pstate_global_params.cpb_boost = !!new_state;
> +
> +err_exit:
> +	mutex_unlock(&amd_pstate_driver_lock);
> +	return ret < 0 ? ret : count;
> +}
> +
>  cpufreq_freq_attr_ro(amd_pstate_max_freq);
>  cpufreq_freq_attr_ro(amd_pstate_lowest_nonlinear_freq);
>  
> @@ -1303,6 +1413,7 @@ cpufreq_freq_attr_rw(energy_performance_preference);
>  cpufreq_freq_attr_ro(energy_performance_available_preferences);
>  static DEVICE_ATTR_RW(status);
>  static DEVICE_ATTR_RO(prefcore);
> +static DEVICE_ATTR_RW(cpb_boost);
>  
>  static struct freq_attr *amd_pstate_attr[] = {
>  	&amd_pstate_max_freq,
> @@ -1327,6 +1438,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
>  static struct attribute *pstate_global_attributes[] = {
>  	&dev_attr_status.attr,
>  	&dev_attr_prefcore.attr,
> +	&dev_attr_cpb_boost.attr,
>  	NULL
>  };
>  
> diff --git a/include/linux/amd-pstate.h b/include/linux/amd-pstate.h
> index 8ba5dd4d3405..56f616a5cd0f 100644
> --- a/include/linux/amd-pstate.h
> +++ b/include/linux/amd-pstate.h
> @@ -106,6 +106,7 @@ struct amd_cpudata {
>  	u32	policy;
>  	u64	cppc_cap1_cached;
>  	bool	suspended;
> +	bool	boost_state;
>  };
>  
>  /*
>
Oleksandr Natalenko May 8, 2024, 7:13 p.m. UTC | #3
On středa 8. května 2024 17:11:42, SELČ Oleksandr Natalenko wrote:
> Hello.
> 
> On středa 8. května 2024 9:21:05, SELČ Perry Yuan wrote:
> > Hi all,
> > The patchset series add core performance boost feature for AMD pstate
> > driver including passisve ,guide and active mode support.
> > 
> > User can change core frequency boost control with a new sysfs entry:
> > 
> > "/sys/devices/system/cpu/amd_pstate/cpb_boost"
> > 
> > 
> > 1) globally disable core boost:
> > $ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > $ lscpu -ae
> > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ      MHZ
> >   0    0      0    0 0:0:0:0          yes 4201.0000 400.0000 2983.578
> >   1    0      0    1 1:1:1:0          yes 4201.0000 400.0000 2983.578
> >   2    0      0    2 2:2:2:0          yes 4201.0000 400.0000 2583.855
> >   3    0      0    3 3:3:3:0          yes 4201.0000 400.0000 2983.578
> >   4    0      0    4 4:4:4:0          yes 4201.0000 400.0000 2983.578
> > 
> > 2) globally enable core boost:
> > $ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > $ lscpu -ae
> >    0    0      0    0 0:0:0:0          yes 5759.0000 400.0000 2983.578
> >   1    0      0    1 1:1:1:0          yes 5759.0000 400.0000 2983.578
> >   2    0      0    2 2:2:2:0          yes 5759.0000 400.0000 2983.578
> >   3    0      0    3 3:3:3:0          yes 5759.0000 400.0000 2983.578
> >   4    0      0    4 4:4:4:0          yes 5759.0000 400.0000 2983.578
> > 
> > 
> > ============================================================================
> > The V9 patches add per CPU boost control, user can enable/disable CPUs boost
> > as the below command tested on a laptop system.
> > # before
> >   CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
> >   0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
> >   1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000
> >   2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3386.1260
> >   3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> > $ sudo rdmsr 0xc00102b3 -p 0
> > 10a6
> > 
> > $ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
> > # after
> >   CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
> >     0    0      0    0 0:0:0:0          yes 3501.0000 400.0000  400.0000
> >     1    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1391.0690
> >     2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3654.4541
> >     3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> > $ sudo rdmsr 0xc00102b3 -p 0
> > 108a
> > 
> > 
> > The patches have been tested with the AMD 7950X processor and many users
> > would like to get core boost control enabled for power saving.
> > 
> > Perry.
> > 
> > 
> > Changes from v9:
> >  * change per CPU boost sysfs file name to `boost` (Mario)
> >  * rebased to latest linux-pm/bleeding-edge
> > 
> > Changes from v8:
> >  * pick RB flag for patch 4 (Mario)
> >  * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
> >  * merge patch 6 into patch 3 (Mario)
> >  * add two patch for per CPU boost control patch 6 & 7(Mario)
> >  * rebased to latest linux-pm/bleeding-edge
> > 
> > Changes from v7:
> >  * fix the mutext locking issue in the sysfs file update(Ray, Mario)
> >  * pick ack flag from Ray
> >  * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
> >  * rerun the testing to check function works well
> >  * rebased to linux-pm/bleeding-edge latest
> > 
> > Changes from v6:
> >  * reword patch 2 commit log (Gautham)
> >  * update cover letter description(Gautham)
> >  * rebase to kernel v6.9-rc5
> > 
> > Changes from v4:
> >  * drop the legacy boost remove patch, let us keep the legacy interface
> >    in case some applications break.
> >  * rebase to linux-pm/bleeding-edge branch
> >  * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
> >    Enhancements which has some intial work done there.
> > 
> > Changes from v4:
> >  * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> >  * pick RB flag from Gautham R. Shenoy
> >  * add Cc Oleksandr Natalenko <oleksandr@natalenko.name>
> >  * rebase to latest linux-pm/bleeding-edge branch
> >  * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And Enhancements
> >  * update  [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
> > 
> > Changes from v3:
> >  * rebased to linux-pm/bleeding-edge v6.8
> >  * rename global to amd_pstate_global_params(Oleksandr Natalenko)
> >  * remove comments for boot_supported in amd_pstate.h
> >  * fix the compiler warning for amd-pstate-ut.ko
> >  * use for_each_online_cpu in cpb_boost_store which fix the null pointer
> >    error during testing
> >  * fix the max frequency value to be KHz when cpb boost disabled(Gautham R. Shenoy)
> > 
> > Changes from v2:
> >  * move global struct to amd-pstate.h
> >  * fix the amd-pstate-ut with new cpb control interface
> > 
> > Changes from v1:
> >  * drop suspend/resume fix patch 6/7 because of the fix should be in
> >    another fix series instead of CPB feature
> >  * move the set_boost remove patch to the last(Mario)
> >  * Fix commit info with "Closes:" (Mario)
> >  * simplified global.cpb_supported initialization(Mario)
> >  * Add guide mode support for CPB control
> >  * Fixed some Doc typos and add guide mode info to Doc as well.
> > 
> > v1: https://lore.kernel.org/all/cover.1706255676.git.perry.yuan@amd.com/
> > v2: https://lore.kernel.org/lkml/cover.1707047943.git.perry.yuan@amd.com/
> > v3: https://lore.kernel.org/lkml/cover.1707297581.git.perry.yuan@amd.com/
> > v4: https://lore.kernel.org/lkml/cover.1710322310.git.perry.yuan@amd.com/
> > v5: https://lore.kernel.org/lkml/cover.1710473712.git.perry.yuan@amd.com/
> > v6: https://lore.kernel.org/lkml/cover.1710754236.git.perry.yuan@amd.com/
> > v7: https://lore.kernel.org/lkml/cover.1713861200.git.perry.yuan@amd.com/
> > v8: https://lore.kernel.org/lkml/cover.1714112854.git.perry.yuan@amd.com/
> > v9: https://lore.kernel.org/lkml/cover.1714989803.git.perry.yuan@amd.com/
> > 
> > Perry Yuan (7):
> >   cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> >   cpufreq: amd-pstate: initialize new core precision boost state
> >   cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> >   cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
> >     while cpb boost off
> >   Documentation: cpufreq: amd-pstate: introduce the new cpu boost
> >     control method
> >   cpufreq: amd-pstate: introduce per CPU frequency boost control
> >   Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
> >     control method
> > 
> >  Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
> >  arch/x86/include/asm/msr-index.h            |   2 +
> >  drivers/cpufreq/acpi-cpufreq.c              |   2 -
> >  drivers/cpufreq/amd-pstate-ut.c             |   2 +-
> >  drivers/cpufreq/amd-pstate.c                | 189 ++++++++++++++++++--
> >  include/linux/amd-pstate.h                  |  14 ++
> >  6 files changed, 225 insertions(+), 14 deletions(-)
> 
> I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.
> 
> The CPU is:
> 
> ```
> Vendor ID:                AuthenticAMD
>   Model name:             AMD Ryzen 9 5950X 16-Core Processor
>     CPU family:           25
>     Model:                33
>     Thread(s) per core:   2
>     Core(s) per socket:   16
>     Socket(s):            1
>     Stepping:             2
> ```
> 
> I've got `amd_pstate=guided` set in the kernel cmdline, but `amd-pstate-epp` gets loaded anyway.

OK, this part is solved like below:

```
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index aafa4466e5ced..5aee7d2b8cfd7 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -66,7 +66,7 @@
 static struct cpufreq_driver *current_pstate_driver;
 static struct cpufreq_driver amd_pstate_driver;
 static struct cpufreq_driver amd_pstate_epp_driver;
-static int cppc_state;
+static int cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
 static bool cppc_enabled;
 static bool amd_pstate_prefcore = true;
 static struct quirk_entry *quirks;
@@ -1958,10 +1958,6 @@ static int __init amd_pstate_init(void)
 	/* check if this machine need CPPC quirks */
 	dmi_check_system(amd_pstate_quirks_table);
 
-	/* get default driver mode for loading*/
-	cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
-	pr_debug("cppc working state set to mode:%d\n", cppc_state);
-
 	switch (cppc_state) {
 	case AMD_PSTATE_DISABLE:
 		pr_info("driver load is disabled, boot with specific mode to enable this\n");
```

as we have discussed here [1].

[1] https://lore.kernel.org/lkml/CYYPR12MB865554562BE018D46FF0108C9CE52@CYYPR12MB8655.namprd12.prod.outlook.com/

But this part:

> When I try to set `guided` manually via `echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status`, the status gets dropped to `disable`, `tee` errors out with `-ENODEV`, and there's this in the kernel log:
> 
> ```
> $ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
> …
> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
> ```

is not. I've successfully booted with `amd_pstate=guided`, then did this:

```
$ echo active | sudo tee /sys/devices/system/cpu/amd_pstate/status
```

just for the sake of test, and got this:

```
tee: /sys/devices/system/cpu/amd_pstate/status: File exists
```

and this:

```
kernel: WARNING: CPU: 9 PID: 8528 at drivers/cpufreq/cpufreq.c:2961 cpufreq_unregister_driver+0x1a/0xc0
```

which corresponds to:

```
2957 void cpufreq_unregister_driver(struct cpufreq_driver *driver)
2958 {
2959         unsigned long flags;
2960
2961         if (WARN_ON(!cpufreq_driver || (driver != cpufreq_driver)))
2962                 return;
```

I haven't conducted this test before, so I don't know whether this behaviour is new, or it was present in older iterations. I also don't know if this belongs to the "boost" series or the "fixes", and just letting you know so that you can test the runtime switching yourself and see if it is reproducible in your environment as well or not.

> The following is applied on top of v6.9-rc7:
> 
> ```
> cpufreq: amd-pstate: automatically load pstate driver by default
> cpufreq: amd-pstate: fix the highest frequency issue which limit performance
> cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
> x86/cpufeatures: Add feature bits for AMD heterogeneous processor
> cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
> Documentation: PM: amd-pstate: add guide mode to the Operation mode
> Documentation: PM: amd-pstate: add debugging section for driver loading failure
> Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
> cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
> cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
> cpufreq: amd-pstate: optimiza the initial frequency values verification
> Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
> cpufreq: amd-pstate: introduce per CPU frequency boost control
> Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
> cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
> cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> cpufreq: amd-pstate: initialize new core precision boost state
> cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
> cpufreq: amd-pstate: fix code format problems
> cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
> cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
> cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
> cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
> cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
> cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
> cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
> ```
> 
> Previously, with your submissions, it was possible to use `guided` mode with my Zen 3.
> 
> [1] https://lore.kernel.org/lkml/cover.1715065568.git.perry.yuan@amd.com/
> 
>
Oleksandr Natalenko May 8, 2024, 7:21 p.m. UTC | #4
On středa 8. května 2024 21:13:40, SELČ Oleksandr Natalenko wrote:
> On středa 8. května 2024 17:11:42, SELČ Oleksandr Natalenko wrote:
> > Hello.
> > 
> > On středa 8. května 2024 9:21:05, SELČ Perry Yuan wrote:
> > > Hi all,
> > > The patchset series add core performance boost feature for AMD pstate
> > > driver including passisve ,guide and active mode support.
> > > 
> > > User can change core frequency boost control with a new sysfs entry:
> > > 
> > > "/sys/devices/system/cpu/amd_pstate/cpb_boost"
> > > 
> > > 
> > > 1) globally disable core boost:
> > > $ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > > $ lscpu -ae
> > > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ      MHZ
> > >   0    0      0    0 0:0:0:0          yes 4201.0000 400.0000 2983.578
> > >   1    0      0    1 1:1:1:0          yes 4201.0000 400.0000 2983.578
> > >   2    0      0    2 2:2:2:0          yes 4201.0000 400.0000 2583.855
> > >   3    0      0    3 3:3:3:0          yes 4201.0000 400.0000 2983.578
> > >   4    0      0    4 4:4:4:0          yes 4201.0000 400.0000 2983.578
> > > 
> > > 2) globally enable core boost:
> > > $ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > > $ lscpu -ae
> > >    0    0      0    0 0:0:0:0          yes 5759.0000 400.0000 2983.578
> > >   1    0      0    1 1:1:1:0          yes 5759.0000 400.0000 2983.578
> > >   2    0      0    2 2:2:2:0          yes 5759.0000 400.0000 2983.578
> > >   3    0      0    3 3:3:3:0          yes 5759.0000 400.0000 2983.578
> > >   4    0      0    4 4:4:4:0          yes 5759.0000 400.0000 2983.578
> > > 
> > > 
> > > ============================================================================
> > > The V9 patches add per CPU boost control, user can enable/disable CPUs boost
> > > as the below command tested on a laptop system.
> > > # before
> > >   CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
> > >   0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
> > >   1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000
> > >   2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3386.1260
> > >   3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> > > $ sudo rdmsr 0xc00102b3 -p 0
> > > 10a6
> > > 
> > > $ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
> > > # after
> > >   CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
> > >     0    0      0    0 0:0:0:0          yes 3501.0000 400.0000  400.0000
> > >     1    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1391.0690
> > >     2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3654.4541
> > >     3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> > > $ sudo rdmsr 0xc00102b3 -p 0
> > > 108a
> > > 
> > > 
> > > The patches have been tested with the AMD 7950X processor and many users
> > > would like to get core boost control enabled for power saving.
> > > 
> > > Perry.
> > > 
> > > 
> > > Changes from v9:
> > >  * change per CPU boost sysfs file name to `boost` (Mario)
> > >  * rebased to latest linux-pm/bleeding-edge
> > > 
> > > Changes from v8:
> > >  * pick RB flag for patch 4 (Mario)
> > >  * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
> > >  * merge patch 6 into patch 3 (Mario)
> > >  * add two patch for per CPU boost control patch 6 & 7(Mario)
> > >  * rebased to latest linux-pm/bleeding-edge
> > > 
> > > Changes from v7:
> > >  * fix the mutext locking issue in the sysfs file update(Ray, Mario)
> > >  * pick ack flag from Ray
> > >  * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
> > >  * rerun the testing to check function works well
> > >  * rebased to linux-pm/bleeding-edge latest
> > > 
> > > Changes from v6:
> > >  * reword patch 2 commit log (Gautham)
> > >  * update cover letter description(Gautham)
> > >  * rebase to kernel v6.9-rc5
> > > 
> > > Changes from v4:
> > >  * drop the legacy boost remove patch, let us keep the legacy interface
> > >    in case some applications break.
> > >  * rebase to linux-pm/bleeding-edge branch
> > >  * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
> > >    Enhancements which has some intial work done there.
> > > 
> > > Changes from v4:
> > >  * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > >  * pick RB flag from Gautham R. Shenoy
> > >  * add Cc Oleksandr Natalenko <oleksandr@natalenko.name>
> > >  * rebase to latest linux-pm/bleeding-edge branch
> > >  * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And Enhancements
> > >  * update  [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
> > > 
> > > Changes from v3:
> > >  * rebased to linux-pm/bleeding-edge v6.8
> > >  * rename global to amd_pstate_global_params(Oleksandr Natalenko)
> > >  * remove comments for boot_supported in amd_pstate.h
> > >  * fix the compiler warning for amd-pstate-ut.ko
> > >  * use for_each_online_cpu in cpb_boost_store which fix the null pointer
> > >    error during testing
> > >  * fix the max frequency value to be KHz when cpb boost disabled(Gautham R. Shenoy)
> > > 
> > > Changes from v2:
> > >  * move global struct to amd-pstate.h
> > >  * fix the amd-pstate-ut with new cpb control interface
> > > 
> > > Changes from v1:
> > >  * drop suspend/resume fix patch 6/7 because of the fix should be in
> > >    another fix series instead of CPB feature
> > >  * move the set_boost remove patch to the last(Mario)
> > >  * Fix commit info with "Closes:" (Mario)
> > >  * simplified global.cpb_supported initialization(Mario)
> > >  * Add guide mode support for CPB control
> > >  * Fixed some Doc typos and add guide mode info to Doc as well.
> > > 
> > > v1: https://lore.kernel.org/all/cover.1706255676.git.perry.yuan@amd.com/
> > > v2: https://lore.kernel.org/lkml/cover.1707047943.git.perry.yuan@amd.com/
> > > v3: https://lore.kernel.org/lkml/cover.1707297581.git.perry.yuan@amd.com/
> > > v4: https://lore.kernel.org/lkml/cover.1710322310.git.perry.yuan@amd.com/
> > > v5: https://lore.kernel.org/lkml/cover.1710473712.git.perry.yuan@amd.com/
> > > v6: https://lore.kernel.org/lkml/cover.1710754236.git.perry.yuan@amd.com/
> > > v7: https://lore.kernel.org/lkml/cover.1713861200.git.perry.yuan@amd.com/
> > > v8: https://lore.kernel.org/lkml/cover.1714112854.git.perry.yuan@amd.com/
> > > v9: https://lore.kernel.org/lkml/cover.1714989803.git.perry.yuan@amd.com/
> > > 
> > > Perry Yuan (7):
> > >   cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > >   cpufreq: amd-pstate: initialize new core precision boost state
> > >   cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> > >   cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
> > >     while cpb boost off
> > >   Documentation: cpufreq: amd-pstate: introduce the new cpu boost
> > >     control method
> > >   cpufreq: amd-pstate: introduce per CPU frequency boost control
> > >   Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
> > >     control method
> > > 
> > >  Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
> > >  arch/x86/include/asm/msr-index.h            |   2 +
> > >  drivers/cpufreq/acpi-cpufreq.c              |   2 -
> > >  drivers/cpufreq/amd-pstate-ut.c             |   2 +-
> > >  drivers/cpufreq/amd-pstate.c                | 189 ++++++++++++++++++--
> > >  include/linux/amd-pstate.h                  |  14 ++
> > >  6 files changed, 225 insertions(+), 14 deletions(-)
> > 
> > I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.
> > 
> > The CPU is:
> > 
> > ```
> > Vendor ID:                AuthenticAMD
> >   Model name:             AMD Ryzen 9 5950X 16-Core Processor
> >     CPU family:           25
> >     Model:                33
> >     Thread(s) per core:   2
> >     Core(s) per socket:   16
> >     Socket(s):            1
> >     Stepping:             2
> > ```
> > 
> > I've got `amd_pstate=guided` set in the kernel cmdline, but `amd-pstate-epp` gets loaded anyway.
> 
> OK, this part is solved like below:
> 
> ```
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index aafa4466e5ced..5aee7d2b8cfd7 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -66,7 +66,7 @@
>  static struct cpufreq_driver *current_pstate_driver;
>  static struct cpufreq_driver amd_pstate_driver;
>  static struct cpufreq_driver amd_pstate_epp_driver;
> -static int cppc_state;
> +static int cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
>  static bool cppc_enabled;
>  static bool amd_pstate_prefcore = true;
>  static struct quirk_entry *quirks;
> @@ -1958,10 +1958,6 @@ static int __init amd_pstate_init(void)
>  	/* check if this machine need CPPC quirks */
>  	dmi_check_system(amd_pstate_quirks_table);
>  
> -	/* get default driver mode for loading*/
> -	cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> -	pr_debug("cppc working state set to mode:%d\n", cppc_state);
> -
>  	switch (cppc_state) {
>  	case AMD_PSTATE_DISABLE:
>  		pr_info("driver load is disabled, boot with specific mode to enable this\n");
> ```
> 
> as we have discussed here [1].
> 
> [1] https://lore.kernel.org/lkml/CYYPR12MB865554562BE018D46FF0108C9CE52@CYYPR12MB8655.namprd12.prod.outlook.com/

Ah no, scratch it, it's not solved. With `amd_pstate=guided` the driver fails to register during the boottime with the same `sysfs` error:

```
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
kernel: Hardware name: ASUS System Product Name/Pro WS X570-ACE, BIOS 4805 03/18/2024
kernel: Call Trace:
kernel:  <TASK>
kernel:  dump_stack_lvl+0x47/0x60
kernel:  sysfs_warn_dup+0x5a/0x70
kernel:  sysfs_create_file_ns+0x196/0x1b0
kernel:  cpufreq_online+0x244/0xde0
kernel:  cpufreq_add_dev+0x7b/0x90
kernel:  subsys_interface_register+0x19e/0x1d0
kernel:  cpufreq_register_driver+0x177/0x2f0
kernel:  amd_pstate_init+0x1b8/0x2c0
kernel:  do_one_initcall+0x5b/0x320
kernel:  kernel_init_freeable+0x1dc/0x380
kernel:  kernel_init+0x1a/0x1c0
kernel:  ret_from_fork+0x34/0x50
kernel:  ret_from_fork_asm+0x1b/0x30
kernel:  </TASK>
```

and things revert to `acpi_cpufreq` instead.

What's wrong?

> 
> But this part:
> 
> > When I try to set `guided` manually via `echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status`, the status gets dropped to `disable`, `tee` errors out with `-ENODEV`, and there's this in the kernel log:
> > 
> > ```
> > $ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
> > kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
> > …
> > kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
> > ```
> 
> is not. I've successfully booted with `amd_pstate=guided`, then did this:
> 
> ```
> $ echo active | sudo tee /sys/devices/system/cpu/amd_pstate/status
> ```
> 
> just for the sake of test, and got this:
> 
> ```
> tee: /sys/devices/system/cpu/amd_pstate/status: File exists
> ```
> 
> and this:
> 
> ```
> kernel: WARNING: CPU: 9 PID: 8528 at drivers/cpufreq/cpufreq.c:2961 cpufreq_unregister_driver+0x1a/0xc0
> ```
> 
> which corresponds to:
> 
> ```
> 2957 void cpufreq_unregister_driver(struct cpufreq_driver *driver)
> 2958 {
> 2959         unsigned long flags;
> 2960
> 2961         if (WARN_ON(!cpufreq_driver || (driver != cpufreq_driver)))
> 2962                 return;
> ```
> 
> I haven't conducted this test before, so I don't know whether this behaviour is new, or it was present in older iterations. I also don't know if this belongs to the "boost" series or the "fixes", and just letting you know so that you can test the runtime switching yourself and see if it is reproducible in your environment as well or not.
> 
> > The following is applied on top of v6.9-rc7:
> > 
> > ```
> > cpufreq: amd-pstate: automatically load pstate driver by default
> > cpufreq: amd-pstate: fix the highest frequency issue which limit performance
> > cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
> > x86/cpufeatures: Add feature bits for AMD heterogeneous processor
> > cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
> > Documentation: PM: amd-pstate: add guide mode to the Operation mode
> > Documentation: PM: amd-pstate: add debugging section for driver loading failure
> > Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
> > cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
> > cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
> > cpufreq: amd-pstate: optimiza the initial frequency values verification
> > Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
> > cpufreq: amd-pstate: introduce per CPU frequency boost control
> > Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
> > cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
> > cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> > cpufreq: amd-pstate: initialize new core precision boost state
> > cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
> > cpufreq: amd-pstate: fix code format problems
> > cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
> > cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
> > cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
> > cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
> > cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
> > cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
> > cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
> > ```
> > 
> > Previously, with your submissions, it was possible to use `guided` mode with my Zen 3.
> > 
> > [1] https://lore.kernel.org/lkml/cover.1715065568.git.perry.yuan@amd.com/
> > 
> > 
> 
> 
>
Oleksandr Natalenko May 8, 2024, 9:31 p.m. UTC | #5
On středa 8. května 2024 21:21:39, SELČ Oleksandr Natalenko wrote:
> On středa 8. května 2024 21:13:40, SELČ Oleksandr Natalenko wrote:
> > On středa 8. května 2024 17:11:42, SELČ Oleksandr Natalenko wrote:
> > > Hello.
> > > 
> > > On středa 8. května 2024 9:21:05, SELČ Perry Yuan wrote:
> > > > Hi all,
> > > > The patchset series add core performance boost feature for AMD pstate
> > > > driver including passisve ,guide and active mode support.
> > > > 
> > > > User can change core frequency boost control with a new sysfs entry:
> > > > 
> > > > "/sys/devices/system/cpu/amd_pstate/cpb_boost"
> > > > 
> > > > 
> > > > 1) globally disable core boost:
> > > > $ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > > > $ lscpu -ae
> > > > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ      MHZ
> > > >   0    0      0    0 0:0:0:0          yes 4201.0000 400.0000 2983.578
> > > >   1    0      0    1 1:1:1:0          yes 4201.0000 400.0000 2983.578
> > > >   2    0      0    2 2:2:2:0          yes 4201.0000 400.0000 2583.855
> > > >   3    0      0    3 3:3:3:0          yes 4201.0000 400.0000 2983.578
> > > >   4    0      0    4 4:4:4:0          yes 4201.0000 400.0000 2983.578
> > > > 
> > > > 2) globally enable core boost:
> > > > $ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > > > $ lscpu -ae
> > > >    0    0      0    0 0:0:0:0          yes 5759.0000 400.0000 2983.578
> > > >   1    0      0    1 1:1:1:0          yes 5759.0000 400.0000 2983.578
> > > >   2    0      0    2 2:2:2:0          yes 5759.0000 400.0000 2983.578
> > > >   3    0      0    3 3:3:3:0          yes 5759.0000 400.0000 2983.578
> > > >   4    0      0    4 4:4:4:0          yes 5759.0000 400.0000 2983.578
> > > > 
> > > > 
> > > > ============================================================================
> > > > The V9 patches add per CPU boost control, user can enable/disable CPUs boost
> > > > as the below command tested on a laptop system.
> > > > # before
> > > >   CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
> > > >   0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
> > > >   1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000
> > > >   2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3386.1260
> > > >   3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> > > > $ sudo rdmsr 0xc00102b3 -p 0
> > > > 10a6
> > > > 
> > > > $ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
> > > > # after
> > > >   CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
> > > >     0    0      0    0 0:0:0:0          yes 3501.0000 400.0000  400.0000
> > > >     1    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1391.0690
> > > >     2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3654.4541
> > > >     3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> > > > $ sudo rdmsr 0xc00102b3 -p 0
> > > > 108a
> > > > 
> > > > 
> > > > The patches have been tested with the AMD 7950X processor and many users
> > > > would like to get core boost control enabled for power saving.
> > > > 
> > > > Perry.
> > > > 
> > > > 
> > > > Changes from v9:
> > > >  * change per CPU boost sysfs file name to `boost` (Mario)
> > > >  * rebased to latest linux-pm/bleeding-edge
> > > > 
> > > > Changes from v8:
> > > >  * pick RB flag for patch 4 (Mario)
> > > >  * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
> > > >  * merge patch 6 into patch 3 (Mario)
> > > >  * add two patch for per CPU boost control patch 6 & 7(Mario)
> > > >  * rebased to latest linux-pm/bleeding-edge
> > > > 
> > > > Changes from v7:
> > > >  * fix the mutext locking issue in the sysfs file update(Ray, Mario)
> > > >  * pick ack flag from Ray
> > > >  * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
> > > >  * rerun the testing to check function works well
> > > >  * rebased to linux-pm/bleeding-edge latest
> > > > 
> > > > Changes from v6:
> > > >  * reword patch 2 commit log (Gautham)
> > > >  * update cover letter description(Gautham)
> > > >  * rebase to kernel v6.9-rc5
> > > > 
> > > > Changes from v4:
> > > >  * drop the legacy boost remove patch, let us keep the legacy interface
> > > >    in case some applications break.
> > > >  * rebase to linux-pm/bleeding-edge branch
> > > >  * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
> > > >    Enhancements which has some intial work done there.
> > > > 
> > > > Changes from v4:
> > > >  * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > > >  * pick RB flag from Gautham R. Shenoy
> > > >  * add Cc Oleksandr Natalenko <oleksandr@natalenko.name>
> > > >  * rebase to latest linux-pm/bleeding-edge branch
> > > >  * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And Enhancements
> > > >  * update  [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
> > > > 
> > > > Changes from v3:
> > > >  * rebased to linux-pm/bleeding-edge v6.8
> > > >  * rename global to amd_pstate_global_params(Oleksandr Natalenko)
> > > >  * remove comments for boot_supported in amd_pstate.h
> > > >  * fix the compiler warning for amd-pstate-ut.ko
> > > >  * use for_each_online_cpu in cpb_boost_store which fix the null pointer
> > > >    error during testing
> > > >  * fix the max frequency value to be KHz when cpb boost disabled(Gautham R. Shenoy)
> > > > 
> > > > Changes from v2:
> > > >  * move global struct to amd-pstate.h
> > > >  * fix the amd-pstate-ut with new cpb control interface
> > > > 
> > > > Changes from v1:
> > > >  * drop suspend/resume fix patch 6/7 because of the fix should be in
> > > >    another fix series instead of CPB feature
> > > >  * move the set_boost remove patch to the last(Mario)
> > > >  * Fix commit info with "Closes:" (Mario)
> > > >  * simplified global.cpb_supported initialization(Mario)
> > > >  * Add guide mode support for CPB control
> > > >  * Fixed some Doc typos and add guide mode info to Doc as well.
> > > > 
> > > > v1: https://lore.kernel.org/all/cover.1706255676.git.perry.yuan@amd.com/
> > > > v2: https://lore.kernel.org/lkml/cover.1707047943.git.perry.yuan@amd.com/
> > > > v3: https://lore.kernel.org/lkml/cover.1707297581.git.perry.yuan@amd.com/
> > > > v4: https://lore.kernel.org/lkml/cover.1710322310.git.perry.yuan@amd.com/
> > > > v5: https://lore.kernel.org/lkml/cover.1710473712.git.perry.yuan@amd.com/
> > > > v6: https://lore.kernel.org/lkml/cover.1710754236.git.perry.yuan@amd.com/
> > > > v7: https://lore.kernel.org/lkml/cover.1713861200.git.perry.yuan@amd.com/
> > > > v8: https://lore.kernel.org/lkml/cover.1714112854.git.perry.yuan@amd.com/
> > > > v9: https://lore.kernel.org/lkml/cover.1714989803.git.perry.yuan@amd.com/
> > > > 
> > > > Perry Yuan (7):
> > > >   cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > > >   cpufreq: amd-pstate: initialize new core precision boost state
> > > >   cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> > > >   cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
> > > >     while cpb boost off
> > > >   Documentation: cpufreq: amd-pstate: introduce the new cpu boost
> > > >     control method
> > > >   cpufreq: amd-pstate: introduce per CPU frequency boost control
> > > >   Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
> > > >     control method
> > > > 
> > > >  Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
> > > >  arch/x86/include/asm/msr-index.h            |   2 +
> > > >  drivers/cpufreq/acpi-cpufreq.c              |   2 -
> > > >  drivers/cpufreq/amd-pstate-ut.c             |   2 +-
> > > >  drivers/cpufreq/amd-pstate.c                | 189 ++++++++++++++++++--
> > > >  include/linux/amd-pstate.h                  |  14 ++
> > > >  6 files changed, 225 insertions(+), 14 deletions(-)
> > > 
> > > I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.
> > > 
> > > The CPU is:
> > > 
> > > ```
> > > Vendor ID:                AuthenticAMD
> > >   Model name:             AMD Ryzen 9 5950X 16-Core Processor
> > >     CPU family:           25
> > >     Model:                33
> > >     Thread(s) per core:   2
> > >     Core(s) per socket:   16
> > >     Socket(s):            1
> > >     Stepping:             2
> > > ```
> > > 
> > > I've got `amd_pstate=guided` set in the kernel cmdline, but `amd-pstate-epp` gets loaded anyway.
> > 
> > OK, this part is solved like below:
> > 
> > ```
> > diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> > index aafa4466e5ced..5aee7d2b8cfd7 100644
> > --- a/drivers/cpufreq/amd-pstate.c
> > +++ b/drivers/cpufreq/amd-pstate.c
> > @@ -66,7 +66,7 @@
> >  static struct cpufreq_driver *current_pstate_driver;
> >  static struct cpufreq_driver amd_pstate_driver;
> >  static struct cpufreq_driver amd_pstate_epp_driver;
> > -static int cppc_state;
> > +static int cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> >  static bool cppc_enabled;
> >  static bool amd_pstate_prefcore = true;
> >  static struct quirk_entry *quirks;
> > @@ -1958,10 +1958,6 @@ static int __init amd_pstate_init(void)
> >  	/* check if this machine need CPPC quirks */
> >  	dmi_check_system(amd_pstate_quirks_table);
> >  
> > -	/* get default driver mode for loading*/
> > -	cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> > -	pr_debug("cppc working state set to mode:%d\n", cppc_state);
> > -
> >  	switch (cppc_state) {
> >  	case AMD_PSTATE_DISABLE:
> >  		pr_info("driver load is disabled, boot with specific mode to enable this\n");
> > ```
> > 
> > as we have discussed here [1].
> > 
> > [1] https://lore.kernel.org/lkml/CYYPR12MB865554562BE018D46FF0108C9CE52@CYYPR12MB8655.namprd12.prod.outlook.com/
> 
> Ah no, scratch it, it's not solved. With `amd_pstate=guided` the driver fails to register during the boottime with the same `sysfs` error:
> 
> ```
> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
> kernel: Hardware name: ASUS System Product Name/Pro WS X570-ACE, BIOS 4805 03/18/2024
> kernel: Call Trace:
> kernel:  <TASK>
> kernel:  dump_stack_lvl+0x47/0x60
> kernel:  sysfs_warn_dup+0x5a/0x70
> kernel:  sysfs_create_file_ns+0x196/0x1b0
> kernel:  cpufreq_online+0x244/0xde0
> kernel:  cpufreq_add_dev+0x7b/0x90
> kernel:  subsys_interface_register+0x19e/0x1d0
> kernel:  cpufreq_register_driver+0x177/0x2f0
> kernel:  amd_pstate_init+0x1b8/0x2c0
> kernel:  do_one_initcall+0x5b/0x320
> kernel:  kernel_init_freeable+0x1dc/0x380
> kernel:  kernel_init+0x1a/0x1c0
> kernel:  ret_from_fork+0x34/0x50
> kernel:  ret_from_fork_asm+0x1b/0x30
> kernel:  </TASK>
> ```
> 
> and things revert to `acpi_cpufreq` instead.
> 
> What's wrong?

This happens with both `amd_pstate=guided` and `amd_pstate=passive`, while with `amd_pstate=active` it works. Also note I've got:

```
CONFIG_X86_AMD_PSTATE=y
CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
```

aka "active" by default.

It seems I miss to understand something in the init sequence.

> 
> > 
> > But this part:
> > 
> > > When I try to set `guided` manually via `echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status`, the status gets dropped to `disable`, `tee` errors out with `-ENODEV`, and there's this in the kernel log:
> > > 
> > > ```
> > > $ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
> > > kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
> > > …
> > > kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
> > > ```
> > 
> > is not. I've successfully booted with `amd_pstate=guided`, then did this:
> > 
> > ```
> > $ echo active | sudo tee /sys/devices/system/cpu/amd_pstate/status
> > ```
> > 
> > just for the sake of test, and got this:
> > 
> > ```
> > tee: /sys/devices/system/cpu/amd_pstate/status: File exists
> > ```
> > 
> > and this:
> > 
> > ```
> > kernel: WARNING: CPU: 9 PID: 8528 at drivers/cpufreq/cpufreq.c:2961 cpufreq_unregister_driver+0x1a/0xc0
> > ```
> > 
> > which corresponds to:
> > 
> > ```
> > 2957 void cpufreq_unregister_driver(struct cpufreq_driver *driver)
> > 2958 {
> > 2959         unsigned long flags;
> > 2960
> > 2961         if (WARN_ON(!cpufreq_driver || (driver != cpufreq_driver)))
> > 2962                 return;
> > ```
> > 
> > I haven't conducted this test before, so I don't know whether this behaviour is new, or it was present in older iterations. I also don't know if this belongs to the "boost" series or the "fixes", and just letting you know so that you can test the runtime switching yourself and see if it is reproducible in your environment as well or not.
> > 
> > > The following is applied on top of v6.9-rc7:
> > > 
> > > ```
> > > cpufreq: amd-pstate: automatically load pstate driver by default
> > > cpufreq: amd-pstate: fix the highest frequency issue which limit performance
> > > cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
> > > x86/cpufeatures: Add feature bits for AMD heterogeneous processor
> > > cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
> > > Documentation: PM: amd-pstate: add guide mode to the Operation mode
> > > Documentation: PM: amd-pstate: add debugging section for driver loading failure
> > > Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
> > > cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
> > > cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
> > > cpufreq: amd-pstate: optimiza the initial frequency values verification
> > > Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
> > > cpufreq: amd-pstate: introduce per CPU frequency boost control
> > > Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
> > > cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
> > > cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> > > cpufreq: amd-pstate: initialize new core precision boost state
> > > cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > > cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
> > > cpufreq: amd-pstate: fix code format problems
> > > cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
> > > cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
> > > cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
> > > cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
> > > cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
> > > cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
> > > cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
> > > ```
> > > 
> > > Previously, with your submissions, it was possible to use `guided` mode with my Zen 3.
> > > 
> > > [1] https://lore.kernel.org/lkml/cover.1715065568.git.perry.yuan@amd.com/
> > > 
> > > 
> > 
> > 
> > 
> 
> 
>
Mario Limonciello May 8, 2024, 10:13 p.m. UTC | #6
On 5/8/2024 16:31, Oleksandr Natalenko wrote:
> On středa 8. května 2024 21:21:39, SELČ Oleksandr Natalenko wrote:
>> On středa 8. května 2024 21:13:40, SELČ Oleksandr Natalenko wrote:
>>> On středa 8. května 2024 17:11:42, SELČ Oleksandr Natalenko wrote:
>>>> Hello.
>>>>
>>>> On středa 8. května 2024 9:21:05, SELČ Perry Yuan wrote:
>>>>> Hi all,
>>>>> The patchset series add core performance boost feature for AMD pstate
>>>>> driver including passisve ,guide and active mode support.
>>>>>
>>>>> User can change core frequency boost control with a new sysfs entry:
>>>>>
>>>>> "/sys/devices/system/cpu/amd_pstate/cpb_boost"
>>>>>
>>>>>
>>>>> 1) globally disable core boost:
>>>>> $ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
>>>>> $ lscpu -ae
>>>>> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ      MHZ
>>>>>    0    0      0    0 0:0:0:0          yes 4201.0000 400.0000 2983.578
>>>>>    1    0      0    1 1:1:1:0          yes 4201.0000 400.0000 2983.578
>>>>>    2    0      0    2 2:2:2:0          yes 4201.0000 400.0000 2583.855
>>>>>    3    0      0    3 3:3:3:0          yes 4201.0000 400.0000 2983.578
>>>>>    4    0      0    4 4:4:4:0          yes 4201.0000 400.0000 2983.578
>>>>>
>>>>> 2) globally enable core boost:
>>>>> $ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
>>>>> $ lscpu -ae
>>>>>     0    0      0    0 0:0:0:0          yes 5759.0000 400.0000 2983.578
>>>>>    1    0      0    1 1:1:1:0          yes 5759.0000 400.0000 2983.578
>>>>>    2    0      0    2 2:2:2:0          yes 5759.0000 400.0000 2983.578
>>>>>    3    0      0    3 3:3:3:0          yes 5759.0000 400.0000 2983.578
>>>>>    4    0      0    4 4:4:4:0          yes 5759.0000 400.0000 2983.578
>>>>>
>>>>>
>>>>> ============================================================================
>>>>> The V9 patches add per CPU boost control, user can enable/disable CPUs boost
>>>>> as the below command tested on a laptop system.
>>>>> # before
>>>>>    CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
>>>>>    0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
>>>>>    1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000
>>>>>    2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3386.1260
>>>>>    3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
>>>>> $ sudo rdmsr 0xc00102b3 -p 0
>>>>> 10a6
>>>>>
>>>>> $ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
>>>>> # after
>>>>>    CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
>>>>>      0    0      0    0 0:0:0:0          yes 3501.0000 400.0000  400.0000
>>>>>      1    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1391.0690
>>>>>      2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3654.4541
>>>>>      3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
>>>>> $ sudo rdmsr 0xc00102b3 -p 0
>>>>> 108a
>>>>>
>>>>>
>>>>> The patches have been tested with the AMD 7950X processor and many users
>>>>> would like to get core boost control enabled for power saving.
>>>>>
>>>>> Perry.
>>>>>
>>>>>
>>>>> Changes from v9:
>>>>>   * change per CPU boost sysfs file name to `boost` (Mario)
>>>>>   * rebased to latest linux-pm/bleeding-edge
>>>>>
>>>>> Changes from v8:
>>>>>   * pick RB flag for patch 4 (Mario)
>>>>>   * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
>>>>>   * merge patch 6 into patch 3 (Mario)
>>>>>   * add two patch for per CPU boost control patch 6 & 7(Mario)
>>>>>   * rebased to latest linux-pm/bleeding-edge
>>>>>
>>>>> Changes from v7:
>>>>>   * fix the mutext locking issue in the sysfs file update(Ray, Mario)
>>>>>   * pick ack flag from Ray
>>>>>   * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
>>>>>   * rerun the testing to check function works well
>>>>>   * rebased to linux-pm/bleeding-edge latest
>>>>>
>>>>> Changes from v6:
>>>>>   * reword patch 2 commit log (Gautham)
>>>>>   * update cover letter description(Gautham)
>>>>>   * rebase to kernel v6.9-rc5
>>>>>
>>>>> Changes from v4:
>>>>>   * drop the legacy boost remove patch, let us keep the legacy interface
>>>>>     in case some applications break.
>>>>>   * rebase to linux-pm/bleeding-edge branch
>>>>>   * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
>>>>>     Enhancements which has some intial work done there.
>>>>>
>>>>> Changes from v4:
>>>>>   * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
>>>>>   * pick RB flag from Gautham R. Shenoy
>>>>>   * add Cc Oleksandr Natalenko <oleksandr@natalenko.name>
>>>>>   * rebase to latest linux-pm/bleeding-edge branch
>>>>>   * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And Enhancements
>>>>>   * update  [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
>>>>>
>>>>> Changes from v3:
>>>>>   * rebased to linux-pm/bleeding-edge v6.8
>>>>>   * rename global to amd_pstate_global_params(Oleksandr Natalenko)
>>>>>   * remove comments for boot_supported in amd_pstate.h
>>>>>   * fix the compiler warning for amd-pstate-ut.ko
>>>>>   * use for_each_online_cpu in cpb_boost_store which fix the null pointer
>>>>>     error during testing
>>>>>   * fix the max frequency value to be KHz when cpb boost disabled(Gautham R. Shenoy)
>>>>>
>>>>> Changes from v2:
>>>>>   * move global struct to amd-pstate.h
>>>>>   * fix the amd-pstate-ut with new cpb control interface
>>>>>
>>>>> Changes from v1:
>>>>>   * drop suspend/resume fix patch 6/7 because of the fix should be in
>>>>>     another fix series instead of CPB feature
>>>>>   * move the set_boost remove patch to the last(Mario)
>>>>>   * Fix commit info with "Closes:" (Mario)
>>>>>   * simplified global.cpb_supported initialization(Mario)
>>>>>   * Add guide mode support for CPB control
>>>>>   * Fixed some Doc typos and add guide mode info to Doc as well.
>>>>>
>>>>> v1: https://lore.kernel.org/all/cover.1706255676.git.perry.yuan@amd.com/
>>>>> v2: https://lore.kernel.org/lkml/cover.1707047943.git.perry.yuan@amd.com/
>>>>> v3: https://lore.kernel.org/lkml/cover.1707297581.git.perry.yuan@amd.com/
>>>>> v4: https://lore.kernel.org/lkml/cover.1710322310.git.perry.yuan@amd.com/
>>>>> v5: https://lore.kernel.org/lkml/cover.1710473712.git.perry.yuan@amd.com/
>>>>> v6: https://lore.kernel.org/lkml/cover.1710754236.git.perry.yuan@amd.com/
>>>>> v7: https://lore.kernel.org/lkml/cover.1713861200.git.perry.yuan@amd.com/
>>>>> v8: https://lore.kernel.org/lkml/cover.1714112854.git.perry.yuan@amd.com/
>>>>> v9: https://lore.kernel.org/lkml/cover.1714989803.git.perry.yuan@amd.com/
>>>>>
>>>>> Perry Yuan (7):
>>>>>    cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
>>>>>    cpufreq: amd-pstate: initialize new core precision boost state
>>>>>    cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
>>>>>    cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
>>>>>      while cpb boost off
>>>>>    Documentation: cpufreq: amd-pstate: introduce the new cpu boost
>>>>>      control method
>>>>>    cpufreq: amd-pstate: introduce per CPU frequency boost control
>>>>>    Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
>>>>>      control method
>>>>>
>>>>>   Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
>>>>>   arch/x86/include/asm/msr-index.h            |   2 +
>>>>>   drivers/cpufreq/acpi-cpufreq.c              |   2 -
>>>>>   drivers/cpufreq/amd-pstate-ut.c             |   2 +-
>>>>>   drivers/cpufreq/amd-pstate.c                | 189 ++++++++++++++++++--
>>>>>   include/linux/amd-pstate.h                  |  14 ++
>>>>>   6 files changed, 225 insertions(+), 14 deletions(-)
>>>>
>>>> I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.
>>>>
>>>> The CPU is:
>>>>
>>>> ```
>>>> Vendor ID:                AuthenticAMD
>>>>    Model name:             AMD Ryzen 9 5950X 16-Core Processor
>>>>      CPU family:           25
>>>>      Model:                33
>>>>      Thread(s) per core:   2
>>>>      Core(s) per socket:   16
>>>>      Socket(s):            1
>>>>      Stepping:             2
>>>> ```
>>>>
>>>> I've got `amd_pstate=guided` set in the kernel cmdline, but `amd-pstate-epp` gets loaded anyway.
>>>
>>> OK, this part is solved like below:
>>>
>>> ```
>>> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
>>> index aafa4466e5ced..5aee7d2b8cfd7 100644
>>> --- a/drivers/cpufreq/amd-pstate.c
>>> +++ b/drivers/cpufreq/amd-pstate.c
>>> @@ -66,7 +66,7 @@
>>>   static struct cpufreq_driver *current_pstate_driver;
>>>   static struct cpufreq_driver amd_pstate_driver;
>>>   static struct cpufreq_driver amd_pstate_epp_driver;
>>> -static int cppc_state;
>>> +static int cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
>>>   static bool cppc_enabled;
>>>   static bool amd_pstate_prefcore = true;
>>>   static struct quirk_entry *quirks;
>>> @@ -1958,10 +1958,6 @@ static int __init amd_pstate_init(void)
>>>   	/* check if this machine need CPPC quirks */
>>>   	dmi_check_system(amd_pstate_quirks_table);
>>>   
>>> -	/* get default driver mode for loading*/
>>> -	cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
>>> -	pr_debug("cppc working state set to mode:%d\n", cppc_state);
>>> -
>>>   	switch (cppc_state) {
>>>   	case AMD_PSTATE_DISABLE:
>>>   		pr_info("driver load is disabled, boot with specific mode to enable this\n");
>>> ```
>>>
>>> as we have discussed here [1].
>>>
>>> [1] https://lore.kernel.org/lkml/CYYPR12MB865554562BE018D46FF0108C9CE52@CYYPR12MB8655.namprd12.prod.outlook.com/
>>
>> Ah no, scratch it, it's not solved. With `amd_pstate=guided` the driver fails to register during the boottime with the same `sysfs` error:
>>
>> ```
>> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
>> kernel: Hardware name: ASUS System Product Name/Pro WS X570-ACE, BIOS 4805 03/18/2024
>> kernel: Call Trace:
>> kernel:  <TASK>
>> kernel:  dump_stack_lvl+0x47/0x60
>> kernel:  sysfs_warn_dup+0x5a/0x70
>> kernel:  sysfs_create_file_ns+0x196/0x1b0
>> kernel:  cpufreq_online+0x244/0xde0
>> kernel:  cpufreq_add_dev+0x7b/0x90
>> kernel:  subsys_interface_register+0x19e/0x1d0
>> kernel:  cpufreq_register_driver+0x177/0x2f0
>> kernel:  amd_pstate_init+0x1b8/0x2c0
>> kernel:  do_one_initcall+0x5b/0x320
>> kernel:  kernel_init_freeable+0x1dc/0x380
>> kernel:  kernel_init+0x1a/0x1c0
>> kernel:  ret_from_fork+0x34/0x50
>> kernel:  ret_from_fork_asm+0x1b/0x30
>> kernel:  </TASK>
>> ```
>>
>> and things revert to `acpi_cpufreq` instead.
>>
>> What's wrong?
> 
> This happens with both `amd_pstate=guided` and `amd_pstate=passive`, while with `amd_pstate=active` it works. Also note I've got:
> 
> ```
> CONFIG_X86_AMD_PSTATE=y
> CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
> ```
> 
> aka "active" by default.
> 
> It seems I miss to understand something in the init sequence.
> 

I think what's going on is that by reusing the same name as acpi_cppc 
does for sysfs when amd pstate is changing modes the sysfs file from 
amd-pstate isn't cleared and so acpi_cppc tries to make it.

Don't get me wrong - I do think that we should keep the same sysfs name 
for both, it's easier for users.

But if we're going to keep mode switching from amd-pstate at runtime we 
really need to make sure that amd-pstate-ut explicitly tests all these 
combinations to catch these types of problems.

>>
>>>
>>> But this part:
>>>
>>>> When I try to set `guided` manually via `echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status`, the status gets dropped to `disable`, `tee` errors out with `-ENODEV`, and there's this in the kernel log:
>>>>
>>>> ```
>>>> $ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
>>>> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
>>>> …
>>>> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
>>>> ```
>>>
>>> is not. I've successfully booted with `amd_pstate=guided`, then did this:
>>>
>>> ```
>>> $ echo active | sudo tee /sys/devices/system/cpu/amd_pstate/status
>>> ```
>>>
>>> just for the sake of test, and got this:
>>>
>>> ```
>>> tee: /sys/devices/system/cpu/amd_pstate/status: File exists
>>> ```
>>>
>>> and this:
>>>
>>> ```
>>> kernel: WARNING: CPU: 9 PID: 8528 at drivers/cpufreq/cpufreq.c:2961 cpufreq_unregister_driver+0x1a/0xc0
>>> ```
>>>
>>> which corresponds to:
>>>
>>> ```
>>> 2957 void cpufreq_unregister_driver(struct cpufreq_driver *driver)
>>> 2958 {
>>> 2959         unsigned long flags;
>>> 2960
>>> 2961         if (WARN_ON(!cpufreq_driver || (driver != cpufreq_driver)))
>>> 2962                 return;
>>> ```
>>>
>>> I haven't conducted this test before, so I don't know whether this behaviour is new, or it was present in older iterations. I also don't know if this belongs to the "boost" series or the "fixes", and just letting you know so that you can test the runtime switching yourself and see if it is reproducible in your environment as well or not.
>>>
>>>> The following is applied on top of v6.9-rc7:
>>>>
>>>> ```
>>>> cpufreq: amd-pstate: automatically load pstate driver by default
>>>> cpufreq: amd-pstate: fix the highest frequency issue which limit performance
>>>> cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
>>>> x86/cpufeatures: Add feature bits for AMD heterogeneous processor
>>>> cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
>>>> Documentation: PM: amd-pstate: add guide mode to the Operation mode
>>>> Documentation: PM: amd-pstate: add debugging section for driver loading failure
>>>> Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
>>>> cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
>>>> cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
>>>> cpufreq: amd-pstate: optimiza the initial frequency values verification
>>>> Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
>>>> cpufreq: amd-pstate: introduce per CPU frequency boost control
>>>> Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
>>>> cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
>>>> cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
>>>> cpufreq: amd-pstate: initialize new core precision boost state
>>>> cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
>>>> cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
>>>> cpufreq: amd-pstate: fix code format problems
>>>> cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
>>>> cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
>>>> cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
>>>> cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
>>>> cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
>>>> cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
>>>> cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
>>>> ```
>>>>
>>>> Previously, with your submissions, it was possible to use `guided` mode with my Zen 3.
>>>>
>>>> [1] https://lore.kernel.org/lkml/cover.1715065568.git.perry.yuan@amd.com/
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>>
> 
>
Oleksandr Natalenko May 9, 2024, 12:01 p.m. UTC | #7
On čtvrtek 9. května 2024 0:13:49, SELČ Mario Limonciello wrote:
> On 5/8/2024 16:31, Oleksandr Natalenko wrote:
> > On středa 8. května 2024 21:21:39, SELČ Oleksandr Natalenko wrote:
> >> On středa 8. května 2024 21:13:40, SELČ Oleksandr Natalenko wrote:
> >>> On středa 8. května 2024 17:11:42, SELČ Oleksandr Natalenko wrote:
> >>>> Hello.
> >>>>
> >>>> On středa 8. května 2024 9:21:05, SELČ Perry Yuan wrote:
> >>>>> Hi all,
> >>>>> The patchset series add core performance boost feature for AMD pstate
> >>>>> driver including passisve ,guide and active mode support.
> >>>>>
> >>>>> User can change core frequency boost control with a new sysfs entry:
> >>>>>
> >>>>> "/sys/devices/system/cpu/amd_pstate/cpb_boost"
> >>>>>
> >>>>>
> >>>>> 1) globally disable core boost:
> >>>>> $ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> >>>>> $ lscpu -ae
> >>>>> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ      MHZ
> >>>>>    0    0      0    0 0:0:0:0          yes 4201.0000 400.0000 2983.578
> >>>>>    1    0      0    1 1:1:1:0          yes 4201.0000 400.0000 2983.578
> >>>>>    2    0      0    2 2:2:2:0          yes 4201.0000 400.0000 2583.855
> >>>>>    3    0      0    3 3:3:3:0          yes 4201.0000 400.0000 2983.578
> >>>>>    4    0      0    4 4:4:4:0          yes 4201.0000 400.0000 2983.578
> >>>>>
> >>>>> 2) globally enable core boost:
> >>>>> $ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> >>>>> $ lscpu -ae
> >>>>>     0    0      0    0 0:0:0:0          yes 5759.0000 400.0000 2983.578
> >>>>>    1    0      0    1 1:1:1:0          yes 5759.0000 400.0000 2983.578
> >>>>>    2    0      0    2 2:2:2:0          yes 5759.0000 400.0000 2983.578
> >>>>>    3    0      0    3 3:3:3:0          yes 5759.0000 400.0000 2983.578
> >>>>>    4    0      0    4 4:4:4:0          yes 5759.0000 400.0000 2983.578
> >>>>>
> >>>>>
> >>>>> ============================================================================
> >>>>> The V9 patches add per CPU boost control, user can enable/disable CPUs boost
> >>>>> as the below command tested on a laptop system.
> >>>>> # before
> >>>>>    CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
> >>>>>    0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
> >>>>>    1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000
> >>>>>    2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3386.1260
> >>>>>    3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> >>>>> $ sudo rdmsr 0xc00102b3 -p 0
> >>>>> 10a6
> >>>>>
> >>>>> $ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
> >>>>> # after
> >>>>>    CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ       MHZ
> >>>>>      0    0      0    0 0:0:0:0          yes 3501.0000 400.0000  400.0000
> >>>>>      1    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1391.0690
> >>>>>      2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3654.4541
> >>>>>      3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> >>>>> $ sudo rdmsr 0xc00102b3 -p 0
> >>>>> 108a
> >>>>>
> >>>>>
> >>>>> The patches have been tested with the AMD 7950X processor and many users
> >>>>> would like to get core boost control enabled for power saving.
> >>>>>
> >>>>> Perry.
> >>>>>
> >>>>>
> >>>>> Changes from v9:
> >>>>>   * change per CPU boost sysfs file name to `boost` (Mario)
> >>>>>   * rebased to latest linux-pm/bleeding-edge
> >>>>>
> >>>>> Changes from v8:
> >>>>>   * pick RB flag for patch 4 (Mario)
> >>>>>   * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
> >>>>>   * merge patch 6 into patch 3 (Mario)
> >>>>>   * add two patch for per CPU boost control patch 6 & 7(Mario)
> >>>>>   * rebased to latest linux-pm/bleeding-edge
> >>>>>
> >>>>> Changes from v7:
> >>>>>   * fix the mutext locking issue in the sysfs file update(Ray, Mario)
> >>>>>   * pick ack flag from Ray
> >>>>>   * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
> >>>>>   * rerun the testing to check function works well
> >>>>>   * rebased to linux-pm/bleeding-edge latest
> >>>>>
> >>>>> Changes from v6:
> >>>>>   * reword patch 2 commit log (Gautham)
> >>>>>   * update cover letter description(Gautham)
> >>>>>   * rebase to kernel v6.9-rc5
> >>>>>
> >>>>> Changes from v4:
> >>>>>   * drop the legacy boost remove patch, let us keep the legacy interface
> >>>>>     in case some applications break.
> >>>>>   * rebase to linux-pm/bleeding-edge branch
> >>>>>   * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
> >>>>>     Enhancements which has some intial work done there.
> >>>>>
> >>>>> Changes from v4:
> >>>>>   * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> >>>>>   * pick RB flag from Gautham R. Shenoy
> >>>>>   * add Cc Oleksandr Natalenko <oleksandr@natalenko.name>
> >>>>>   * rebase to latest linux-pm/bleeding-edge branch
> >>>>>   * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And Enhancements
> >>>>>   * update  [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
> >>>>>
> >>>>> Changes from v3:
> >>>>>   * rebased to linux-pm/bleeding-edge v6.8
> >>>>>   * rename global to amd_pstate_global_params(Oleksandr Natalenko)
> >>>>>   * remove comments for boot_supported in amd_pstate.h
> >>>>>   * fix the compiler warning for amd-pstate-ut.ko
> >>>>>   * use for_each_online_cpu in cpb_boost_store which fix the null pointer
> >>>>>     error during testing
> >>>>>   * fix the max frequency value to be KHz when cpb boost disabled(Gautham R. Shenoy)
> >>>>>
> >>>>> Changes from v2:
> >>>>>   * move global struct to amd-pstate.h
> >>>>>   * fix the amd-pstate-ut with new cpb control interface
> >>>>>
> >>>>> Changes from v1:
> >>>>>   * drop suspend/resume fix patch 6/7 because of the fix should be in
> >>>>>     another fix series instead of CPB feature
> >>>>>   * move the set_boost remove patch to the last(Mario)
> >>>>>   * Fix commit info with "Closes:" (Mario)
> >>>>>   * simplified global.cpb_supported initialization(Mario)
> >>>>>   * Add guide mode support for CPB control
> >>>>>   * Fixed some Doc typos and add guide mode info to Doc as well.
> >>>>>
> >>>>> v1: https://lore.kernel.org/all/cover.1706255676.git.perry.yuan@amd.com/
> >>>>> v2: https://lore.kernel.org/lkml/cover.1707047943.git.perry.yuan@amd.com/
> >>>>> v3: https://lore.kernel.org/lkml/cover.1707297581.git.perry.yuan@amd.com/
> >>>>> v4: https://lore.kernel.org/lkml/cover.1710322310.git.perry.yuan@amd.com/
> >>>>> v5: https://lore.kernel.org/lkml/cover.1710473712.git.perry.yuan@amd.com/
> >>>>> v6: https://lore.kernel.org/lkml/cover.1710754236.git.perry.yuan@amd.com/
> >>>>> v7: https://lore.kernel.org/lkml/cover.1713861200.git.perry.yuan@amd.com/
> >>>>> v8: https://lore.kernel.org/lkml/cover.1714112854.git.perry.yuan@amd.com/
> >>>>> v9: https://lore.kernel.org/lkml/cover.1714989803.git.perry.yuan@amd.com/
> >>>>>
> >>>>> Perry Yuan (7):
> >>>>>    cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> >>>>>    cpufreq: amd-pstate: initialize new core precision boost state
> >>>>>    cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> >>>>>    cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
> >>>>>      while cpb boost off
> >>>>>    Documentation: cpufreq: amd-pstate: introduce the new cpu boost
> >>>>>      control method
> >>>>>    cpufreq: amd-pstate: introduce per CPU frequency boost control
> >>>>>    Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
> >>>>>      control method
> >>>>>
> >>>>>   Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
> >>>>>   arch/x86/include/asm/msr-index.h            |   2 +
> >>>>>   drivers/cpufreq/acpi-cpufreq.c              |   2 -
> >>>>>   drivers/cpufreq/amd-pstate-ut.c             |   2 +-
> >>>>>   drivers/cpufreq/amd-pstate.c                | 189 ++++++++++++++++++--
> >>>>>   include/linux/amd-pstate.h                  |  14 ++
> >>>>>   6 files changed, 225 insertions(+), 14 deletions(-)
> >>>>
> >>>> I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.
> >>>>
> >>>> The CPU is:
> >>>>
> >>>> ```
> >>>> Vendor ID:                AuthenticAMD
> >>>>    Model name:             AMD Ryzen 9 5950X 16-Core Processor
> >>>>      CPU family:           25
> >>>>      Model:                33
> >>>>      Thread(s) per core:   2
> >>>>      Core(s) per socket:   16
> >>>>      Socket(s):            1
> >>>>      Stepping:             2
> >>>> ```
> >>>>
> >>>> I've got `amd_pstate=guided` set in the kernel cmdline, but `amd-pstate-epp` gets loaded anyway.
> >>>
> >>> OK, this part is solved like below:
> >>>
> >>> ```
> >>> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> >>> index aafa4466e5ced..5aee7d2b8cfd7 100644
> >>> --- a/drivers/cpufreq/amd-pstate.c
> >>> +++ b/drivers/cpufreq/amd-pstate.c
> >>> @@ -66,7 +66,7 @@
> >>>   static struct cpufreq_driver *current_pstate_driver;
> >>>   static struct cpufreq_driver amd_pstate_driver;
> >>>   static struct cpufreq_driver amd_pstate_epp_driver;
> >>> -static int cppc_state;
> >>> +static int cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> >>>   static bool cppc_enabled;
> >>>   static bool amd_pstate_prefcore = true;
> >>>   static struct quirk_entry *quirks;
> >>> @@ -1958,10 +1958,6 @@ static int __init amd_pstate_init(void)
> >>>   	/* check if this machine need CPPC quirks */
> >>>   	dmi_check_system(amd_pstate_quirks_table);
> >>>   
> >>> -	/* get default driver mode for loading*/
> >>> -	cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> >>> -	pr_debug("cppc working state set to mode:%d\n", cppc_state);
> >>> -
> >>>   	switch (cppc_state) {
> >>>   	case AMD_PSTATE_DISABLE:
> >>>   		pr_info("driver load is disabled, boot with specific mode to enable this\n");
> >>> ```
> >>>
> >>> as we have discussed here [1].
> >>>
> >>> [1] https://lore.kernel.org/lkml/CYYPR12MB865554562BE018D46FF0108C9CE52@CYYPR12MB8655.namprd12.prod.outlook.com/
> >>
> >> Ah no, scratch it, it's not solved. With `amd_pstate=guided` the driver fails to register during the boottime with the same `sysfs` error:
> >>
> >> ```
> >> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
> >> kernel: Hardware name: ASUS System Product Name/Pro WS X570-ACE, BIOS 4805 03/18/2024
> >> kernel: Call Trace:
> >> kernel:  <TASK>
> >> kernel:  dump_stack_lvl+0x47/0x60
> >> kernel:  sysfs_warn_dup+0x5a/0x70
> >> kernel:  sysfs_create_file_ns+0x196/0x1b0
> >> kernel:  cpufreq_online+0x244/0xde0
> >> kernel:  cpufreq_add_dev+0x7b/0x90
> >> kernel:  subsys_interface_register+0x19e/0x1d0
> >> kernel:  cpufreq_register_driver+0x177/0x2f0
> >> kernel:  amd_pstate_init+0x1b8/0x2c0
> >> kernel:  do_one_initcall+0x5b/0x320
> >> kernel:  kernel_init_freeable+0x1dc/0x380
> >> kernel:  kernel_init+0x1a/0x1c0
> >> kernel:  ret_from_fork+0x34/0x50
> >> kernel:  ret_from_fork_asm+0x1b/0x30
> >> kernel:  </TASK>
> >> ```
> >>
> >> and things revert to `acpi_cpufreq` instead.
> >>
> >> What's wrong?
> > 
> > This happens with both `amd_pstate=guided` and `amd_pstate=passive`, while with `amd_pstate=active` it works. Also note I've got:
> > 
> > ```
> > CONFIG_X86_AMD_PSTATE=y
> > CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
> > ```
> > 
> > aka "active" by default.
> > 
> > It seems I miss to understand something in the init sequence.
> > 
> 
> I think what's going on is that by reusing the same name as acpi_cppc 
> does for sysfs when amd pstate is changing modes the sysfs file from 
> amd-pstate isn't cleared and so acpi_cppc tries to make it.

Seems so. I've renamed `amd_pstate`'s `boost` file to `amd_pstate_boost`, and now I'm able to boot with `amd_pstate=guided`, and after boot under `/sys/devices/system/cpu/cpufreq/policyX` I see both `boost` (from `acpi_cppc`, apparently) and `amd_pstate_boost` at the same time.

Not sure the fact both files are present is as intended.

> 
> Don't get me wrong - I do think that we should keep the same sysfs name 
> for both, it's easier for users.
> 
> But if we're going to keep mode switching from amd-pstate at runtime we 
> really need to make sure that amd-pstate-ut explicitly tests all these 
> combinations to catch these types of problems.

Not sure it's runtime switching only that is affected. I guess having `CONFIG_X86_AMD_PSTATE_DEFAULT_MODE` set to `active` and then having `amd_pstate=guided` on the kernel cmdline is not considered to be a runtime switching (or is it?), yet it doesn't work either due to filename conflict.

> >>
> >>>
> >>> But this part:
> >>>
> >>>> When I try to set `guided` manually via `echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status`, the status gets dropped to `disable`, `tee` errors out with `-ENODEV`, and there's this in the kernel log:
> >>>>
> >>>> ```
> >>>> $ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
> >>>> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
> >>>> …
> >>>> kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
> >>>> ```
> >>>
> >>> is not. I've successfully booted with `amd_pstate=guided`, then did this:
> >>>
> >>> ```
> >>> $ echo active | sudo tee /sys/devices/system/cpu/amd_pstate/status
> >>> ```
> >>>
> >>> just for the sake of test, and got this:
> >>>
> >>> ```
> >>> tee: /sys/devices/system/cpu/amd_pstate/status: File exists
> >>> ```
> >>>
> >>> and this:
> >>>
> >>> ```
> >>> kernel: WARNING: CPU: 9 PID: 8528 at drivers/cpufreq/cpufreq.c:2961 cpufreq_unregister_driver+0x1a/0xc0
> >>> ```
> >>>
> >>> which corresponds to:
> >>>
> >>> ```
> >>> 2957 void cpufreq_unregister_driver(struct cpufreq_driver *driver)
> >>> 2958 {
> >>> 2959         unsigned long flags;
> >>> 2960
> >>> 2961         if (WARN_ON(!cpufreq_driver || (driver != cpufreq_driver)))
> >>> 2962                 return;
> >>> ```
> >>>
> >>> I haven't conducted this test before, so I don't know whether this behaviour is new, or it was present in older iterations. I also don't know if this belongs to the "boost" series or the "fixes", and just letting you know so that you can test the runtime switching yourself and see if it is reproducible in your environment as well or not.
> >>>
> >>>> The following is applied on top of v6.9-rc7:
> >>>>
> >>>> ```
> >>>> cpufreq: amd-pstate: automatically load pstate driver by default
> >>>> cpufreq: amd-pstate: fix the highest frequency issue which limit performance
> >>>> cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
> >>>> x86/cpufeatures: Add feature bits for AMD heterogeneous processor
> >>>> cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
> >>>> Documentation: PM: amd-pstate: add guide mode to the Operation mode
> >>>> Documentation: PM: amd-pstate: add debugging section for driver loading failure
> >>>> Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
> >>>> cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
> >>>> cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
> >>>> cpufreq: amd-pstate: optimiza the initial frequency values verification
> >>>> Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
> >>>> cpufreq: amd-pstate: introduce per CPU frequency boost control
> >>>> Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
> >>>> cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
> >>>> cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> >>>> cpufreq: amd-pstate: initialize new core precision boost state
> >>>> cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> >>>> cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
> >>>> cpufreq: amd-pstate: fix code format problems
> >>>> cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
> >>>> cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
> >>>> cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
> >>>> cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
> >>>> cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
> >>>> cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
> >>>> cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
> >>>> ```
> >>>>
> >>>> Previously, with your submissions, it was possible to use `guided` mode with my Zen 3.
> >>>>
> >>>> [1] https://lore.kernel.org/lkml/cover.1715065568.git.perry.yuan@amd.com/
> >>>>
> >>>>
> >>>
> >>>
> >>>
> >>
> >>
> >>
> > 
> > 
> 
>
Perry Yuan May 9, 2024, 4:01 p.m. UTC | #8
[AMD Official Use Only - General]

 Hi Boris,

> -----Original Message-----
> From: Borislav Petkov <bp@alien8.de>
> Sent: Wednesday, May 8, 2024 4:19 PM
> To: Yuan, Perry <Perry.Yuan@amd.com>
> Cc: rafael.j.wysocki@intel.com; Limonciello, Mario
> <Mario.Limonciello@amd.com>; viresh.kumar@linaro.org; Huang, Ray
> <Ray.Huang@amd.com>; Shenoy, Gautham Ranjal
> <gautham.shenoy@amd.com>; 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 v10 0/7] AMD Pstate Driver Core Performance Boost
>
> On Wed, May 08, 2024 at 03:21:05PM +0800, Perry Yuan wrote:
> > The patchset series add core performance boost feature for AMD pstate
> > driver including passisve ,guide and active mode support.
>
> Can you please slow down, wait to collect as much feedback as possible and
> only *then* spam again with your patchset?
>
> https://kernel.org/doc/html/latest/process/submitting-patches.html#don-t-
> get-discouraged-or-impatient
>
> "You should receive comments within a few weeks (typically 2-3); if that does
> not happen, make sure that you have sent your patches to the right place.
> Wait for a minimum of one week before resubmitting or pinging reviewers -
> possibly longer during busy times like merge windows."
>
> Maintainers are not a shooting gallery.
>
> While waiting, you can read this:
>
> https://kernel.org/doc/html/latest/process/development-process.html
>
> Thanks.
>
> --
> Regards/Gruss,
>     Boris.

I understand your point,  the patch set has taken very long-time review since version 1,
I would like to get this done as soon as possible with reviewers support,  then we can deliver the feature to users who have been waiting long enough.

Perry.

>
> https://people.kernel.org/tglx/notes-about-netiquette
Perry Yuan May 9, 2024, 4:03 p.m. UTC | #9
[AMD Official Use Only - General]

 Hi Oleksandr

> -----Original Message-----
> From: Oleksandr Natalenko <oleksandr@natalenko.name>
> Sent: Thursday, May 9, 2024 8:01 PM
> To: 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>; Yuan, Perry <Perry.Yuan@amd.com>;
> Limonciello, Mario <Mario.Limonciello@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 v10 0/7] AMD Pstate Driver Core Performance Boost
>
> On čtvrtek 9. května 2024 0:13:49, SELČ Mario Limonciello wrote:
> > On 5/8/2024 16:31, Oleksandr Natalenko wrote:
> > > On středa 8. května 2024 21:21:39, SELČ Oleksandr Natalenko wrote:
> > >> On středa 8. května 2024 21:13:40, SELČ Oleksandr Natalenko wrote:
> > >>> On středa 8. května 2024 17:11:42, SELČ Oleksandr Natalenko wrote:
> > >>>> Hello.
> > >>>>
> > >>>> On středa 8. května 2024 9:21:05, SELČ Perry Yuan wrote:
> > >>>>> Hi all,
> > >>>>> The patchset series add core performance boost feature for AMD
> > >>>>> pstate driver including passisve ,guide and active mode support.
> > >>>>>
> > >>>>> User can change core frequency boost control with a new sysfs
> entry:
> > >>>>>
> > >>>>> "/sys/devices/system/cpu/amd_pstate/cpb_boost"
> > >>>>>
> > >>>>>
> > >>>>> 1) globally disable core boost:
> > >>>>> $ sudo bash -c "echo 0 >
> /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > >>>>> $ lscpu -ae
> > >>>>> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ
> MHZ
> > >>>>>    0    0      0    0 0:0:0:0          yes 4201.0000 400.0000 2983.578
> > >>>>>    1    0      0    1 1:1:1:0          yes 4201.0000 400.0000 2983.578
> > >>>>>    2    0      0    2 2:2:2:0          yes 4201.0000 400.0000 2583.855
> > >>>>>    3    0      0    3 3:3:3:0          yes 4201.0000 400.0000 2983.578
> > >>>>>    4    0      0    4 4:4:4:0          yes 4201.0000 400.0000 2983.578
> > >>>>>
> > >>>>> 2) globally enable core boost:
> > >>>>> $ sudo bash -c "echo 1 >
> /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > >>>>> $ lscpu -ae
> > >>>>>     0    0      0    0 0:0:0:0          yes 5759.0000 400.0000 2983.578
> > >>>>>    1    0      0    1 1:1:1:0          yes 5759.0000 400.0000 2983.578
> > >>>>>    2    0      0    2 2:2:2:0          yes 5759.0000 400.0000 2983.578
> > >>>>>    3    0      0    3 3:3:3:0          yes 5759.0000 400.0000 2983.578
> > >>>>>    4    0      0    4 4:4:4:0          yes 5759.0000 400.0000 2983.578
> > >>>>>
> > >>>>>
> > >>>>>
> ==========================================================
> ======
> > >>>>> ============ The V9 patches add per CPU boost control, user can
> > >>>>> enable/disable CPUs boost as the below command tested on a
> > >>>>> laptop system.
> > >>>>> # before
> > >>>>>    CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ
> MINMHZ       MHZ
> > >>>>>    0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
> > >>>>>    1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000
> > >>>>>    2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3386.1260
> > >>>>>    3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> > >>>>> $ sudo rdmsr 0xc00102b3 -p 0
> > >>>>> 10a6
> > >>>>>
> > >>>>> $ sudo bash -c "echo 1 >
> /sys/devices/system/cpu/cpu0/cpufreq/boost"
> > >>>>> # after
> > >>>>>    CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ
> MINMHZ       MHZ
> > >>>>>      0    0      0    0 0:0:0:0          yes 3501.0000 400.0000  400.0000
> > >>>>>      1    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1391.0690
> > >>>>>      2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3654.4541
> > >>>>>      3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
> > >>>>> $ sudo rdmsr 0xc00102b3 -p 0
> > >>>>> 108a
> > >>>>>
> > >>>>>
> > >>>>> The patches have been tested with the AMD 7950X processor and
> > >>>>> many users would like to get core boost control enabled for power
> saving.
> > >>>>>
> > >>>>> Perry.
> > >>>>>
> > >>>>>
> > >>>>> Changes from v9:
> > >>>>>   * change per CPU boost sysfs file name to `boost` (Mario)
> > >>>>>   * rebased to latest linux-pm/bleeding-edge
> > >>>>>
> > >>>>> Changes from v8:
> > >>>>>   * pick RB flag for patch 4 (Mario)
> > >>>>>   * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
> > >>>>>   * merge patch 6 into patch 3 (Mario)
> > >>>>>   * add two patch for per CPU boost control patch 6 & 7(Mario)
> > >>>>>   * rebased to latest linux-pm/bleeding-edge
> > >>>>>
> > >>>>> Changes from v7:
> > >>>>>   * fix the mutext locking issue in the sysfs file update(Ray, Mario)
> > >>>>>   * pick ack flag from Ray
> > >>>>>   * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
> > >>>>>   * rerun the testing to check function works well
> > >>>>>   * rebased to linux-pm/bleeding-edge latest
> > >>>>>
> > >>>>> Changes from v6:
> > >>>>>   * reword patch 2 commit log (Gautham)
> > >>>>>   * update cover letter description(Gautham)
> > >>>>>   * rebase to kernel v6.9-rc5
> > >>>>>
> > >>>>> Changes from v4:
> > >>>>>   * drop the legacy boost remove patch, let us keep the legacy
> interface
> > >>>>>     in case some applications break.
> > >>>>>   * rebase to linux-pm/bleeding-edge branch
> > >>>>>   * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes
> And
> > >>>>>     Enhancements which has some intial work done there.
> > >>>>>
> > >>>>> Changes from v4:
> > >>>>>   * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > >>>>>   * pick RB flag from Gautham R. Shenoy
> > >>>>>   * add Cc Oleksandr Natalenko <oleksandr@natalenko.name>
> > >>>>>   * rebase to latest linux-pm/bleeding-edge branch
> > >>>>>   * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes
> And Enhancements
> > >>>>>   * update  [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
> > >>>>>
> > >>>>> Changes from v3:
> > >>>>>   * rebased to linux-pm/bleeding-edge v6.8
> > >>>>>   * rename global to amd_pstate_global_params(Oleksandr
> Natalenko)
> > >>>>>   * remove comments for boot_supported in amd_pstate.h
> > >>>>>   * fix the compiler warning for amd-pstate-ut.ko
> > >>>>>   * use for_each_online_cpu in cpb_boost_store which fix the null
> pointer
> > >>>>>     error during testing
> > >>>>>   * fix the max frequency value to be KHz when cpb boost
> > >>>>> disabled(Gautham R. Shenoy)
> > >>>>>
> > >>>>> Changes from v2:
> > >>>>>   * move global struct to amd-pstate.h
> > >>>>>   * fix the amd-pstate-ut with new cpb control interface
> > >>>>>
> > >>>>> Changes from v1:
> > >>>>>   * drop suspend/resume fix patch 6/7 because of the fix should be
> in
> > >>>>>     another fix series instead of CPB feature
> > >>>>>   * move the set_boost remove patch to the last(Mario)
> > >>>>>   * Fix commit info with "Closes:" (Mario)
> > >>>>>   * simplified global.cpb_supported initialization(Mario)
> > >>>>>   * Add guide mode support for CPB control
> > >>>>>   * Fixed some Doc typos and add guide mode info to Doc as well.
> > >>>>>
> > >>>>> v1:
> > >>>>> https://lore.kernel.org/all/cover.1706255676.git.perry.yuan@amd.
> > >>>>> com/
> > >>>>> v2:
> > >>>>> https://lore.kernel.org/lkml/cover.1707047943.git.perry.yuan@amd
> > >>>>> .com/
> > >>>>> v3:
> > >>>>> https://lore.kernel.org/lkml/cover.1707297581.git.perry.yuan@amd
> > >>>>> .com/
> > >>>>> v4:
> > >>>>> https://lore.kernel.org/lkml/cover.1710322310.git.perry.yuan@amd
> > >>>>> .com/
> > >>>>> v5:
> > >>>>> https://lore.kernel.org/lkml/cover.1710473712.git.perry.yuan@amd
> > >>>>> .com/
> > >>>>> v6:
> > >>>>> https://lore.kernel.org/lkml/cover.1710754236.git.perry.yuan@amd
> > >>>>> .com/
> > >>>>> v7:
> > >>>>> https://lore.kernel.org/lkml/cover.1713861200.git.perry.yuan@amd
> > >>>>> .com/
> > >>>>> v8:
> > >>>>> https://lore.kernel.org/lkml/cover.1714112854.git.perry.yuan@amd
> > >>>>> .com/
> > >>>>> v9:
> > >>>>> https://lore.kernel.org/lkml/cover.1714989803.git.perry.yuan@amd
> > >>>>> .com/
> > >>>>>
> > >>>>> Perry Yuan (7):
> > >>>>>    cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-
> index.h
> > >>>>>    cpufreq: amd-pstate: initialize new core precision boost state
> > >>>>>    cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost
> control
> > >>>>>    cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
> > >>>>>      while cpb boost off
> > >>>>>    Documentation: cpufreq: amd-pstate: introduce the new cpu
> boost
> > >>>>>      control method
> > >>>>>    cpufreq: amd-pstate: introduce per CPU frequency boost control
> > >>>>>    Documentation: cpufreq: amd-pstate: update doc for Per CPU
> boost
> > >>>>>      control method
> > >>>>>
> > >>>>>   Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
> > >>>>>   arch/x86/include/asm/msr-index.h            |   2 +
> > >>>>>   drivers/cpufreq/acpi-cpufreq.c              |   2 -
> > >>>>>   drivers/cpufreq/amd-pstate-ut.c             |   2 +-
> > >>>>>   drivers/cpufreq/amd-pstate.c                | 189
> ++++++++++++++++++--
> > >>>>>   include/linux/amd-pstate.h                  |  14 ++
> > >>>>>   6 files changed, 225 insertions(+), 14 deletions(-)
> > >>>>
> > >>>> I've applied this series along with fixes and improvements [1], and I
> cannot get guided mode to work with my CPU any more.
> > >>>>
> > >>>> The CPU is:
> > >>>>
> > >>>> ```
> > >>>> Vendor ID:                AuthenticAMD
> > >>>>    Model name:             AMD Ryzen 9 5950X 16-Core Processor
> > >>>>      CPU family:           25
> > >>>>      Model:                33
> > >>>>      Thread(s) per core:   2
> > >>>>      Core(s) per socket:   16
> > >>>>      Socket(s):            1
> > >>>>      Stepping:             2
> > >>>> ```
> > >>>>
> > >>>> I've got `amd_pstate=guided` set in the kernel cmdline, but `amd-
> pstate-epp` gets loaded anyway.
> > >>>
> > >>> OK, this part is solved like below:
> > >>>
> > >>> ```
> > >>> diff --git a/drivers/cpufreq/amd-pstate.c
> > >>> b/drivers/cpufreq/amd-pstate.c index aafa4466e5ced..5aee7d2b8cfd7
> > >>> 100644
> > >>> --- a/drivers/cpufreq/amd-pstate.c
> > >>> +++ b/drivers/cpufreq/amd-pstate.c
> > >>> @@ -66,7 +66,7 @@
> > >>>   static struct cpufreq_driver *current_pstate_driver;
> > >>>   static struct cpufreq_driver amd_pstate_driver;
> > >>>   static struct cpufreq_driver amd_pstate_epp_driver; -static int
> > >>> cppc_state;
> > >>> +static int cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> > >>>   static bool cppc_enabled;
> > >>>   static bool amd_pstate_prefcore = true;
> > >>>   static struct quirk_entry *quirks; @@ -1958,10 +1958,6 @@ static
> > >>> int __init amd_pstate_init(void)
> > >>>         /* check if this machine need CPPC quirks */
> > >>>         dmi_check_system(amd_pstate_quirks_table);
> > >>>
> > >>> -       /* get default driver mode for loading*/
> > >>> -       cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> > >>> -       pr_debug("cppc working state set to mode:%d\n", cppc_state);
> > >>> -
> > >>>         switch (cppc_state) {
> > >>>         case AMD_PSTATE_DISABLE:
> > >>>                 pr_info("driver load is disabled, boot with specific mode to
> > >>> enable this\n"); ```
> > >>>
> > >>> as we have discussed here [1].
> > >>>
> > >>> [1]
> > >>>
> https://lore.kernel.org/lkml/CYYPR12MB865554562BE018D46FF0108C9CE5
> > >>> 2@CYYPR12MB8655.namprd12.prod.outlook.com/
> > >>
> > >> Ah no, scratch it, it's not solved. With `amd_pstate=guided` the driver
> fails to register during the boottime with the same `sysfs` error:
> > >>
> > >> ```
> > >> kernel: sysfs: cannot create duplicate filename
> '/devices/system/cpu/cpufreq/policy0/boost'
> > >> kernel: Hardware name: ASUS System Product Name/Pro WS X570-ACE,
> > >> BIOS 4805 03/18/2024
> > >> kernel: Call Trace:
> > >> kernel:  <TASK>
> > >> kernel:  dump_stack_lvl+0x47/0x60
> > >> kernel:  sysfs_warn_dup+0x5a/0x70
> > >> kernel:  sysfs_create_file_ns+0x196/0x1b0
> > >> kernel:  cpufreq_online+0x244/0xde0
> > >> kernel:  cpufreq_add_dev+0x7b/0x90
> > >> kernel:  subsys_interface_register+0x19e/0x1d0
> > >> kernel:  cpufreq_register_driver+0x177/0x2f0
> > >> kernel:  amd_pstate_init+0x1b8/0x2c0
> > >> kernel:  do_one_initcall+0x5b/0x320
> > >> kernel:  kernel_init_freeable+0x1dc/0x380
> > >> kernel:  kernel_init+0x1a/0x1c0
> > >> kernel:  ret_from_fork+0x34/0x50
> > >> kernel:  ret_from_fork_asm+0x1b/0x30
> > >> kernel:  </TASK>
> > >> ```
> > >>
> > >> and things revert to `acpi_cpufreq` instead.
> > >>
> > >> What's wrong?
> > >
> > > This happens with both `amd_pstate=guided` and `amd_pstate=passive`,
> while with `amd_pstate=active` it works. Also note I've got:
> > >
> > > ```
> > > CONFIG_X86_AMD_PSTATE=y
> > > CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
> > > ```
> > >
> > > aka "active" by default.
> > >
> > > It seems I miss to understand something in the init sequence.
> > >
> >
> > I think what's going on is that by reusing the same name as acpi_cppc
> > does for sysfs when amd pstate is changing modes the sysfs file from
> > amd-pstate isn't cleared and so acpi_cppc tries to make it.
>
> Seems so. I've renamed `amd_pstate`'s `boost` file to `amd_pstate_boost`,
> and now I'm able to boot with `amd_pstate=guided`, and after boot under
> `/sys/devices/system/cpu/cpufreq/policyX` I see both `boost` (from
> `acpi_cppc`, apparently) and `amd_pstate_boost` at the same time.
>
> Not sure the fact both files are present is as intended.
>
> >
> > Don't get me wrong - I do think that we should keep the same sysfs
> > name for both, it's easier for users.
> >
> > But if we're going to keep mode switching from amd-pstate at runtime
> > we really need to make sure that amd-pstate-ut explicitly tests all
> > these combinations to catch these types of problems.
>
> Not sure it's runtime switching only that is affected. I guess having
> `CONFIG_X86_AMD_PSTATE_DEFAULT_MODE` set to `active` and then
> having `amd_pstate=guided` on the kernel cmdline is not considered to be a
> runtime switching (or is it?), yet it doesn't work either due to filename
> conflict.
>
> > >>
> > >>>
> > >>> But this part:
> > >>>
> > >>>> When I try to set `guided` manually via `echo guided | sudo tee
> /sys/devices/system/cpu/amd_pstate/status`, the status gets dropped to
> `disable`, `tee` errors out with `-ENODEV`, and there's this in the kernel log:
> > >>>>
> > >>>> ```
> > >>>> $ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
> > >>>> kernel: sysfs: cannot create duplicate filename
> '/devices/system/cpu/cpufreq/policy0/boost'
> > >>>> …
> > >>>> kernel: sysfs: cannot create duplicate filename
> '/devices/system/cpu/cpufreq/policy31/boost'
> > >>>> ```
> > >>>
> > >>> is not. I've successfully booted with `amd_pstate=guided`, then did
> this:
> > >>>
> > >>> ```
> > >>> $ echo active | sudo tee /sys/devices/system/cpu/amd_pstate/status
> > >>> ```
> > >>>
> > >>> just for the sake of test, and got this:
> > >>>
> > >>> ```
> > >>> tee: /sys/devices/system/cpu/amd_pstate/status: File exists ```
> > >>>
> > >>> and this:
> > >>>
> > >>> ```
> > >>> kernel: WARNING: CPU: 9 PID: 8528 at
> > >>> drivers/cpufreq/cpufreq.c:2961 cpufreq_unregister_driver+0x1a/0xc0
> > >>> ```
> > >>>
> > >>> which corresponds to:
> > >>>
> > >>> ```
> > >>> 2957 void cpufreq_unregister_driver(struct cpufreq_driver *driver)
> > >>> 2958 {
> > >>> 2959         unsigned long flags;
> > >>> 2960
> > >>> 2961         if (WARN_ON(!cpufreq_driver || (driver != cpufreq_driver)))
> > >>> 2962                 return;
> > >>> ```
> > >>>
> > >>> I haven't conducted this test before, so I don't know whether this
> behaviour is new, or it was present in older iterations. I also don't know if this
> belongs to the "boost" series or the "fixes", and just letting you know so that
> you can test the runtime switching yourself and see if it is reproducible in
> your environment as well or not.
> > >>>
> > >>>> The following is applied on top of v6.9-rc7:
> > >>>>
> > >>>> ```
> > >>>> cpufreq: amd-pstate: automatically load pstate driver by default
> > >>>> cpufreq: amd-pstate: fix the highest frequency issue which limit
> > >>>> performance
> > >>>> cpufreq: amd-pstate: implement heterogeneous core topology for
> > >>>> highest performance initialization
> > >>>> x86/cpufeatures: Add feature bits for AMD heterogeneous processor
> > >>>> cpufreq: amd-pstate: switch boot_cpu_has() to
> > >>>> cpu_feature_enabled()
> > >>>> Documentation: PM: amd-pstate: add guide mode to the Operation
> > >>>> mode
> > >>>> Documentation: PM: amd-pstate: add debugging section for driver
> > >>>> loading failure
> > >>>> Documentation: PM: amd-pstate: introducing recommended reboot
> > >>>> requirement during driver switch
> > >>>> cpufreq: amd-pstate: add debug message while CPPC is supported
> > >>>> and disabled by SBIOS
> > >>>> cpufreq: amd-pstate: show CPPC debug message if CPPC is not
> > >>>> supported
> > >>>> cpufreq: amd-pstate: optimiza the initial frequency values
> > >>>> verification
> > >>>> Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
> > >>>> control method
> > >>>> cpufreq: amd-pstate: introduce per CPU frequency boost control
> > >>>> Documentation: cpufreq: amd-pstate: introduce the new cpu boost
> > >>>> control method
> > >>>> cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
> > >>>> while cpb boost off
> > >>>> cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost
> > >>>> control
> > >>>> cpufreq: amd-pstate: initialize new core precision boost state
> > >>>> cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > >>>> cpufreq: amd-pstate: remove unused variable
> lowest_nonlinear_freq
> > >>>> cpufreq: amd-pstate: fix code format problems
> > >>>> cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities
> > >>>> missing
> > >>>> cpufreq: amd-pstate: get transition delay and latency value from
> > >>>> ACPI tables
> > >>>> cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
> > >>>> cpufreq: amd-pstate: Remove
> > >>>> amd_get_{min,max,nominal,lowest_nonlinear}_freq()
> > >>>> cpufreq: amd-pstate: Unify computation of
> > >>>> {max,min,nominal,lowest_nonlinear}_freq
> > >>>> cpufreq: amd-pstate: Document the units for freq variables in
> > >>>> amd_cpudata
> > >>>> cpufreq: amd-pstate: Document *_limit_* fields in struct
> > >>>> amd_cpudata ```
> > >>>>
> > >>>> Previously, with your submissions, it was possible to use `guided`
> mode with my Zen 3.
> > >>>>
> > >>>> [1]
> > >>>> https://lore.kernel.org/lkml/cover.1715065568.git.perry.yuan@amd.
> > >>>> com/
> > >>>>
> > >>>>
> > >>>
> > >>>
> > >>>
> > >>
> > >>
> > >>
> > >
> > >
> >
> >
>
>
> --
> Oleksandr Natalenko (post-factum)

I have known the issue detail, will fix it to allow kernel command input like before.

Perry.
Borislav Petkov May 9, 2024, 4:12 p.m. UTC | #10
On May 9, 2024 6:01:09 PM GMT+02:00, "Yuan, Perry" <Perry.Yuan@amd.com> wrote:
>I understand your point,  the patch set has taken very long-time review since version 1,
>I would like to get this done as soon as possible with reviewers support,  then we can deliver the feature to users who have been waiting long enough.

Spamming maintainers with it is going to help with that how exactly?