AMD Pstate Driver Core Performance Boost
Subsystems (4)
Perry Yuan
reviewerv10 cover AMD Pstate Driver Core Performance Boost
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
108aThe 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 <[email protected]>
* 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/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/
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(-)
Signature · 1 line
2.34.1
Perry Yuan
reviewerPATCH v10 1/7 cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
There are some other drivers also need to use the MSR_K7_HWCR_CPB_DIS_BIT for CPB control bit, so it makes sense to move the definition to a common header file to allow other driver to use it.
No intentional functional impact.
--- arch/x86/include/asm/msr-index.h | 2 ++ drivers/cpufreq/acpi-cpufreq.c | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/x86/include/asm/msr-index.h +2 -0
@@ -782,6 +782,8 @@#define MSR_K7_HWCR_IRPERF_EN BIT_ULL(MSR_K7_HWCR_IRPERF_EN_BIT)#define MSR_K7_FID_VID_CTL 0xc0010041#define MSR_K7_FID_VID_STATUS 0xc0010042 +#define MSR_K7_HWCR_CPB_DIS_BIT 25 +#define MSR_K7_HWCR_CPB_DIS BIT_ULL(MSR_K7_HWCR_CPB_DIS_BIT)/* K6 MSRs */ #define MSR_K6_WHCR 0xc0000082
drivers/cpufreq/acpi-cpufreq.c +0 -2
@@ -50,8 +50,6 @@ enum {#define AMD_MSR_RANGE (0x7)#define HYGON_MSR_RANGE (0x7) -#define MSR_K7_HWCR_CPB_DIS (1ULL << 25) -struct acpi_cpufreq_data {unsigned int resume;unsigned int cpu_feature;
Signature · 1 line
2.34.1
Perry Yuan
reviewerPATCH v10 2/7 cpufreq: amd-pstate: initialize new core precision boost state
In reply to Perry YuanFrom: Perry Yuan <[email protected]>
Add one global global_params to represent CPU Performance Boost(cpb) state for cpu frequency scaling, both active and passive modes all can support CPU cores frequency boosting control which is based on the BIOS setting, while BIOS turn on the "Core Performance Boost", it will allow OS control each core highest perf limitation from OS side.
The active, guided and passive modes of the amd-pstate driver can support frequency boost control when the "Core Performance Boost" (CPB) feature is enabled in the BIOS. When enabled in BIOS, the user has an option at runtime to allow/disallow the cores from operating in the boost frequency range.
Add an amd_pstate_global_params object to record whether CPB is enabled in BIOS, and if it has been activated by the user
--- drivers/cpufreq/amd-pstate.c | 45 +++++++++++++++++++++++++++--------- include/linux/amd-pstate.h | 13 +++++++++++ 2 files changed, 47 insertions(+), 11 deletions(-)
drivers/cpufreq/amd-pstate.c +34 -11
@@ -68,6 +68,8 @@ static int cppc_state = AMD_PSTATE_UNDEFINED;static bool cppc_enabled;static bool amd_pstate_prefcore = true;static struct quirk_entry *quirks; +struct amd_pstate_global_params amd_pstate_global_params; +EXPORT_SYMBOL_GPL (amd_pstate_global_params);/* * AMD Energy Preference Performance (EPP)
@@ -647,7 +649,7 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)if (!cpudata->boost_supported) {pr_err ("Boost mode is not supported by this processor or SBIOS\n" ); -return -EINVAL ; +return -ENOTSUPP ; }if (state)
@@ -665,18 +667,31 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)return 0 ; } -static void amd_pstate_boost_init (struct amd_cpudata *cpudata) +static int amd_pstate_boost_init (struct amd_cpudata *cpudata) { -u32 highest_perf, nominal_perf; +u64 boost_val; +int ret; - highest_perf =READ_ONCE (cpudata->highest_perf); - nominal_perf =READ_ONCE (cpudata->nominal_perf); +if (!cpu_feature_enabled (X86_FEATURE_CPB )) { + cpudata->boost_supported = false; + current_pstate_driver->boost_enabled = false; +pr_debug_once ("Boost CPB capabilities not present in the processor\n" ); +return -ENOTSUPP ; + } -if (highest_perf <= nominal_perf) -return ; + ret =rdmsrl_on_cpu (cpudata->cpu,MSR_K7_HWCR , &boost_val); +if (ret) { +pr_err_once ("failed to read initial CPU boost state!\n" ); +return ret; + } - cpudata->boost_supported = true; - current_pstate_driver->boost_enabled = true; + amd_pstate_global_params.cpb_supported = !(boost_val &MSR_K7_HWCR_CPB_DIS ); +if (amd_pstate_global_params.cpb_supported) + current_pstate_driver->boost_enabled = true; + + amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported; + +return ret; }static void amd_perf_ctl_reset (unsigned int cpu)
@@ -899,6 +914,11 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)amd_pstate_init_prefcore (cpudata); +/* initialize cpu cores boot state */ + ret =amd_pstate_boost_init (cpudata); +if (ret) + goto free_cpudata1; + ret =amd_pstate_init_perf (cpudata);if (ret) goto free_cpudata1;
@@ -954,7 +974,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy) policy->driver_data = cpudata; -amd_pstate_boost_init (cpudata);if (!current_pstate_driver->adjust_perf) current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
@@ -1361,6 +1380,11 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)amd_pstate_init_prefcore (cpudata); +/* initialize cpu cores boot state */ + ret =amd_pstate_boost_init (cpudata); +if (ret) + goto free_cpudata1; + ret =amd_pstate_init_perf (cpudata);if (ret) goto free_cpudata1;
@@ -1414,7 +1438,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)return ret;WRITE_ONCE (cpudata->cppc_cap1_cached, value); } -amd_pstate_boost_init (cpudata);return 0 ;
include/linux/amd-pstate.h +13 -0
@@ -134,4 +134,17 @@ struct quirk_entry { u32 lowest_freq; }; +/** +* struct amd_pstate_global_params - Global parameters, mostly tunable via sysfs. +* @cpb_boost: Whether or not to use boost CPU P-states. +* @cpb_supported: Whether or not CPU boost P-states are available +* based on the MSR_K7_HWCR bit[25] state +*/ +struct amd_pstate_global_params { +bool cpb_boost; +bool cpb_supported; +}; + +extern struct amd_pstate_global_params amd_pstate_global_params; +#endif /* _LINUX_AMD_PSTATE_H */
Signature · 1 line
2.34.1
Perry Yuan
reviewerPATCH v10 3/7 cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
In reply to Perry YuanFrom: Perry Yuan <[email protected]>
With this new sysfs entry cpb_boostcreated, 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"
--- 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(-)
drivers/cpufreq/amd-pstate-ut.c +1 -1
@@ -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 ;
drivers/cpufreq/amd-pstate.c +113 -1
139 lines not on this page · raw message
include/linux/amd-pstate.h +1 -0
@@ -106,6 +106,7 @@ struct amd_cpudata {u32 policy;u64 cppc_cap1_cached;bool suspended; +bool boost_state; };/*
Signature · 1 line
2.34.1
Re: [PATCH v10 3/7] cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
Hello.
Quoted 146 lines · SELČ Perry Yuan
From: Perry Yuan <[email protected]>
With this new sysfs entry
cpb_boostcreated, user can change CPU boost state dynamically underactive,guidedandpassivemodes. 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_boost1): 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"Signed-off-by Perry Yuan <[email protected]>--- 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(-)drivers/cpufreq/amd-pstate-ut.c +1
-1@@ -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 ;drivers/cpufreq/amd-pstate.c +91
-1@@ -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 ; + }
drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev, · line 1395
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10
-0+ + 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.
Quoted 42 lines
drivers/cpufreq/amd-pstate.c +12
-0+ 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 };include/linux/amd-pstate.h +1
-0@@ -106,6 +106,7 @@ struct amd_cpudata {u32 policy;u64 cppc_cap1_cached;bool suspended; +bool boost_state; };/*
Signature · 1 line
Oleksandr Natalenko (post-factum)
Yuan, Perry
reviewerRE: [PATCH v10 3/7] cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
[AMD Official Use Only - General]
Hi Oleksandr
Quoted 187 lines
-----Original Message-----
From: Oleksandr Natalenko <[email protected]>
Sent: Wednesday, May 8, 2024 5:39 PM
To: [email protected]; Limonciello, Mario <[email protected]>; [email protected]; Huang, Ray <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>; Yuan, Perry <[email protected]>
Cc: Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>; Meng, Li (Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v10 3/7] cpufreq: amd-pstate: implementcpb_boostsysfs entry for boost controlHello.
Quoted 16 lines · SELČ Perry Yuan
From: Perry Yuan <[email protected]>
With this new sysfs entry
cpb_boostcreated, user can change CPU boost state dynamically underactive,guidedandpassivemodes. 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_boost1): 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"Quoted 6 lines
Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/amd-pstate-ut.c | 2 +- drivers/cpufreq/amd-pstate.c | 114+++++++++++++++++++++++++++++++-
Quoted 17 lines
include/linux/amd-pstate.h | 1 + 3 files changed, 115 insertions(+), 2 deletions(-)(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate-ut.cindexf04ae67dda37..b3601b0e6dd3100644drivers/cpufreq/amd-pstate-ut.c +1
-1@@ -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))Quoted 1 line
amd_pstate_ut_cases[index].result =
AMD_PSTATE_UT_RESULT_PASS;drivers/cpufreq/amd-pstate.c static int amd_pstate_boost_init(struct
Quoted 5 lines
(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate.cindexf7dab0f7b452..f81fd61dd2a9100644drivers/cpufreq/amd-pstate.c +0
-0@@ -686,8 +686,10 @@ static int amd_pstate_boost_init(struct
amd_cpudata*cpudata)drivers/cpufreq/amd-pstate.c static int amd_pstate_boost_init(struct · line 688
Quoted 3 lines
drivers/cpufreq/amd-pstate.c +0
-0} amd_pstate_global_params.cpb_supported = !(boost_val &
MSR_K7_HWCR_CPB_DIS);drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +3
-1-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,
Quoted 19 lines
drivers/cpufreq/amd-pstate.c +15
-0return 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);drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10
-0+ 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);
drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 6 lines
drivers/cpufreq/amd-pstate.c +6
-0+ }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);
Quoted 32 lines
drivers/cpufreq/amd-pstate.c +32
-0+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);drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10
-0+ 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);
drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 3 lines
drivers/cpufreq/amd-pstate.c +3
-0+} + +static ssize_t cpb_boost_store(struct device *dev, struct device_attribute*b,
drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 7 lines
drivers/cpufreq/amd-pstate.c +7
-0+ 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 orSBIOS\n");
drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 12 lines
drivers/cpufreq/amd-pstate.c +12
-0+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);
Quoted 1 line
Note ret is
ssize_t, so %d should be %ld (or %z/%zd/%zi?) instead.
Yes, it should be %ld, looks like the ret is less than zero, it is not needed to print out looks like. Will remove it in v11 otherwise it will cause build warning.
Thanks for the review!
Perry.
Quoted 48 lines
Quoted 37 lines
drivers/cpufreq/amd-pstate.c +11
-0+ 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,drivers/cpufreq/amd-pstate.c +1
-0@@ -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 };include/linux/amd-pstate.h +0
-0include/linux/amd-pstate.h struct amd_cpudata { · line 112
Quoted 7 lines
include/linux/amd-pstate.h +1
-0@@ -106,6 +106,7 @@ struct amd_cpudata {u32 policy;u64 cppc_cap1_cached;bool suspended; +bool boost_state; };/* --
Oleksandr Natalenko (post-factum)
Perry Yuan
reviewerPATCH v10 4/7 cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
In reply to Perry YuanFrom: Perry Yuan <[email protected]>
Select the min perf to fix the highest perf value while update pstate CPPC request MSR register, here it needs to limit the max perf value when CPU boost is disabled in case of that highest perf value in the MSR will be reset to original highest perf value which cause the BOOST control failed.
--- drivers/cpufreq/amd-pstate.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/cpufreq/amd-pstate.c +5 -0
@@ -476,6 +476,7 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf, u32 des_perf, u32 max_perf, bool fast_switch, int gov_flags) { u64 prev = READ_ONCE(cpudata->cppc_req_cached); +u32 nominal_perf =READ_ONCE (cpudata->nominal_perf);u64 value = prev; min_perf = clamp_t(unsigned long, min_perf, cpudata->min_limit_perf,
@@ -495,6 +496,10 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf, value &= ~AMD_CPPC_DES_PERF (~0L ); value |=AMD_CPPC_DES_PERF (des_perf); +/* limit the max perf when core performance boost feature is disabled */ +if (!amd_pstate_global_params.cpb_boost) + max_perf = min_t(unsigned long, nominal_perf, max_perf); + value &= ~AMD_CPPC_MAX_PERF (~0L ); value |=AMD_CPPC_MAX_PERF (max_perf);
Signature · 1 line
2.34.1
Perry Yuan
reviewerPATCH v10 5/7 Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
In reply to Perry YuanFrom: Perry Yuan <[email protected]>
Introduce AMD CPU frequency boosting control sysfs entry which used for switching boost on and boost off.
If core performance boost is disabled while a core is in a boosted P-state, the core automatically transitions to the highest performance non-boosted P-state The highest perf and frequency will be limited by the setting value.
--- Documentation/admin-guide/pm/amd-pstate.rst | 10 ++++++++++ 1 file changed, 10 insertions(+)
Documentation/admin-guide/pm/amd-pstate.rst +10 -0
@@ -440,6 +440,16 @@ control its functionality at the system level. They are located in the This attribute is read-only to check the state of preferred core set by the kernel parameter. +``cpb_boost`` + Specifies whether core performance boost is requested to be enabled or disabled + If core performance boost is disabled while a core is in a boosted P-state, the + core automatically transitions to the highest performance non-boosted P-state. + AMD Core Performance Boost(CPB) is controlled by this attribute file which allows + user to change all cores frequency boosting state. It supports all amd-pstate modes. + + "0" Disable Core Performance Boosting + "1" Enable Core Performance Boosting + ``cpupower`` tool support for ``amd-pstate`` ===============================================
Signature · 1 line
2.34.1
Perry Yuan
reviewerPATCH v10 6/7 cpufreq: amd-pstate: introduce per CPU frequency boost control
In reply to Perry YuanAdd a new sysfs attribute file to support per CPU frequency boost control, allowing individual CPUs to enable or disable CPB separately.
The new sysfs attribute file is located at below path, /sys/devices/system/cpu/cpuX/cpufreq/boost, where X represents the CPU number.
To disable CPB for a specific CPU, you can use the following command:
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/boost"
After disabling CPB, the CPU frequency will no longer boost beyond the base frequency for that particular CPU.
for example:
----------------------------------------------------------------------
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
----------------------------------------------------------------------
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
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 4154.3140 1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 400.0000
Please be aware that modifying the global variable amd_pstate_global_params.cpb_boost will overwrite the individual CPU settings.
--- drivers/cpufreq/amd-pstate.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
drivers/cpufreq/amd-pstate.c +27 -0
@@ -1371,6 +1371,30 @@ static int amd_pstate_cpu_boost(int cpu, bool state)return ret <0 ? ret :0 ; } +static ssize_t show_boost (struct cpufreq_policy *policy,char *buf) +{ +struct amd_cpudata *cpudata = policy->driver_data; +bool boost_val; + + boost_val =READ_ONCE (cpudata->boost_state); + +return sysfs_emit (buf,"%u\n" , boost_val); +} + +static ssize_t store_boost ( +struct cpufreq_policy *policy,const char *buf,size_t count) +{ +bool boost_val; +int ret; + +if (sscanf (buf,"%d" , &boost_val) !=1 ) +return -EINVAL ; + + ret =amd_pstate_cpu_boost (policy->cpu, boost_val); + +return ret <0 ? ret : count; +} +static ssize_t cpb_boost_show (struct device *dev,struct device_attribute *attr,char *buf) {
@@ -1416,6 +1440,7 @@ cpufreq_freq_attr_ro(amd_pstate_prefcore_ranking);cpufreq_freq_attr_ro (amd_pstate_hw_prefcore);cpufreq_freq_attr_rw (energy_performance_preference);cpufreq_freq_attr_ro (energy_performance_available_preferences); +cpufreq_freq_attr_rw (boost);static DEVICE_ATTR_RW (status);static DEVICE_ATTR_RO (prefcore);static DEVICE_ATTR_RW (cpb_boost);
@@ -1426,6 +1451,7 @@ static struct freq_attr *amd_pstate_attr[] = { &amd_pstate_highest_perf, &amd_pstate_prefcore_ranking, &amd_pstate_hw_prefcore, + &boost, NULL, };
@@ -1437,6 +1463,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = { &amd_pstate_hw_prefcore, &energy_performance_preference, &energy_performance_available_preferences, + &boost, NULL, };
Signature · 1 line
2.34.1
Re: [PATCH v10 6/7] cpufreq: amd-pstate: introduce per CPU frequency boost control
Hello.
Quoted 49 lines · SELČ Perry Yuan
Add a new sysfs attribute file to support per CPU frequency boost control, allowing individual CPUs to enable or disable CPB separately.
The new sysfs attribute file is located at below path,
/sys/devices/system/cpu/cpuX/cpufreq/boost, whereXrepresents the CPU number.To disable CPB for a specific CPU, you can use the following command:
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/boost"After disabling CPB, the CPU frequency will no longer boost beyond the base frequency for that particular CPU.
for example:
----------------------------------------------------------------------
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ0 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----------------------------------------------------------------------
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/boost"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 4154.3140 1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 400.0000Please be aware that modifying the global variable
amd_pstate_global_params.cpb_boostwill overwrite the individual CPU settings.Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/amd-pstate.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)drivers/cpufreq/amd-pstate.c +7
-0@@ -1371,6 +1371,30 @@ static int amd_pstate_cpu_boost(int cpu, bool state)return ret <0 ? ret :0 ; } +static ssize_t show_boost (struct cpufreq_policy *policy,char *buf) +{ +struct amd_cpudata *cpudata = policy->driver_data; +bool boost_val; + + boost_val =READ_ONCE (cpudata->boost_state); +
drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool state) · line 1390
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10
-0+return sysfs_emit (buf,"%u\n" , boost_val); +} + +static ssize_t store_boost ( +struct cpufreq_policy *policy,const char *buf,size_t count) +{ +bool boost_val; +int ret; + +if (sscanf (buf,"%d" , &boost_val) !=1 )
This will generate warning. IIUC, sscanf() doesn't work with booleans directly, so you'd probably want to read the value into an (unsigned) integer, and then cast it to bool.
Quoted 35 lines
drivers/cpufreq/amd-pstate.c +10
-0+return -EINVAL ; + + ret =amd_pstate_cpu_boost (policy->cpu, boost_val); + +return ret <0 ? ret : count; +} +static ssize_t cpb_boost_show (struct device *dev,struct device_attribute *attr,char *buf) {@@ -1416,6 +1440,7 @@ cpufreq_freq_attr_ro(amd_pstate_prefcore_ranking);cpufreq_freq_attr_ro (amd_pstate_hw_prefcore);cpufreq_freq_attr_rw (energy_performance_preference);cpufreq_freq_attr_ro (energy_performance_available_preferences); +cpufreq_freq_attr_rw (boost);static DEVICE_ATTR_RW (status);static DEVICE_ATTR_RO (prefcore);static DEVICE_ATTR_RW (cpb_boost);@@ -1426,6 +1451,7 @@ static struct freq_attr *amd_pstate_attr[] = { &amd_pstate_highest_perf, &amd_pstate_prefcore_ranking, &amd_pstate_hw_prefcore, + &boost, NULL, };@@ -1437,6 +1463,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = { &amd_pstate_hw_prefcore, &energy_performance_preference, &energy_performance_available_preferences, + &boost, NULL, };
Signature · 1 line
Oleksandr Natalenko (post-factum)
Re: [PATCH v10 6/7] cpufreq: amd-pstate: introduce per CPU frequency boost control
Quoted 56 lines · SELČ Oleksandr Natalenko
Hello.
Quoted 53 lines · SELČ Perry Yuan
Add a new sysfs attribute file to support per CPU frequency boost control, allowing individual CPUs to enable or disable CPB separately.
The new sysfs attribute file is located at below path,
/sys/devices/system/cpu/cpuX/cpufreq/boost, whereXrepresents the CPU number.To disable CPB for a specific CPU, you can use the following command:
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/boost"After disabling CPB, the CPU frequency will no longer boost beyond the base frequency for that particular CPU.
for example:
----------------------------------------------------------------------
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ0 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----------------------------------------------------------------------
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/boost"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 4154.3140 1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 400.0000Please be aware that modifying the global variable
amd_pstate_global_params.cpb_boostwill overwrite the individual CPU settings.Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/amd-pstate.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)drivers/cpufreq/amd-pstate.c +11
-0@@ -1371,6 +1371,30 @@ static int amd_pstate_cpu_boost(int cpu, bool state)return ret <0 ? ret :0 ; } +static ssize_t show_boost (struct cpufreq_policy *policy,char *buf) +{ +struct amd_cpudata *cpudata = policy->driver_data; +bool boost_val; + + boost_val =READ_ONCE (cpudata->boost_state); + +return sysfs_emit (buf,"%u\n" , boost_val); +} + +static ssize_t store_boost(
Quoted 8 lines
drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool state) · line 1390
Quoted 6 lines
drivers/cpufreq/amd-pstate.c +6
-0+ struct cpufreq_policy *policy, const char *buf, size_t count) +{ + bool boost_val; +int ret; + +if (sscanf (buf,"%d" , &boost_val) !=1 )This will generate warning. IIUC,
sscanf()doesn't work with booleans directly, so you'd probably want to read the value into an (unsigned) integer, and then cast it to bool.
…or maybe just use kstrtobool()?
Quoted 39 lines
Quoted 36 lines
drivers/cpufreq/amd-pstate.c +10
-0+return -EINVAL ; + + ret =amd_pstate_cpu_boost (policy->cpu, boost_val); + +return ret <0 ? ret : count; +} +static ssize_t cpb_boost_show (struct device *dev,struct device_attribute *attr,char *buf) {@@ -1416,6 +1440,7 @@ cpufreq_freq_attr_ro(amd_pstate_prefcore_ranking);cpufreq_freq_attr_ro (amd_pstate_hw_prefcore);cpufreq_freq_attr_rw (energy_performance_preference);cpufreq_freq_attr_ro (energy_performance_available_preferences); +cpufreq_freq_attr_rw (boost);static DEVICE_ATTR_RW (status);static DEVICE_ATTR_RO (prefcore);static DEVICE_ATTR_RW (cpb_boost);@@ -1426,6 +1451,7 @@ static struct freq_attr *amd_pstate_attr[] = { &amd_pstate_highest_perf, &amd_pstate_prefcore_ranking, &amd_pstate_hw_prefcore, + &boost, NULL, };@@ -1437,6 +1463,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = { &amd_pstate_hw_prefcore, &energy_performance_preference, &energy_performance_available_preferences, + &boost, NULL, };
Signature · 1 line
Oleksandr Natalenko (post-factum)
Yuan, Perry
reviewerRE: [PATCH v10 6/7] cpufreq: amd-pstate: introduce per CPU frequency boost control
[AMD Official Use Only - General]
Regards.
Perry
Quoted 84 lines
-----Original Message-----
From: Oleksandr Natalenko <[email protected]>
Sent: Wednesday, May 8, 2024 5:43 PM
To: [email protected]; Limonciello, Mario <[email protected]>; [email protected]; Huang, Ray <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>; Yuan, Perry <[email protected]>
Cc: Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>; Meng, Li (Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v10 6/7] cpufreq: amd-pstate: introduce per CPU frequency boost controlQuoted 19 lines · SELČ Oleksandr Natalenko
Hello.
Quoted 16 lines · SELČ Perry Yuan
Add a new sysfs attribute file to support per CPU frequency boost control, allowing individual CPUs to enable or disable CPB separately.
The new sysfs attribute file is located at below path,
/sys/devices/system/cpu/cpuX/cpufreq/boost, whereXrepresents the CPU number.To disable CPB for a specific CPU, you can use the following command:
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/boost"After disabling CPB, the CPU frequency will no longer boost beyond the base frequency for that particular CPU.
for example:
----------------------------------------------------------------------
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZMHZ
Quoted 8 lines
Quoted 8 lines
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--------------------------------------------------------------------
-- $ sudo bash -c "echo 0 >/sys/devices/system/cpu/cpu0/cpufreq/boost"CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
MHZ
Quoted 5 lines
Quoted 5 lines
0 0 0 0 0:0:0:0 yes 3501.0000 400.0000 4154.3140 1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 400.0000Please be aware that modifying the global variable
amd_pstate_global_params.cpb_boostwill overwrite the individual CPUsettings.
Quoted 6 lines
Quoted 6 lines
Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/amd-pstate.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)Quoted 6 lines
drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool
Quoted 6 lines
(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate.cindex11bce2c1db32..cb0055e7c842100644drivers/cpufreq/amd-pstate.c +0
-0@@ -1371,6 +1371,30 @@ static int amd_pstate_cpu_boost(int cpu, boolstate)
Quoted 12 lines
Quoted 12 lines
drivers/cpufreq/amd-pstate.c +9
-0return ret <0 ? ret :0 ; } +static ssize_t show_boost (struct cpufreq_policy *policy,char *buf) +{ +struct amd_cpudata *cpudata = policy->driver_data; +bool boost_val; + + boost_val =READ_ONCE (cpudata->boost_state); + +return sysfs_emit (buf,"%u\n" , boost_val); } +Quoted 8 lines
drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool state) · line 1390
Quoted 6 lines
drivers/cpufreq/amd-pstate.c +6
-0+static ssize_t store_boost ( +struct cpufreq_policy *policy,const char *buf,size_t count) { +bool boost_val; +int ret; + +if (sscanf (buf,"%d" , &boost_val) !=1 )This will generate warning. IIUC,
sscanf()doesn't work with booleans
Quoted 4 lines
directly, so you'd probably want to read the value into an (unsigned) integer, and then cast it to bool.
…or maybe just use
kstrtobool()?
Yes, the kstrtobool is the function I need to use, will change it in next. Thanks
Perry.
Quoted 45 lines
Quoted 11 lines
drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool state)
Quoted 11 lines
drivers/cpufreq/amd-pstate.c +7
-0+return -EINVAL ; + + ret =amd_pstate_cpu_boost (policy->cpu, boost_val); + +return ret <0 ? ret : count; +} +static ssize_t cpb_boost_show (struct device *dev, struct device_attribute *attr, char *buf) { @@ -1416,6
Quoted 16 lines
Quoted 16 lines
drivers/cpufreq/amd-pstate.c +3
-0+1440,7 @@ cpufreq_freq_attr_ro(amd_pstate_prefcore_ranking);cpufreq_freq_attr_ro (amd_pstate_hw_prefcore);cpufreq_freq_attr_rw (energy_performance_preference);cpufreq_freq_attr_ro (energy_performance_available_preferences); +cpufreq_freq_attr_rw (boost);static DEVICE_ATTR_RW (status);static DEVICE_ATTR_RO (prefcore);static DEVICE_ATTR_RW (cpb_boost);@@ -1426,6 +1451,7 @@ static struct freq_attr *amd_pstate_attr[] = { &amd_pstate_highest_perf, &amd_pstate_prefcore_ranking, &amd_pstate_hw_prefcore, + &boost, NULL, };Quoted 1 line
drivers/cpufreq/amd-pstate.c static struct freq_attr *amd_pstate_epp_attr[]
Quoted 1 line
drivers/cpufreq/amd-pstate.c +0
-0@@ -1437,6 +1463,7 @@ static struct freq_attr *amd_pstate_epp_attr[]= {
Quoted 11 lines
drivers/cpufreq/amd-pstate.c static struct freq_attr *amd_pstate_epp_attr[] = { · line 1469
Quoted 8 lines
drivers/cpufreq/amd-pstate.c +1
-0&amd_pstate_hw_prefcore, &energy_performance_preference, &energy_performance_available_preferences, + &boost, NULL, };--
Oleksandr Natalenko (post-factum)
Perry Yuan
reviewerPATCH v10 7/7 Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
In reply to Perry YuanUpdates the documentation in amd-pstate.rst to include information about the per CPU boost control feature. Users can now enable or disable the Core Performance Boost (CPB) feature on individual CPUs using the boost sysfs attribute.
--- Documentation/admin-guide/pm/amd-pstate.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
Documentation/admin-guide/pm/amd-pstate.rst +20 -0
@@ -281,6 +281,26 @@ integer values defined between 0 to 255 when EPP feature is enabled by platform firmware, if EPP feature is disabled, driver will ignore the written value This attribute is read-write. +``boost`` +The `boost` sysfs attribute provides control over the CPU core +performance boost, allowing users to manage the maximum frequency limitation +of the CPU. This attribute can be used to enable or disable the boost feature +on individual CPUs. + +When the boost feature is enabled, the CPU can dynamically increase its frequency +beyond the base frequency, providing enhanced performance for demanding workloads. +On the other hand, disabling the boost feature restricts the CPU to operate at the +base frequency, which may be desirable in certain scenarios to prioritize power +efficiency or manage temperature. + +To manipulate the `boost` attribute, users can write a value of `0` to disable the +boost or `1` to enable it, for the respective CPU using the sysfs path +`/sys/devices/system/cpu/cpuX/cpufreq/boost`, where `X` represents the CPU number. + +It is important to note that modifying the global variable +`amd_pstate_global_params.cpb_boost` will override the individual CPU settings. + + Other performance and frequency values can be read back from ``/sys/devices/system/cpu/cpuX/acpi_cppc/``, see :ref:`cppc_sysfs`.
Signature · 1 line
2.34.1
Borislav Petkov
maintainerQuoted 2 lines · Perry Yuan
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?
"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.
Signature · 4 lines
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquetteYuan, Perry
reviewer[AMD Official Use Only - General]
Hi Boris,
Quoted 33 lines
-----Original Message-----
From: Borislav Petkov <[email protected]>
Sent: Wednesday, May 8, 2024 4:19 PM
To: Yuan, Perry <[email protected]>
Cc: [email protected]; Limonciello, Mario <[email protected]>; [email protected]; Huang, Ray <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>; Meng, Li (Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v10 0/7] AMD Pstate Driver Core Performance BoostQuoted 2 lines · Perry Yuan
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:
Quoted 7 lines
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.
Quoted 2 lines
Borislav Petkov
maintainerQuoted 2 lines · Perry
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?
Signature · 1 line
Sent from a small device: formatting sucks and brevity is inevitable.
Hello.
Quoted 140 lines · SELČ Perry Yuan
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.5782) 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 108aThe 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 toboost(Mario)
* rebased to latest linux-pm/bleeding-edgeChanges from v8:
* pick RB flag for patch 4 (Mario)
* changeboot_cpu_hastocpu_feature_enabledfor 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-edgeChanges from v7:
* fix the mutext locking issue in the sysfs fileupdate(Ray, Mario)
* pick ack flag from Ray
* useX86_FEATURE_CPBto verify the CPB function in Patch #2(Ray)
* rerun the testing to check function works well
* rebased to linux-pm/bleeding-edge latestChanges from v6:
* reword patch 2 commit log (Gautham)
* update cover letter description(Gautham)
* rebase to kernel v6.9-rc5Changes 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:
* moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
* pick RB flag from Gautham R. Shenoy
* add Cc Oleksandr Natalenko <[email protected]>
* 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 useMSR_K7_HWCR_CPB_DIS_BITChanges from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global toamd_pstate_global_params(Oleksandr Natalenko)
* remove comments forboot_supportedinamd_pstate.h
* fix the compiler warning for amd-pstate-ut.ko
* usefor_each_online_cpuincpb_boost_storewhich 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 toamd-pstate.h
* fix the amd-pstate-ut with new cpb control interfaceChanges from v1:
* drop suspend/resume fix patch 6/7 because of the fix should be in another fix series instead of CPB feature
* move theset_boostremove 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/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/Perry Yuan (7):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs 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
Quoted 7 lines
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. 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' ```
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/[email protected]/
Signature · 1 line
Oleksandr Natalenko (post-factum)
Quoted 166 lines · SELČ Oleksandr Natalenko
Hello.
Quoted 140 lines · SELČ Perry Yuan
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.5782) 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 108aThe 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 toboost(Mario)
* rebased to latest linux-pm/bleeding-edgeChanges from v8:
* pick RB flag for patch 4 (Mario)
* changeboot_cpu_hastocpu_feature_enabledfor 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-edgeChanges from v7:
* fix the mutext locking issue in the sysfs fileupdate(Ray, Mario)
* pick ack flag from Ray
* useX86_FEATURE_CPBto verify the CPB function in Patch #2(Ray)
* rerun the testing to check function works well
* rebased to linux-pm/bleeding-edge latestChanges from v6:
* reword patch 2 commit log (Gautham)
* update cover letter description(Gautham)
* rebase to kernel v6.9-rc5Changes 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:
* moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
* pick RB flag from Gautham R. Shenoy
* add Cc Oleksandr Natalenko <[email protected]>
* 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 useMSR_K7_HWCR_CPB_DIS_BITChanges from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global toamd_pstate_global_params(Oleksandr Natalenko)
* remove comments forboot_supportedinamd_pstate.h
* fix the compiler warning for amd-pstate-ut.ko
* usefor_each_online_cpuincpb_boost_storewhich 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 toamd-pstate.h
* fix the amd-pstate-ut with new cpb control interfaceChanges from v1:
* drop suspend/resume fix patch 6/7 because of the fix should be in another fix series instead of CPB feature
* move theset_boostremove 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/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/Perry Yuan (7):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs 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 methodQuoted 7 lines
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 ```
Quoted 1 line
I've got
amd_pstate=guidedset in the kernel cmdline, butamd-pstate-eppgets 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].
But this part:
Quoted 8 lines
When I try to set
guidedmanually viaecho guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped todisable,teeerrors 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.
Quoted 37 lines
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
guidedmode with my Zen 3.
Signature · 1 line
Oleksandr Natalenko (post-factum)
Quoted 198 lines · SELČ Oleksandr Natalenko
Quoted 166 lines · SELČ Oleksandr Natalenko
Hello.
Quoted 140 lines · SELČ Perry Yuan
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.5782) 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 108aThe 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 toboost(Mario)
* rebased to latest linux-pm/bleeding-edgeChanges from v8:
* pick RB flag for patch 4 (Mario)
* changeboot_cpu_hastocpu_feature_enabledfor 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-edgeChanges from v7:
* fix the mutext locking issue in the sysfs fileupdate(Ray, Mario)
* pick ack flag from Ray
* useX86_FEATURE_CPBto verify the CPB function in Patch #2(Ray)
* rerun the testing to check function works well
* rebased to linux-pm/bleeding-edge latestChanges from v6:
* reword patch 2 commit log (Gautham)
* update cover letter description(Gautham)
* rebase to kernel v6.9-rc5Changes 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:
* moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
* pick RB flag from Gautham R. Shenoy
* add Cc Oleksandr Natalenko <[email protected]>
* 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 useMSR_K7_HWCR_CPB_DIS_BITChanges from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global toamd_pstate_global_params(Oleksandr Natalenko)
* remove comments forboot_supportedinamd_pstate.h
* fix the compiler warning for amd-pstate-ut.ko
* usefor_each_online_cpuincpb_boost_storewhich 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 toamd-pstate.h
* fix the amd-pstate-ut with new cpb control interfaceChanges from v1:
* drop suspend/resume fix patch 6/7 because of the fix should be in another fix series instead of CPB feature
* move theset_boostremove 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/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/Perry Yuan (7):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs 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 methodQuoted 7 lines
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 ```Quoted 1 line
I've got
amd_pstate=guidedset in the kernel cmdline, butamd-pstate-eppgets loaded anyway.OK, this part is solved like below:
```
drivers/cpufreq/amd-pstate.c +1
-5@@ -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" );```
Quoted 3 lines
as we have discussed here [1].
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?
Quoted 83 lines
But this part:
Quoted 8 lines
When I try to set
guidedmanually viaecho guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped todisable,teeerrors 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.
Quoted 37 lines
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
guidedmode with my Zen 3.
Signature · 1 line
Oleksandr Natalenko (post-factum)
Quoted 226 lines · SELČ Oleksandr Natalenko
Quoted 198 lines · SELČ Oleksandr Natalenko
Quoted 166 lines · SELČ Oleksandr Natalenko
Hello.
Quoted 140 lines · SELČ Perry Yuan
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.5782) 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 108aThe 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 toboost(Mario)
* rebased to latest linux-pm/bleeding-edgeChanges from v8:
* pick RB flag for patch 4 (Mario)
* changeboot_cpu_hastocpu_feature_enabledfor 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-edgeChanges from v7:
* fix the mutext locking issue in the sysfs fileupdate(Ray, Mario)
* pick ack flag from Ray
* useX86_FEATURE_CPBto verify the CPB function in Patch #2(Ray)
* rerun the testing to check function works well
* rebased to linux-pm/bleeding-edge latestChanges from v6:
* reword patch 2 commit log (Gautham)
* update cover letter description(Gautham)
* rebase to kernel v6.9-rc5Changes 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:
* moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
* pick RB flag from Gautham R. Shenoy
* add Cc Oleksandr Natalenko <[email protected]>
* 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 useMSR_K7_HWCR_CPB_DIS_BITChanges from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global toamd_pstate_global_params(Oleksandr Natalenko)
* remove comments forboot_supportedinamd_pstate.h
* fix the compiler warning for amd-pstate-ut.ko
* usefor_each_online_cpuincpb_boost_storewhich 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 toamd-pstate.h
* fix the amd-pstate-ut with new cpb control interfaceChanges from v1:
* drop suspend/resume fix patch 6/7 because of the fix should be in another fix series instead of CPB feature
* move theset_boostremove 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/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/Perry Yuan (7):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs 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 methodQuoted 7 lines
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 ```Quoted 1 line
I've got
amd_pstate=guidedset in the kernel cmdline, butamd-pstate-eppgets loaded anyway.OK, this part is solved like below:
```
drivers/cpufreq/amd-pstate.c +1
-5@@ -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" );```
Quoted 3 lines
as we have discussed here [1].
Ah no, scratch it, it's not solved. With
amd_pstate=guidedthe driver fails to register during the boottime with the samesysfserror:``` 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> ```
Quoted 3 lines
and things revert to
acpi_cpufreqinstead.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.
Quoted 87 lines
Quoted 84 lines
But this part:
Quoted 8 lines
When I try to set
guidedmanually viaecho guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped todisable,teeerrors 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.
Quoted 37 lines
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
guidedmode with my Zen 3.
Signature · 1 line
Oleksandr Natalenko (post-factum)
Mario Limonciello
maintainerQuoted 233 lines · Oleksandr Natalenko
Quoted 226 lines · SELČ Oleksandr Natalenko
Quoted 198 lines · SELČ Oleksandr Natalenko
Quoted 166 lines · SELČ Oleksandr Natalenko
Hello.
Quoted 140 lines · SELČ Perry Yuan
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.5782) 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 108aThe 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 toboost(Mario)
* rebased to latest linux-pm/bleeding-edgeChanges from v8:
* pick RB flag for patch 4 (Mario)
* changeboot_cpu_hastocpu_feature_enabledfor 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-edgeChanges from v7:
* fix the mutext locking issue in the sysfs fileupdate(Ray, Mario)
* pick ack flag from Ray
* useX86_FEATURE_CPBto verify the CPB function in Patch #2(Ray)
* rerun the testing to check function works well
* rebased to linux-pm/bleeding-edge latestChanges from v6:
* reword patch 2 commit log (Gautham)
* update cover letter description(Gautham)
* rebase to kernel v6.9-rc5Changes 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:
* moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
* pick RB flag from Gautham R. Shenoy
* add Cc Oleksandr Natalenko <[email protected]>
* 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 useMSR_K7_HWCR_CPB_DIS_BITChanges from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global toamd_pstate_global_params(Oleksandr Natalenko)
* remove comments forboot_supportedinamd_pstate.h
* fix the compiler warning for amd-pstate-ut.ko
* usefor_each_online_cpuincpb_boost_storewhich 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 toamd-pstate.h
* fix the amd-pstate-ut with new cpb control interfaceChanges from v1:
* drop suspend/resume fix patch 6/7 because of the fix should be in another fix series instead of CPB feature
* move theset_boostremove 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/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/Perry Yuan (7):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs 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 methodQuoted 7 lines
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 ```Quoted 1 line
I've got
amd_pstate=guidedset in the kernel cmdline, butamd-pstate-eppgets loaded anyway.OK, this part is solved like below:
```
drivers/cpufreq/amd-pstate.c +1
-5@@ -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" );```
Quoted 3 lines
as we have discussed here [1].
Ah no, scratch it, it's not solved. With
amd_pstate=guidedthe driver fails to register during the boottime with the samesysfserror:``` 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> ```Quoted 3 lines
and things revert to
acpi_cpufreqinstead.What's wrong?
This happens with both
amd_pstate=guidedandamd_pstate=passive, while withamd_pstate=activeit works. Also note I've got:
Quoted 9 lines
``` 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.
Quoted 89 lines
Quoted 87 lines
Quoted 84 lines
But this part:
Quoted 8 lines
When I try to set
guidedmanually viaecho guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped todisable,teeerrors 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.
Quoted 37 lines
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
guidedmode with my Zen 3.
Quoted 239 lines · SELČ Mario Limonciello
Quoted 238 lines · Oleksandr Natalenko
Quoted 226 lines · SELČ Oleksandr Natalenko
Quoted 198 lines · SELČ Oleksandr Natalenko
Quoted 166 lines · SELČ Oleksandr Natalenko
Hello.
Quoted 140 lines · SELČ Perry Yuan
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.5782) 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 108aThe 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 toboost(Mario)
* rebased to latest linux-pm/bleeding-edgeChanges from v8:
* pick RB flag for patch 4 (Mario)
* changeboot_cpu_hastocpu_feature_enabledfor 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-edgeChanges from v7:
* fix the mutext locking issue in the sysfs fileupdate(Ray, Mario)
* pick ack flag from Ray
* useX86_FEATURE_CPBto verify the CPB function in Patch #2(Ray)
* rerun the testing to check function works well
* rebased to linux-pm/bleeding-edge latestChanges from v6:
* reword patch 2 commit log (Gautham)
* update cover letter description(Gautham)
* rebase to kernel v6.9-rc5Changes 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:
* moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
* pick RB flag from Gautham R. Shenoy
* add Cc Oleksandr Natalenko <[email protected]>
* 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 useMSR_K7_HWCR_CPB_DIS_BITChanges from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global toamd_pstate_global_params(Oleksandr Natalenko)
* remove comments forboot_supportedinamd_pstate.h
* fix the compiler warning for amd-pstate-ut.ko
* usefor_each_online_cpuincpb_boost_storewhich 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 toamd-pstate.h
* fix the amd-pstate-ut with new cpb control interfaceChanges from v1:
* drop suspend/resume fix patch 6/7 because of the fix should be in another fix series instead of CPB feature
* move theset_boostremove 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/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/Perry Yuan (7):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs 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 methodQuoted 7 lines
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 ```Quoted 1 line
I've got
amd_pstate=guidedset in the kernel cmdline, butamd-pstate-eppgets loaded anyway.OK, this part is solved like below:
```
drivers/cpufreq/amd-pstate.c +1
-5@@ -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" );```
Quoted 3 lines
as we have discussed here [1].
Ah no, scratch it, it's not solved. With
amd_pstate=guidedthe driver fails to register during the boottime with the samesysfserror:``` 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> ```Quoted 3 lines
and things revert to
acpi_cpufreqinstead.What's wrong?
This happens with both
amd_pstate=guidedandamd_pstate=passive, while withamd_pstate=activeit works. Also note I've got:``` CONFIG_X86_AMD_PSTATE=y CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3 ```
Quoted 8 lines
Quoted 4 lines
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_cppcdoes for sysfs when amd pstate is changing modes the sysfs file from amd-pstate isn't cleared and soacpi_cppctries 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.
Quoted 7 lines
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.
Quoted 91 lines
Quoted 89 lines
Quoted 87 lines
Quoted 84 lines
But this part:
Quoted 8 lines
When I try to set
guidedmanually viaecho guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped todisable,teeerrors 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.
Quoted 37 lines
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
guidedmode with my Zen 3.
Signature · 1 line
Oleksandr Natalenko (post-factum)
Yuan, Perry
reviewer[AMD Official Use Only - General]
Hi Oleksandr
Quoted 459 lines
-----Original Message-----
From: Oleksandr Natalenko <[email protected]>
Sent: Thursday, May 9, 2024 8:01 PM
To: [email protected]; [email protected]; Huang, Ray <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>; Yuan, Perry <[email protected]>; Limonciello, Mario <[email protected]>
Cc: Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>; Meng, Li (Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v10 0/7] AMD Pstate Driver Core Performance BoostQuoted 4 lines · SELČ Mario Limonciello
Quoted 3 lines · Oleksandr Natalenko
Quoted 2 lines · SELČ Oleksandr Natalenko
Quoted 1 line · SELČ Oleksandr Natalenko
On středa 8. května 2024 17:11:42, SELČ Oleksandr Natalenko wrote:
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Hello.
Quoted 5 lines · SELČ Perry Yuan
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:
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
"
/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"Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
$ lscpu -ae CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZMHZ
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
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.5782) globally enable core boost:
$ sudo bash -c "echo 1 >
/sys/devices/system/cpu/amd_pstate/cpb_boost"Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
$ 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==========================================================
======Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
============ 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 MAXMHZMINMHZ MHZ
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
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"Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
# after CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZMINMHZ 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.0000Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
$ sudo rdmsr 0xc00102b3 -p 0 108aThe patches have been tested with the AMD 7950X processor and many users would like to get core boost control enabled for power
saving.
Quoted 22 lines
Quoted 22 lines
Quoted 22 lines
Quoted 22 lines
Quoted 22 lines
Quoted 22 lines
Perry.
Changes from v9:
* change per CPU boost sysfs file name toboost(Mario)
* rebased to latest linux-pm/bleeding-edgeChanges from v8:
* pick RB flag for patch 4 (Mario)
* changeboot_cpu_hastocpu_feature_enabledfor 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-edgeChanges from v7:
* fix the mutext locking issue in the sysfs fileupdate(Ray, Mario)
* pick ack flag from Ray
* useX86_FEATURE_CPBto verify the CPB function in Patch #2(Ray)
* rerun the testing to check function works well
* rebased to linux-pm/bleeding-edge latestQuoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Changes from v6:
* reword patch 2 commit log (Gautham)
* update cover letter description(Gautham)
* rebase to kernel v6.9-rc5Changes from v4:
* drop the legacy boost remove patch, let us keep the legacyinterface
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
in case some applications break.
* rebase to linux-pm/bleeding-edge branch
* rework the patchset base on [PATCH v8 0/8] AMD Pstate FixesAnd
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Enhancements which has some intial work done there.
Changes from v4:
* moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
* pick RB flag from Gautham R. Shenoy
* add Cc Oleksandr Natalenko <[email protected]>
* rebase to latest linux-pm/bleeding-edge branch
* rebase the patch set on top of [PATCH v7 0/6] AMD Pstate FixesAnd Enhancements
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
* update [PATCH v7 2/6] to use
MSR_K7_HWCR_CPB_DIS_BITChanges from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global to amd_pstate_global_params(OleksandrNatalenko)
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
* remove comments for
boot_supportedinamd_pstate.h
* fix the compiler warning for amd-pstate-ut.ko
* usefor_each_online_cpuincpb_boost_storewhich fix the nullpointer
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
error during testing
* fix the max frequency value to be KHz when cpb boost
disabled(Gautham R. Shenoy)Changes from v2:
* move global struct toamd-pstate.h
* fix the amd-pstate-ut with new cpb control interfaceChanges from v1:
* drop suspend/resume fix patch 6/7 because of the fix should bein
Quoted 35 lines
Quoted 35 lines
Quoted 35 lines
Quoted 35 lines
Quoted 35 lines
Quoted 35 lines
another fix series instead of CPB feature
* move theset_boostremove 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/Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Perry Yuan (7):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITinto msr-
index.hQuoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs entry for boostcontrol
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
while cpb boost off
Documentation: cpufreq: amd-pstate: introduce the new cpuboost
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: update doc for Per CPUboost
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
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++++++++++++++++++--
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 2 lines
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.
Quoted 14 lines
Quoted 14 lines
Quoted 14 lines
Quoted 14 lines
Quoted 14 lines
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 ```Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
I've got
amd_pstate=guidedset in the kernel cmdline, but `amd-pstate-epp` gets loaded anyway.
Quoted 31 lines
Quoted 31 lines
Quoted 31 lines
Quoted 31 lines
OK, this part is solved like below:
```
(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate.cindexaafa4466e5ced..5aee7d2b8cfd7100644drivers/cpufreq/amd-pstate.c +1
-0@@ -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 @@ staticint
__initamd_pstate_init(void)/* check if this machine need CPPC quirks */ dmi_check_system(amd_pstate_quirks_table);drivers/cpufreq/amd-pstate.c +0
-4-/* 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 toenable this\n"); ```
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
as we have discussed here [1].
[1]
https://lore.kernel.org/lkml/CYYPR12MB865554562BE018D46FF0108C9CE5
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 1 line
Ah no, scratch it, it's not solved. With
amd_pstate=guidedthe driverfails to register during the boottime with the same
sysfserror:Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
```
kernel: sysfs: cannot create duplicate filename'/devices/system/cpu/cpufreq/policy0/boost'
Quoted 20 lines
Quoted 20 lines
Quoted 20 lines
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>```
Quoted 5 lines
Quoted 5 lines
Quoted 3 lines
and things revert to
acpi_cpufreqinstead.What's wrong?
This happens with both
amd_pstate=guidedandamd_pstate=passive,while with
amd_pstate=activeit works. Also note I've got:Quoted 6 lines
Quoted 6 lines
``` CONFIG_X86_AMD_PSTATE=y CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3 ```Quoted 8 lines
Quoted 4 lines
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_cppcdoes for sysfs when amd pstate is changing modes the sysfs file from amd-pstate isn't cleared and soacpi_cppctries to make it.Seems so. I've renamed
amd_pstate'sboostfile toamd_pstate_boost, and now I'm able to boot withamd_pstate=guided, and after boot under/sys/devices/system/cpu/cpufreq/policyXI see bothboost(fromacpi_cppc, apparently) andamd_pstate_boostat the same time.Not sure the fact both files are present is as intended.
Quoted 7 lines
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_MODEset toactiveand then havingamd_pstate=guidedon the kernel cmdline is not considered to be a runtime switching (or is it?), yet it doesn't work either due to filename conflict.Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
But this part:
Quoted 1 line
When I try to set
guidedmanually via `echo guided | sudo tee
/sys/devices/system/cpu/amd_pstate/status, the status gets dropped todisable,teeerrors out with-ENODEV`, and there's this in the kernel log:Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
```
$ jctl -kb | grep sysfs: | cut -d ' ' -f 5- kernel: sysfs: cannot create duplicate filename'/devices/system/cpu/cpufreq/policy0/boost'
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
…
kernel: sysfs: cannot create duplicate filename'/devices/system/cpu/cpufreq/policy31/boost'
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 1 line
```
is not. I've successfully booted with
amd_pstate=guided, then didthis:
Quoted 28 lines
Quoted 28 lines
Quoted 28 lines
Quoted 28 lines
``` $ 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;
```Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
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.
Quoted 28 lines
Quoted 28 lines
Quoted 28 lines
Quoted 28 lines
Quoted 28 lines
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: switchboot_cpu_has()tocpu_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 boostQuoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
control method
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
cpufreq: amd-pstate: implementcpb_boostsysfs entry for boost control
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: amd-pstate: remove unused variable
lowest_nonlinear_freqQuoted 15 lines
Quoted 15 lines
Quoted 15 lines
Quoted 15 lines
Quoted 15 lines
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 inamd_cpudata
cpufreq: amd-pstate: Document *_limit_* fields in structamd_cpudata```Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Previously, with your submissions, it was possible to use
guidedmode with my Zen 3.
Quoted 16 lines
Quoted 14 lines
Quoted 12 lines
Quoted 9 lines
Quoted 6 lines
[1]
https://lore.kernel.org/lkml/cover.1715065568.git.perry.yuan@amd.
com/
Quoted 2 lines
--
Oleksandr Natalenko (post-factum)
I have known the issue detail, will fix it to allow kernel command input like before.
Perry.