Skip to contentSkip to conversation

AMD Pstate Driver Core Performance Boost

PATCH Superseded Perry Yuan 4 participants 23 messages May 8, 2024 – May 9, 2024

Subsystems (4)

v10 of 13 Superseded Latest is v13 →

lore
Share & tools
lore

Perry Yuan

author reviewer
#0 lore raw

v10 cover AMD Pstate Driver Core Performance Boost

Hi all,
The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

1) globally disable core boost:

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

2) globally enable core boost:

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

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

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

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

Perry.

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

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

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

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

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

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

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

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

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

v1: https://lore.kernel.org/all/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/

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

 Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
 arch/x86/include/asm/msr-index.h            |   2 +
 drivers/cpufreq/acpi-cpufreq.c              |   2 -
 drivers/cpufreq/amd-pstate-ut.c             |   2 +-
 drivers/cpufreq/amd-pstate.c                | 189 ++++++++++++++++++--
 include/linux/amd-pstate.h                  |  14 ++
 6 files changed, 225 insertions(+), 14 deletions(-)
Signature · 1 line
2.34.1
author reviewer
#1 lore raw

PATCH v10 1/7 cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h

There are some other drivers also need to use the MSR_K7_HWCR_CPB_DIS_BIT for CPB control bit, so it makes sense to move the definition to a common header file to allow other driver to use it.

No intentional functional impact.

---
 arch/x86/include/asm/msr-index.h | 2 ++
 drivers/cpufreq/acpi-cpufreq.c   | 2 --
 2 files changed, 2 insertions(+), 2 deletions(-)
arch/x86/include/asm/msr-index.h +2 -0
index e72c2b872957..8738a7b3917d 100644
@@ -782,6 +782,8 @@
 #define MSR_K7_HWCR_IRPERF_EN		BIT_ULL(MSR_K7_HWCR_IRPERF_EN_BIT)
 #define MSR_K7_FID_VID_CTL		0xc0010041
 #define MSR_K7_FID_VID_STATUS		0xc0010042
+#define MSR_K7_HWCR_CPB_DIS_BIT		25
+#define MSR_K7_HWCR_CPB_DIS		BIT_ULL(MSR_K7_HWCR_CPB_DIS_BIT)
 
 /* K6 MSRs */
 #define MSR_K6_WHCR			0xc0000082
drivers/cpufreq/acpi-cpufreq.c +0 -2
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 v10 2/7 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 | 45 +++++++++++++++++++++++++++---------
 include/linux/amd-pstate.h   | 13 +++++++++++
 2 files changed, 47 insertions(+), 11 deletions(-)
drivers/cpufreq/amd-pstate.c +34 -11
index 2db095867d03..f7dab0f7b452 100644
@@ -68,6 +68,8 @@ static int cppc_state = AMD_PSTATE_UNDEFINED;
 static bool cppc_enabled;
 static bool amd_pstate_prefcore = true;
 static struct quirk_entry *quirks;
+struct amd_pstate_global_params amd_pstate_global_params;
+EXPORT_SYMBOL_GPL(amd_pstate_global_params);
 
 /*
  * AMD Energy Preference Performance (EPP)
@@ -647,7 +649,7 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
 
 	if (!cpudata->boost_supported) {
 		pr_err("Boost mode is not supported by this processor or SBIOS\n");
-		return -EINVAL;
+		return -ENOTSUPP;
 	}
 
 	if (state)
@@ -665,18 +667,31 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
 	return 0;
 }
 
-static void amd_pstate_boost_init(struct amd_cpudata *cpudata)
+static int amd_pstate_boost_init(struct amd_cpudata *cpudata)
 {
-	u32 highest_perf, nominal_perf;
+	u64 boost_val;
+	int ret;
 
-	highest_perf = READ_ONCE(cpudata->highest_perf);
-	nominal_perf = READ_ONCE(cpudata->nominal_perf);
+	if (!cpu_feature_enabled(X86_FEATURE_CPB)) {
+		cpudata->boost_supported = false;
+		current_pstate_driver->boost_enabled = false;
+		pr_debug_once("Boost CPB capabilities not present in the processor\n");
+		return -ENOTSUPP;
+	}
 
-	if (highest_perf <= nominal_perf)
-		return;
+	ret = rdmsrl_on_cpu(cpudata->cpu, MSR_K7_HWCR, &boost_val);
+	if (ret) {
+		pr_err_once("failed to read initial CPU boost state!\n");
+		return ret;
+	}
 
-	cpudata->boost_supported = true;
-	current_pstate_driver->boost_enabled = true;
+	amd_pstate_global_params.cpb_supported = !(boost_val & MSR_K7_HWCR_CPB_DIS);
+	if (amd_pstate_global_params.cpb_supported)
+		current_pstate_driver->boost_enabled = true;
+
+	amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported;
+
+	return ret;
 }
 
 static void amd_perf_ctl_reset(unsigned int cpu)
@@ -899,6 +914,11 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
 
 	amd_pstate_init_prefcore(cpudata);
 
+	/* initialize cpu cores boot state */
+	ret = amd_pstate_boost_init(cpudata);
+	if (ret)
+		goto free_cpudata1;
+
 	ret = amd_pstate_init_perf(cpudata);
 	if (ret)
 		goto free_cpudata1;
@@ -954,7 +974,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
 
 	policy->driver_data = cpudata;
 
-	amd_pstate_boost_init(cpudata);
 	if (!current_pstate_driver->adjust_perf)
 		current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
 
@@ -1361,6 +1380,11 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
 
 	amd_pstate_init_prefcore(cpudata);
 
+	/* initialize cpu cores boot state */
+	ret = amd_pstate_boost_init(cpudata);
+	if (ret)
+		goto free_cpudata1;
+
 	ret = amd_pstate_init_perf(cpudata);
 	if (ret)
 		goto free_cpudata1;
@@ -1414,7 +1438,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
 			return ret;
 		WRITE_ONCE(cpudata->cppc_cap1_cached, value);
 	}
-	amd_pstate_boost_init(cpudata);
 
 	return 0;
 
include/linux/amd-pstate.h +13 -0
index d58fc022ec46..8ba5dd4d3405 100644
@@ -134,4 +134,17 @@ struct quirk_entry {
 	u32 lowest_freq;
 };
 
+/**
+ * struct amd_pstate_global_params - Global parameters, mostly tunable via sysfs.
+ * @cpb_boost:		Whether or not to use boost CPU P-states.
+ * @cpb_supported:	Whether or not CPU boost P-states are available
+ *			based on the MSR_K7_HWCR bit[25] state
+ */
+struct amd_pstate_global_params {
+	bool cpb_boost;
+	bool cpb_supported;
+};
+
+extern struct amd_pstate_global_params amd_pstate_global_params;
+
 #endif /* _LINUX_AMD_PSTATE_H */
Signature · 1 line
2.34.1
author reviewer
#3 lore raw

PATCH v10 3/7 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    | 114 +++++++++++++++++++++++++++++++-
 include/linux/amd-pstate.h      |   1 +
 3 files changed, 115 insertions(+), 2 deletions(-)
drivers/cpufreq/amd-pstate-ut.c +1 -1
index f04ae67dda37..b3601b0e6dd3 100644
@@ -226,7 +226,7 @@ static void amd_pstate_ut_check_freq(u32 index)
 			goto skip_test;
 		}
 
