AMD Pstate Driver Core Performance Boost
Subsystems (4)
Perry Yuan
reviewerv11 cover AMD Pstate Driver Core Performance Boost
Hi all,
The patchset series implement CPB(core performance boost) feature for AMD pstate driver including passisve ,guide and active mode support.
User can change global core frequency boost control with a new sysfs entry:
"/sys/devices/system/cpu/amd_pstate/cpb_boost"
Now it also support to update indivial CPU boost state in sysfs boost file. "/sys/devices/system/cpu/cpuX/cpufreq/boost"
And global control will override the indivial CPU boost state by default.
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
108arebasd to keep syncing to Mario kernel tree: bleeding-edge
https://git.kernel.org/pub/scm/linux/kernel/git/superm1/linux.git
Tested result:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 3110.0000 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2732.3569 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 2312.2109 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2310.1011 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140
sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu11/cpufreq/boost" sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu10/cpufreq/boost" sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu9/cpufreq/boost"
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1242.7240 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2754.5710 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2659.8159 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2308.9929 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140
sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1233.8630 1 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2714.4851 3 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2732.3569 4 0 0 2 2:2:2:0 yes 2801.0000 400.0000 2564.2639 5 0 0 2 2:2:2:0 yes 2801.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 2801.0000 400.0000 2732.3569 7 0 0 3 3:3:3:0 yes 2801.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1233.8660 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.6630 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.5050
sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1234.0200 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2278.8491 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2732.3569 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2353.0449 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140
Perry.
Changes from v10:
* rework the boost interface with cpufreq core boost control, align the sysfs file created from cpufreq.c and allow indivial CPU boost control (Mario)
* fix the pr_warn code format with %zd (Oleksandr Natalenko)
* replace sscanf with kstrtobool for cpufreq.c (new)
* drop the boost sysfs file creation from amd pstate patch #6
* add init_boost for cpufreq.c to unify the boost file creation(Mario)
* add set_boost callback for EPP driver mode
* fix syncronization issue for indivial boost control and global CPB control, now the two control way will keep syncronization after anyone CPU boost state changed.
* rebased to Mario kernel tree: bleeding-edge
* run testing on local system, no regression issue found so far.
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]/
v10: https://lore.kernel.org/lkml/[email protected]/
Perry Yuan (9):
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: simplify boolean parsing with kstrtobool in store function
cpufreq: introduce init_boost callback to initialize boost state for
pstate drivers
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: Add set_boost callback for active mode
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
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 | 197 +++++++++++++++++--- drivers/cpufreq/amd-pstate.h | 14 ++ drivers/cpufreq/cpufreq.c | 23 ++- include/linux/cpufreq.h | 2 + 8 files changed, 237 insertions(+), 35 deletions(-)
Signature · 1 line
2.34.1
Perry Yuan
reviewerPATCH v11 1/9 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
@@ -781,6 +781,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 v11 2/9 cpufreq: simplify boolean parsing with kstrtobool in store function
In reply to Perry YuanUpdate the cpufreq store function to use kstrtobool for parsing boolean values. This simplifies the code and improves readability by using a standard kernel function for boolean string conversion.
--- drivers/cpufreq/cpufreq.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/cpufreq/cpufreq.c +5 -6
@@ -614,10 +614,9 @@ static ssize_t show_boost(struct kobject *kobj,static ssize_t store_boost (struct kobject *kobj,struct kobj_attribute *attr,const char *buf,size_t count) { -int ret, enable; +bool enable; - ret =sscanf (buf,"%d" , &enable); -if (ret !=1 || enable <0 || enable >1 ) +if (kstrtobool (buf, &enable))return -EINVAL ;if (cpufreq_boost_trigger_state (enable)) {
@@ -641,10 +640,10 @@ static ssize_t show_local_boost(struct cpufreq_policy *policy, char *buf)static ssize_t store_local_boost (struct cpufreq_policy *policy,const char *buf,size_t count) { -int ret, enable; +int ret; +bool enable; - ret =kstrtoint (buf,10 , &enable); -if (ret || enable <0 || enable >1 ) +if (kstrtobool (buf, &enable))return -EINVAL ;if (!cpufreq_driver->boost_enabled)
Signature · 1 line
2.34.1
Re: [PATCH v11 2/9] cpufreq: simplify boolean parsing with kstrtobool in store function
Quoted 5 lines · Perry Yuan
Update the cpufreq store function to use kstrtobool for parsing boolean values. This simplifies the code and improves readability by using a standard kernel function for boolean string conversion.
Signed-off-by Perry Yuan <[email protected]>
Quoted 35 lines
--- drivers/cpufreq/cpufreq.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)drivers/cpufreq/cpufreq.c +5
-6@@ -614,10 +614,9 @@ static ssize_t show_boost(struct kobject *kobj,static ssize_t store_boost (struct kobject *kobj,struct kobj_attribute *attr,const char *buf,size_t count) { -int ret, enable; +bool enable; - ret =sscanf (buf,"%d" , &enable); -if (ret !=1 || enable <0 || enable >1 ) +if (kstrtobool (buf, &enable))return -EINVAL ;if (cpufreq_boost_trigger_state (enable)) {@@ -641,10 +640,10 @@ static ssize_t show_local_boost(struct cpufreq_policy *policy, char *buf)static ssize_t store_local_boost (struct cpufreq_policy *policy,const char *buf,size_t count) { -int ret, enable; +int ret; +bool enable; - ret =kstrtoint (buf,10 , &enable); -if (ret || enable <0 || enable >1 ) +if (kstrtobool (buf, &enable))return -EINVAL ;if (!cpufreq_driver->boost_enabled)
Perry Yuan
reviewerPATCH v11 3/9 cpufreq: introduce init_boost callback to initialize boost state for pstate drivers
In reply to Perry YuanIntroduce a new init_boost callback in cpufreq to initialize the boost state for specific pstate drivers. This initialization is required before calling the set_boost interface for each CPU.
The init_boost callback will set up and synchronize each CPU's current boost state before invoking the set_boost function. Without this step, the boost state may be inconsistent across CPUs.
--- drivers/cpufreq/cpufreq.c | 12 ++++++++++-- include/linux/cpufreq.h | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-)
drivers/cpufreq/cpufreq.c +10 -2
@@ -1429,8 +1429,16 @@ static int cpufreq_online(unsigned int cpu) goto out_free_policy; } -/* Let the per-policy boost flag mirror the cpufreq_driver boost during init */ - policy->boost_enabled =cpufreq_boost_enabled () &&policy_has_boost_freq (policy); +/* init boost state to prepare set_boost callback for each CPU */ +if (cpufreq_driver->init_boost) { + ret = cpufreq_driver->init_boost (policy); +if (ret) +pr_debug ("%s: %d: initialization boost failed\n" , __func__, + __LINE__); + }else { +/* Let the per-policy boost flag mirror the cpufreq_driver boost during init */ + policy->boost_enabled =cpufreq_boost_enabled () &&policy_has_boost_freq (policy); + }/* * The initialization has succeeded and the policy is online.
include/linux/cpufreq.h +2 -0
@@ -409,6 +409,8 @@ struct cpufreq_driver {bool boost_enabled;int (*set_boost)(struct cpufreq_policy *policy,int state); +/* initialize boost state to be consistent before calling set_boost */ +int (*init_boost)(struct cpufreq_policy *policy);/* * Set by drivers that want to register with the energy model after the * policy is properly initialized, but before the governor is started.
Signature · 1 line
2.34.1
Mario Limonciello
maintainerRe: [PATCH v11 3/9] cpufreq: introduce init_boost callback to initialize boost state for pstate drivers
Quoted 20 lines · Perry Yuan
Introduce a new
init_boostcallback in cpufreq to initialize the boost state for specific pstate drivers. This initialization is required before calling theset_boostinterface for each CPU.The
init_boostcallback will set up and synchronize each CPU's current boost state before invoking theset_boostfunction. Without this step, the boost state may be inconsistent across CPUs.Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/cpufreq.c | 12 ++++++++++-- include/linux/cpufreq.h | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-)drivers/cpufreq/cpufreq.c +0
-0@@ -1429,8 +1429,16 @@ static int cpufreq_online(unsigned int cpu) goto out_free_policy;
drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1437
Quoted 10 lines
drivers/cpufreq/cpufreq.c +6
-2} -/* Let the per-policy boost flag mirror the cpufreq_driver boost during init */ - policy->boost_enabled =cpufreq_boost_enabled () &&policy_has_boost_freq (policy); +/* init boost state to prepare set_boost callback for each CPU */ +if (cpufreq_driver->init_boost) { + ret = cpufreq_driver->init_boost (policy); +if (ret) +pr_debug ("%s: %d: initialization boost failed\n" , __func__, + __LINE__);
The message should have the subject at the beginning. IE:
"boost initialization failed\n"
Also, isn't this fatal if init failed? IE shouldn't failing have a:
goto out_free_policy;
Quoted 20 lines
drivers/cpufreq/cpufreq.c +4
-0+ }else { +/* Let the per-policy boost flag mirror the cpufreq_driver boost during init */ + policy->boost_enabled =cpufreq_boost_enabled () &&policy_has_boost_freq (policy); + }/* * The initialization has succeeded and the policy is online. include/linux/cpufreq.h +2
-0@@ -409,6 +409,8 @@ struct cpufreq_driver {bool boost_enabled;int (*set_boost)(struct cpufreq_policy *policy,int state); +/* initialize boost state to be consistent before calling set_boost */ +int (*init_boost)(struct cpufreq_policy *policy);/* * Set by drivers that want to register with the energy model after the * policy is properly initialized, but before the governor is started.
Yuan, Perry
reviewerRE: [PATCH v11 3/9] cpufreq: introduce init_boost callback to initialize boost state for pstate drivers
[AMD Official Use Only - AMD Internal Distribution Only]
Quoted 46 lines
-----Original Message-----
From: Limonciello, Mario <[email protected]>
Sent: Friday, June 14, 2024 1:55 AM
To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>
Cc: [email protected]; [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 v11 3/9] cpufreq: introduceinit_boostcallback to initialize boost state for pstate driversQuoted 19 lines · Perry Yuan
Introduce a new
init_boostcallback in cpufreq to initialize the boost state for specific pstate drivers. This initialization is required before calling theset_boostinterface for each CPU.The
init_boostcallback will set up and synchronize each CPU's current boost state before invoking theset_boostfunction. Without this step, the boost state may be inconsistent across CPUs.Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/cpufreq.c | 12 ++++++++++-- include/linux/cpufreq.h | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-)drivers/cpufreq/cpufreq.c +0
-0drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1432
Quoted 4 lines
drivers/cpufreq/cpufreq.c +0
-1@@ -1429,8 +1429,16 @@ static int cpufreq_online(unsigned int cpu) goto out_free_policy; } -/* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1433
Quoted 1 line
drivers/cpufreq/cpufreq.c +0
-1- policy->boost_enabled = cpufreq_boost_enabled() &&
policy_has_boost_freq(policy);drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1432
Quoted 1 line
drivers/cpufreq/cpufreq.c +1
-0+/* init boost state to prepare set_boost callback for each CPU */
drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu)
Quoted 4 lines
drivers/cpufreq/cpufreq.c +4
-0+if (cpufreq_driver->init_boost) { + ret = cpufreq_driver->init_boost (policy); +if (ret) + pr_debug("%s: %d: initialization boost
Quoted 8 lines
failed\n",
__func__,drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1437
Quoted 1 line
drivers/cpufreq/cpufreq.c +1
-0+ __LINE__);The message should have the subject at the beginning. IE:
"boost initialization failed\n"
Also, isn't this fatal if init failed? IE shouldn't failing have a:
Firstly, I also add the " goto out_free_policy", and removed later, because I think it is a little risky to fail the whole online process if driver init boost callback failed. If driver init boost failed, it just let boost control function lost, but online initialize failed and go to free the policy, it is a big problem. I am ok to add the error handling if maintainer agree to see the potential online function aborting. 😊
Perry.
Quoted 25 lines
goto out_free_policy;drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1439
Quoted 2 lines
drivers/cpufreq/cpufreq.c +2
-0+ }else { +/* Let the per-policy boost flag mirror the
cpufreq_driverboost during init */drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1440
Quoted 1 line
drivers/cpufreq/cpufreq.c +1
-0+ policy->boost_enabled =cpufreq_boost_enabled ()&&
policy_has_boost_freq(policy);Quoted 17 lines
drivers/cpufreq/cpufreq.c +1
-0+ }/* * The initialization has succeeded and the policy is online. include/linux/cpufreq.h index renamed from include/linux/cpufreq.h +0
-0
20f7e98ee8af..0698c0292d8f100644include/linux/cpufreq.h +2
-0@@ -409,6 +409,8 @@ struct cpufreq_driver {bool boost_enabled;int (*set_boost)(struct cpufreq_policy *policy,int state); +/* initialize boost state to be consistent before calling set_boost */ +int (*init_boost)(struct cpufreq_policy *policy);/* * Set by drivers that want to register with the energy model after the * policy is properly initialized, but before the governor is started.
Yuan, Perry
reviewerRE: [PATCH v11 3/9] cpufreq: introduce init_boost callback to initialize boost state for pstate drivers
[Public]
Hi Rafael
Quoted 107 lines
-----Original Message-----
From: Yuan, Perry <[email protected]>
Sent: Friday, June 14, 2024 10:43 AM
To: Limonciello, Mario <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>
Cc: [email protected]; [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 v11 3/9] cpufreq: introduceinit_boostcallback to initialize boost state for pstate drivers[AMD Official Use Only - AMD Internal Distribution Only]
[AMD Official Use Only - AMD Internal Distribution Only]
Quoted 5 lines
-----Original Message-----
From: Limonciello, Mario <[email protected]>
Sent: Friday, June 14, 2024 1:55 AM
To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, BorislavQuoted 3 lines
Cc: [email protected]; [email protected]; Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>;
Meng, Li
Quoted 39 lines
(Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v11 3/9] cpufreq: introduceinit_boostcallback to initialize boost state for pstate driversQuoted 19 lines · Perry Yuan
Introduce a new
init_boostcallback in cpufreq to initialize the boost state for specific pstate drivers. This initialization is required before calling theset_boostinterface for each CPU.The
init_boostcallback will set up and synchronize each CPU's current boost state before invoking theset_boostfunction. Without this step, the boost state may be inconsistent across CPUs.Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/cpufreq.c | 12 ++++++++++-- include/linux/cpufreq.h | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-)drivers/cpufreq/cpufreq.c +0
-0drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1432
Quoted 4 lines
drivers/cpufreq/cpufreq.c +0
-1@@ -1429,8 +1429,16 @@ static int cpufreq_online(unsigned int cpu) goto out_free_policy; } -/* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1433
Quoted 1 line
drivers/cpufreq/cpufreq.c +0
-1- policy->boost_enabled = cpufreq_boost_enabled() &&
policy_has_boost_freq(policy);drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1433
Quoted 2 lines
drivers/cpufreq/cpufreq.c +2
-0+/* init boost state to prepare set_boost callback for +each CPU */
drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu)
Quoted 4 lines
drivers/cpufreq/cpufreq.c +4
-0+if (cpufreq_driver->init_boost) { + ret = cpufreq_driver->init_boost (policy); +if (ret) + pr_debug("%s: %d: initialization boostQuoted 8 lines
failed\n",
__func__,drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1437
Quoted 1 line
drivers/cpufreq/cpufreq.c +1
-0+ __LINE__);The message should have the subject at the beginning. IE:
"boost initialization failed\n"
Also, isn't this fatal if init failed? IE shouldn't failing have a:
Firstly, I also add the " goto
out_free_policy", and removed later, because I think it is a little risky to fail the whole online process if driver init boost callback failed.
If driver init boost failed, it just let boost control function lost, but online initialize failed and go to free the policy, it is a big problem. I am ok to add the error handling if maintainer agree to see the potential online function aborting. 😊Perry.
Quoted 20 lines
goto out_free_policy;drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1440
Quoted 2 lines
drivers/cpufreq/cpufreq.c +2
-0+ }else { +/* Let the per-policy boost flag mirror the
cpufreq_driverboost during init */drivers/cpufreq/cpufreq.c static int cpufreq_online(unsigned int cpu) · line 1441
Quoted 1 line
drivers/cpufreq/cpufreq.c +1
-0+ policy->boost_enabled =cpufreq_boost_enabled ()&&
policy_has_boost_freq(policy);Quoted 12 lines
drivers/cpufreq/cpufreq.c +1
-0+ }/* * The initialization has succeeded and the policy is online. include/linux/cpufreq.h index renamed from include/linux/cpufreq.h +0
-0
20f7e98ee8af..0698c0292d8f100644include/linux/cpufreq.h +0
-0@@ -409,6 +409,8 @@ struct cpufreq_driver {bool boost_enabled;int (*set_boost)(struct cpufreq_policy *policy,int state);
Quoted 5 lines
Quoted 5 lines
include/linux/cpufreq.h struct cpufreq_driver { · line 416
Quoted 5 lines
include/linux/cpufreq.h +2
-0+/* initialize boost state to be consistent before calling set_boost */ +int (*init_boost)(struct cpufreq_policy *policy);/* * Set by drivers that want to register with the energy model after the * policy is properly initialized, but before the governor is started.
Could you please help to review this cpufreq change to add init_boost callback for the pstate driver?
We need to add this to initialize boost_supported and boost_state according to SBIOS , then user could change the boost setting as preference.
Perry.
Perry Yuan
reviewerPATCH v11 4/9 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 | 59 +++++++++++++++++++++++++++++------- drivers/cpufreq/amd-pstate.h | 13 ++++++++ 2 files changed, 61 insertions(+), 11 deletions(-)
drivers/cpufreq/amd-pstate.c +48 -11
@@ -102,6 +102,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)
@@ -696,7 +698,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)
@@ -714,18 +716,38 @@ 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_set (struct amd_cpudata *cpudata) { -u32 highest_perf, nominal_perf; +u64 boost_val; +int ret =-1 ; - highest_perf =READ_ONCE (cpudata->highest_perf); - nominal_perf =READ_ONCE (cpudata->nominal_perf); +if (!cpu_feature_enabled (X86_FEATURE_CPB )) { +pr_debug_once ("Boost CPB capabilities not present in the processor\n" ); + ret = -EOPNOTSUPP ; + goto exit_err; + } -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" ); + ret = -EIO ; + goto exit_err; + } + + 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; +WRITE_ONCE (cpudata->boost_supported, true); + } - cpudata->boost_supported = true; - current_pstate_driver->boost_enabled = true; + amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported; +return 0 ; + +exit_err: +WRITE_ONCE (cpudata->boost_supported, false); + current_pstate_driver->boost_enabled = false; + amd_pstate_global_params.cpb_boost = false; +return ret; }static void amd_perf_ctl_reset (unsigned int cpu)
@@ -1007,7 +1029,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;
@@ -1389,6 +1410,21 @@ static bool amd_pstate_acpi_pm_profile_undefined(void)return false; } +static int amd_pstate_init_boost (struct cpufreq_policy *policy) +{ +struct amd_cpudata *cpudata = policy->driver_data; +int ret; + +/* initialize cpu cores boot state */ + ret =amd_pstate_boost_set (cpudata); +if (ret) +return ret; + + policy->boost_enabled =READ_ONCE (cpudata->boost_supported); + +return 0 ; +} +static int amd_pstate_epp_cpu_init (struct cpufreq_policy *policy) {int min_freq, max_freq, nominal_freq, ret;
@@ -1467,7 +1503,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 ;
@@ -1706,6 +1741,7 @@ static struct cpufreq_driver amd_pstate_driver = { .exit = amd_pstate_cpu_exit, .suspend = amd_pstate_cpu_suspend, .resume = amd_pstate_cpu_resume, + .init_boost = amd_pstate_init_boost, .set_boost = amd_pstate_set_boost, .update_limits = amd_pstate_update_limits, .name = "amd-pstate",
@@ -1723,6 +1759,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = { .suspend = amd_pstate_epp_suspend, .resume = amd_pstate_epp_resume, .update_limits = amd_pstate_update_limits, + .init_boost = amd_pstate_init_boost, .name = "amd-pstate-epp", .attr = amd_pstate_epp_attr, };
drivers/cpufreq/amd-pstate.h +13 -0
@@ -101,4 +101,17 @@ struct amd_cpudata { bool suspended; }; +/** +* 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
Mario Limonciello
maintainerRe: [PATCH v11 4/9] cpufreq: amd-pstate: initialize new core precision boost state
Quoted 108 lines · Perry Yuan
From: Perry Yuan <[email protected]>
Add one global
global_paramsto 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_paramsobject to record whether CPB is enabled in BIOS, and if it has been activated by the userReported-by Artem S. Tashkinov" <[email protected]>Cc Oleksandr Natalenko <[email protected]>Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/amd-pstate.c | 59 +++++++++++++++++++++++++++++------- drivers/cpufreq/amd-pstate.h | 13 ++++++++ 2 files changed, 61 insertions(+), 11 deletions(-)drivers/cpufreq/amd-pstate.c +32
-10@@ -102,6 +102,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) @@ -696,7 +698,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)@@ -714,18 +716,38 @@ 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_set (struct amd_cpudata *cpudata) { -u32 highest_perf, nominal_perf; +u64 boost_val; +int ret =-1 ; - highest_perf =READ_ONCE (cpudata->highest_perf); - nominal_perf =READ_ONCE (cpudata->nominal_perf); +if (!cpu_feature_enabled (X86_FEATURE_CPB )) { +pr_debug_once ("Boost CPB capabilities not present in the processor\n" ); + ret = -EOPNOTSUPP ; + goto exit_err; + } -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" ); + ret = -EIO ; + goto exit_err; + } + + 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; +WRITE_ONCE (cpudata->boost_supported, true); + } - cpudata->boost_supported = true; - current_pstate_driver->boost_enabled = true; + amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported; +return 0 ; + +exit_err: +WRITE_ONCE (cpudata->boost_supported, false); + current_pstate_driver->boost_enabled = false; + amd_pstate_global_params.cpb_boost = false; +return ret; }static void amd_perf_ctl_reset (unsigned int cpu)@@ -1007,7 +1029,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;@@ -1389,6 +1410,21 @@ static bool amd_pstate_acpi_pm_profile_undefined(void)return false; } +static int amd_pstate_init_boost (struct cpufreq_policy *policy)
drivers/cpufreq/amd-pstate.c static bool amd_pstate_acpi_pm_profile_undefined(void) · line 1423
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10
-0+{ +struct amd_cpudata *cpudata = policy->driver_data; +int ret; + +/* initialize cpu cores boot state */ + ret =amd_pstate_boost_set (cpudata); +if (ret) +return ret; + + policy->boost_enabled =READ_ONCE (cpudata->boost_supported);
Because of the change I suggested in patch 3/9, I believe you should move the check for
if (!cpudata->boost_supported)
from amd_pstate_boost_set() to the beginning of amd_pstate_init_boost(). Something like this:
static int amd_pstate_init_boost(struct cpufreq_policy *policy)
{
struct amd_cpudata *cpudata = policy->driver_data;
int ret;
if (!cpudata->boost_supported) {
policy->boost_enabled = false;
return 0;
}
ret = amd_pstate_boost_set(cpudata);
if (ret)
return ret;
policy->boost_enabled = true;
return ret;
}Quoted 53 lines
drivers/cpufreq/amd-pstate.c +6
-1+ +return 0 ; +} +static int amd_pstate_epp_cpu_init (struct cpufreq_policy *policy) {int min_freq, max_freq, nominal_freq, ret;@@ -1467,7 +1503,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 ;@@ -1706,6 +1741,7 @@ static struct cpufreq_driver amd_pstate_driver = { .exit = amd_pstate_cpu_exit, .suspend = amd_pstate_cpu_suspend, .resume = amd_pstate_cpu_resume, + .init_boost = amd_pstate_init_boost, .set_boost = amd_pstate_set_boost, .update_limits = amd_pstate_update_limits, .name = "amd-pstate",@@ -1723,6 +1759,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = { .suspend = amd_pstate_epp_suspend, .resume = amd_pstate_epp_resume, .update_limits = amd_pstate_update_limits, + .init_boost = amd_pstate_init_boost, .name = "amd-pstate-epp", .attr = amd_pstate_epp_attr, };drivers/cpufreq/amd-pstate.h +13
-0@@ -101,4 +101,17 @@ struct amd_cpudata { bool suspended; }; +/** +* 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 */
Yuan, Perry
reviewerRE: [PATCH v11 4/9] cpufreq: amd-pstate: initialize new core precision boost state
[AMD Official Use Only - AMD Internal Distribution Only]
Quoted 144 lines
-----Original Message-----
From: Limonciello, Mario <[email protected]>
Sent: Friday, June 14, 2024 1:55 AM
To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>
Cc: [email protected]; [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 v11 4/9] cpufreq: amd-pstate: initialize new core precision boost stateQuoted 17 lines · Perry Yuan
From: Perry Yuan <[email protected]>
Add one global
global_paramsto 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_paramsobject to record whether CPB is enabled in BIOS, and if it has been activated by the userQuoted 6 lines
Reported-by Artem S. Tashkinov" <[email protected]>Cc Oleksandr Natalenko <[email protected]>Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/amd-pstate.c | 59 +++++++++++++++++++++++++++++-------
Quoted 19 lines
drivers/cpufreq/amd-pstate.h | 13 ++++++++ 2 files changed, 61 insertions(+), 11 deletions(-)(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate.cindexfda8f86c90e0..9f42524074a9100644drivers/cpufreq/amd-pstate.c +2
-0@@ -102,6 +102,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) @@ -696,7 +698,7 @@ static int
amd_pstate_set_boost(struct cpufreq_policy *policy, int state)Quoted 2 lines
if (!cpudata->boost_supported) {
pr_err("Boost mode is not supported by this processor orSBIOS\n");
drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct
Quoted 6 lines
drivers/cpufreq/amd-pstate.c +1
-1-return -EINVAL ; +return -ENOTSUPP ; }if (state)@@ -714,18 +716,38 @@ static int amd_pstate_set_boost(struct
cpufreq_policy*policy, int state)Quoted 4 lines
drivers/cpufreq/amd-pstate.c +0
-1return 0 ; } -static void amd_pstate_boost_init (struct amd_cpudata *cpudata)drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +5
-3+static int amd_pstate_boost_set (struct amd_cpudata *cpudata) { -u32 highest_perf, nominal_perf; +u64 boost_val; +int ret =-1 ; - highest_perf =READ_ONCE (cpudata->highest_perf); - nominal_perf =READ_ONCE (cpudata->nominal_perf); +if (!cpu_feature_enabled (X86_FEATURE_CPB )) { + pr_debug_once("Boost CPB capabilities not present in theprocessor\n");
Quoted 4 lines
drivers/cpufreq/amd-pstate.c +3
-0+ ret = -EOPNOTSUPP ; + goto exit_err; + }drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +8
-2-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" ); + ret = -EIO ; + goto exit_err; + } + + amd_pstate_global_params.cpb_supported = !(boost_val &
MSR_K7_HWCR_CPB_DIS);drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
Quoted 8 lines
drivers/cpufreq/amd-pstate.c +5
-2+if (amd_pstate_global_params.cpb_supported) { + current_pstate_driver->boost_enabled = true; +WRITE_ONCE (cpudata->boost_supported, true); + } - cpudata->boost_supported = true; - current_pstate_driver->boost_enabled = true; + amd_pstate_global_params.cpb_boost =amd_pstate_global_params.cpb_supported;
Quoted 12 lines
drivers/cpufreq/amd-pstate.c +7
-0+return 0 ; + +exit_err: +WRITE_ONCE (cpudata->boost_supported, false); + current_pstate_driver->boost_enabled = false; + amd_pstate_global_params.cpb_boost = false; +return ret; } static void amd_perf_ctl_reset(unsigned int cpu) @@ -1007,7 +1029,6@@ static int
amd_pstate_cpu_init(struct cpufreq_policy *policy)Quoted 5 lines
policy->driver_data = cpudata;- amd_pstate_boost_init(cpudata); if (!current_pstate_driver->adjust_perf) current_pstate_driver->adjust_perf =
amd_pstate_adjust_perf;drivers/cpufreq/amd-pstate.c static bool
Quoted 2 lines
drivers/cpufreq/amd-pstate.c +0
-0@@ -1389,6 +1410,21 @@ static bool
amd_pstate_acpi_pm_profile_undefined(void)drivers/cpufreq/amd-pstate.c static bool amd_pstate_acpi_pm_profile_undefined(void) · line 1423
Quoted 13 lines
drivers/cpufreq/amd-pstate.c +10
-0return false; } +static int amd_pstate_init_boost (struct cpufreq_policy *policy) { +struct amd_cpudata *cpudata = policy->driver_data; +int ret; + +/* initialize cpu cores boot state */ + ret =amd_pstate_boost_set (cpudata); +if (ret) +return ret; + + policy->boost_enabled =READ_ONCE (cpudata->boost_supported);Because of the change I suggested in patch 3/9, I believe you should move the check for
Quoted 4 lines
if (!cpudata->boost_supported)
from
amd_pstate_boost_set()to the beginning ofamd_pstate_init_boost(). Something like this:
cpudata->boost_supported will be initialized in amd_pstate_init_boost(), if system is identified to support boost control, then each CPU will mark boost_supported to be true.
In the next, the set_boost callback will check boost mode is not supported or not before it do real boost switching operation.
amd_pstate_init_boost() was added to initialize everything that control needs, the below function will set “cpudata->boost_supported” value when it returns.
static int amd_pstate_init_boost(struct cpufreq_policy *policy)
{
struct amd_cpudata *cpudata = policy->driver_data;
int ret;
/* initialize cpu cores boot state */
ret = amd_pstate_boost_set(cpudata);<<<<------- “cpudata->boost_supported” will be set to true or false.
if (ret)
return ret;
policy->boost_enabled = READ_ONCE(cpudata->boost_state);
return 0;
}Quoted 74 lines
static int amd_pstate_init_boost(struct cpufreq_policy *policy) { struct amd_cpudata *cpudata = policy->driver_data; int ret; if (!cpudata->boost_supported) { policy->boost_enabled = false; return 0; } ret = amd_pstate_boost_set(cpudata); if (ret) return ret; policy->boost_enabled = true; return ret; }drivers/cpufreq/amd-pstate.c static struct cpufreq_driver amd_pstate_driver =
Quoted 16 lines
drivers/cpufreq/amd-pstate.c +4
-0+ +return 0 ; +} +static int amd_pstate_epp_cpu_init (struct cpufreq_policy *policy) { int min_freq, max_freq, nominal_freq, ret; @@ -1467,7 +1503,6 @@static int
amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)return ret; WRITE_ONCE(cpudata->cppc_cap1_cached, value); }drivers/cpufreq/amd-pstate.c +0
-1-amd_pstate_boost_init (cpudata);return 0 ;@@ -1706,6 +1741,7 @@ static struct cpufreq_driver amd_pstate_driver ={
drivers/cpufreq/amd-pstate.c static struct cpufreq_driver
Quoted 8 lines
drivers/cpufreq/amd-pstate.c +1
-0.exit = amd_pstate_cpu_exit, .suspend = amd_pstate_cpu_suspend, .resume = amd_pstate_cpu_resume, + .init_boost = amd_pstate_init_boost, .set_boost = amd_pstate_set_boost, .update_limits = amd_pstate_update_limits, .name = "amd-pstate",@@ -1723,6 +1759,7 @@ static struct cpufreq_driver
amd_pstate_epp_driver= {Quoted 12 lines
drivers/cpufreq/amd-pstate.c +1
-0.suspend = amd_pstate_epp_suspend, .resume = amd_pstate_epp_resume, .update_limits = amd_pstate_update_limits, + .init_boost = amd_pstate_init_boost, .name = "amd-pstate-epp", .attr = amd_pstate_epp_attr, };(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate.hindexe6a28e7f4dbf..0b75a6267fca100644drivers/cpufreq/amd-pstate.h struct amd_cpudata { · line 105
Quoted 5 lines
drivers/cpufreq/amd-pstate.h +2
-0@@ -101,4 +101,17 @@ struct amd_cpudata {bool suspended; }; +/** +* struct amd_pstate_global_params - Global parameters, mostly tunable via sysfs.
Quoted 12 lines
drivers/cpufreq/amd-pstate.h +11
-0+* @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 */
Perry Yuan
reviewerPATCH v11 5/9 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 | 117 +++++++++++++++++++++++++++++++- drivers/cpufreq/amd-pstate.h | 1 + 3 files changed, 118 insertions(+), 2 deletions(-)
drivers/cpufreq/amd-pstate-ut.c +1 -1
@@ -227,7 +227,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 +116 -1
159 lines not on this page · raw message
drivers/cpufreq/amd-pstate.h +1 -0
@@ -99,6 +99,7 @@ struct amd_cpudata {u32 policy;u64 cppc_cap1_cached;bool suspended; +bool boost_state; };/**
Signature · 1 line
2.34.1
Mario Limonciello
maintainerRe: [PATCH v11 5/9] cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
Quoted 71 lines · 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 | 117 +++++++++++++++++++++++++++++++- drivers/cpufreq/amd-pstate.h | 1 + 3 files changed, 118 insertions(+), 2 deletions(-)drivers/cpufreq/amd-pstate-ut.c +1
-1@@ -227,7 +227,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 +4
-0@@ -104,6 +104,7 @@ 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); +static int amd_pstate_cpu_boost (int cpu,bool state);/* * AMD Energy Preference Performance (EPP) @@ -738,6 +739,7 @@ static int amd_pstate_boost_set(struct amd_cpudata *cpudata)if (amd_pstate_global_params.cpb_supported) { current_pstate_driver->boost_enabled = true;WRITE_ONCE (cpudata->boost_supported, true); +WRITE_ONCE (cpudata->boost_state, true); } amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported;@@ -745,6 +747,7 @@ static int amd_pstate_boost_set(struct amd_cpudata *cpudata) exit_err:WRITE_ONCE (cpudata->boost_supported, false); +WRITE_ONCE (cpudata->boost_state, false); current_pstate_driver->boost_enabled = false; amd_pstate_global_params.cpb_boost = false;return ret;@@ -1348,6 +1351,116 @@ 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)
drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev, · line 1364
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10
-0+{ +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 ; + }
This is dead code that can't possibly be hit, because there would be a NULL pointer dereference above for this line:
struct amd_cpudata *cpudata = policy->driver_data;
Furthermore, the caller for this function, amd_pstate_cpu_boost() has the same check already.
So drop the check here.
Quoted 139 lines
drivers/cpufreq/amd-pstate.c +102
-1+ + 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); +if (ret <0 ) +pr_debug ("Failed to update freq constraint: CPU%d\n" , cpudata->cpu); + } + +return ret <0 ? ret :0 ; +} + +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); +WRITE_ONCE (cpudata->boost_state, state); + policy->boost_enabled = state; + +err_exit: +cpufreq_cpu_put (policy); +return ret <0 ? ret :0 ; +} + +static ssize_t cpb_boost_show (struct device *dev, +struct device_attribute *attr,char *buf) +{ +return sysfs_emit (buf,"%u\n" , amd_pstate_global_params.cpb_boost); +} + +static ssize_t cpb_boost_store (struct device *dev,struct device_attribute *b, +const char *buf,size_t count) +{ +bool new_state; +ssize_t ret; +int cpu; + +if (!amd_pstate_global_params.cpb_supported) { +pr_err ("Boost mode is not supported by this processor or SBIOS\n" ); +return -EINVAL ; + } + + ret =kstrtobool (buf, &new_state); +if (ret) +return ret; + +mutex_lock (&amd_pstate_driver_lock); +for_each_present_cpu (cpu) { + ret =amd_pstate_cpu_boost (cpu, new_state); +if (ret <0 ) { +pr_warn ("failed to update cpu boost for CPU%d (%zd)\n" , cpu, ret); + 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);@@ -1358,6 +1471,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,@@ -1382,6 +1496,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 };@@ -1420,7 +1535,7 @@ static int amd_pstate_init_boost(struct cpufreq_policy *policy)if (ret)return ret; - policy->boost_enabled =READ_ONCE (cpudata->boost_supported); + policy->boost_enabled =READ_ONCE (cpudata->boost_state);return 0 ; }drivers/cpufreq/amd-pstate.h +1
-0@@ -99,6 +99,7 @@ struct amd_cpudata {u32 policy;u64 cppc_cap1_cached;bool suspended; +bool boost_state; };/**
Yuan, Perry
reviewerRE: [PATCH v11 5/9] cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
[AMD Official Use Only - AMD Internal Distribution Only]
Quoted 108 lines
-----Original Message-----
From: Limonciello, Mario <[email protected]>
Sent: Friday, June 14, 2024 1:55 AM
To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>
Cc: [email protected]; [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 v11 5/9] cpufreq: amd-pstate: implementcpb_boostsysfs entry for boost controlQuoted 16 lines · 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 | 117+++++++++++++++++++++++++++++++-
Quoted 17 lines
drivers/cpufreq/amd-pstate.h | 1 + 3 files changed, 118 insertions(+), 2 deletions(-)(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate-ut.cindexfc275d41d51e..b528f198f4c3100644drivers/cpufreq/amd-pstate-ut.c +1
-1@@ -227,7 +227,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_set(struct
Quoted 22 lines
(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate.cindex9f42524074a9..fe7c9d3562c5100644drivers/cpufreq/amd-pstate.c +1
-0@@ -104,6 +104,7 @@ 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); +static int amd_pstate_cpu_boost (int cpu,bool state);/* * AMD Energy Preference Performance (EPP) @@ -738,6 +739,7 @@ static int
amd_pstate_boost_set(struct amd_cpudata *cpudata)if (amd_pstate_global_params.cpb_supported) { current_pstate_driver->boost_enabled = true; WRITE_ONCE(cpudata->boost_supported, true); + WRITE_ONCE(cpudata->boost_state, true); } amd_pstate_global_params.cpb_boost =amd_pstate_global_params.cpb_supported;
drivers/cpufreq/amd-pstate.c +0
-0@@ -745,6 +747,7 @@ static int amd_pstate_boost_set(struct
amd_cpudatadrivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device
Quoted 9 lines
drivers/cpufreq/amd-pstate.c +1
-0*cpudata) exit_err:WRITE_ONCE (cpudata->boost_supported, false); +WRITE_ONCE (cpudata->boost_state, false); current_pstate_driver->boost_enabled = false; amd_pstate_global_params.cpb_boost = false;return ret;drivers/cpufreq/amd-pstate.c +0
-0@@ -1348,6 +1351,116 @@ static ssize_t prefcore_show(struct device*dev,
drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device · line 1351
Quoted 1 line
drivers/cpufreq/amd-pstate.c +0
-0return sysfs_emit(buf, "%s\n",
str_enabled_disabled(amd_pstate_prefcore));drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev, · line 1364
Quoted 13 lines
drivers/cpufreq/amd-pstate.c +11
-0} +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 ; + }This is dead code that can't possibly be hit, because there would be a NULL pointer dereference above for this line:
Quoted 6 lines
struct amd_cpudata *cpudata = policy->driver_data;Furthermore, the caller for this function,
amd_pstate_cpu_boost()has the same check already.So drop the check here.
Will improve the checking code in v12.
Thanks for the feedback.
Quoted 147 lines
Quoted 11 lines
drivers/cpufreq/amd-pstate.c +10
-0+ + 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 );drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10
-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);
Quoted 6 lines
drivers/cpufreq/amd-pstate.c +6
-0+return ret; + } + } + +if (on) + policy->cpuinfo.max_freq = max_freq;drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +9
-0+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); +if (ret <0 ) + pr_debug("Failed to update freq constraint:CPU%d\n",
cpudata->cpu);Quoted 19 lines
drivers/cpufreq/amd-pstate.c +19
-0+ } + +return ret <0 ? ret :0 ; +} + +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); +WRITE_ONCE (cpudata->boost_state, state);drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10
-0+ policy->boost_enabled = 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(%zd)\n", cpu, ret);
drivers/cpufreq/amd-pstate.c
Quoted 14 lines
drivers/cpufreq/amd-pstate.c +10
-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);@@ -1358,6 +1471,7 @@
cpufreq_freq_attr_rw(energy_performance_preference);drivers/cpufreq/amd-pstate.c static int amd_pstate_init_boost(struct
Quoted 16 lines
drivers/cpufreq/amd-pstate.c +2
-0cpufreq_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,@@ -1382,6 +1496,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 };@@ -1420,7 +1535,7 @@ static int amd_pstate_init_boost(struct
cpufreq_policy*policy)Quoted 10 lines
drivers/cpufreq/amd-pstate.c +1
-1if (ret)return ret; - policy->boost_enabled =READ_ONCE (cpudata->boost_supported); + policy->boost_enabled =READ_ONCE (cpudata->boost_state);return 0 ; }(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate.hindex0b75a6267fca..9eba854ab7d3100644
Quoted 10 lines
drivers/cpufreq/amd-pstate.h +1
-0@@ -99,6 +99,7 @@ struct amd_cpudata {u32 policy;u64 cppc_cap1_cached;bool suspended; +bool boost_state; };/**
Perry Yuan
reviewerPATCH v11 6/9 cpufreq: amd-pstate: Add set_boost callback for active mode
In reply to Perry YuanAdd support for the set_boost callback in the active mode driver to enable boost control via the cpufreq core. This ensures a consistent boost control interface across all pstate modes, including passive mode, guided mode, and active mode.
With this addition, all three pstate modes can support the same boost control interface with unique interface and global CPB control. Each CPU also supports individual boost control, allowing global CPB to change all cores' boost states simultaneously. Specific CPUs can update their boost states separately, ensuring all cores' boost states are synchronized.
--- drivers/cpufreq/amd-pstate.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)
drivers/cpufreq/amd-pstate.c +5 -13
@@ -701,20 +701,11 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)pr_err ("Boost mode is not supported by this processor or SBIOS\n" );return -ENOTSUPP ; } +mutex_lock (&amd_pstate_driver_lock); + ret =amd_pstate_cpu_boost (policy->cpu, state); +mutex_unlock (&amd_pstate_driver_lock); -if (state) - policy->cpuinfo.max_freq = cpudata->max_freq; -else - policy->cpuinfo.max_freq = cpudata->nominal_freq *1000 ; - - policy->max = policy->cpuinfo.max_freq; - - ret =freq_qos_update_request (&cpudata->req[1 ], - policy->cpuinfo.max_freq); -if (ret <0 ) -return ret; - -return 0 ; +return ret <0 ? ret :0 ; }static int amd_pstate_boost_set (struct amd_cpudata *cpudata)
@@ -1875,6 +1866,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = { .resume = amd_pstate_epp_resume, .update_limits = amd_pstate_update_limits, .init_boost = amd_pstate_init_boost, + .set_boost = amd_pstate_set_boost, .name = "amd-pstate-epp", .attr = amd_pstate_epp_attr, };
Signature · 1 line
2.34.1
Mario Limonciello
maintainerRe: [PATCH v11 6/9] cpufreq: amd-pstate: Add set_boost callback for active mode
Quoted 33 lines · Perry Yuan
Add support for the
set_boostcallback in the active mode driver to enable boost control via the cpufreq core. This ensures a consistent boost control interface across all pstate modes, including passive mode, guided mode, and active mode.With this addition, all three pstate modes can support the same boost control interface with unique interface and global CPB control. Each CPU also supports individual boost control, allowing global CPB to change all cores' boost states simultaneously. Specific CPUs can update their boost states separately, ensuring all cores' boost states are synchronized.
Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/amd-pstate.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)drivers/cpufreq/amd-pstate.c +3
-4@@ -701,20 +701,11 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)pr_err ("Boost mode is not supported by this processor or SBIOS\n" );return -ENOTSUPP ; } +mutex_lock (&amd_pstate_driver_lock); + ret =amd_pstate_cpu_boost (policy->cpu, state); +mutex_unlock (&amd_pstate_driver_lock); -if (state) - policy->cpuinfo.max_freq = cpudata->max_freq; -else - policy->cpuinfo.max_freq = cpudata->nominal_freq *1000 ;
drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state) · line 708
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +1
-9- - policy->max = policy->cpuinfo.max_freq; - - ret =freq_qos_update_request (&cpudata->req[1 ], - policy->cpuinfo.max_freq); -if (ret <0 ) -return ret; - -return 0 ; +return ret <0 ? ret :0 ;
What's wrong with just doing this instead:
return ret;
Quoted 11 lines
drivers/cpufreq/amd-pstate.c +1
-0}static int amd_pstate_boost_set (struct amd_cpudata *cpudata)@@ -1875,6 +1866,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = { .resume = amd_pstate_epp_resume, .update_limits = amd_pstate_update_limits, .init_boost = amd_pstate_init_boost, + .set_boost = amd_pstate_set_boost, .name = "amd-pstate-epp", .attr = amd_pstate_epp_attr, };
Yuan, Perry
reviewerRE: [PATCH v11 6/9] cpufreq: amd-pstate: Add set_boost callback for active mode
[AMD Official Use Only - AMD Internal Distribution Only]
Quoted 63 lines
-----Original Message-----
From: Limonciello, Mario <[email protected]>
Sent: Friday, June 14, 2024 1:53 AM
To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>
Cc: [email protected]; [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 v11 6/9] cpufreq: amd-pstate: Addset_boostcallback for active modeQuoted 12 lines · Perry Yuan
Add support for the
set_boostcallback in the active mode driver to enable boost control via the cpufreq core. This ensures a consistent boost control interface across all pstate modes, including passive mode, guided mode, and active mode.With this addition, all three pstate modes can support the same boost control interface with unique interface and global CPB control. Each CPU also supports individual boost control, allowing global CPB to change all cores' boost states simultaneously. Specific CPUs can update their boost states separately, ensuring all cores' boost states are synchronized.
Quoted 7 lines
Signed-off-by Perry Yuan <[email protected]>--- drivers/cpufreq/amd-pstate.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)(quoted diff) +0
-0
b/drivers/cpufreq/amd-pstate.cindexfe7c9d3562c5..d07f09dd7eab100644
drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct
Quoted 3 lines
drivers/cpufreq/amd-pstate.c +0
-0@@ -701,20 +701,11 @@ static int amd_pstate_set_boost(struct
cpufreq_policy*policy, int state)drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct · line 701
Quoted 1 line
drivers/cpufreq/amd-pstate.c +0
-0pr_err("Boost mode is not supported by this processor orSBIOS\n");
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +3
-4return -ENOTSUPP ; } +mutex_lock (&amd_pstate_driver_lock); + ret =amd_pstate_cpu_boost (policy->cpu, state); +mutex_unlock (&amd_pstate_driver_lock); -if (state) - policy->cpuinfo.max_freq = cpudata->max_freq; -else - policy->cpuinfo.max_freq = cpudata->nominal_freq *1000 ;drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state) · line 708
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +1
-9- - policy->max = policy->cpuinfo.max_freq; - - ret =freq_qos_update_request (&cpudata->req[1 ], - policy->cpuinfo.max_freq); -if (ret <0 ) -return ret; - -return 0 ; +return ret <0 ? ret :0 ;What's wrong with just doing this instead:
Quoted 1 line
return ret;
/**
* freq_qos_update_request - Modify existing frequency QoS request.
* @req: Request to modify.
* @new_value: New request value.
*
* Update an existing frequency QoS request along with the effective constraint
* value for the list of requests it belongs to.
*
* Return 1 if the effective constraint value has changed, 0 if the effective
* constraint value has not changed, or a negative error code on failures. */
int freq_qos_update_request(struct freq_qos_request *req, s32 new_value)
The effective return value from freq_qos_update_request will be "1", we expect the return value to be -1 or 0 in the code path,
0 is the successful return value passed to caller.
Perry.
Quoted 13 lines
drivers/cpufreq/amd-pstate.c static int amd_pstate_set_boost(struct
Quoted 5 lines
drivers/cpufreq/amd-pstate.c +0
-1} static int amd_pstate_boost_set(struct amd_cpudata *cpudata) @@ -1875,6 +1866,7 @@ static struct cpufreq_driver amd_pstate_epp_driver ={
Quoted 7 lines
.resume = amd_pstate_epp_resume, .update_limits = amd_pstate_update_limits, .init_boost = amd_pstate_init_boost, + .set_boost = amd_pstate_set_boost, .name = "amd-pstate-epp", .attr = amd_pstate_epp_attr,};
Perry Yuan
reviewerPATCH v11 7/9 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
@@ -526,6 +526,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,
@@ -545,6 +546,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 v11 8/9 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
Re: [PATCH v11 8/9] Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
Quoted 10 lines · Perry Yuan
From: 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.
Signed-off-by Perry Yuan <[email protected]>
Quoted 25 lines
--- 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`` ===============================================
Perry Yuan
reviewerPATCH v11 9/9 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
Re: [PATCH v11 9/9] Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
Quoted 5 lines · Perry Yuan
Updates the documentation in
amd-pstate.rstto 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 theboostsysfs attribute.Signed-off-by Perry Yuan <[email protected]>
Quoted 35 lines
--- 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`.
Mario Limonciello
maintainerThis is the cover letter, so if no other feedback no need to fix up. But if you need a v12 then typos below.
Quoted 3 lines · Perry Yuan
Hi all,
The patchset series implement CPB(core performance boost) feature for AMD pstate driver including passisve ,guide and active mode support.
passive
guided
Quoted 6 lines
User can change global core frequency boost control with a new sysfs entry:
"
/sys/devices/system/cpu/amd_pstate/cpb_boost"Now it also support to update indivial CPU boost state in sysfs boost file.
individual
Quoted 3 lines
"
/sys/devices/system/cpu/cpuX/cpufreq/boost"And global control will override the indivial CPU boost state by default.
individual
Quoted 224 lines
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 108arebasd to keep syncing to Mario kernel tree: bleeding-edge
https://git.kernel.org/pub/scm/linux/kernel/git/superm1/linux.gitTested result:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 3110.0000 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2732.3569 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 2312.2109 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2310.1011 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140sudo bash -c "echo 0 >
/sys/devices/system/cpu/cpu11/cpufreq/boost" sudo bash -c "echo 0 >/sys/devices/system/cpu/cpu10/cpufreq/boost" sudo bash -c "echo 0 >/sys/devices/system/cpu/cpu9/cpufreq/boost"CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1242.7240 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2754.5710 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2659.8159 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2308.9929 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140sudo bash -c "echo 0 >
/sys/devices/system/cpu/amd_pstate/cpb_boost"CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1233.8630 1 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2714.4851 3 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2732.3569 4 0 0 2 2:2:2:0 yes 2801.0000 400.0000 2564.2639 5 0 0 2 2:2:2:0 yes 2801.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 2801.0000 400.0000 2732.3569 7 0 0 3 3:3:3:0 yes 2801.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1233.8660 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.6630 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.5050sudo bash -c "echo 1 >
/sys/devices/system/cpu/amd_pstate/cpb_boost"CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1234.0200 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2278.8491 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2732.3569 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2353.0449 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140Perry.
Changes from v10:
* rework the boost interface with cpufreq core boost control, align the sysfs file created fromcpufreq.cand allow indivial CPU boost control (Mario)
* fix thepr_warncode format with %zd (Oleksandr Natalenko)
* replace sscanf with kstrtobool forcpufreq.c(new)
* drop the boost sysfs file creation from amd pstate patch #6
* addinit_boostforcpufreq.cto unify the boost file creation(Mario)
* addset_boostcallback for EPP driver mode
* fix syncronization issue for indivial boost control and global CPB control, now the two control way will keep syncronization after anyone CPU boost state changed.
* rebased to Mario kernel tree: bleeding-edge
* run testing on local system, no regression issue found so far.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]/
v10: https://lore.kernel.org/lkml/[email protected]/Perry Yuan (9):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: simplify boolean parsing with kstrtobool in store function
cpufreq: introduceinit_boostcallback to initialize boost state for
pstate drivers
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs entry for boost control
cpufreq: amd-pstate: Addset_boostcallback for active mode
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
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
control methodDocumentation/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 | 197 +++++++++++++++++--- drivers/cpufreq/amd-pstate.h | 14 ++ drivers/cpufreq/cpufreq.c | 23 ++- include/linux/cpufreq.h | 2 + 8 files changed, 237 insertions(+), 35 deletions(-)
Yuan, Perry
reviewer[AMD Official Use Only - AMD Internal Distribution Only]
Quoted 12 lines
-----Original Message-----
From: Limonciello, Mario <[email protected]>
Sent: Friday, June 14, 2024 1:54 AM
To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>
Cc: [email protected]; [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 v11 0/9] AMD Pstate Driver Core Performance Boost
Quoted 2 lines
This is the cover letter, so if no other feedback no need to fix up. But if you need a v12 then typos below.
Thank you Mario, will get this done in v12.
Quoted 274 lines · Perry Yuan
Quoted 3 lines
Hi all,
The patchset series implement CPB(core performance boost) feature for AMD pstate driver including passisve ,guide and active mode support.passive
guidedQuoted 2 lines
User can change global core frequency boost control with a new sysfs
entry:
Quoted 4 lines
"
/sys/devices/system/cpu/amd_pstate/cpb_boost"Now it also support to update indivial CPU boost state in sysfs boost file.
individual
Quoted 3 lines
"
/sys/devices/system/cpu/cpuX/cpufreq/boost"And global control will override the indivial CPU boost state by default.
individual
Quoted 5 lines
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 MINMHZMHZ
Quoted 6 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.578Quoted 11 lines
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===============================================================
=======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 MAXMHZ MINMHZMHZ
Quoted 10 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" # after CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZMHZ
Quoted 7 lines
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 108aQuoted 6 lines
rebasd to keep syncing to Mario kernel tree: bleeding-edge
https://git.kernel.org/pub/scm/linux/kernel/git/superm1/linux.gitTested result:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
MHZ
Quoted 13 lines
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 3110.0000 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2732.3569 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 2312.2109 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2310.1011 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140Quoted 5 lines
sudo bash -c "echo 0 >
/sys/devices/system/cpu/cpu11/cpufreq/boost" sudo bash -c "echo 0 >/sys/devices/system/cpu/cpu10/cpufreq/boost" sudo bash -c "echo 0 >/sys/devices/system/cpu/cpu9/cpufreq/boost"CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
MHZ
Quoted 13 lines
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1242.7240 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2754.5710 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2659.8159 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2308.9929 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140Quoted 3 lines
sudo bash -c "echo 0 >
/sys/devices/system/cpu/amd_pstate/cpb_boost"CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
MHZ
Quoted 13 lines
0 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1233.8630 1 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2714.4851 3 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2732.3569 4 0 0 2 2:2:2:0 yes 2801.0000 400.0000 2564.2639 5 0 0 2 2:2:2:0 yes 2801.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 2801.0000 400.0000 2732.3569 7 0 0 3 3:3:3:0 yes 2801.0000 400.0000 1110.7140 8 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1233.8660 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.6630 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.5050Quoted 3 lines
sudo bash -c "echo 1 >
/sys/devices/system/cpu/amd_pstate/cpb_boost"CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
MHZ
Quoted 14 lines
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1234.0200 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2278.8491 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2732.3569 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2353.0449 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140Quoted 4 lines
Perry.
Changes from v10:
* rework the boost interface with cpufreq core boost control, align thesysfs file
Quoted 7 lines
created from
cpufreq.cand allow indivial CPU boost control (Mario)
* fix thepr_warncode format with %zd (Oleksandr Natalenko)
* replace sscanf with kstrtobool forcpufreq.c(new)
* drop the boost sysfs file creation from amd pstate patch #6
* addinit_boostforcpufreq.cto unify the boost file creation(Mario)
* addset_boostcallback for EPP driver mode
* fix syncronization issue for indivial boost control and global CPB control,now the
Quoted 1 line
two control way will keep syncronization after anyone CPU boost state
changed.
Quoted 33 lines
* rebased to Mario kernel tree: bleeding-edge
* run testing on local system, no regression issue found so far.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.Quoted 6 lines
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 AndEnhancements
Quoted 71 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 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]/
v10:
https://lore.kernel.org/lkml/[email protected]/Perry Yuan (9):
cpufreq: acpi: moveMSR_K7_HWCR_CPB_DIS_BITintomsr-index.h
cpufreq: simplify boolean parsing with kstrtobool in store function
cpufreq: introduceinit_boostcallback to initialize boost state for
pstate drivers
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implementcpb_boostsysfs entry for boost control
cpufreq: amd-pstate: Addset_boostcallback for active mode
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
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
control methodDocumentation/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 | 197 +++++++++++++++++--- drivers/cpufreq/amd-pstate.h | 14 ++ drivers/cpufreq/cpufreq.c | 23 ++- include/linux/cpufreq.h | 2 + 8 files changed, 237 insertions(+), 35 deletions(-)