Skip to contentSkip to conversation

AMD Pstate Driver Core Performance Boost

PATCH Superseded Perry Yuan 2 participants 24 messages Jun 13, 2024 – Jun 19, 2024

Subsystems (4)

v11 of 13 Superseded Latest is v13 →

lore
Share & tools
lore

Perry Yuan

author reviewer
#0 lore raw

v11 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
108a

rebasd 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
author reviewer
#1 lore raw

PATCH 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
index e022e6eb766c..384739d592af 100644
@@ -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
index 37f1cdf46d29..2fc82831bddd 100644
@@ -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
author reviewer
#2 lore raw

PATCH v11 2/9 cpufreq: simplify boolean parsing with kstrtobool in store function

In reply to 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.

---
 drivers/cpufreq/cpufreq.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/cpufreq/cpufreq.c +5 -6
index a45aac17c20f..1fdabb660231 100644
@@ -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
maintainer Reviewed-by on v11 2/9
#3 lore raw

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.

Quoted 35 lines
---
  drivers/cpufreq/cpufreq.c | 11 +++++------
  1 file changed, 5 insertions(+), 6 deletions(-)
drivers/cpufreq/cpufreq.c +5 -6
index a45aac17c20f..1fdabb660231 100644
@@ -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)
author reviewer
#4 lore raw

PATCH v11 3/9 cpufreq: introduce init_boost callback to initialize boost state for pstate drivers

In reply to Perry Yuan

Introduce 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
index 1fdabb660231..e1a4730f4f8c 100644
@@ -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
index 20f7e98ee8af..0698c0292d8f 100644
@@ -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
#5 lore raw