-		if (cpudata->boost_supported) {
+		if (amd_pstate_global_params.cpb_boost) {
 			if ((policy->max == cpudata->max_freq) ||
 					(policy->max == cpudata->nominal_freq))
 				amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
drivers/cpufreq/amd-pstate.c +113 -1

139 lines not on this page · raw message

include/linux/amd-pstate.h +1 -0
index 8ba5dd4d3405..56f616a5cd0f 100644
@@ -106,6 +106,7 @@ struct amd_cpudata {
 	u32	policy;
 	u64	cppc_cap1_cached;
 	bool	suspended;
+	bool	boost_state;
 };
 
 /*
Signature · 1 line
2.34.1
#4 lore raw

Re: [PATCH v10 3/7] cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control

Hello.

Quoted 146 lines · SELČ Perry Yuan

From: Perry Yuan <[email protected]>

With this new sysfs entry cpb_boostcreated, user can change CPU boost state dynamically under active, guided and passive modes. And the highest perf and frequency will also be updated as the boost state changing.

0): check current boost state
cat /sys/devices/system/cpu/amd_pstate/cpb_boost

1): disable CPU boost
sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"

2): enable CPU boost
sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"

---
 drivers/cpufreq/amd-pstate-ut.c |   2 +-
 drivers/cpufreq/amd-pstate.c    | 114 +++++++++++++++++++++++++++++++-
 include/linux/amd-pstate.h      |   1 +
 3 files changed, 115 insertions(+), 2 deletions(-)
drivers/cpufreq/amd-pstate-ut.c +1 -1
index f04ae67dda37..b3601b0e6dd3 100644
@@ -226,7 +226,7 @@ static void amd_pstate_ut_check_freq(u32 index)
 			goto skip_test;
 		}
 
-		if (cpudata->boost_supported) {
+		if (amd_pstate_global_params.cpb_boost) {
 			if ((policy->max == cpudata->max_freq) ||
 					(policy->max == cpudata->nominal_freq))
 				amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
drivers/cpufreq/amd-pstate.c +91 -1
index f7dab0f7b452..f81fd61dd2a9 100644
@@ -686,8 +686,10 @@ static int amd_pstate_boost_init(struct amd_cpudata *cpudata)
 	}
 
 	amd_pstate_global_params.cpb_supported = !(boost_val & MSR_K7_HWCR_CPB_DIS);
-	if (amd_pstate_global_params.cpb_supported)
+	if (amd_pstate_global_params.cpb_supported) {
 		current_pstate_driver->boost_enabled = true;
+		cpudata->boost_state = true;
+	}
 
 	amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported;
 
@@ -1293,6 +1295,114 @@ static ssize_t prefcore_show(struct device *dev,
 	return sysfs_emit(buf, "%s\n", str_enabled_disabled(amd_pstate_prefcore));
 }
 
+static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
+{
+	struct amd_cpudata *cpudata = policy->driver_data;
+	struct cppc_perf_ctrls perf_ctrls;
+	u32 highest_perf, nominal_perf, nominal_freq, max_freq;
+	int ret;
+
+	if (!policy) {
+		pr_err("policy is null\n");
+		return -ENODATA;
+	}
+
+	highest_perf = READ_ONCE(cpudata->highest_perf);
+	nominal_perf = READ_ONCE(cpudata->nominal_perf);
+	nominal_freq = READ_ONCE(cpudata->nominal_freq);
+	max_freq = READ_ONCE(cpudata->max_freq);
+
+	if (boot_cpu_has(X86_FEATURE_CPPC)) {
+		u64 value = READ_ONCE(cpudata->cppc_req_cached);
+
+		value &= ~GENMASK_ULL(7, 0);
+		value |= on ? highest_perf : nominal_perf;
+		WRITE_ONCE(cpudata->cppc_req_cached, value);
+
+		wrmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ, value);
+	} else {
+		perf_ctrls.max_perf = on ? highest_perf : nominal_perf;
+		ret = cppc_set_epp_perf(cpudata->cpu, &perf_ctrls, 1);
+		if (ret) {
+			cpufreq_cpu_release(policy);
+			pr_debug("failed to set energy perf value (%d)\n", ret);
+			return ret;
+		}
+	}
+
+	if (on)
+		policy->cpuinfo.max_freq = max_freq;
+	else
+		policy->cpuinfo.max_freq = nominal_freq * 1000;
+
+	policy->max = policy->cpuinfo.max_freq;
+
+	if (cppc_state == AMD_PSTATE_PASSIVE) {
+		ret = freq_qos_update_request(&cpudata->req[1],
+				      policy->cpuinfo.max_freq);
+	}
+
+	return ret;
+}
+
+static int amd_pstate_cpu_boost(int cpu, bool state)
+{
+	int ret;
+	struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
+	struct amd_cpudata *cpudata = policy->driver_data;
+
+	if (!policy) {
+		pr_err("policy is NULL\n");
+		ret = -ENODATA;
+		goto err_exit;
+	}
+
+	ret = amd_pstate_cpu_boost_update(policy, state);
+	refresh_frequency_limits(policy);
+	cpudata->boost_state = !!state;
+
+err_exit:
+	cpufreq_cpu_put(policy);
+	return ret < 0 ? ret : 0;
+}
+
+static ssize_t cpb_boost_show(struct device *dev,
+			   struct device_attribute *attr, char *buf)
+{
+	return sysfs_emit(buf, "%u\n", amd_pstate_global_params.cpb_boost);
+}
+
+static ssize_t cpb_boost_store(struct device *dev, struct device_attribute *b,
+			    const char *buf, size_t count)
+{
+	bool new_state;
+	ssize_t ret;
+	int cpu;
+
+	if (!amd_pstate_global_params.cpb_supported) {
+		pr_err("Boost mode is not supported by this processor or SBIOS\n");
+		return -EINVAL;
+	}

drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev, · line 1395

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10 -0
+
+	ret = kstrtobool(buf, &new_state);
+	if (ret)
+		return ret;
+
+	mutex_lock(&amd_pstate_driver_lock);
+	for_each_present_cpu(cpu) {
+		ret = amd_pstate_cpu_boost(cpu, new_state);
+		if (ret < 0) {
+			pr_warn("failed to update cpu boost for CPU%d (%d)\n", cpu, ret);

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

Quoted 42 lines
drivers/cpufreq/amd-pstate.c +12 -0
+			goto err_exit;
+		}
+	}
+	amd_pstate_global_params.cpb_boost = !!new_state;
+
+err_exit:
+	mutex_unlock(&amd_pstate_driver_lock);
+	return ret < 0 ? ret : count;
+}
+
 cpufreq_freq_attr_ro(amd_pstate_max_freq);
 cpufreq_freq_attr_ro(amd_pstate_lowest_nonlinear_freq);
 
@@ -1303,6 +1413,7 @@ cpufreq_freq_attr_rw(energy_performance_preference);
 cpufreq_freq_attr_ro(energy_performance_available_preferences);
 static DEVICE_ATTR_RW(status);
 static DEVICE_ATTR_RO(prefcore);
+static DEVICE_ATTR_RW(cpb_boost);
 
 static struct freq_attr *amd_pstate_attr[] = {
 	&amd_pstate_max_freq,
@@ -1327,6 +1438,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
 static struct attribute *pstate_global_attributes[] = {
 	&dev_attr_status.attr,
 	&dev_attr_prefcore.attr,
+	&dev_attr_cpb_boost.attr,
 	NULL
 };
 
include/linux/amd-pstate.h +1 -0
index 8ba5dd4d3405..56f616a5cd0f 100644
@@ -106,6 +106,7 @@ struct amd_cpudata {
 	u32	policy;
 	u64	cppc_cap1_cached;
 	bool	suspended;
+	bool	boost_state;
 };
 
 /*
Signature · 1 line
Oleksandr Natalenko (post-factum)
author reviewer
#5 lore raw

RE: [PATCH v10 3/7] cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control

[AMD Official Use Only - General]

Hi Oleksandr

Quoted 187 lines

-----Original Message-----
From: Oleksandr Natalenko <[email protected]>
Sent: Wednesday, May 8, 2024 5:39 PM
To: [email protected]; Limonciello, Mario <[email protected]>; [email protected]; Huang, Ray <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>; Yuan, Perry <[email protected]>
Cc: Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>; Meng, Li (Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v10 3/7] cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control

Hello.

Quoted 16 lines · SELČ Perry Yuan

From: Perry Yuan <[email protected]>

With this new sysfs entry cpb_boostcreated, user can change CPU boost state dynamically 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    | 114

+++++++++++++++++++++++++++++++-

Quoted 17 lines
 include/linux/amd-pstate.h      |   1 +
 3 files changed, 115 insertions(+), 2 deletions(-)
(quoted diff) +0 -0

b/drivers/cpufreq/amd-pstate-ut.c index f04ae67dda37..b3601b0e6dd3 100644

drivers/cpufreq/amd-pstate-ut.c +1 -1
@@ -226,7 +226,7 @@ static void amd_pstate_ut_check_freq(u32 index)
                    goto skip_test;
            }
 
-           if (cpudata->boost_supported) {
+           if (amd_pstate_global_params.cpb_boost) {
                    if ((policy->max == cpudata->max_freq) ||
                                    (policy->max == cpudata-
 nominal_freq))
Quoted 1 line

amd_pstate_ut_cases[index].result =

AMD_PSTATE_UT_RESULT_PASS;

drivers/cpufreq/amd-pstate.c static int amd_pstate_boost_init(struct

Quoted 5 lines
(quoted diff) +0 -0

b/drivers/cpufreq/amd-pstate.c index f7dab0f7b452..f81fd61dd2a9 100644

drivers/cpufreq/amd-pstate.c +0 -0
@@ -686,8 +686,10 @@ static int amd_pstate_boost_init(struct

amd_cpudata *cpudata)

drivers/cpufreq/amd-pstate.c static int amd_pstate_boost_init(struct · line 688

Quoted 3 lines
drivers/cpufreq/amd-pstate.c +0 -0
    }
 
    amd_pstate_global_params.cpb_supported = !(boost_val &

MSR_K7_HWCR_CPB_DIS);

drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +3 -1
-   if (amd_pstate_global_params.cpb_supported)
+   if (amd_pstate_global_params.cpb_supported) {
            current_pstate_driver->boost_enabled = true;
+           cpudata->boost_state = true;
+   }
 
    amd_pstate_global_params.cpb_boost =
 amd_pstate_global_params.cpb_supported;
@@ -1293,6 +1295,114 @@ static ssize_t prefcore_show(struct device

*dev,

Quoted 19 lines
drivers/cpufreq/amd-pstate.c +15 -0
    return sysfs_emit(buf, "%s\n",
 str_enabled_disabled(amd_pstate_prefcore));
 }
 
+static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy,
+bool on) {
+   struct amd_cpudata *cpudata = policy->driver_data;
+   struct cppc_perf_ctrls perf_ctrls;
+   u32 highest_perf, nominal_perf, nominal_freq, max_freq;
+   int ret;
+
+   if (!policy) {
+           pr_err("policy is null\n");
+           return -ENODATA;
+   }
+
+   highest_perf = READ_ONCE(cpudata->highest_perf);
+   nominal_perf = READ_ONCE(cpudata->nominal_perf);
+   nominal_freq = READ_ONCE(cpudata->nominal_freq);

drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10 -0
+   max_freq = READ_ONCE(cpudata->max_freq);
+
+   if (boot_cpu_has(X86_FEATURE_CPPC)) {
+           u64 value = READ_ONCE(cpudata->cppc_req_cached);
+
+           value &= ~GENMASK_ULL(7, 0);
+           value |= on ? highest_perf : nominal_perf;
+           WRITE_ONCE(cpudata->cppc_req_cached, value);
+
+           wrmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ,

value);

drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,

Quoted 6 lines
drivers/cpufreq/amd-pstate.c +6 -0
+   } else {
+           perf_ctrls.max_perf = on ? highest_perf : nominal_perf;
+           ret = cppc_set_epp_perf(cpudata->cpu, &perf_ctrls, 1);
+           if (ret) {
+                   cpufreq_cpu_release(policy);
+                   pr_debug("failed to set energy perf value (%d)\n",

ret);

Quoted 32 lines
drivers/cpufreq/amd-pstate.c +32 -0
+                   return ret;
+           }
+   }
+
+   if (on)
+           policy->cpuinfo.max_freq = max_freq;
+   else
+           policy->cpuinfo.max_freq = nominal_freq * 1000;
+
+   policy->max = policy->cpuinfo.max_freq;
+
+   if (cppc_state == AMD_PSTATE_PASSIVE) {
+           ret = freq_qos_update_request(&cpudata->req[1],
+                                 policy->cpuinfo.max_freq);
+   }
+
+   return ret;
+}
+
+static int amd_pstate_cpu_boost(int cpu, bool state) {
+   int ret;
+   struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
+   struct amd_cpudata *cpudata = policy->driver_data;
+
+   if (!policy) {
+           pr_err("policy is NULL\n");
+           ret = -ENODATA;
+           goto err_exit;
+   }
+
+   ret = amd_pstate_cpu_boost_update(policy, state);
+   refresh_frequency_limits(policy);

drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10 -0
+   cpudata->boost_state = !!state;
+
+err_exit:
+   cpufreq_cpu_put(policy);
+   return ret < 0 ? ret : 0;
+}
+
+static ssize_t cpb_boost_show(struct device *dev,
+                      struct device_attribute *attr, char *buf) {
+   return sysfs_emit(buf, "%u\n",

amd_pstate_global_params.cpb_boost);

drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,

Quoted 3 lines
drivers/cpufreq/amd-pstate.c +3 -0
+}
+
+static ssize_t cpb_boost_store(struct device *dev, struct device_attribute

*b,

drivers/cpufreq/amd-pstate.c static ssize_t prefcore_show(struct device *dev,

Quoted 7 lines
drivers/cpufreq/amd-pstate.c +7 -0
+                       const char *buf, size_t count) {
+   bool new_state;
+   ssize_t ret;
+   int cpu;
+
+   if (!amd_pstate_global_params.cpb_supported) {
+           pr_err("Boost mode is not supported by this processor 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

(%d)\n", cpu, ret);

Quoted 1 line

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

Yes, it should be %ld, looks like the ret is less than zero, it is not needed to print out looks like. Will remove it in v11 otherwise it will cause build warning.

Thanks for the review!

Perry.

Quoted 48 lines
Quoted 37 lines
drivers/cpufreq/amd-pstate.c +11 -0
+                   goto err_exit;
+           }
+   }
+   amd_pstate_global_params.cpb_boost = !!new_state;
+
+err_exit:
+   mutex_unlock(&amd_pstate_driver_lock);
+   return ret < 0 ? ret : count;
+}
+
 cpufreq_freq_attr_ro(amd_pstate_max_freq);
 cpufreq_freq_attr_ro(amd_pstate_lowest_nonlinear_freq);
@@ -1303,6 +1413,7 @@
 cpufreq_freq_attr_rw(energy_performance_preference);
 cpufreq_freq_attr_ro(energy_performance_available_preferences);
 static DEVICE_ATTR_RW(status);
 static DEVICE_ATTR_RO(prefcore);
+static DEVICE_ATTR_RW(cpb_boost);
 
 static struct freq_attr *amd_pstate_attr[] = {

&amd_pstate_max_freq,

drivers/cpufreq/amd-pstate.c +1 -0
@@ -1327,6 +1438,7 @@ static struct freq_attr *amd_pstate_epp_attr[] =
 {  static struct attribute *pstate_global_attributes[] = {
    &dev_attr_status.attr,
    &dev_attr_prefcore.attr,
+   &dev_attr_cpb_boost.attr,
    NULL
 };
 
include/linux/amd-pstate.h +0 -0
index 8ba5dd4d3405..56f616a5cd0f 100644

include/linux/amd-pstate.h struct amd_cpudata { · line 112

Quoted 7 lines
include/linux/amd-pstate.h +1 -0
@@ -106,6 +106,7 @@ struct amd_cpudata {
    u32     policy;
    u64     cppc_cap1_cached;
    bool    suspended;
+   bool    boost_state;
 };
 
 /*

--
Oleksandr Natalenko (post-factum)

author reviewer
#6 lore raw

PATCH v10 4/7 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 f81fd61dd2a9..11bce2c1db32 100644
@@ -476,6 +476,7 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
 			      u32 des_perf, u32 max_perf, bool fast_switch, int gov_flags)
 {
 	u64 prev = READ_ONCE(cpudata->cppc_req_cached);
+	u32 nominal_perf = READ_ONCE(cpudata->nominal_perf);
 	u64 value = prev;
 
 	min_perf = clamp_t(unsigned long, min_perf, cpudata->min_limit_perf,
@@ -495,6 +496,10 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
 	value &= ~AMD_CPPC_DES_PERF(~0L);
 	value |= AMD_CPPC_DES_PERF(des_perf);
 
+	/* limit the max perf when core performance boost feature is disabled */
+	if (!amd_pstate_global_params.cpb_boost)
+		max_perf = min_t(unsigned long, nominal_perf, max_perf);
+
 	value &= ~AMD_CPPC_MAX_PERF(~0L);
 	value |= AMD_CPPC_MAX_PERF(max_perf);
 
Signature · 1 line
2.34.1
author reviewer
#7 lore raw

PATCH v10 5/7 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
author reviewer
#8 lore raw

PATCH v10 6/7 cpufreq: amd-pstate: introduce per CPU frequency boost control

In reply to Perry Yuan

Add a new sysfs attribute file to support per CPU frequency boost control, allowing individual CPUs to enable or disable CPB separately.

The new sysfs attribute file is located at below path, /sys/devices/system/cpu/cpuX/cpufreq/boost, where X represents the CPU number.

To disable CPB for a specific CPU, you can use the following command:

$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/boost"

After disabling CPB, the CPU frequency will no longer boost beyond the base frequency for that particular CPU.

for example:
----------------------------------------------------------------------
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ

  0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000

----------------------------------------------------------------------

$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/boost"

CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ

  0    0      0    0 0:0:0:0          yes 3501.0000 400.0000 4154.3140
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000

Please be aware that modifying the global variable amd_pstate_global_params.cpb_boost will overwrite the individual CPU settings.

---
 drivers/cpufreq/amd-pstate.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
drivers/cpufreq/amd-pstate.c +27 -0
index 11bce2c1db32..cb0055e7c842 100644
@@ -1371,6 +1371,30 @@ static int amd_pstate_cpu_boost(int cpu, bool state)
 	return ret < 0 ? ret : 0;
 }
 
+static ssize_t show_boost(struct cpufreq_policy *policy, char *buf)
+{
+	struct amd_cpudata *cpudata = policy->driver_data;
+	bool boost_val;
+
+	boost_val = READ_ONCE(cpudata->boost_state);
+
+	return sysfs_emit(buf, "%u\n", boost_val);
+}
+
+static ssize_t store_boost(
+		struct cpufreq_policy *policy, const char *buf, size_t count)
+{
+	bool boost_val;
+	int ret;
+
+	if (sscanf(buf, "%d", &boost_val) != 1)
+		return -EINVAL;
+
+	ret = amd_pstate_cpu_boost(policy->cpu, boost_val);
+
+	return ret < 0 ? ret : count;
+}
+
 static ssize_t cpb_boost_show(struct device *dev,
 			   struct device_attribute *attr, char *buf)
 {
@@ -1416,6 +1440,7 @@ cpufreq_freq_attr_ro(amd_pstate_prefcore_ranking);
 cpufreq_freq_attr_ro(amd_pstate_hw_prefcore);
 cpufreq_freq_attr_rw(energy_performance_preference);
 cpufreq_freq_attr_ro(energy_performance_available_preferences);
+cpufreq_freq_attr_rw(boost);
 static DEVICE_ATTR_RW(status);
 static DEVICE_ATTR_RO(prefcore);
 static DEVICE_ATTR_RW(cpb_boost);
@@ -1426,6 +1451,7 @@ static struct freq_attr *amd_pstate_attr[] = {
 	&amd_pstate_highest_perf,
 	&amd_pstate_prefcore_ranking,
 	&amd_pstate_hw_prefcore,
+	&boost,
 	NULL,
 };
 
@@ -1437,6 +1463,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
 	&amd_pstate_hw_prefcore,
 	&energy_performance_preference,
 	&energy_performance_available_preferences,
+	&boost,
 	NULL,
 };
 
Signature · 1 line
2.34.1
#9 lore raw

Re: [PATCH v10 6/7] cpufreq: amd-pstate: introduce per CPU frequency boost control

Hello.

Quoted 49 lines · SELČ Perry Yuan

Add a new sysfs attribute file to support per CPU frequency boost control, allowing individual CPUs to enable or disable CPB separately.

The new sysfs attribute file is located at below path, /sys/devices/system/cpu/cpuX/cpufreq/boost, where X represents the CPU number.

To disable CPB for a specific CPU, you can use the following command:

$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/boost"

After disabling CPB, the CPU frequency will no longer boost beyond the base frequency for that particular CPU.

for example:
----------------------------------------------------------------------
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ

  0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000

----------------------------------------------------------------------

$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/boost"

CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ

  0    0      0    0 0:0:0:0          yes 3501.0000 400.0000 4154.3140
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000

Please be aware that modifying the global variable amd_pstate_global_params.cpb_boost will overwrite the individual CPU settings.

---
 drivers/cpufreq/amd-pstate.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
drivers/cpufreq/amd-pstate.c +7 -0
index 11bce2c1db32..cb0055e7c842 100644
@@ -1371,6 +1371,30 @@ static int amd_pstate_cpu_boost(int cpu, bool state)
 	return ret < 0 ? ret : 0;
 }
 
+static ssize_t show_boost(struct cpufreq_policy *policy, char *buf)
+{
+	struct amd_cpudata *cpudata = policy->driver_data;
+	bool boost_val;
+
+	boost_val = READ_ONCE(cpudata->boost_state);
+

drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool state) · line 1390

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +10 -0
+	return sysfs_emit(buf, "%u\n", boost_val);
+}
+
+static ssize_t store_boost(
+		struct cpufreq_policy *policy, const char *buf, size_t count)
+{
+	bool boost_val;
+	int ret;
+
+	if (sscanf(buf, "%d", &boost_val) != 1)

This will generate warning. IIUC, sscanf() doesn't work with booleans directly, so you'd probably want to read the value into an (unsigned) integer, and then cast it to bool.

Quoted 35 lines
drivers/cpufreq/amd-pstate.c +10 -0
+		return -EINVAL;
+
+	ret = amd_pstate_cpu_boost(policy->cpu, boost_val);
+
+	return ret < 0 ? ret : count;
+}
+
 static ssize_t cpb_boost_show(struct device *dev,
 			   struct device_attribute *attr, char *buf)
 {
@@ -1416,6 +1440,7 @@ cpufreq_freq_attr_ro(amd_pstate_prefcore_ranking);
 cpufreq_freq_attr_ro(amd_pstate_hw_prefcore);
 cpufreq_freq_attr_rw(energy_performance_preference);
 cpufreq_freq_attr_ro(energy_performance_available_preferences);
+cpufreq_freq_attr_rw(boost);
 static DEVICE_ATTR_RW(status);
 static DEVICE_ATTR_RO(prefcore);
 static DEVICE_ATTR_RW(cpb_boost);
@@ -1426,6 +1451,7 @@ static struct freq_attr *amd_pstate_attr[] = {
 	&amd_pstate_highest_perf,
 	&amd_pstate_prefcore_ranking,
 	&amd_pstate_hw_prefcore,
+	&boost,
 	NULL,
 };
 
@@ -1437,6 +1463,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
 	&amd_pstate_hw_prefcore,
 	&energy_performance_preference,
 	&energy_performance_available_preferences,
+	&boost,
 	NULL,
 };
 