Re: [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_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 +0 -0
index 1fdabb660231..e1a4730f4f8c 100644
@@ -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
index 20f7e98ee8af..0698c0292d8f 100644
@@ -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.
author reviewer
#6 lore raw

RE: [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: introduce init_boost callback to initialize boost state for pstate drivers

Quoted 19 lines · Perry Yuan

Introduce 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 +0 -0
index 1fdabb660231..e1a4730f4f8c 100644

drivers/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_driver boost 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..0698c0292d8f 100644

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.
author reviewer
#7 lore raw

RE: [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: introduce init_boost callback 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, Borislav

<[email protected]>

Quoted 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: introduce init_boost callback to initialize boost state for pstate drivers

Quoted 19 lines · Perry Yuan

Introduce 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 +0 -0
index 1fdabb660231..e1a4730f4f8c 100644

drivers/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 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 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_driver boost 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..0698c0292d8f 100644

include/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.

author reviewer
#8 lore raw

PATCH v11 4/9 cpufreq: amd-pstate: initialize new core precision boost state

In reply to Perry Yuan

From: 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
index fda8f86c90e0..9f42524074a9 100644
@@ -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
index e6a28e7f4dbf..0b75a6267fca 100644
@@ -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
#9 lore raw

Re: [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_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 +32 -10
index fda8f86c90e0..9f42524074a9 100644
@@ -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
index e6a28e7f4dbf..0b75a6267fca 100644
@@ -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 */
author reviewer
#10 lore raw

RE: [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 state

Quoted 17 lines · Perry Yuan

From: 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

Quoted 6 lines
---
  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.c index fda8f86c90e0..9f42524074a9 100644

drivers/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 or

SBIOS\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 -1
    return 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 the

processor\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 -0
    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);

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 of amd_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.h index e6a28e7f4dbf..0b75a6267fca 100644

drivers/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 */
author reviewer
#11 lore raw

PATCH v11 5/9 cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control

In reply to Perry Yuan

From: 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
index fc275d41d51e..b528f198f4c3 100644
@@ -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
index 0b75a6267fca..9eba854ab7d3 100644
@@ -99,6 +99,7 @@ struct amd_cpudata {
 	u32	policy;
 	u64	cppc_cap1_cached;
 	bool	suspended;
+	bool	boost_state;
 };
 
 /**
Signature · 1 line
2.34.1
#12 lore raw

Re: [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 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
index fc275d41d51e..b528f198f4c3 100644
@@ -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
index 9f42524074a9..fe7c9d3562c5 100644
@@ -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
index 0b75a6267fca..9eba854ab7d3 100644
@@ -99,6 +99,7 @@ struct amd_cpudata {
  	u32	policy;
  	u64	cppc_cap1_cached;
  	bool	suspended;
+	bool	boost_state;
  };
 
  /**
author reviewer
#13 lore raw

RE: [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: implement cpb_boost sysfs entry for boost control

Quoted 16 lines · Perry Yuan

From: 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"

Quoted 6 lines
---
  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.c index fc275d41d51e..b528f198f4c3 100644

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))
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.c index 9f42524074a9..fe7c9d3562c5 100644

drivers/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_cpudata

drivers/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 -0
    return 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 or

SBIOS\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 -0
  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)

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +1 -1
    if (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.h index 0b75a6267fca..9eba854ab7d3

100644

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;
  };
 
  /**
author reviewer
#14 lore raw

PATCH v11 6/9 cpufreq: amd-pstate: Add set_boost callback for active mode

In reply to Perry Yuan

Add 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
index fe7c9d3562c5..d07f09dd7eab 100644
@@ -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
#15 lore raw

Re: [PATCH v11 6/9] cpufreq: amd-pstate: Add set_boost callback for active mode

Quoted 33 lines · Perry Yuan

Add 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 +3 -4
index fe7c9d3562c5..d07f09dd7eab 100644
@@ -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,
  };
author reviewer
#16 lore raw

RE: [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: Add set_boost callback for active mode

Quoted 12 lines · Perry Yuan

Add 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.

Quoted 7 lines
---
  drivers/cpufreq/amd-pstate.c | 18 +++++-------------
  1 file changed, 5 insertions(+), 13 deletions(-)
(quoted diff) +0 -0

b/drivers/cpufreq/amd-pstate.c index fe7c9d3562c5..d07f09dd7eab

100644

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 -0
            pr_err("Boost mode is not supported by this processor or

SBIOS\n");

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +3 -4
            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:

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,

};

author reviewer
#17 lore raw

PATCH v11 7/9 cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off

In reply to Perry Yuan

From: 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
index d07f09dd7eab..03e4cf177a5b 100644
@@ -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
author reviewer
#18 lore raw

PATCH v11 8/9 Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method

In reply to 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.

---
 Documentation/admin-guide/pm/amd-pstate.rst | 10 ++++++++++
 1 file changed, 10 insertions(+)
Documentation/admin-guide/pm/amd-pstate.rst +10 -0
index 1e0d101b020a..bcc0d9404c18 100644
@@ -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
maintainer Reviewed-by on v11 8/9
#19 lore raw

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.

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
index 1e0d101b020a..bcc0d9404c18 100644
@@ -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``
  ===============================================
 
author reviewer
#20 lore raw

PATCH v11 9/9 Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method

In reply to Perry Yuan

Updates 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
index bcc0d9404c18..98e43c53c387 100644
@@ -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
maintainer Reviewed-by on v11 9/9
#21 lore raw

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.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.

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
index bcc0d9404c18..98e43c53c387 100644
@@ -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`.
 
#22 lore raw
In reply to Perry Yuan

This 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.578

2) globally enable core boost:

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

============================================================================
The V9 patches add per CPU boost control, user can enable/disable CPUs boost as the below command tested on a laptop system.

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

rebasd 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(-)
author reviewer
#23 lore raw

[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
guided

Quoted 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   MINMHZ

MHZ

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.578
Quoted 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   MINMHZ

MHZ

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   MINMHZ

MHZ

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
108a
Quoted 6 lines

rebasd 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

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.7140
Quoted 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.7140
Quoted 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.5050
Quoted 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.7140
Quoted 4 lines

Perry.

Changes from v10:
* rework the boost interface with cpufreq core boost control, align the

sysfs file

Quoted 7 lines

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

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 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.

Quoted 6 lines

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

Quoted 71 lines

* 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(-)