Signature · 1 line
Oleksandr Natalenko (post-factum)
#10 lore raw

Re: [PATCH v10 6/7] cpufreq: amd-pstate: introduce per CPU frequency boost control

Quoted 56 lines · SELČ Oleksandr Natalenko

Hello.

Quoted 53 lines · SELČ Perry Yuan

Add a new sysfs attribute file to support per CPU frequency boost control, allowing individual CPUs to enable or disable CPB separately.

The new sysfs attribute file is located at below path, /sys/devices/system/cpu/cpuX/cpufreq/boost, where X represents the CPU number.

To disable CPB for a specific CPU, you can use the following command:

$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/boost"

After disabling CPB, the CPU frequency will no longer boost beyond the base frequency for that particular CPU.

for example:
----------------------------------------------------------------------
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ

  0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000

----------------------------------------------------------------------

$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu0/cpufreq/boost"

CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ

  0    0      0    0 0:0:0:0          yes 3501.0000 400.0000 4154.3140
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000

Please be aware that modifying the global variable amd_pstate_global_params.cpb_boost will overwrite the individual CPU settings.

---
 drivers/cpufreq/amd-pstate.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
drivers/cpufreq/amd-pstate.c +11 -0
index 11bce2c1db32..cb0055e7c842 100644
@@ -1371,6 +1371,30 @@ static int amd_pstate_cpu_boost(int cpu, bool state)
 	return ret < 0 ? ret : 0;
 }
 
+static ssize_t show_boost(struct cpufreq_policy *policy, char *buf)
+{
+	struct amd_cpudata *cpudata = policy->driver_data;
+	bool boost_val;
+
+	boost_val = READ_ONCE(cpudata->boost_state);
+
+	return sysfs_emit(buf, "%u\n", boost_val);
+}
+
+static ssize_t store_boost(
Quoted 8 lines

drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool state) · line 1390

Quoted 6 lines
drivers/cpufreq/amd-pstate.c +6 -0
+		struct cpufreq_policy *policy, const char *buf, size_t count)
+{
+	bool boost_val;
+	int ret;
+
+	if (sscanf(buf, "%d", &boost_val) != 1)

This will generate warning. IIUC, sscanf() doesn't work with booleans directly, so you'd probably want to read the value into an (unsigned) integer, and then cast it to bool.

…or maybe just use kstrtobool()?

Quoted 39 lines
Quoted 36 lines
drivers/cpufreq/amd-pstate.c +10 -0
+		return -EINVAL;
+
+	ret = amd_pstate_cpu_boost(policy->cpu, boost_val);
+
+	return ret < 0 ? ret : count;
+}
+
 static ssize_t cpb_boost_show(struct device *dev,
 			   struct device_attribute *attr, char *buf)
 {
@@ -1416,6 +1440,7 @@ cpufreq_freq_attr_ro(amd_pstate_prefcore_ranking);
 cpufreq_freq_attr_ro(amd_pstate_hw_prefcore);
 cpufreq_freq_attr_rw(energy_performance_preference);
 cpufreq_freq_attr_ro(energy_performance_available_preferences);
+cpufreq_freq_attr_rw(boost);
 static DEVICE_ATTR_RW(status);
 static DEVICE_ATTR_RO(prefcore);
 static DEVICE_ATTR_RW(cpb_boost);
@@ -1426,6 +1451,7 @@ static struct freq_attr *amd_pstate_attr[] = {
 	&amd_pstate_highest_perf,
 	&amd_pstate_prefcore_ranking,
 	&amd_pstate_hw_prefcore,
+	&boost,
 	NULL,
 };
 
@@ -1437,6 +1463,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
 	&amd_pstate_hw_prefcore,
 	&energy_performance_preference,
 	&energy_performance_available_preferences,
+	&boost,
 	NULL,
 };
 
Signature · 1 line
Oleksandr Natalenko (post-factum)
author reviewer
#11 lore raw

RE: [PATCH v10 6/7] cpufreq: amd-pstate: introduce per CPU frequency boost control

[AMD Official Use Only - General]

Regards.
Perry

Quoted 84 lines

-----Original Message-----
From: Oleksandr Natalenko <[email protected]>
Sent: Wednesday, May 8, 2024 5:43 PM
To: [email protected]; Limonciello, Mario <[email protected]>; [email protected]; Huang, Ray <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>; Yuan, Perry <[email protected]>
Cc: Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>; Meng, Li (Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v10 6/7] cpufreq: amd-pstate: introduce per CPU frequency boost control

Quoted 19 lines · SELČ Oleksandr Natalenko

Hello.

Quoted 16 lines · SELČ Perry Yuan

Add a new sysfs attribute file to support per CPU frequency boost control, allowing individual CPUs to enable or disable CPB separately.

The new sysfs attribute file is located at below path, /sys/devices/system/cpu/cpuX/cpufreq/boost, where X represents the CPU number.

To disable CPB for a specific CPU, you can use the following command:

$ sudo bash -c "echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/boost"

After disabling CPB, the CPU frequency will no longer boost beyond the base frequency for that particular CPU.

for example:
----------------------------------------------------------------------
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ

MHZ

Quoted 8 lines
Quoted 8 lines
  0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000

--------------------------------------------------------------------
-- $ sudo bash -c "echo 0 >
/sys/devices/system/cpu/cpu0/cpufreq/boost"

CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ

MHZ

Quoted 5 lines
Quoted 5 lines
  0    0      0    0 0:0:0:0          yes 3501.0000 400.0000 4154.3140
  1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000

Please be aware that modifying the global variable amd_pstate_global_params.cpb_boost will overwrite the individual CPU

settings.

Quoted 6 lines
Quoted 6 lines
---
 drivers/cpufreq/amd-pstate.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
Quoted 6 lines

drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool

Quoted 6 lines
(quoted diff) +0 -0

b/drivers/cpufreq/amd-pstate.c index 11bce2c1db32..cb0055e7c842 100644

drivers/cpufreq/amd-pstate.c +0 -0
@@ -1371,6 +1371,30 @@ static int amd_pstate_cpu_boost(int cpu, bool

state)

Quoted 12 lines
Quoted 12 lines
drivers/cpufreq/amd-pstate.c +9 -0
  return ret < 0 ? ret : 0;
 }
 
+static ssize_t show_boost(struct cpufreq_policy *policy, char *buf)
+{
+ struct amd_cpudata *cpudata = policy->driver_data;
+ bool boost_val;
+
+ boost_val = READ_ONCE(cpudata->boost_state);
+
+ return sysfs_emit(buf, "%u\n", boost_val); }
+
Quoted 8 lines

drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool state) · line 1390

Quoted 6 lines
drivers/cpufreq/amd-pstate.c +6 -0
+static ssize_t store_boost(
+         struct cpufreq_policy *policy, const char *buf, size_t count) {
+ bool boost_val;
+ int ret;
+
+ if (sscanf(buf, "%d", &boost_val) != 1)

This will generate warning. IIUC, sscanf() doesn't work with booleans

Quoted 4 lines

directly, so you'd probably want to read the value into an (unsigned) integer, and then cast it to bool.

…or maybe just use kstrtobool()?

Yes, the kstrtobool is the function I need to use, will change it in next. Thanks
Perry.

Quoted 45 lines
Quoted 11 lines

drivers/cpufreq/amd-pstate.c static int amd_pstate_cpu_boost(int cpu, bool state)

Quoted 11 lines
drivers/cpufreq/amd-pstate.c +7 -0
+         return -EINVAL;
+
+ ret = amd_pstate_cpu_boost(policy->cpu, boost_val);
+
+ return ret < 0 ? ret : count;
+}
+
 static ssize_t cpb_boost_show(struct device *dev,
                     struct device_attribute *attr, char *buf)  { @@ -

1416,6

Quoted 16 lines
Quoted 16 lines
drivers/cpufreq/amd-pstate.c +3 -0
+1440,7 @@ cpufreq_freq_attr_ro(amd_pstate_prefcore_ranking);
 cpufreq_freq_attr_ro(amd_pstate_hw_prefcore);
 cpufreq_freq_attr_rw(energy_performance_preference);
 cpufreq_freq_attr_ro(energy_performance_available_preferences);
+cpufreq_freq_attr_rw(boost);
 static DEVICE_ATTR_RW(status);
 static DEVICE_ATTR_RO(prefcore);
 static DEVICE_ATTR_RW(cpb_boost);
@@ -1426,6 +1451,7 @@ static struct freq_attr *amd_pstate_attr[] = {
  &amd_pstate_highest_perf,
  &amd_pstate_prefcore_ranking,
  &amd_pstate_hw_prefcore,
+ &boost,
  NULL,
 };
 
Quoted 1 line

drivers/cpufreq/amd-pstate.c static struct freq_attr *amd_pstate_epp_attr[]

Quoted 1 line
drivers/cpufreq/amd-pstate.c +0 -0
@@ -1437,6 +1463,7 @@ static struct freq_attr *amd_pstate_epp_attr[]

= {

Quoted 11 lines

drivers/cpufreq/amd-pstate.c static struct freq_attr *amd_pstate_epp_attr[] = { · line 1469

Quoted 8 lines
drivers/cpufreq/amd-pstate.c +1 -0
  &amd_pstate_hw_prefcore,
  &energy_performance_preference,
  &energy_performance_available_preferences,
+ &boost,
  NULL,
 };
 

--
Oleksandr Natalenko (post-factum)

author reviewer
#12 lore raw

PATCH v10 7/7 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
#13 lore raw
In reply to Perry Yuan
Quoted 2 lines · Perry Yuan

The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

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

Maintainers are not a shooting gallery.

While waiting, you can read this:

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

Thanks.

Signature · 4 lines
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette
author reviewer
#14 lore raw

[AMD Official Use Only - General]

Hi Boris,

Quoted 33 lines

-----Original Message-----
From: Borislav Petkov <[email protected]>
Sent: Wednesday, May 8, 2024 4:19 PM
To: Yuan, Perry <[email protected]>
Cc: [email protected]; Limonciello, Mario <[email protected]>; [email protected]; Huang, Ray <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>; Meng, Li (Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v10 0/7] AMD Pstate Driver Core Performance Boost

Quoted 2 lines · Perry Yuan

The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

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

Maintainers are not a shooting gallery.

While waiting, you can read this:

Quoted 7 lines

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

Thanks.

--
Regards/Gruss,
Boris.

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

Perry.

Quoted 2 lines

https://people.kernel.org/tglx/notes-about-netiquette

maintainer
#15 lore raw
Quoted 2 lines · Perry

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

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

Signature · 1 line
Sent from a small device: formatting sucks and brevity is inevitable.
#16 lore raw
In reply to Perry Yuan

Hello.

Quoted 140 lines · SELČ Perry Yuan

Hi all,
The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

1) globally disable core boost:

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

2) globally enable core boost:

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

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

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

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

Perry.

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

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

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

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

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

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

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

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

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

v1: https://lore.kernel.org/all/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/

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

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

I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.

The CPU is:

```
Vendor ID:                AuthenticAMD
  Model name:             AMD Ryzen 9 5950X 16-Core Processor
    CPU family:           25
    Model:                33
    Thread(s) per core:   2
    Core(s) per socket:   16
    Socket(s):            1
    Stepping:             2
```

I've got amd_pstate=guided set in the kernel cmdline, but amd-pstate-epp gets loaded anyway. When I try to set guided manually via echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped to disable, tee errors out with -ENODEV, and there's this in the kernel log:

```
$ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
…
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
```

The following is applied on top of v6.9-rc7:

```
cpufreq: amd-pstate: automatically load pstate driver by default
cpufreq: amd-pstate: fix the highest frequency issue which limit performance
cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
x86/cpufeatures: Add feature bits for AMD heterogeneous processor
cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
Documentation: PM: amd-pstate: add guide mode to the Operation mode
Documentation: PM: amd-pstate: add debugging section for driver loading failure
Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
cpufreq: amd-pstate: optimiza the initial frequency values verification
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
cpufreq: amd-pstate: fix code format problems
cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
```

Previously, with your submissions, it was possible to use guided mode with my Zen 3.

[1] https://lore.kernel.org/lkml/[email protected]/

Signature · 1 line
Oleksandr Natalenko (post-factum)
#17 lore raw
Quoted 166 lines · SELČ Oleksandr Natalenko

Hello.

Quoted 140 lines · SELČ Perry Yuan

Hi all,
The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

1) globally disable core boost:

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

2) globally enable core boost:

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

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

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

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

Perry.

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

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

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

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

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

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

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

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

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

v1: https://lore.kernel.org/all/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/

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

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

I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.

The CPU is:

```
Vendor ID:                AuthenticAMD
  Model name:             AMD Ryzen 9 5950X 16-Core Processor
    CPU family:           25
    Model:                33
    Thread(s) per core:   2
    Core(s) per socket:   16
    Socket(s):            1
    Stepping:             2
```
Quoted 1 line

I've got amd_pstate=guided set in the kernel cmdline, but amd-pstate-epp gets loaded anyway.

OK, this part is solved like below:

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

as we have discussed here [1].

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

But this part:

Quoted 8 lines

When I try to set guided manually via echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped to disable, tee errors out with -ENODEV, and there's this in the kernel log:

```
$ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
…
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
```

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

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

just for the sake of test, and got this:

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

and this:

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

which corresponds to:

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

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

Quoted 37 lines

The following is applied on top of v6.9-rc7:

```
cpufreq: amd-pstate: automatically load pstate driver by default
cpufreq: amd-pstate: fix the highest frequency issue which limit performance
cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
x86/cpufeatures: Add feature bits for AMD heterogeneous processor
cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
Documentation: PM: amd-pstate: add guide mode to the Operation mode
Documentation: PM: amd-pstate: add debugging section for driver loading failure
Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
cpufreq: amd-pstate: optimiza the initial frequency values verification
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
cpufreq: amd-pstate: fix code format problems
cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
```

Previously, with your submissions, it was possible to use guided mode with my Zen 3.

[1] https://lore.kernel.org/lkml/[email protected]/

Signature · 1 line
Oleksandr Natalenko (post-factum)
#18 lore raw
Quoted 198 lines · SELČ Oleksandr Natalenko
Quoted 166 lines · SELČ Oleksandr Natalenko

Hello.

Quoted 140 lines · SELČ Perry Yuan

Hi all,
The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

1) globally disable core boost:

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

2) globally enable core boost:

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

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

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

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

Perry.

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

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

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

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

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

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

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

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

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

v1: https://lore.kernel.org/all/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/

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

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

I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.

The CPU is:

```
Vendor ID:                AuthenticAMD
  Model name:             AMD Ryzen 9 5950X 16-Core Processor
    CPU family:           25
    Model:                33
    Thread(s) per core:   2
    Core(s) per socket:   16
    Socket(s):            1
    Stepping:             2
```
Quoted 1 line

I've got amd_pstate=guided set in the kernel cmdline, but amd-pstate-epp gets loaded anyway.

OK, this part is solved like below:

```

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

```

Quoted 3 lines

as we have discussed here [1].

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

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

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

and things revert to acpi_cpufreq instead.

What's wrong?

Quoted 83 lines

But this part:

Quoted 8 lines

When I try to set guided manually via echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped to disable, tee errors out with -ENODEV, and there's this in the kernel log:

```
$ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
…
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
```

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

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

just for the sake of test, and got this:

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

and this:

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

which corresponds to:

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

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

Quoted 37 lines

The following is applied on top of v6.9-rc7:

```
cpufreq: amd-pstate: automatically load pstate driver by default
cpufreq: amd-pstate: fix the highest frequency issue which limit performance
cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
x86/cpufeatures: Add feature bits for AMD heterogeneous processor
cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
Documentation: PM: amd-pstate: add guide mode to the Operation mode
Documentation: PM: amd-pstate: add debugging section for driver loading failure
Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
cpufreq: amd-pstate: optimiza the initial frequency values verification
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
cpufreq: amd-pstate: fix code format problems
cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
```

Previously, with your submissions, it was possible to use guided mode with my Zen 3.

[1] https://lore.kernel.org/lkml/[email protected]/

Signature · 1 line
Oleksandr Natalenko (post-factum)
#19 lore raw
Quoted 226 lines · SELČ Oleksandr Natalenko
Quoted 198 lines · SELČ Oleksandr Natalenko
Quoted 166 lines · SELČ Oleksandr Natalenko

Hello.

Quoted 140 lines · SELČ Perry Yuan

Hi all,
The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

1) globally disable core boost:

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

2) globally enable core boost:

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

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

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

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

Perry.

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

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

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

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

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

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

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

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

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

v1: https://lore.kernel.org/all/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/

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

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

I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.

The CPU is:

```
Vendor ID:                AuthenticAMD
  Model name:             AMD Ryzen 9 5950X 16-Core Processor
    CPU family:           25
    Model:                33
    Thread(s) per core:   2
    Core(s) per socket:   16
    Socket(s):            1
    Stepping:             2
```
Quoted 1 line

I've got amd_pstate=guided set in the kernel cmdline, but amd-pstate-epp gets loaded anyway.

OK, this part is solved like below:

```

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

```

Quoted 3 lines

as we have discussed here [1].

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

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

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

and things revert to acpi_cpufreq instead.

What's wrong?

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

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

aka "active" by default.

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

Quoted 87 lines
Quoted 84 lines

But this part:

Quoted 8 lines

When I try to set guided manually via echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped to disable, tee errors out with -ENODEV, and there's this in the kernel log:

```
$ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
…
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
```

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

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

just for the sake of test, and got this:

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

and this:

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

which corresponds to:

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

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

Quoted 37 lines

The following is applied on top of v6.9-rc7:

```
cpufreq: amd-pstate: automatically load pstate driver by default
cpufreq: amd-pstate: fix the highest frequency issue which limit performance
cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
x86/cpufeatures: Add feature bits for AMD heterogeneous processor
cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
Documentation: PM: amd-pstate: add guide mode to the Operation mode
Documentation: PM: amd-pstate: add debugging section for driver loading failure
Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
cpufreq: amd-pstate: optimiza the initial frequency values verification
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
cpufreq: amd-pstate: fix code format problems
cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
```

Previously, with your submissions, it was possible to use guided mode with my Zen 3.

[1] https://lore.kernel.org/lkml/[email protected]/

Signature · 1 line
Oleksandr Natalenko (post-factum)
#20 lore raw
Quoted 233 lines · Oleksandr Natalenko
Quoted 226 lines · SELČ Oleksandr Natalenko
Quoted 198 lines · SELČ Oleksandr Natalenko
Quoted 166 lines · SELČ Oleksandr Natalenko

Hello.

Quoted 140 lines · SELČ Perry Yuan

Hi all,
The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

1) globally disable core boost:

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

2) globally enable core boost:

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

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

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

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

Perry.

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

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

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

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

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

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

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

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

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

v1: https://lore.kernel.org/all/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/

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

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

I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.

The CPU is:

```
Vendor ID:                AuthenticAMD
   Model name:             AMD Ryzen 9 5950X 16-Core Processor
     CPU family:           25
     Model:                33
     Thread(s) per core:   2
     Core(s) per socket:   16
     Socket(s):            1
     Stepping:             2
```
Quoted 1 line

I've got amd_pstate=guided set in the kernel cmdline, but amd-pstate-epp gets loaded anyway.

OK, this part is solved like below:

```

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

```

Quoted 3 lines

as we have discussed here [1].

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

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

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

and things revert to acpi_cpufreq instead.

What's wrong?

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

Quoted 9 lines
```
CONFIG_X86_AMD_PSTATE=y
CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
```

aka "active" by default.

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

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

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

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

Quoted 89 lines
Quoted 87 lines
Quoted 84 lines

But this part:

Quoted 8 lines

When I try to set guided manually via echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped to disable, tee errors out with -ENODEV, and there's this in the kernel log:

```
$ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
…
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
```

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

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

just for the sake of test, and got this:

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

and this:

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

which corresponds to:

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

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

Quoted 37 lines

The following is applied on top of v6.9-rc7:

```
cpufreq: amd-pstate: automatically load pstate driver by default
cpufreq: amd-pstate: fix the highest frequency issue which limit performance
cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
x86/cpufeatures: Add feature bits for AMD heterogeneous processor
cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
Documentation: PM: amd-pstate: add guide mode to the Operation mode
Documentation: PM: amd-pstate: add debugging section for driver loading failure
Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
cpufreq: amd-pstate: optimiza the initial frequency values verification
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
cpufreq: amd-pstate: fix code format problems
cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
```

Previously, with your submissions, it was possible to use guided mode with my Zen 3.

[1] https://lore.kernel.org/lkml/[email protected]/

#21 lore raw
Quoted 239 lines · SELČ Mario Limonciello
Quoted 238 lines · Oleksandr Natalenko
Quoted 226 lines · SELČ Oleksandr Natalenko
Quoted 198 lines · SELČ Oleksandr Natalenko
Quoted 166 lines · SELČ Oleksandr Natalenko

Hello.

Quoted 140 lines · SELČ Perry Yuan

Hi all,
The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

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

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

1) globally disable core boost:

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

2) globally enable core boost:

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

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

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

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

Perry.

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

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

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

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

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

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

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

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

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

v1: https://lore.kernel.org/all/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/

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

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

I've applied this series along with fixes and improvements [1], and I cannot get guided mode to work with my CPU any more.

The CPU is:

```
Vendor ID:                AuthenticAMD
   Model name:             AMD Ryzen 9 5950X 16-Core Processor
     CPU family:           25
     Model:                33
     Thread(s) per core:   2
     Core(s) per socket:   16
     Socket(s):            1
     Stepping:             2
```
Quoted 1 line

I've got amd_pstate=guided set in the kernel cmdline, but amd-pstate-epp gets loaded anyway.

OK, this part is solved like below:

```

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

```

Quoted 3 lines

as we have discussed here [1].

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

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

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

and things revert to acpi_cpufreq instead.

What's wrong?

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

```
CONFIG_X86_AMD_PSTATE=y
CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
```
Quoted 8 lines
Quoted 4 lines

aka "active" by default.

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

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

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

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

Quoted 7 lines

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

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

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

Quoted 91 lines
Quoted 89 lines
Quoted 87 lines
Quoted 84 lines

But this part:

Quoted 8 lines

When I try to set guided manually via echo guided | sudo tee /sys/devices/system/cpu/amd_pstate/status, the status gets dropped to disable, tee errors out with -ENODEV, and there's this in the kernel log:

```
$ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy0/boost'
…
kernel: sysfs: cannot create duplicate filename '/devices/system/cpu/cpufreq/policy31/boost'
```

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

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

just for the sake of test, and got this:

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

and this:

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

which corresponds to:

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

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

Quoted 37 lines

The following is applied on top of v6.9-rc7:

```
cpufreq: amd-pstate: automatically load pstate driver by default
cpufreq: amd-pstate: fix the highest frequency issue which limit performance
cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
x86/cpufeatures: Add feature bits for AMD heterogeneous processor
cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
Documentation: PM: amd-pstate: add guide mode to the Operation mode
Documentation: PM: amd-pstate: add debugging section for driver loading failure
Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
cpufreq: amd-pstate: optimiza the initial frequency values verification
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: introduce the new cpu boost control method
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: amd-pstate: remove unused variable lowest_nonlinear_freq
cpufreq: amd-pstate: fix code format problems
cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata
```

Previously, with your submissions, it was possible to use guided mode with my Zen 3.

[1] https://lore.kernel.org/lkml/[email protected]/

Signature · 1 line
Oleksandr Natalenko (post-factum)
author reviewer
#22 lore raw

[AMD Official Use Only - General]

Hi Oleksandr

Quoted 459 lines

-----Original Message-----
From: Oleksandr Natalenko <[email protected]>
Sent: Thursday, May 9, 2024 8:01 PM
To: [email protected]; [email protected]; Huang, Ray <[email protected]>; Shenoy, Gautham Ranjal <[email protected]>; Petkov, Borislav <[email protected]>; Yuan, Perry <[email protected]>; Limonciello, Mario <[email protected]>
Cc: Deucher, Alexander <[email protected]>; Huang, Shimmer <[email protected]>; Du, Xiaojian <[email protected]>; Meng, Li (Jassmine) <[email protected]>; [email protected]; linux- [email protected]
Subject: Re: [PATCH v10 0/7] AMD Pstate Driver Core Performance Boost

Quoted 4 lines · SELČ Mario Limonciello
Quoted 3 lines · Oleksandr Natalenko
Quoted 2 lines · SELČ Oleksandr Natalenko
Quoted 1 line · SELČ Oleksandr Natalenko

On středa 8. května 2024 17:11:42, SELČ Oleksandr Natalenko wrote:

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines

Hello.

Quoted 5 lines · SELČ Perry Yuan

Hi all,
The patchset series add core performance boost feature for AMD pstate driver including passisve ,guide and active mode support.

User can change core frequency boost control with a new sysfs

entry:

Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines

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

1) globally disable core boost:

$ sudo bash -c "echo 0 >

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

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
$ lscpu -ae
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ   MINMHZ

MHZ

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
   0    0      0    0 0:0:0:0          yes 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"

Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
$ lscpu -ae
    0    0      0    0 0:0:0:0          yes 5759.0000 400.0000 2983.578
   1    0      0    1 1:1:1:0          yes 5759.0000 400.0000 2983.578
   2    0      0    2 2:2:2:0          yes 5759.0000 400.0000 2983.578
   3    0      0    3 3:3:3:0          yes 5759.0000 400.0000 2983.578
   4    0      0    4 4:4:4:0          yes 5759.0000 400.0000 2983.578

==========================================================
======

Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines

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

# before
   CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    MAXMHZ

MINMHZ MHZ

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
   0    0      0    0 0:0:0:0          yes 4208.0000 400.0000 1666.7740
   1    0      0    0 0:0:0:0          yes 4208.0000 400.0000  400.0000
   2    0      0    1 1:1:1:0          yes 4208.0000 400.0000 3386.1260
   3    0      0    1 1:1:1:0          yes 4208.0000 400.0000  400.0000
$ sudo rdmsr 0xc00102b3 -p 0
10a6
$ sudo bash -c "echo 1 >

/sys/devices/system/cpu/cpu0/cpufreq/boost"

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
# after
   CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE    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
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
$ sudo rdmsr 0xc00102b3 -p 0
108a

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

saving.

Quoted 22 lines
Quoted 22 lines
Quoted 22 lines
Quoted 22 lines
Quoted 22 lines
Quoted 22 lines

Perry.

Changes from v9:
* change per CPU boost sysfs file name 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

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

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

Changes from v4:
* drop the legacy boost remove patch, let us keep the legacy

interface

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

in case some applications break.
* rebase to linux-pm/bleeding-edge branch
* rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes

And

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines

Enhancements which has some intial work done there.

Changes from v4:
* 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 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines

* update [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT

Changes from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global to amd_pstate_global_params(Oleksandr

Natalenko)

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

* 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

Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines

error during testing
* fix the max frequency value to be KHz when cpb boost
disabled(Gautham R. Shenoy)

Changes from v2:
* move global struct 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

Quoted 35 lines
Quoted 35 lines
Quoted 35 lines
Quoted 35 lines
Quoted 35 lines
Quoted 35 lines

another fix series instead of CPB feature
* move the set_boost remove patch to the last(Mario)
* Fix commit info with "Closes:" (Mario)
* simplified global.cpb_supported initialization(Mario)
* Add guide mode support for CPB control
* Fixed some Doc typos and add guide mode info to Doc as well.

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

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

Perry Yuan (7):
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-

index.h

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost

control

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
while cpb boost off
Documentation: cpufreq: amd-pstate: introduce the new cpu

boost

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: update doc for Per CPU

boost

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

control method

  Documentation/admin-guide/pm/amd-pstate.rst |  30 ++++
  arch/x86/include/asm/msr-index.h            |   2 +
  drivers/cpufreq/acpi-cpufreq.c              |   2 -
  drivers/cpufreq/amd-pstate-ut.c             |   2 +-
  drivers/cpufreq/amd-pstate.c                | 189

++++++++++++++++++--

Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 2 lines
  include/linux/amd-pstate.h                  |  14 ++
  6 files changed, 225 insertions(+), 14 deletions(-)

I've applied this series along with fixes and improvements [1], and I

cannot get guided mode to work with my CPU any more.

Quoted 14 lines
Quoted 14 lines
Quoted 14 lines
Quoted 14 lines
Quoted 14 lines

The CPU is:

```
Vendor ID:                AuthenticAMD
   Model name:             AMD Ryzen 9 5950X 16-Core Processor
     CPU family:           25
     Model:                33
     Thread(s) per core:   2
     Core(s) per socket:   16
     Socket(s):            1
     Stepping:             2
```
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

I've got amd_pstate=guided set in the kernel cmdline, but `amd-

pstate-epp` gets loaded anyway.

Quoted 31 lines
Quoted 31 lines
Quoted 31 lines
Quoted 31 lines

OK, this part is solved like below:

```

(quoted diff) +0 -0

b/drivers/cpufreq/amd-pstate.c index aafa4466e5ced..5aee7d2b8cfd7 100644

drivers/cpufreq/amd-pstate.c +1 -0
@@ -66,7 +66,7 @@
  static struct cpufreq_driver *current_pstate_driver;
  static struct cpufreq_driver amd_pstate_driver;
  static struct cpufreq_driver amd_pstate_epp_driver; -static int
 cppc_state;
+static int cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
  static bool cppc_enabled;
  static bool amd_pstate_prefcore = true;
  static struct quirk_entry *quirks; @@ -1958,10 +1958,6 @@ static

int __init amd_pstate_init(void)

        /* check if this machine need CPPC quirks */
        dmi_check_system(amd_pstate_quirks_table);
drivers/cpufreq/amd-pstate.c +0 -4
-       /* get default driver mode for loading*/
-       cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
-       pr_debug("cppc working state set to mode:%d\n", cppc_state);
-
        switch (cppc_state) {
        case AMD_PSTATE_DISABLE:
                pr_info("driver load is disabled, boot with specific mode to

enable this\n"); ```

Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines

as we have discussed here [1].

[1]

https://lore.kernel.org/lkml/CYYPR12MB865554562BE018D46FF0108C9CE5

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 1 line

[email protected]/

Ah no, scratch it, it's not solved. With amd_pstate=guided the driver

fails to register during the boottime with the same sysfs error:

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

```
kernel: sysfs: cannot create duplicate filename

'/devices/system/cpu/cpufreq/policy0/boost'

Quoted 20 lines
Quoted 20 lines
Quoted 20 lines

kernel: Hardware name: ASUS System Product Name/Pro WS X570-ACE, BIOS 4805 03/18/2024

kernel: Call Trace:
kernel:  <TASK>
kernel:  dump_stack_lvl+0x47/0x60
kernel:  sysfs_warn_dup+0x5a/0x70
kernel:  sysfs_create_file_ns+0x196/0x1b0
kernel:  cpufreq_online+0x244/0xde0
kernel:  cpufreq_add_dev+0x7b/0x90
kernel:  subsys_interface_register+0x19e/0x1d0
kernel:  cpufreq_register_driver+0x177/0x2f0
kernel:  amd_pstate_init+0x1b8/0x2c0
kernel:  do_one_initcall+0x5b/0x320
kernel:  kernel_init_freeable+0x1dc/0x380
kernel:  kernel_init+0x1a/0x1c0
kernel:  ret_from_fork+0x34/0x50
kernel:  ret_from_fork_asm+0x1b/0x30
kernel:  </TASK>

```

Quoted 5 lines
Quoted 5 lines
Quoted 3 lines

and things revert to acpi_cpufreq instead.

What's wrong?

This happens with both amd_pstate=guided and amd_pstate=passive,

while with amd_pstate=active it works. Also note I've got:

Quoted 6 lines
Quoted 6 lines
```
CONFIG_X86_AMD_PSTATE=y
CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
```
Quoted 8 lines
Quoted 4 lines

aka "active" by default.

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

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

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

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

Quoted 7 lines

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

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

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

Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines

But this part:

Quoted 1 line

When I try to set guided manually via `echo guided | sudo tee

/sys/devices/system/cpu/amd_pstate/status, the status gets dropped to disable, tee errors out with -ENODEV`, and there's this in the kernel log:

Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines

```

$ jctl -kb | grep sysfs: | cut -d ' ' -f 5-
kernel: sysfs: cannot create duplicate filename

'/devices/system/cpu/cpufreq/policy0/boost'

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

…
kernel: sysfs: cannot create duplicate filename

'/devices/system/cpu/cpufreq/policy31/boost'

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 1 line

```

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

this:

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

just for the sake of test, and got this:

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

and this:

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

which corresponds to:

```

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

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

I haven't conducted this test before, so I don't know whether this

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

Quoted 28 lines
Quoted 28 lines
Quoted 28 lines
Quoted 28 lines
Quoted 28 lines

The following is applied on top of v6.9-rc7:

```
cpufreq: amd-pstate: automatically load pstate driver by default
cpufreq: amd-pstate: fix the highest frequency issue which limit performance
cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
x86/cpufeatures: Add feature bits for AMD heterogeneous processor
cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
Documentation: PM: amd-pstate: add guide mode to the Operation mode
Documentation: PM: amd-pstate: add debugging section for driver loading failure
Documentation: PM: amd-pstate: introducing recommended reboot requirement during driver switch
cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
cpufreq: amd-pstate: optimiza the initial frequency values verification
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost control method
cpufreq: amd-pstate: introduce per CPU frequency boost control
Documentation: cpufreq: amd-pstate: introduce the new cpu boost

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines

control method
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue while cpb boost off
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: amd-pstate: remove unused variable

lowest_nonlinear_freq

Quoted 15 lines
Quoted 15 lines
Quoted 15 lines
Quoted 15 lines
Quoted 15 lines

cpufreq: amd-pstate: fix code format problems
cpufreq: amd-pstate: Add quirk for the pstate CPPC capabilities missing
cpufreq: amd-pstate: get transition delay and latency value from ACPI tables
cpufreq: amd-pstate: Bail out if min/max/nominal_freq is 0
cpufreq: amd-pstate: Remove amd_get_{min,max,nominal,lowest_nonlinear}_freq()
cpufreq: amd-pstate: Unify computation of {max,min,nominal,lowest_nonlinear}_freq
cpufreq: amd-pstate: Document the units for freq variables in amd_cpudata
cpufreq: amd-pstate: Document *_limit_* fields in struct amd_cpudata ```

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

Previously, with your submissions, it was possible to use guided

mode with my Zen 3.

Quoted 16 lines
Quoted 14 lines
Quoted 12 lines
Quoted 9 lines
Quoted 6 lines

[1]
https://lore.kernel.org/lkml/cover.1715065568.git.perry.yuan@amd.
com/

Quoted 2 lines

--
Oleksandr Natalenko (post-factum)

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

Perry.