Hi all,
The patchset series implement CPB(core performance boost) feature for AMD pstate
driver including passisve ,guide and active mode support.
User can change global core frequency boost control with a new sysfs entry:
"/sys/devices/system/cpu/amd_pstate/cpb_boost"
Now it also support to update indivial CPU boost state in sysfs boost file.
"/sys/devices/system/cpu/cpuX/cpufreq/boost"
And global control will override the indivial CPU boost state by default.
1) globally disable core boost:
$ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
$ lscpu -ae
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4201.0000 400.0000 2983.578
1 0 0 1 1:1:1:0 yes 4201.0000 400.0000 2983.578
2 0 0 2 2:2:2:0 yes 4201.0000 400.0000 2583.855
3 0 0 3 3:3:3:0 yes 4201.0000 400.0000 2983.578
4 0 0 4 4:4:4:0 yes 4201.0000 400.0000 2983.578
2) globally enable core boost:
$ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
$ lscpu -ae
0 0 0 0 0:0:0:0 yes 5759.0000 400.0000 2983.578
1 0 0 1 1:1:1:0 yes 5759.0000 400.0000 2983.578
2 0 0 2 2:2:2:0 yes 5759.0000 400.0000 2983.578
3 0 0 3 3:3:3:0 yes 5759.0000 400.0000 2983.578
4 0 0 4 4:4:4:0 yes 5759.0000 400.0000 2983.578
============================================================================
The V9 patches add per CPU boost control, user can enable/disable CPUs boost
as the below command tested on a laptop system.
# before
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4208.0000 400.0000 1666.7740
1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 400.0000
2 0 0 1 1:1:1:0 yes 4208.0000 400.0000 3386.1260
3 0 0 1 1:1:1:0 yes 4208.0000 400.0000 400.0000
$ sudo rdmsr 0xc00102b3 -p 0
10a6
$ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
# after
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 3501.0000 400.0000 400.0000
1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 1391.0690
2 0 0 1 1:1:1:0 yes 4208.0000 400.0000 3654.4541
3 0 0 1 1:1:1:0 yes 4208.0000 400.0000 400.0000
$ sudo rdmsr 0xc00102b3 -p 0
108a
rebasd to keep syncing to Mario kernel tree: bleeding-edge
https://git.kernel.org/pub/scm/linux/kernel/git/superm1/linux.git
Tested result:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 3110.0000
4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2732.3569
5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 2312.2109
9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2310.1011
11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140
sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu11/cpufreq/boost"
sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu10/cpufreq/boost"
sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu9/cpufreq/boost"
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1242.7240
1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2754.5710
3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2659.8159
4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2308.9929
5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140
10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140
11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140
sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1233.8630
1 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1110.7140
2 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2714.4851
3 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2732.3569
4 0 0 2 2:2:2:0 yes 2801.0000 400.0000 2564.2639
5 0 0 2 2:2:2:0 yes 2801.0000 400.0000 1110.7140
6 0 0 3 3:3:3:0 yes 2801.0000 400.0000 2732.3569
7 0 0 3 3:3:3:0 yes 2801.0000 400.0000 1110.7140
8 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1233.8660
9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140
10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.6630
11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.5050
sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1234.0200
1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2278.8491
7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2732.3569
8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2353.0449
11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140
Perry.
Changes from v10:
* rework the boost interface with cpufreq core boost control, align the sysfs file
created from cpufreq.c and allow indivial CPU boost control (Mario)
* fix the pr_warn code format with %zd (Oleksandr Natalenko)
* replace sscanf with kstrtobool for cpufreq.c (new)
* drop the boost sysfs file creation from amd pstate patch #6
* add init_boost for cpufreq.c to unify the boost file creation(Mario)
* add set_boost callback for EPP driver mode
* fix syncronization issue for indivial boost control and global CPB control, now the
two control way will keep syncronization after anyone CPU boost state changed.
* rebased to Mario kernel tree: bleeding-edge
* run testing on local system, no regression issue found so far.
Changes from v9:
* change per CPU boost sysfs file name to `boost` (Mario)
* rebased to latest linux-pm/bleeding-edge
Changes from v8:
* pick RB flag for patch 4 (Mario)
* change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
* merge patch 6 into patch 3 (Mario)
* add two patch for per CPU boost control patch 6 & 7(Mario)
* rebased to latest linux-pm/bleeding-edge
Changes from v7:
* fix the mutext locking issue in the sysfs file update(Ray, Mario)
* pick ack flag from Ray
* use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
* rerun the testing to check function works well
* rebased to linux-pm/bleeding-edge latest
Changes from v6:
* reword patch 2 commit log (Gautham)
* update cover letter description(Gautham)
* rebase to kernel v6.9-rc5
Changes from v4:
* drop the legacy boost remove patch, let us keep the legacy interface
in case some applications break.
* rebase to linux-pm/bleeding-edge branch
* rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
Enhancements which has some intial work done there.
Changes from v4:
* move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
* pick RB flag from Gautham R. Shenoy
* add Cc Oleksandr Natalenko <[email protected]>
* rebase to latest linux-pm/bleeding-edge branch
* rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And Enhancements
* update [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
Changes from v3:
* rebased to linux-pm/bleeding-edge v6.8
* rename global to amd_pstate_global_params(Oleksandr Natalenko)
* remove comments for boot_supported in amd_pstate.h
* fix the compiler warning for amd-pstate-ut.ko
* use for_each_online_cpu in cpb_boost_store which fix the null pointer
error during testing
* fix the max frequency value to be KHz when cpb boost disabled(Gautham R. Shenoy)
Changes from v2:
* move global struct to amd-pstate.h
* fix the amd-pstate-ut with new cpb control interface
Changes from v1:
* drop suspend/resume fix patch 6/7 because of the fix should be in
another fix series instead of CPB feature
* move the set_boost remove patch to the last(Mario)
* Fix commit info with "Closes:" (Mario)
* simplified global.cpb_supported initialization(Mario)
* Add guide mode support for CPB control
* Fixed some Doc typos and add guide mode info to Doc as well.
v1: https://lore.kernel.org/all/[email protected]/
v2: https://lore.kernel.org/lkml/[email protected]/
v3: https://lore.kernel.org/lkml/[email protected]/
v4: https://lore.kernel.org/lkml/[email protected]/
v5: https://lore.kernel.org/lkml/[email protected]/
v6: https://lore.kernel.org/lkml/[email protected]/
v7: https://lore.kernel.org/lkml/[email protected]/
v8: https://lore.kernel.org/lkml/[email protected]/
v9: https://lore.kernel.org/lkml/[email protected]/
v10: https://lore.kernel.org/lkml/[email protected]/
Perry Yuan (9):
cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
cpufreq: simplify boolean parsing with kstrtobool in store function
cpufreq: introduce init_boost callback to initialize boost state for
pstate drivers
cpufreq: amd-pstate: initialize new core precision boost state
cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
cpufreq: amd-pstate: Add set_boost callback for active mode
cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
while cpb boost off
Documentation: cpufreq: amd-pstate: introduce the new cpu boost
control method
Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
control method
Documentation/admin-guide/pm/amd-pstate.rst | 30 +++
arch/x86/include/asm/msr-index.h | 2 +
drivers/cpufreq/acpi-cpufreq.c | 2 -
drivers/cpufreq/amd-pstate-ut.c | 2 +-
drivers/cpufreq/amd-pstate.c | 197 +++++++++++++++++---
drivers/cpufreq/amd-pstate.h | 14 ++
drivers/cpufreq/cpufreq.c | 23 ++-
include/linux/cpufreq.h | 2 +
8 files changed, 237 insertions(+), 35 deletions(-)
--
2.34.1
Introduce a new init_boost callback in cpufreq to initialize the boost
state for specific pstate drivers. This initialization is required before
calling the set_boost interface for each CPU.
The init_boost callback will set up and synchronize each CPU's current
boost state before invoking the set_boost function. Without this step,
the boost state may be inconsistent across CPUs.
Signed-off-by: Perry Yuan <[email protected]>
---
drivers/cpufreq/cpufreq.c | 12 ++++++++++--
include/linux/cpufreq.h | 2 ++
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 1fdabb660231..e1a4730f4f8c 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1429,8 +1429,16 @@ static int cpufreq_online(unsigned int cpu)
goto out_free_policy;
}
- /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
- policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy);
+ /* init boost state to prepare set_boost callback for each CPU */
+ if (cpufreq_driver->init_boost) {
+ ret = cpufreq_driver->init_boost(policy);
+ if (ret)
+ pr_debug("%s: %d: initialization boost failed\n", __func__,
+ __LINE__);
+ } else {
+ /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
+ policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy);
+ }
/*
* The initialization has succeeded and the policy is online.
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 20f7e98ee8af..0698c0292d8f 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -409,6 +409,8 @@ struct cpufreq_driver {
bool boost_enabled;
int (*set_boost)(struct cpufreq_policy *policy, int state);
+ /* initialize boost state to be consistent before calling set_boost */
+ int (*init_boost)(struct cpufreq_policy *policy);
/*
* Set by drivers that want to register with the energy model after the
* policy is properly initialized, but before the governor is started.
--
2.34.1
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
Reported-by: Artem S. Tashkinov" <[email protected]>
Cc: Oleksandr Natalenko <[email protected]>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217931
Signed-off-by: Perry Yuan <[email protected]>
---
drivers/cpufreq/amd-pstate.c | 59 +++++++++++++++++++++++++++++-------
drivers/cpufreq/amd-pstate.h | 13 ++++++++
2 files changed, 61 insertions(+), 11 deletions(-)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index fda8f86c90e0..9f42524074a9 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -102,6 +102,8 @@ static int cppc_state = AMD_PSTATE_UNDEFINED;
static bool cppc_enabled;
static bool amd_pstate_prefcore = true;
static struct quirk_entry *quirks;
+struct amd_pstate_global_params amd_pstate_global_params;
+EXPORT_SYMBOL_GPL(amd_pstate_global_params);
/*
* AMD Energy Preference Performance (EPP)
@@ -696,7 +698,7 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
if (!cpudata->boost_supported) {
pr_err("Boost mode is not supported by this processor or SBIOS\n");
- return -EINVAL;
+ return -ENOTSUPP;
}
if (state)
@@ -714,18 +716,38 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
return 0;
}
-static void amd_pstate_boost_init(struct amd_cpudata *cpudata)
+static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
{
- u32 highest_perf, nominal_perf;
+ u64 boost_val;
+ int ret = -1;
- highest_perf = READ_ONCE(cpudata->highest_perf);
- nominal_perf = READ_ONCE(cpudata->nominal_perf);
+ if (!cpu_feature_enabled(X86_FEATURE_CPB)) {
+ pr_debug_once("Boost CPB capabilities not present in the processor\n");
+ ret = -EOPNOTSUPP;
+ goto exit_err;
+ }
- if (highest_perf <= nominal_perf)
- return;
+ ret = rdmsrl_on_cpu(cpudata->cpu, MSR_K7_HWCR, &boost_val);
+ if (ret) {
+ pr_err_once("failed to read initial CPU boost state!\n");
+ ret = -EIO;
+ goto exit_err;
+ }
+
+ amd_pstate_global_params.cpb_supported = !(boost_val & MSR_K7_HWCR_CPB_DIS);
+ if (amd_pstate_global_params.cpb_supported) {
+ current_pstate_driver->boost_enabled = true;
+ WRITE_ONCE(cpudata->boost_supported, true);
+ }
- cpudata->boost_supported = true;
- current_pstate_driver->boost_enabled = true;
+ amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported;
+ return 0;
+
+exit_err:
+ WRITE_ONCE(cpudata->boost_supported, false);
+ current_pstate_driver->boost_enabled = false;
+ amd_pstate_global_params.cpb_boost = false;
+ return ret;
}
static void amd_perf_ctl_reset(unsigned int cpu)
@@ -1007,7 +1029,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
policy->driver_data = cpudata;
- amd_pstate_boost_init(cpudata);
if (!current_pstate_driver->adjust_perf)
current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
@@ -1389,6 +1410,21 @@ static bool amd_pstate_acpi_pm_profile_undefined(void)
return false;
}
+static int amd_pstate_init_boost(struct cpufreq_policy *policy)
+{
+ struct amd_cpudata *cpudata = policy->driver_data;
+ int ret;
+
+ /* initialize cpu cores boot state */
+ ret = amd_pstate_boost_set(cpudata);
+ if (ret)
+ return ret;
+
+ policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
+
+ return 0;
+}
+
static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
{
int min_freq, max_freq, nominal_freq, ret;
@@ -1467,7 +1503,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
return ret;
WRITE_ONCE(cpudata->cppc_cap1_cached, value);
}
- amd_pstate_boost_init(cpudata);
return 0;
@@ -1706,6 +1741,7 @@ static struct cpufreq_driver amd_pstate_driver = {
.exit = amd_pstate_cpu_exit,
.suspend = amd_pstate_cpu_suspend,
.resume = amd_pstate_cpu_resume,
+ .init_boost = amd_pstate_init_boost,
.set_boost = amd_pstate_set_boost,
.update_limits = amd_pstate_update_limits,
.name = "amd-pstate",
@@ -1723,6 +1759,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = {
.suspend = amd_pstate_epp_suspend,
.resume = amd_pstate_epp_resume,
.update_limits = amd_pstate_update_limits,
+ .init_boost = amd_pstate_init_boost,
.name = "amd-pstate-epp",
.attr = amd_pstate_epp_attr,
};
diff --git a/drivers/cpufreq/amd-pstate.h b/drivers/cpufreq/amd-pstate.h
index e6a28e7f4dbf..0b75a6267fca 100644
--- a/drivers/cpufreq/amd-pstate.h
+++ b/drivers/cpufreq/amd-pstate.h
@@ -101,4 +101,17 @@ struct amd_cpudata {
bool suspended;
};
+/**
+ * struct amd_pstate_global_params - Global parameters, mostly tunable via sysfs.
+ * @cpb_boost: Whether or not to use boost CPU P-states.
+ * @cpb_supported: Whether or not CPU boost P-states are available
+ * based on the MSR_K7_HWCR bit[25] state
+ */
+struct amd_pstate_global_params {
+ bool cpb_boost;
+ bool cpb_supported;
+};
+
+extern struct amd_pstate_global_params amd_pstate_global_params;
+
#endif /* _LINUX_AMD_PSTATE_H */
--
2.34.1
From: Perry Yuan <[email protected]>
With this new sysfs entry `cpb_boost`created, user can change CPU boost
state dynamically under `active`, `guided` and `passive` modes.
And the highest perf and frequency will also be updated as the boost
state changing.
0): check current boost state
cat /sys/devices/system/cpu/amd_pstate/cpb_boost
1): disable CPU boost
sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
2): enable CPU boost
sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
Link: https://bugzilla.kernel.org/show_bug.cgi?id=217931
Link: https://bugzilla.kernel.org/show_bug.cgi?id=217618
Signed-off-by: Perry Yuan <[email protected]>
---
drivers/cpufreq/amd-pstate-ut.c | 2 +-
drivers/cpufreq/amd-pstate.c | 117 +++++++++++++++++++++++++++++++-
drivers/cpufreq/amd-pstate.h | 1 +
3 files changed, 118 insertions(+), 2 deletions(-)
diff --git a/drivers/cpufreq/amd-pstate-ut.c b/drivers/cpufreq/amd-pstate-ut.c
index fc275d41d51e..b528f198f4c3 100644
--- a/drivers/cpufreq/amd-pstate-ut.c
+++ b/drivers/cpufreq/amd-pstate-ut.c
@@ -227,7 +227,7 @@ static void amd_pstate_ut_check_freq(u32 index)
goto skip_test;
}
- if (cpudata->boost_supported) {
+ if (amd_pstate_global_params.cpb_boost) {
if ((policy->max == cpudata->max_freq) ||
(policy->max == cpudata->nominal_freq))
amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index 9f42524074a9..fe7c9d3562c5 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -104,6 +104,7 @@ static bool amd_pstate_prefcore = true;
static struct quirk_entry *quirks;
struct amd_pstate_global_params amd_pstate_global_params;
EXPORT_SYMBOL_GPL(amd_pstate_global_params);
+static int amd_pstate_cpu_boost(int cpu, bool state);
/*
* AMD Energy Preference Performance (EPP)
@@ -738,6 +739,7 @@ static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
if (amd_pstate_global_params.cpb_supported) {
current_pstate_driver->boost_enabled = true;
WRITE_ONCE(cpudata->boost_supported, true);
+ WRITE_ONCE(cpudata->boost_state, true);
}
amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported;
@@ -745,6 +747,7 @@ static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
exit_err:
WRITE_ONCE(cpudata->boost_supported, false);
+ WRITE_ONCE(cpudata->boost_state, false);
current_pstate_driver->boost_enabled = false;
amd_pstate_global_params.cpb_boost = false;
return ret;
@@ -1348,6 +1351,116 @@ static ssize_t prefcore_show(struct device *dev,
return sysfs_emit(buf, "%s\n", str_enabled_disabled(amd_pstate_prefcore));
}
+static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
+{
+ 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);
+ if (ret < 0)
+ pr_debug("Failed to update freq constraint: CPU%d\n", cpudata->cpu);
+ }
+
+ return ret < 0 ? ret : 0;
+}
+
+static int amd_pstate_cpu_boost(int cpu, bool state)
+{
+ int ret;
+ struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
+ struct amd_cpudata *cpudata = policy->driver_data;
+
+ if (!policy) {
+ pr_err("policy is NULL\n");
+ ret = -ENODATA;
+ goto err_exit;
+ }
+
+ ret = amd_pstate_cpu_boost_update(policy, state);
+ refresh_frequency_limits(policy);
+ WRITE_ONCE(cpudata->boost_state, state);
+ policy->boost_enabled = state;
+
+err_exit:
+ cpufreq_cpu_put(policy);
+ return ret < 0 ? ret : 0;
+}
+
+static ssize_t cpb_boost_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sysfs_emit(buf, "%u\n", amd_pstate_global_params.cpb_boost);
+}
+
+static ssize_t cpb_boost_store(struct device *dev, struct device_attribute *b,
+ const char *buf, size_t count)
+{
+ bool new_state;
+ ssize_t ret;
+ int cpu;
+
+ if (!amd_pstate_global_params.cpb_supported) {
+ pr_err("Boost mode is not supported by this processor or SBIOS\n");
+ return -EINVAL;
+ }
+
+ ret = kstrtobool(buf, &new_state);
+ if (ret)
+ return ret;
+
+ mutex_lock(&amd_pstate_driver_lock);
+ for_each_present_cpu(cpu) {
+ ret = amd_pstate_cpu_boost(cpu, new_state);
+ if (ret < 0) {
+ pr_warn("failed to update cpu boost for CPU%d (%zd)\n", cpu, ret);
+ goto err_exit;
+ }
+ }
+ amd_pstate_global_params.cpb_boost = !!new_state;
+
+err_exit:
+ mutex_unlock(&amd_pstate_driver_lock);
+ return ret < 0 ? ret : count;
+}
+
cpufreq_freq_attr_ro(amd_pstate_max_freq);
cpufreq_freq_attr_ro(amd_pstate_lowest_nonlinear_freq);
@@ -1358,6 +1471,7 @@ cpufreq_freq_attr_rw(energy_performance_preference);
cpufreq_freq_attr_ro(energy_performance_available_preferences);
static DEVICE_ATTR_RW(status);
static DEVICE_ATTR_RO(prefcore);
+static DEVICE_ATTR_RW(cpb_boost);
static struct freq_attr *amd_pstate_attr[] = {
&amd_pstate_max_freq,
@@ -1382,6 +1496,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
static struct attribute *pstate_global_attributes[] = {
&dev_attr_status.attr,
&dev_attr_prefcore.attr,
+ &dev_attr_cpb_boost.attr,
NULL
};
@@ -1420,7 +1535,7 @@ static int amd_pstate_init_boost(struct cpufreq_policy *policy)
if (ret)
return ret;
- policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
+ policy->boost_enabled = READ_ONCE(cpudata->boost_state);
return 0;
}
diff --git a/drivers/cpufreq/amd-pstate.h b/drivers/cpufreq/amd-pstate.h
index 0b75a6267fca..9eba854ab7d3 100644
--- a/drivers/cpufreq/amd-pstate.h
+++ b/drivers/cpufreq/amd-pstate.h
@@ -99,6 +99,7 @@ struct amd_cpudata {
u32 policy;
u64 cppc_cap1_cached;
bool suspended;
+ bool boost_state;
};
/**
--
2.34.1
Add support for the set_boost callback in the active mode driver to
enable boost control via the cpufreq core. This ensures a consistent
boost control interface across all pstate modes, including passive
mode, guided mode, and active mode.
With this addition, all three pstate modes can support the same boost
control interface with unique interface and global CPB control. Each
CPU also supports individual boost control, allowing global CPB to
change all cores' boost states simultaneously. Specific CPUs can
update their boost states separately, ensuring all cores' boost
states are synchronized.
Signed-off-by: Perry Yuan <[email protected]>
---
drivers/cpufreq/amd-pstate.c | 18 +++++-------------
1 file changed, 5 insertions(+), 13 deletions(-)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index fe7c9d3562c5..d07f09dd7eab 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -701,20 +701,11 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
pr_err("Boost mode is not supported by this processor or SBIOS\n");
return -ENOTSUPP;
}
+ mutex_lock(&amd_pstate_driver_lock);
+ ret = amd_pstate_cpu_boost(policy->cpu, state);
+ mutex_unlock(&amd_pstate_driver_lock);
- if (state)
- policy->cpuinfo.max_freq = cpudata->max_freq;
- else
- policy->cpuinfo.max_freq = cpudata->nominal_freq * 1000;
-
- policy->max = policy->cpuinfo.max_freq;
-
- ret = freq_qos_update_request(&cpudata->req[1],
- policy->cpuinfo.max_freq);
- if (ret < 0)
- return ret;
-
- return 0;
+ return ret < 0 ? ret : 0;
}
static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
@@ -1875,6 +1866,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = {
.resume = amd_pstate_epp_resume,
.update_limits = amd_pstate_update_limits,
.init_boost = amd_pstate_init_boost,
+ .set_boost = amd_pstate_set_boost,
.name = "amd-pstate-epp",
.attr = amd_pstate_epp_attr,
};
--
2.34.1
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.
Signed-off-by: Perry Yuan <[email protected]>
Acked-by: Huang Rui <[email protected]>
Reviewed-by: Mario Limonciello <[email protected]>
---
drivers/cpufreq/amd-pstate.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index d07f09dd7eab..03e4cf177a5b 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -526,6 +526,7 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
u32 des_perf, u32 max_perf, bool fast_switch, int gov_flags)
{
u64 prev = READ_ONCE(cpudata->cppc_req_cached);
+ u32 nominal_perf = READ_ONCE(cpudata->nominal_perf);
u64 value = prev;
min_perf = clamp_t(unsigned long, min_perf, cpudata->min_limit_perf,
@@ -545,6 +546,10 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
value &= ~AMD_CPPC_DES_PERF(~0L);
value |= AMD_CPPC_DES_PERF(des_perf);
+ /* limit the max perf when core performance boost feature is disabled */
+ if (!amd_pstate_global_params.cpb_boost)
+ max_perf = min_t(unsigned long, nominal_perf, max_perf);
+
value &= ~AMD_CPPC_MAX_PERF(~0L);
value |= AMD_CPPC_MAX_PERF(max_perf);
--
2.34.1
From: Perry Yuan <[email protected]>
Introduce AMD CPU frequency boosting control sysfs entry which used for
switching boost on and boost off.
If core performance boost is disabled while a core is in a boosted P-state,
the core automatically transitions to the highest performance non-boosted P-state
The highest perf and frequency will be limited by the setting value.
Signed-off-by: Perry Yuan <[email protected]>
---
Documentation/admin-guide/pm/amd-pstate.rst | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
index 1e0d101b020a..bcc0d9404c18 100644
--- a/Documentation/admin-guide/pm/amd-pstate.rst
+++ b/Documentation/admin-guide/pm/amd-pstate.rst
@@ -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``
===============================================
--
2.34.1
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.
Signed-off-by: Perry Yuan <[email protected]>
---
Documentation/admin-guide/pm/amd-pstate.rst | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
index bcc0d9404c18..98e43c53c387 100644
--- a/Documentation/admin-guide/pm/amd-pstate.rst
+++ b/Documentation/admin-guide/pm/amd-pstate.rst
@@ -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`.
--
2.34.1
On 6/13/2024 02:25, Perry Yuan wrote:
> Add support for the set_boost callback in the active mode driver to
> enable boost control via the cpufreq core. This ensures a consistent
> boost control interface across all pstate modes, including passive
> mode, guided mode, and active mode.
>
> With this addition, all three pstate modes can support the same boost
> control interface with unique interface and global CPB control. Each
> CPU also supports individual boost control, allowing global CPB to
> change all cores' boost states simultaneously. Specific CPUs can
> update their boost states separately, ensuring all cores' boost
> states are synchronized.
>
> Signed-off-by: Perry Yuan <[email protected]>
> ---
> drivers/cpufreq/amd-pstate.c | 18 +++++-------------
> 1 file changed, 5 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index fe7c9d3562c5..d07f09dd7eab 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -701,20 +701,11 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
> pr_err("Boost mode is not supported by this processor or SBIOS\n");
> return -ENOTSUPP;
> }
> + mutex_lock(&amd_pstate_driver_lock);
> + ret = amd_pstate_cpu_boost(policy->cpu, state);
> + mutex_unlock(&amd_pstate_driver_lock);
>
> - if (state)
> - policy->cpuinfo.max_freq = cpudata->max_freq;
> - else
> - policy->cpuinfo.max_freq = cpudata->nominal_freq * 1000;
> -
> - policy->max = policy->cpuinfo.max_freq;
> -
> - ret = freq_qos_update_request(&cpudata->req[1],
> - policy->cpuinfo.max_freq);
> - if (ret < 0)
> - return ret;
> -
> - return 0;
> + return ret < 0 ? ret : 0;
What's wrong with just doing this instead:
return ret;
> }
>
> static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
> @@ -1875,6 +1866,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = {
> .resume = amd_pstate_epp_resume,
> .update_limits = amd_pstate_update_limits,
> .init_boost = amd_pstate_init_boost,
> + .set_boost = amd_pstate_set_boost,
> .name = "amd-pstate-epp",
> .attr = amd_pstate_epp_attr,
> };
On 6/13/2024 02:25, Perry Yuan wrote:
> 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.
>
> Signed-off-by: Perry Yuan <[email protected]>
Reviewed-by: Mario Limonciello <[email protected]>
> ---
> Documentation/admin-guide/pm/amd-pstate.rst | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
> index bcc0d9404c18..98e43c53c387 100644
> --- a/Documentation/admin-guide/pm/amd-pstate.rst
> +++ b/Documentation/admin-guide/pm/amd-pstate.rst
> @@ -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`.
>
On 6/13/2024 02:25, Perry Yuan wrote:
> From: Perry Yuan <[email protected]>
>
> Introduce AMD CPU frequency boosting control sysfs entry which used for
> switching boost on and boost off.
>
> If core performance boost is disabled while a core is in a boosted P-state,
> the core automatically transitions to the highest performance non-boosted P-state
> The highest perf and frequency will be limited by the setting value.
>
> Signed-off-by: Perry Yuan <[email protected]>
Reviewed-by: Mario Limonciello <[email protected]>
> ---
> Documentation/admin-guide/pm/amd-pstate.rst | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
> index 1e0d101b020a..bcc0d9404c18 100644
> --- a/Documentation/admin-guide/pm/amd-pstate.rst
> +++ b/Documentation/admin-guide/pm/amd-pstate.rst
> @@ -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``
> ===============================================
>
This is the cover letter, so if no other feedback no need to fix up. But
if you need a v12 then typos below.
On 6/13/2024 02:25, Perry Yuan wrote:
> Hi all,
> The patchset series implement CPB(core performance boost) feature for AMD pstate
> driver including passisve ,guide and active mode support.
passive
guided
>
> User can change global core frequency boost control with a new sysfs entry:
>
> "/sys/devices/system/cpu/amd_pstate/cpb_boost"
>
> Now it also support to update indivial CPU boost state in sysfs boost file.
individual
> "/sys/devices/system/cpu/cpuX/cpufreq/boost"
>
> And global control will override the indivial CPU boost state by default.
individual
>
> 1) globally disable core boost:
> $ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> $ lscpu -ae
> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
> 0 0 0 0 0:0:0:0 yes 4201.0000 400.0000 2983.578
> 1 0 0 1 1:1:1:0 yes 4201.0000 400.0000 2983.578
> 2 0 0 2 2:2:2:0 yes 4201.0000 400.0000 2583.855
> 3 0 0 3 3:3:3:0 yes 4201.0000 400.0000 2983.578
> 4 0 0 4 4:4:4:0 yes 4201.0000 400.0000 2983.578
>
> 2) globally enable core boost:
> $ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> $ lscpu -ae
> 0 0 0 0 0:0:0:0 yes 5759.0000 400.0000 2983.578
> 1 0 0 1 1:1:1:0 yes 5759.0000 400.0000 2983.578
> 2 0 0 2 2:2:2:0 yes 5759.0000 400.0000 2983.578
> 3 0 0 3 3:3:3:0 yes 5759.0000 400.0000 2983.578
> 4 0 0 4 4:4:4:0 yes 5759.0000 400.0000 2983.578
>
>
> ============================================================================
> The V9 patches add per CPU boost control, user can enable/disable CPUs boost
> as the below command tested on a laptop system.
> # before
> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
> 0 0 0 0 0:0:0:0 yes 4208.0000 400.0000 1666.7740
> 1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 400.0000
> 2 0 0 1 1:1:1:0 yes 4208.0000 400.0000 3386.1260
> 3 0 0 1 1:1:1:0 yes 4208.0000 400.0000 400.0000
> $ sudo rdmsr 0xc00102b3 -p 0
> 10a6
>
> $ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
> # after
> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
> 0 0 0 0 0:0:0:0 yes 3501.0000 400.0000 400.0000
> 1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 1391.0690
> 2 0 0 1 1:1:1:0 yes 4208.0000 400.0000 3654.4541
> 3 0 0 1 1:1:1:0 yes 4208.0000 400.0000 400.0000
> $ sudo rdmsr 0xc00102b3 -p 0
> 108a
>
> rebasd to keep syncing to Mario kernel tree: bleeding-edge
> https://git.kernel.org/pub/scm/linux/kernel/git/superm1/linux.git
>
> Tested result:
>
> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
> 0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
> 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
> 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
> 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 3110.0000
> 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2732.3569
> 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
> 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
> 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
> 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 2312.2109
> 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
> 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2310.1011
> 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140
>
> sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu11/cpufreq/boost"
> sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu10/cpufreq/boost"
> sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu9/cpufreq/boost"
>
> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
> 0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1242.7240
> 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
> 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2754.5710
> 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2659.8159
> 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2308.9929
> 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
> 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
> 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
> 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
> 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140
> 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140
> 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140
>
> sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
>
> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
> 0 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1233.8630
> 1 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1110.7140
> 2 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2714.4851
> 3 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2732.3569
> 4 0 0 2 2:2:2:0 yes 2801.0000 400.0000 2564.2639
> 5 0 0 2 2:2:2:0 yes 2801.0000 400.0000 1110.7140
> 6 0 0 3 3:3:3:0 yes 2801.0000 400.0000 2732.3569
> 7 0 0 3 3:3:3:0 yes 2801.0000 400.0000 1110.7140
> 8 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1233.8660
> 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140
> 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.6630
> 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.5050
>
> sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
>
> CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ MHZ
> 0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1234.0200
> 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
> 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
> 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
> 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
> 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
> 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2278.8491
> 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2732.3569
> 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
> 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
> 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2353.0449
> 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140
>
>
> Perry.
>
> Changes from v10:
> * rework the boost interface with cpufreq core boost control, align the sysfs file
> created from cpufreq.c and allow indivial CPU boost control (Mario)
> * fix the pr_warn code format with %zd (Oleksandr Natalenko)
> * replace sscanf with kstrtobool for cpufreq.c (new)
> * drop the boost sysfs file creation from amd pstate patch #6
> * add init_boost for cpufreq.c to unify the boost file creation(Mario)
> * add set_boost callback for EPP driver mode
> * fix syncronization issue for indivial boost control and global CPB control, now the
> two control way will keep syncronization after anyone CPU boost state changed.
> * rebased to Mario kernel tree: bleeding-edge
> * run testing on local system, no regression issue found so far.
>
> Changes from v9:
> * change per CPU boost sysfs file name to `boost` (Mario)
> * rebased to latest linux-pm/bleeding-edge
>
> Changes from v8:
> * pick RB flag for patch 4 (Mario)
> * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
> * merge patch 6 into patch 3 (Mario)
> * add two patch for per CPU boost control patch 6 & 7(Mario)
> * rebased to latest linux-pm/bleeding-edge
>
> Changes from v7:
> * fix the mutext locking issue in the sysfs file update(Ray, Mario)
> * pick ack flag from Ray
> * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
> * rerun the testing to check function works well
> * rebased to linux-pm/bleeding-edge latest
>
> Changes from v6:
> * reword patch 2 commit log (Gautham)
> * update cover letter description(Gautham)
> * rebase to kernel v6.9-rc5
>
> Changes from v4:
> * drop the legacy boost remove patch, let us keep the legacy interface
> in case some applications break.
> * rebase to linux-pm/bleeding-edge branch
> * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
> Enhancements which has some intial work done there.
>
> Changes from v4:
> * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> * pick RB flag from Gautham R. Shenoy
> * add Cc Oleksandr Natalenko <[email protected]>
> * rebase to latest linux-pm/bleeding-edge branch
> * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And Enhancements
> * update [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
>
> Changes from v3:
> * rebased to linux-pm/bleeding-edge v6.8
> * rename global to amd_pstate_global_params(Oleksandr Natalenko)
> * remove comments for boot_supported in amd_pstate.h
> * fix the compiler warning for amd-pstate-ut.ko
> * use for_each_online_cpu in cpb_boost_store which fix the null pointer
> error during testing
> * fix the max frequency value to be KHz when cpb boost disabled(Gautham R. Shenoy)
>
> Changes from v2:
> * move global struct to amd-pstate.h
> * fix the amd-pstate-ut with new cpb control interface
>
> Changes from v1:
> * drop suspend/resume fix patch 6/7 because of the fix should be in
> another fix series instead of CPB feature
> * move the set_boost remove patch to the last(Mario)
> * Fix commit info with "Closes:" (Mario)
> * simplified global.cpb_supported initialization(Mario)
> * Add guide mode support for CPB control
> * Fixed some Doc typos and add guide mode info to Doc as well.
>
> v1: https://lore.kernel.org/all/[email protected]/
> v2: https://lore.kernel.org/lkml/[email protected]/
> v3: https://lore.kernel.org/lkml/[email protected]/
> v4: https://lore.kernel.org/lkml/[email protected]/
> v5: https://lore.kernel.org/lkml/[email protected]/
> v6: https://lore.kernel.org/lkml/[email protected]/
> v7: https://lore.kernel.org/lkml/[email protected]/
> v8: https://lore.kernel.org/lkml/[email protected]/
> v9: https://lore.kernel.org/lkml/[email protected]/
> v10: https://lore.kernel.org/lkml/[email protected]/
>
> Perry Yuan (9):
> cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> cpufreq: simplify boolean parsing with kstrtobool in store function
> cpufreq: introduce init_boost callback to initialize boost state for
> pstate drivers
> cpufreq: amd-pstate: initialize new core precision boost state
> cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> cpufreq: amd-pstate: Add set_boost callback for active mode
> cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
> while cpb boost off
> Documentation: cpufreq: amd-pstate: introduce the new cpu boost
> control method
> Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
> control method
>
> Documentation/admin-guide/pm/amd-pstate.rst | 30 +++
> arch/x86/include/asm/msr-index.h | 2 +
> drivers/cpufreq/acpi-cpufreq.c | 2 -
> drivers/cpufreq/amd-pstate-ut.c | 2 +-
> drivers/cpufreq/amd-pstate.c | 197 +++++++++++++++++---
> drivers/cpufreq/amd-pstate.h | 14 ++
> drivers/cpufreq/cpufreq.c | 23 ++-
> include/linux/cpufreq.h | 2 +
> 8 files changed, 237 insertions(+), 35 deletions(-)
>
On 6/13/2024 02:25, Perry Yuan wrote:
> From: Perry Yuan <[email protected]>
>
> With this new sysfs entry `cpb_boost`created, user can change CPU boost
> state dynamically under `active`, `guided` and `passive` modes.
> And the highest perf and frequency will also be updated as the boost
> state changing.
>
> 0): check current boost state
> cat /sys/devices/system/cpu/amd_pstate/cpb_boost
>
> 1): disable CPU boost
> sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
>
> 2): enable CPU boost
> sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=217931
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=217618
> Signed-off-by: Perry Yuan <[email protected]>
> ---
> drivers/cpufreq/amd-pstate-ut.c | 2 +-
> drivers/cpufreq/amd-pstate.c | 117 +++++++++++++++++++++++++++++++-
> drivers/cpufreq/amd-pstate.h | 1 +
> 3 files changed, 118 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/cpufreq/amd-pstate-ut.c b/drivers/cpufreq/amd-pstate-ut.c
> index fc275d41d51e..b528f198f4c3 100644
> --- a/drivers/cpufreq/amd-pstate-ut.c
> +++ b/drivers/cpufreq/amd-pstate-ut.c
> @@ -227,7 +227,7 @@ static void amd_pstate_ut_check_freq(u32 index)
> goto skip_test;
> }
>
> - if (cpudata->boost_supported) {
> + if (amd_pstate_global_params.cpb_boost) {
> if ((policy->max == cpudata->max_freq) ||
> (policy->max == cpudata->nominal_freq))
> amd_pstate_ut_cases[index].result = AMD_PSTATE_UT_RESULT_PASS;
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index 9f42524074a9..fe7c9d3562c5 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -104,6 +104,7 @@ static bool amd_pstate_prefcore = true;
> static struct quirk_entry *quirks;
> struct amd_pstate_global_params amd_pstate_global_params;
> EXPORT_SYMBOL_GPL(amd_pstate_global_params);
> +static int amd_pstate_cpu_boost(int cpu, bool state);
>
> /*
> * AMD Energy Preference Performance (EPP)
> @@ -738,6 +739,7 @@ static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
> if (amd_pstate_global_params.cpb_supported) {
> current_pstate_driver->boost_enabled = true;
> WRITE_ONCE(cpudata->boost_supported, true);
> + WRITE_ONCE(cpudata->boost_state, true);
> }
>
> amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported;
> @@ -745,6 +747,7 @@ static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
>
> exit_err:
> WRITE_ONCE(cpudata->boost_supported, false);
> + WRITE_ONCE(cpudata->boost_state, false);
> current_pstate_driver->boost_enabled = false;
> amd_pstate_global_params.cpb_boost = false;
> return ret;
> @@ -1348,6 +1351,116 @@ static ssize_t prefcore_show(struct device *dev,
> return sysfs_emit(buf, "%s\n", str_enabled_disabled(amd_pstate_prefcore));
> }
>
> +static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
> +{
> + struct amd_cpudata *cpudata = policy->driver_data;
> + struct cppc_perf_ctrls perf_ctrls;
> + u32 highest_perf, nominal_perf, nominal_freq, max_freq;
> + int ret;
> +
> + if (!policy) {
> + pr_err("policy is null\n");
> + return -ENODATA;
> + }
This is dead code that can't possibly be hit, because there would be a
NULL pointer dereference above for this line:
struct amd_cpudata *cpudata = policy->driver_data;
Furthermore, the caller for this function, amd_pstate_cpu_boost() has
the same check already.
So drop the check here.
> +
> + highest_perf = READ_ONCE(cpudata->highest_perf);
> + nominal_perf = READ_ONCE(cpudata->nominal_perf);
> + nominal_freq = READ_ONCE(cpudata->nominal_freq);
> + max_freq = READ_ONCE(cpudata->max_freq);
> +
> + if (boot_cpu_has(X86_FEATURE_CPPC)) {
> + u64 value = READ_ONCE(cpudata->cppc_req_cached);
> +
> + value &= ~GENMASK_ULL(7, 0);
> + value |= on ? highest_perf : nominal_perf;
> + WRITE_ONCE(cpudata->cppc_req_cached, value);
> +
> + wrmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ, value);
> + } else {
> + perf_ctrls.max_perf = on ? highest_perf : nominal_perf;
> + ret = cppc_set_epp_perf(cpudata->cpu, &perf_ctrls, 1);
> + if (ret) {
> + cpufreq_cpu_release(policy);
> + pr_debug("failed to set energy perf value (%d)\n", ret);
> + return ret;
> + }
> + }
> +
> + if (on)
> + policy->cpuinfo.max_freq = max_freq;
> + else
> + policy->cpuinfo.max_freq = nominal_freq * 1000;
> +
> + policy->max = policy->cpuinfo.max_freq;
> +
> + if (cppc_state == AMD_PSTATE_PASSIVE) {
> + ret = freq_qos_update_request(&cpudata->req[1], policy->cpuinfo.max_freq);
> + if (ret < 0)
> + pr_debug("Failed to update freq constraint: CPU%d\n", cpudata->cpu);
> + }
> +
> + return ret < 0 ? ret : 0;
> +}
> +
> +static int amd_pstate_cpu_boost(int cpu, bool state)
> +{
> + int ret;
> + struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
> + struct amd_cpudata *cpudata = policy->driver_data;
> +
> + if (!policy) {
> + pr_err("policy is NULL\n");
> + ret = -ENODATA;
> + goto err_exit;
> + }
> +
> + ret = amd_pstate_cpu_boost_update(policy, state);
> + refresh_frequency_limits(policy);
> + WRITE_ONCE(cpudata->boost_state, state);
> + policy->boost_enabled = state;
> +
> +err_exit:
> + cpufreq_cpu_put(policy);
> + return ret < 0 ? ret : 0;
> +}
> +
> +static ssize_t cpb_boost_show(struct device *dev,
> + struct device_attribute *attr, char *buf)
> +{
> + return sysfs_emit(buf, "%u\n", amd_pstate_global_params.cpb_boost);
> +}
> +
> +static ssize_t cpb_boost_store(struct device *dev, struct device_attribute *b,
> + const char *buf, size_t count)
> +{
> + bool new_state;
> + ssize_t ret;
> + int cpu;
> +
> + if (!amd_pstate_global_params.cpb_supported) {
> + pr_err("Boost mode is not supported by this processor or SBIOS\n");
> + return -EINVAL;
> + }
> +
> + ret = kstrtobool(buf, &new_state);
> + if (ret)
> + return ret;
> +
> + mutex_lock(&amd_pstate_driver_lock);
> + for_each_present_cpu(cpu) {
> + ret = amd_pstate_cpu_boost(cpu, new_state);
> + if (ret < 0) {
> + pr_warn("failed to update cpu boost for CPU%d (%zd)\n", cpu, ret);
> + goto err_exit;
> + }
> + }
> + amd_pstate_global_params.cpb_boost = !!new_state;
> +
> +err_exit:
> + mutex_unlock(&amd_pstate_driver_lock);
> + return ret < 0 ? ret : count;
> +}
> +
> cpufreq_freq_attr_ro(amd_pstate_max_freq);
> cpufreq_freq_attr_ro(amd_pstate_lowest_nonlinear_freq);
>
> @@ -1358,6 +1471,7 @@ cpufreq_freq_attr_rw(energy_performance_preference);
> cpufreq_freq_attr_ro(energy_performance_available_preferences);
> static DEVICE_ATTR_RW(status);
> static DEVICE_ATTR_RO(prefcore);
> +static DEVICE_ATTR_RW(cpb_boost);
>
> static struct freq_attr *amd_pstate_attr[] = {
> &amd_pstate_max_freq,
> @@ -1382,6 +1496,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
> static struct attribute *pstate_global_attributes[] = {
> &dev_attr_status.attr,
> &dev_attr_prefcore.attr,
> + &dev_attr_cpb_boost.attr,
> NULL
> };
>
> @@ -1420,7 +1535,7 @@ static int amd_pstate_init_boost(struct cpufreq_policy *policy)
> if (ret)
> return ret;
>
> - policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
> + policy->boost_enabled = READ_ONCE(cpudata->boost_state);
>
> return 0;
> }
> diff --git a/drivers/cpufreq/amd-pstate.h b/drivers/cpufreq/amd-pstate.h
> index 0b75a6267fca..9eba854ab7d3 100644
> --- a/drivers/cpufreq/amd-pstate.h
> +++ b/drivers/cpufreq/amd-pstate.h
> @@ -99,6 +99,7 @@ struct amd_cpudata {
> u32 policy;
> u64 cppc_cap1_cached;
> bool suspended;
> + bool boost_state;
> };
>
> /**
On 6/13/2024 02:25, Perry Yuan wrote:
> 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
>
> Reported-by: Artem S. Tashkinov" <[email protected]>
> Cc: Oleksandr Natalenko <[email protected]>
> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217931
> Signed-off-by: Perry Yuan <[email protected]>
> ---
> drivers/cpufreq/amd-pstate.c | 59 +++++++++++++++++++++++++++++-------
> drivers/cpufreq/amd-pstate.h | 13 ++++++++
> 2 files changed, 61 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index fda8f86c90e0..9f42524074a9 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -102,6 +102,8 @@ static int cppc_state = AMD_PSTATE_UNDEFINED;
> static bool cppc_enabled;
> static bool amd_pstate_prefcore = true;
> static struct quirk_entry *quirks;
> +struct amd_pstate_global_params amd_pstate_global_params;
> +EXPORT_SYMBOL_GPL(amd_pstate_global_params);
>
> /*
> * AMD Energy Preference Performance (EPP)
> @@ -696,7 +698,7 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
>
> if (!cpudata->boost_supported) {
> pr_err("Boost mode is not supported by this processor or SBIOS\n");
> - return -EINVAL;
> + return -ENOTSUPP;
> }
>
> if (state)
> @@ -714,18 +716,38 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
> return 0;
> }
>
> -static void amd_pstate_boost_init(struct amd_cpudata *cpudata)
> +static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
> {
> - u32 highest_perf, nominal_perf;
> + u64 boost_val;
> + int ret = -1;
>
> - highest_perf = READ_ONCE(cpudata->highest_perf);
> - nominal_perf = READ_ONCE(cpudata->nominal_perf);
> + if (!cpu_feature_enabled(X86_FEATURE_CPB)) {
> + pr_debug_once("Boost CPB capabilities not present in the processor\n");
> + ret = -EOPNOTSUPP;
> + goto exit_err;
> + }
>
> - if (highest_perf <= nominal_perf)
> - return;
> + ret = rdmsrl_on_cpu(cpudata->cpu, MSR_K7_HWCR, &boost_val);
> + if (ret) {
> + pr_err_once("failed to read initial CPU boost state!\n");
> + ret = -EIO;
> + goto exit_err;
> + }
> +
> + amd_pstate_global_params.cpb_supported = !(boost_val & MSR_K7_HWCR_CPB_DIS);
> + if (amd_pstate_global_params.cpb_supported) {
> + current_pstate_driver->boost_enabled = true;
> + WRITE_ONCE(cpudata->boost_supported, true);
> + }
>
> - cpudata->boost_supported = true;
> - current_pstate_driver->boost_enabled = true;
> + amd_pstate_global_params.cpb_boost = amd_pstate_global_params.cpb_supported;
> + return 0;
> +
> +exit_err:
> + WRITE_ONCE(cpudata->boost_supported, false);
> + current_pstate_driver->boost_enabled = false;
> + amd_pstate_global_params.cpb_boost = false;
> + return ret;
> }
>
> static void amd_perf_ctl_reset(unsigned int cpu)
> @@ -1007,7 +1029,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
>
> policy->driver_data = cpudata;
>
> - amd_pstate_boost_init(cpudata);
> if (!current_pstate_driver->adjust_perf)
> current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
>
> @@ -1389,6 +1410,21 @@ static bool amd_pstate_acpi_pm_profile_undefined(void)
> return false;
> }
>
> +static int amd_pstate_init_boost(struct cpufreq_policy *policy)
> +{
> + struct amd_cpudata *cpudata = policy->driver_data;
> + int ret;
> +
> + /* initialize cpu cores boot state */
> + ret = amd_pstate_boost_set(cpudata);
> + if (ret)
> + return ret;
> +
> + policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
Because of the change I suggested in patch 3/9, I believe you should
move the check for
if (!cpudata->boost_supported)
from amd_pstate_boost_set() to the beginning of amd_pstate_init_boost().
Something like this:
static int amd_pstate_init_boost(struct cpufreq_policy *policy)
{
struct amd_cpudata *cpudata = policy->driver_data;
int ret;
if (!cpudata->boost_supported) {
policy->boost_enabled = false;
return 0;
}
ret = amd_pstate_boost_set(cpudata);
if (ret)
return ret;
policy->boost_enabled = true;
return ret;
}
> +
> + return 0;
> +}
> +
> static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
> {
> int min_freq, max_freq, nominal_freq, ret;
> @@ -1467,7 +1503,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
> return ret;
> WRITE_ONCE(cpudata->cppc_cap1_cached, value);
> }
> - amd_pstate_boost_init(cpudata);
>
> return 0;
>
> @@ -1706,6 +1741,7 @@ static struct cpufreq_driver amd_pstate_driver = {
> .exit = amd_pstate_cpu_exit,
> .suspend = amd_pstate_cpu_suspend,
> .resume = amd_pstate_cpu_resume,
> + .init_boost = amd_pstate_init_boost,
> .set_boost = amd_pstate_set_boost,
> .update_limits = amd_pstate_update_limits,
> .name = "amd-pstate",
> @@ -1723,6 +1759,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = {
> .suspend = amd_pstate_epp_suspend,
> .resume = amd_pstate_epp_resume,
> .update_limits = amd_pstate_update_limits,
> + .init_boost = amd_pstate_init_boost,
> .name = "amd-pstate-epp",
> .attr = amd_pstate_epp_attr,
> };
> diff --git a/drivers/cpufreq/amd-pstate.h b/drivers/cpufreq/amd-pstate.h
> index e6a28e7f4dbf..0b75a6267fca 100644
> --- a/drivers/cpufreq/amd-pstate.h
> +++ b/drivers/cpufreq/amd-pstate.h
> @@ -101,4 +101,17 @@ struct amd_cpudata {
> bool suspended;
> };
>
> +/**
> + * struct amd_pstate_global_params - Global parameters, mostly tunable via sysfs.
> + * @cpb_boost: Whether or not to use boost CPU P-states.
> + * @cpb_supported: Whether or not CPU boost P-states are available
> + * based on the MSR_K7_HWCR bit[25] state
> + */
> +struct amd_pstate_global_params {
> + bool cpb_boost;
> + bool cpb_supported;
> +};
> +
> +extern struct amd_pstate_global_params amd_pstate_global_params;
> +
> #endif /* _LINUX_AMD_PSTATE_H */
On 6/13/2024 02:25, Perry Yuan wrote:
> Introduce a new init_boost callback in cpufreq to initialize the boost
> state for specific pstate drivers. This initialization is required before
> calling the set_boost interface for each CPU.
>
> The init_boost callback will set up and synchronize each CPU's current
> boost state before invoking the set_boost function. Without this step,
> the boost state may be inconsistent across CPUs.
>
> Signed-off-by: Perry Yuan <[email protected]>
> ---
> drivers/cpufreq/cpufreq.c | 12 ++++++++++--
> include/linux/cpufreq.h | 2 ++
> 2 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 1fdabb660231..e1a4730f4f8c 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -1429,8 +1429,16 @@ static int cpufreq_online(unsigned int cpu)
> goto out_free_policy;
> }
>
> - /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
> - policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy);
> + /* init boost state to prepare set_boost callback for each CPU */
> + if (cpufreq_driver->init_boost) {
> + ret = cpufreq_driver->init_boost(policy);
> + if (ret)
> + pr_debug("%s: %d: initialization boost failed\n", __func__,
> + __LINE__);
The message should have the subject at the beginning. IE:
"boost initialization failed\n"
Also, isn't this fatal if init failed? IE shouldn't failing have a:
goto out_free_policy;
> + } else {
> + /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
> + policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy);
> + }
>
> /*
> * The initialization has succeeded and the policy is online.
> diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
> index 20f7e98ee8af..0698c0292d8f 100644
> --- a/include/linux/cpufreq.h
> +++ b/include/linux/cpufreq.h
> @@ -409,6 +409,8 @@ struct cpufreq_driver {
> bool boost_enabled;
> int (*set_boost)(struct cpufreq_policy *policy, int state);
>
> + /* initialize boost state to be consistent before calling set_boost */
> + int (*init_boost)(struct cpufreq_policy *policy);
> /*
> * Set by drivers that want to register with the energy model after the
> * policy is properly initialized, but before the governor is started.
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Limonciello, Mario <[email protected]>
> Sent: Friday, June 14, 2024 1:53 AM
> To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal
> <[email protected]>; Petkov, Borislav <[email protected]>
> Cc: [email protected]; [email protected]; Deucher, Alexander
> <[email protected]>; Huang, Shimmer
> <[email protected]>; Du, Xiaojian <[email protected]>; Meng,
> Li (Jassmine) <[email protected]>; [email protected]; linux-
> [email protected]
> Subject: Re: [PATCH v11 6/9] cpufreq: amd-pstate: Add set_boost callback for
> active mode
>
> On 6/13/2024 02:25, Perry Yuan wrote:
> > Add support for the set_boost callback in the active mode driver to
> > enable boost control via the cpufreq core. This ensures a consistent
> > boost control interface across all pstate modes, including passive
> > mode, guided mode, and active mode.
> >
> > With this addition, all three pstate modes can support the same boost
> > control interface with unique interface and global CPB control. Each
> > CPU also supports individual boost control, allowing global CPB to
> > change all cores' boost states simultaneously. Specific CPUs can
> > update their boost states separately, ensuring all cores' boost states
> > are synchronized.
> >
> > Signed-off-by: Perry Yuan <[email protected]>
> > ---
> > drivers/cpufreq/amd-pstate.c | 18 +++++-------------
> > 1 file changed, 5 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/cpufreq/amd-pstate.c
> > b/drivers/cpufreq/amd-pstate.c index fe7c9d3562c5..d07f09dd7eab
> 100644
> > --- a/drivers/cpufreq/amd-pstate.c
> > +++ b/drivers/cpufreq/amd-pstate.c
> > @@ -701,20 +701,11 @@ static int amd_pstate_set_boost(struct
> cpufreq_policy *policy, int state)
> > pr_err("Boost mode is not supported by this processor or
> SBIOS\n");
> > return -ENOTSUPP;
> > }
> > + mutex_lock(&amd_pstate_driver_lock);
> > + ret = amd_pstate_cpu_boost(policy->cpu, state);
> > + mutex_unlock(&amd_pstate_driver_lock);
> >
> > - if (state)
> > - policy->cpuinfo.max_freq = cpudata->max_freq;
> > - else
> > - policy->cpuinfo.max_freq = cpudata->nominal_freq * 1000;
> > -
> > - policy->max = policy->cpuinfo.max_freq;
> > -
> > - ret = freq_qos_update_request(&cpudata->req[1],
> > - policy->cpuinfo.max_freq);
> > - if (ret < 0)
> > - return ret;
> > -
> > - return 0;
> > + return ret < 0 ? ret : 0;
>
> What's wrong with just doing this instead:
>
> return ret;
/**
* freq_qos_update_request - Modify existing frequency QoS request.
* @req: Request to modify.
* @new_value: New request value.
*
* Update an existing frequency QoS request along with the effective constraint
* value for the list of requests it belongs to.
*
* Return 1 if the effective constraint value has changed, 0 if the effective
* constraint value has not changed, or a negative error code on failures.
*/
int freq_qos_update_request(struct freq_qos_request *req, s32 new_value)
The effective return value from freq_qos_update_request will be "1", we expect the return value to be -1 or 0 in the code path,
0 is the successful return value passed to caller.
Perry.
>
> > }
> >
> > static int amd_pstate_boost_set(struct amd_cpudata *cpudata) @@
> > -1875,6 +1866,7 @@ static struct cpufreq_driver amd_pstate_epp_driver =
> {
> > .resume = amd_pstate_epp_resume,
> > .update_limits = amd_pstate_update_limits,
> > .init_boost = amd_pstate_init_boost,
> > + .set_boost = amd_pstate_set_boost,
> > .name = "amd-pstate-epp",
> > .attr = amd_pstate_epp_attr,
> > };
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Limonciello, Mario <[email protected]>
> Sent: Friday, June 14, 2024 1:55 AM
> To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal
> <[email protected]>; Petkov, Borislav <[email protected]>
> Cc: [email protected]; [email protected]; Deucher, Alexander
> <[email protected]>; Huang, Shimmer
> <[email protected]>; Du, Xiaojian <[email protected]>; Meng,
> Li (Jassmine) <[email protected]>; [email protected]; linux-
> [email protected]
> Subject: Re: [PATCH v11 5/9] cpufreq: amd-pstate: implement cpb_boost
> sysfs entry for boost control
>
> On 6/13/2024 02:25, Perry Yuan wrote:
> > From: Perry Yuan <[email protected]>
> >
> > With this new sysfs entry `cpb_boost`created, user can change CPU
> > boost state dynamically under `active`, `guided` and `passive` modes.
> > And the highest perf and frequency will also be updated as the boost
> > state changing.
> >
> > 0): check current boost state
> > cat /sys/devices/system/cpu/amd_pstate/cpb_boost
> >
> > 1): disable CPU boost
> > sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> >
> > 2): enable CPU boost
> > sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> >
> > Link: https://bugzilla.kernel.org/show_bug.cgi?id=217931
> > Link: https://bugzilla.kernel.org/show_bug.cgi?id=217618
> > Signed-off-by: Perry Yuan <[email protected]>
> > ---
> > drivers/cpufreq/amd-pstate-ut.c | 2 +-
> > drivers/cpufreq/amd-pstate.c | 117
> +++++++++++++++++++++++++++++++-
> > drivers/cpufreq/amd-pstate.h | 1 +
> > 3 files changed, 118 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/cpufreq/amd-pstate-ut.c
> > b/drivers/cpufreq/amd-pstate-ut.c index fc275d41d51e..b528f198f4c3
> > 100644
> > --- a/drivers/cpufreq/amd-pstate-ut.c
> > +++ b/drivers/cpufreq/amd-pstate-ut.c
> > @@ -227,7 +227,7 @@ static void amd_pstate_ut_check_freq(u32 index)
> > goto skip_test;
> > }
> >
> > - if (cpudata->boost_supported) {
> > + if (amd_pstate_global_params.cpb_boost) {
> > if ((policy->max == cpudata->max_freq) ||
> > (policy->max == cpudata-
> >nominal_freq))
> > amd_pstate_ut_cases[index].result =
> AMD_PSTATE_UT_RESULT_PASS;
> > diff --git a/drivers/cpufreq/amd-pstate.c
> > b/drivers/cpufreq/amd-pstate.c index 9f42524074a9..fe7c9d3562c5 100644
> > --- a/drivers/cpufreq/amd-pstate.c
> > +++ b/drivers/cpufreq/amd-pstate.c
> > @@ -104,6 +104,7 @@ static bool amd_pstate_prefcore = true;
> > static struct quirk_entry *quirks;
> > struct amd_pstate_global_params amd_pstate_global_params;
> > EXPORT_SYMBOL_GPL(amd_pstate_global_params);
> > +static int amd_pstate_cpu_boost(int cpu, bool state);
> >
> > /*
> > * AMD Energy Preference Performance (EPP) @@ -738,6 +739,7 @@
> > static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
> > if (amd_pstate_global_params.cpb_supported) {
> > current_pstate_driver->boost_enabled = true;
> > WRITE_ONCE(cpudata->boost_supported, true);
> > + WRITE_ONCE(cpudata->boost_state, true);
> > }
> >
> > amd_pstate_global_params.cpb_boost =
> > amd_pstate_global_params.cpb_supported;
> > @@ -745,6 +747,7 @@ static int amd_pstate_boost_set(struct
> amd_cpudata
> > *cpudata)
> >
> > exit_err:
> > WRITE_ONCE(cpudata->boost_supported, false);
> > + WRITE_ONCE(cpudata->boost_state, false);
> > current_pstate_driver->boost_enabled = false;
> > amd_pstate_global_params.cpb_boost = false;
> > return ret;
> > @@ -1348,6 +1351,116 @@ static ssize_t prefcore_show(struct device
> *dev,
> > return sysfs_emit(buf, "%s\n",
> str_enabled_disabled(amd_pstate_prefcore));
> > }
> >
> > +static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy,
> > +bool on) {
> > + struct amd_cpudata *cpudata = policy->driver_data;
> > + struct cppc_perf_ctrls perf_ctrls;
> > + u32 highest_perf, nominal_perf, nominal_freq, max_freq;
> > + int ret;
> > +
> > + if (!policy) {
> > + pr_err("policy is null\n");
> > + return -ENODATA;
> > + }
>
> This is dead code that can't possibly be hit, because there would be a NULL
> pointer dereference above for this line:
>
> struct amd_cpudata *cpudata = policy->driver_data;
>
> Furthermore, the caller for this function, amd_pstate_cpu_boost() has the
> same check already.
>
> So drop the check here.
Will improve the checking code in v12.
Thanks for the feedback.
>
> > +
> > + highest_perf = READ_ONCE(cpudata->highest_perf);
> > + nominal_perf = READ_ONCE(cpudata->nominal_perf);
> > + nominal_freq = READ_ONCE(cpudata->nominal_freq);
> > + max_freq = READ_ONCE(cpudata->max_freq);
> > +
> > + if (boot_cpu_has(X86_FEATURE_CPPC)) {
> > + u64 value = READ_ONCE(cpudata->cppc_req_cached);
> > +
> > + value &= ~GENMASK_ULL(7, 0);
> > + value |= on ? highest_perf : nominal_perf;
> > + WRITE_ONCE(cpudata->cppc_req_cached, value);
> > +
> > + wrmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ, value);
> > + } else {
> > + perf_ctrls.max_perf = on ? highest_perf : nominal_perf;
> > + ret = cppc_set_epp_perf(cpudata->cpu, &perf_ctrls, 1);
> > + if (ret) {
> > + cpufreq_cpu_release(policy);
> > + pr_debug("failed to set energy perf value (%d)\n",
> ret);
> > + return ret;
> > + }
> > + }
> > +
> > + if (on)
> > + policy->cpuinfo.max_freq = max_freq;
> > + else
> > + policy->cpuinfo.max_freq = nominal_freq * 1000;
> > +
> > + policy->max = policy->cpuinfo.max_freq;
> > +
> > + if (cppc_state == AMD_PSTATE_PASSIVE) {
> > + ret = freq_qos_update_request(&cpudata->req[1], policy-
> >cpuinfo.max_freq);
> > + if (ret < 0)
> > + pr_debug("Failed to update freq constraint:
> CPU%d\n", cpudata->cpu);
> > + }
> > +
> > + return ret < 0 ? ret : 0;
> > +}
> > +
> > +static int amd_pstate_cpu_boost(int cpu, bool state) {
> > + int ret;
> > + struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
> > + struct amd_cpudata *cpudata = policy->driver_data;
> > +
> > + if (!policy) {
> > + pr_err("policy is NULL\n");
> > + ret = -ENODATA;
> > + goto err_exit;
> > + }
> > +
> > + ret = amd_pstate_cpu_boost_update(policy, state);
> > + refresh_frequency_limits(policy);
> > + WRITE_ONCE(cpudata->boost_state, state);
> > + policy->boost_enabled = state;
> > +
> > +err_exit:
> > + cpufreq_cpu_put(policy);
> > + return ret < 0 ? ret : 0;
> > +}
> > +
> > +static ssize_t cpb_boost_show(struct device *dev,
> > + struct device_attribute *attr, char *buf) {
> > + return sysfs_emit(buf, "%u\n",
> amd_pstate_global_params.cpb_boost);
> > +}
> > +
> > +static ssize_t cpb_boost_store(struct device *dev, struct device_attribute
> *b,
> > + const char *buf, size_t count) {
> > + bool new_state;
> > + ssize_t ret;
> > + int cpu;
> > +
> > + if (!amd_pstate_global_params.cpb_supported) {
> > + pr_err("Boost mode is not supported by this processor or
> SBIOS\n");
> > + return -EINVAL;
> > + }
> > +
> > + ret = kstrtobool(buf, &new_state);
> > + if (ret)
> > + return ret;
> > +
> > + mutex_lock(&amd_pstate_driver_lock);
> > + for_each_present_cpu(cpu) {
> > + ret = amd_pstate_cpu_boost(cpu, new_state);
> > + if (ret < 0) {
> > + pr_warn("failed to update cpu boost for CPU%d
> (%zd)\n", cpu, ret);
> > + goto err_exit;
> > + }
> > + }
> > + amd_pstate_global_params.cpb_boost = !!new_state;
> > +
> > +err_exit:
> > + mutex_unlock(&amd_pstate_driver_lock);
> > + return ret < 0 ? ret : count;
> > +}
> > +
> > cpufreq_freq_attr_ro(amd_pstate_max_freq);
> > cpufreq_freq_attr_ro(amd_pstate_lowest_nonlinear_freq);
> >
> > @@ -1358,6 +1471,7 @@
> cpufreq_freq_attr_rw(energy_performance_preference);
> > cpufreq_freq_attr_ro(energy_performance_available_preferences);
> > static DEVICE_ATTR_RW(status);
> > static DEVICE_ATTR_RO(prefcore);
> > +static DEVICE_ATTR_RW(cpb_boost);
> >
> > static struct freq_attr *amd_pstate_attr[] = {
> > &amd_pstate_max_freq,
> > @@ -1382,6 +1496,7 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
> > static struct attribute *pstate_global_attributes[] = {
> > &dev_attr_status.attr,
> > &dev_attr_prefcore.attr,
> > + &dev_attr_cpb_boost.attr,
> > NULL
> > };
> >
> > @@ -1420,7 +1535,7 @@ static int amd_pstate_init_boost(struct
> cpufreq_policy *policy)
> > if (ret)
> > return ret;
> >
> > - policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
> > + policy->boost_enabled = READ_ONCE(cpudata->boost_state);
> >
> > return 0;
> > }
> > diff --git a/drivers/cpufreq/amd-pstate.h
> > b/drivers/cpufreq/amd-pstate.h index 0b75a6267fca..9eba854ab7d3
> 100644
> > --- a/drivers/cpufreq/amd-pstate.h
> > +++ b/drivers/cpufreq/amd-pstate.h
> > @@ -99,6 +99,7 @@ struct amd_cpudata {
> > u32 policy;
> > u64 cppc_cap1_cached;
> > bool suspended;
> > + bool boost_state;
> > };
> >
> > /**
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Limonciello, Mario <[email protected]>
> Sent: Friday, June 14, 2024 1:55 AM
> To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal
> <[email protected]>; Petkov, Borislav <[email protected]>
> Cc: [email protected]; [email protected]; Deucher, Alexander
> <[email protected]>; Huang, Shimmer
> <[email protected]>; Du, Xiaojian <[email protected]>; Meng,
> Li (Jassmine) <[email protected]>; [email protected]; linux-
> [email protected]
> Subject: Re: [PATCH v11 3/9] cpufreq: introduce init_boost callback to
> initialize boost state for pstate drivers
>
> On 6/13/2024 02:25, Perry Yuan wrote:
> > Introduce a new init_boost callback in cpufreq to initialize the boost
> > state for specific pstate drivers. This initialization is required
> > before calling the set_boost interface for each CPU.
> >
> > The init_boost callback will set up and synchronize each CPU's current
> > boost state before invoking the set_boost function. Without this step,
> > the boost state may be inconsistent across CPUs.
> >
> > Signed-off-by: Perry Yuan <[email protected]>
> > ---
> > drivers/cpufreq/cpufreq.c | 12 ++++++++++--
> > include/linux/cpufreq.h | 2 ++
> > 2 files changed, 12 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 1fdabb660231..e1a4730f4f8c 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -1429,8 +1429,16 @@ static int cpufreq_online(unsigned int cpu)
> > goto out_free_policy;
> > }
> >
> > - /* Let the per-policy boost flag mirror the cpufreq_driver
> boost during init */
> > - policy->boost_enabled = cpufreq_boost_enabled() &&
> policy_has_boost_freq(policy);
> > + /* init boost state to prepare set_boost callback for each CPU
> */
> > + if (cpufreq_driver->init_boost) {
> > + ret = cpufreq_driver->init_boost(policy);
> > + if (ret)
> > + pr_debug("%s: %d: initialization boost
> failed\n", __func__,
> > + __LINE__);
>
> The message should have the subject at the beginning. IE:
>
> "boost initialization failed\n"
>
> Also, isn't this fatal if init failed? IE shouldn't failing have a:
Firstly, I also add the " goto out_free_policy", and removed later, because I think it is a little risky to fail the whole online process if driver init boost callback failed.
If driver init boost failed, it just let boost control function lost, but online initialize failed and go to free the policy, it is a big problem.
I am ok to add the error handling if maintainer agree to see the potential online function aborting. ????
Perry.
>
> goto out_free_policy;
>
> > + } else {
> > + /* Let the per-policy boost flag mirror the
> cpufreq_driver boost during init */
> > + policy->boost_enabled = cpufreq_boost_enabled()
> && policy_has_boost_freq(policy);
> > + }
> >
> > /*
> > * The initialization has succeeded and the policy is online.
> > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index
> > 20f7e98ee8af..0698c0292d8f 100644
> > --- a/include/linux/cpufreq.h
> > +++ b/include/linux/cpufreq.h
> > @@ -409,6 +409,8 @@ struct cpufreq_driver {
> > bool boost_enabled;
> > int (*set_boost)(struct cpufreq_policy *policy, int state);
> >
> > + /* initialize boost state to be consistent before calling set_boost */
> > + int (*init_boost)(struct cpufreq_policy *policy);
> > /*
> > * Set by drivers that want to register with the energy model after the
> > * policy is properly initialized, but before the governor is started.
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Limonciello, Mario <[email protected]>
> Sent: Friday, June 14, 2024 1:54 AM
> To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal
> <[email protected]>; Petkov, Borislav <[email protected]>
> Cc: [email protected]; [email protected]; Deucher, Alexander
> <[email protected]>; Huang, Shimmer
> <[email protected]>; Du, Xiaojian <[email protected]>; Meng,
> Li (Jassmine) <[email protected]>; [email protected]; linux-
> [email protected]
> Subject: Re: [PATCH v11 0/9] AMD Pstate Driver Core Performance Boost
>
> This is the cover letter, so if no other feedback no need to fix up. But if you
> need a v12 then typos below.
Thank you Mario, will get this done in v12.
>
> On 6/13/2024 02:25, Perry Yuan wrote:
> > Hi all,
> > The patchset series implement CPB(core performance boost) feature for
> > AMD pstate driver including passisve ,guide and active mode support.
>
> passive
> guided
>
> >
> > User can change global core frequency boost control with a new sysfs
> entry:
> >
> > "/sys/devices/system/cpu/amd_pstate/cpb_boost"
> >
> > Now it also support to update indivial CPU boost state in sysfs boost file.
>
> individual
>
> > "/sys/devices/system/cpu/cpuX/cpufreq/boost"
> >
> > And global control will override the indivial CPU boost state by default.
>
> individual
>
> >
> > 1) globally disable core boost:
> > $ sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > $ lscpu -ae
> > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
> MHZ
> > 0 0 0 0 0:0:0:0 yes 4201.0000 400.0000 2983.578
> > 1 0 0 1 1:1:1:0 yes 4201.0000 400.0000 2983.578
> > 2 0 0 2 2:2:2:0 yes 4201.0000 400.0000 2583.855
> > 3 0 0 3 3:3:3:0 yes 4201.0000 400.0000 2983.578
> > 4 0 0 4 4:4:4:0 yes 4201.0000 400.0000 2983.578
> >
> > 2) globally enable core boost:
> > $ sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> > $ lscpu -ae
> > 0 0 0 0 0:0:0:0 yes 5759.0000 400.0000 2983.578
> > 1 0 0 1 1:1:1:0 yes 5759.0000 400.0000 2983.578
> > 2 0 0 2 2:2:2:0 yes 5759.0000 400.0000 2983.578
> > 3 0 0 3 3:3:3:0 yes 5759.0000 400.0000 2983.578
> > 4 0 0 4 4:4:4:0 yes 5759.0000 400.0000 2983.578
> >
> >
> >
> ===============================================================
> =======
> > ====== The V9 patches add per CPU boost control, user can
> > enable/disable CPUs boost as the below command tested on a laptop
> > system.
> > # before
> > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
> MHZ
> > 0 0 0 0 0:0:0:0 yes 4208.0000 400.0000 1666.7740
> > 1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 400.0000
> > 2 0 0 1 1:1:1:0 yes 4208.0000 400.0000 3386.1260
> > 3 0 0 1 1:1:1:0 yes 4208.0000 400.0000 400.0000
> > $ sudo rdmsr 0xc00102b3 -p 0
> > 10a6
> >
> > $ sudo bash -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/boost"
> > # after
> > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
> MHZ
> > 0 0 0 0 0:0:0:0 yes 3501.0000 400.0000 400.0000
> > 1 0 0 0 0:0:0:0 yes 4208.0000 400.0000 1391.0690
> > 2 0 0 1 1:1:1:0 yes 4208.0000 400.0000 3654.4541
> > 3 0 0 1 1:1:1:0 yes 4208.0000 400.0000 400.0000
> > $ sudo rdmsr 0xc00102b3 -p 0
> > 108a
> >
> > rebasd to keep syncing to Mario kernel tree: bleeding-edge
> > https://git.kernel.org/pub/scm/linux/kernel/git/superm1/linux.git
> >
> > Tested result:
> >
> > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
> MHZ
> > 0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
> > 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
> > 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
> > 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 3110.0000
> > 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2732.3569
> > 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
> > 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
> > 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
> > 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 2312.2109
> > 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
> > 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2310.1011
> > 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140
> >
> > sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu11/cpufreq/boost"
> > sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu10/cpufreq/boost"
> > sudo bash -c "echo 0 > /sys/devices/system/cpu/cpu9/cpufreq/boost"
> >
> > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
> MHZ
> > 0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1242.7240
> > 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
> > 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2754.5710
> > 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 2659.8159
> > 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 2308.9929
> > 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
> > 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
> > 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 1110.7140
> > 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
> > 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140
> > 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140
> > 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1110.7140
> >
> > sudo bash -c "echo 0 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> >
> > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
> MHZ
> > 0 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1233.8630
> > 1 0 0 0 0:0:0:0 yes 2801.0000 400.0000 1110.7140
> > 2 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2714.4851
> > 3 0 0 1 1:1:1:0 yes 2801.0000 400.0000 2732.3569
> > 4 0 0 2 2:2:2:0 yes 2801.0000 400.0000 2564.2639
> > 5 0 0 2 2:2:2:0 yes 2801.0000 400.0000 1110.7140
> > 6 0 0 3 3:3:3:0 yes 2801.0000 400.0000 2732.3569
> > 7 0 0 3 3:3:3:0 yes 2801.0000 400.0000 1110.7140
> > 8 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1233.8660
> > 9 0 0 4 4:4:4:0 yes 2801.0000 400.0000 1110.7140
> > 10 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.6630
> > 11 0 0 5 5:5:5:0 yes 2801.0000 400.0000 1233.5050
> >
> > sudo bash -c "echo 1 > /sys/devices/system/cpu/amd_pstate/cpb_boost"
> >
> > CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
> MHZ
> > 0 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1234.0200
> > 1 0 0 0 0:0:0:0 yes 4354.0000 400.0000 1110.7140
> > 2 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
> > 3 0 0 1 1:1:1:0 yes 4354.0000 400.0000 1110.7140
> > 4 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
> > 5 0 0 2 2:2:2:0 yes 4354.0000 400.0000 1110.7140
> > 6 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2278.8491
> > 7 0 0 3 3:3:3:0 yes 4354.0000 400.0000 2732.3569
> > 8 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
> > 9 0 0 4 4:4:4:0 yes 4354.0000 400.0000 1110.7140
> > 10 0 0 5 5:5:5:0 yes 4354.0000 400.0000 2353.0449
> > 11 0 0 5 5:5:5:0 yes 4354.0000 400.0000 1110.7140
> >
> >
> > Perry.
> >
> > Changes from v10:
> > * rework the boost interface with cpufreq core boost control, align the
> sysfs file
> > created from cpufreq.c and allow indivial CPU boost control (Mario)
> > * fix the pr_warn code format with %zd (Oleksandr Natalenko)
> > * replace sscanf with kstrtobool for cpufreq.c (new)
> > * drop the boost sysfs file creation from amd pstate patch #6
> > * add init_boost for cpufreq.c to unify the boost file creation(Mario)
> > * add set_boost callback for EPP driver mode
> > * fix syncronization issue for indivial boost control and global CPB control,
> now the
> > two control way will keep syncronization after anyone CPU boost state
> changed.
> > * rebased to Mario kernel tree: bleeding-edge
> > * run testing on local system, no regression issue found so far.
> >
> > Changes from v9:
> > * change per CPU boost sysfs file name to `boost` (Mario)
> > * rebased to latest linux-pm/bleeding-edge
> >
> > Changes from v8:
> > * pick RB flag for patch 4 (Mario)
> > * change boot_cpu_has to cpu_feature_enabled for patch 2 (Boris)
> > * merge patch 6 into patch 3 (Mario)
> > * add two patch for per CPU boost control patch 6 & 7(Mario)
> > * rebased to latest linux-pm/bleeding-edge
> >
> > Changes from v7:
> > * fix the mutext locking issue in the sysfs file update(Ray, Mario)
> > * pick ack flag from Ray
> > * use X86_FEATURE_CPB to verify the CPB function in Patch #2(Ray)
> > * rerun the testing to check function works well
> > * rebased to linux-pm/bleeding-edge latest
> >
> > Changes from v6:
> > * reword patch 2 commit log (Gautham)
> > * update cover letter description(Gautham)
> > * rebase to kernel v6.9-rc5
> >
> > Changes from v4:
> > * drop the legacy boost remove patch, let us keep the legacy interface
> > in case some applications break.
> > * rebase to linux-pm/bleeding-edge branch
> > * rework the patchset base on [PATCH v8 0/8] AMD Pstate Fixes And
> > Enhancements which has some intial work done there.
> >
> > Changes from v4:
> > * move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > * pick RB flag from Gautham R. Shenoy
> > * add Cc Oleksandr Natalenko <[email protected]>
> > * rebase to latest linux-pm/bleeding-edge branch
> > * rebase the patch set on top of [PATCH v7 0/6] AMD Pstate Fixes And
> Enhancements
> > * update [PATCH v7 2/6] to use MSR_K7_HWCR_CPB_DIS_BIT
> >
> > Changes from v3:
> > * rebased to linux-pm/bleeding-edge v6.8
> > * rename global to amd_pstate_global_params(Oleksandr Natalenko)
> > * remove comments for boot_supported in amd_pstate.h
> > * fix the compiler warning for amd-pstate-ut.ko
> > * use for_each_online_cpu in cpb_boost_store which fix the null pointer
> > error during testing
> > * fix the max frequency value to be KHz when cpb boost
> > disabled(Gautham R. Shenoy)
> >
> > Changes from v2:
> > * move global struct to amd-pstate.h
> > * fix the amd-pstate-ut with new cpb control interface
> >
> > Changes from v1:
> > * drop suspend/resume fix patch 6/7 because of the fix should be in
> > another fix series instead of CPB feature
> > * move the set_boost remove patch to the last(Mario)
> > * Fix commit info with "Closes:" (Mario)
> > * simplified global.cpb_supported initialization(Mario)
> > * Add guide mode support for CPB control
> > * Fixed some Doc typos and add guide mode info to Doc as well.
> >
> > v1:
> > https://lore.kernel.org/all/[email protected]/
> > v2:
> > https://lore.kernel.org/lkml/[email protected]/
> > v3:
> > https://lore.kernel.org/lkml/[email protected]/
> > v4:
> > https://lore.kernel.org/lkml/[email protected]/
> > v5:
> > https://lore.kernel.org/lkml/[email protected]/
> > v6:
> > https://lore.kernel.org/lkml/[email protected]/
> > v7:
> > https://lore.kernel.org/lkml/[email protected]/
> > v8:
> > https://lore.kernel.org/lkml/[email protected]/
> > v9:
> > https://lore.kernel.org/lkml/[email protected]/
> > v10:
> > https://lore.kernel.org/lkml/[email protected]/
> >
> > Perry Yuan (9):
> > cpufreq: acpi: move MSR_K7_HWCR_CPB_DIS_BIT into msr-index.h
> > cpufreq: simplify boolean parsing with kstrtobool in store function
> > cpufreq: introduce init_boost callback to initialize boost state for
> > pstate drivers
> > cpufreq: amd-pstate: initialize new core precision boost state
> > cpufreq: amd-pstate: implement cpb_boost sysfs entry for boost control
> > cpufreq: amd-pstate: Add set_boost callback for active mode
> > cpufreq: amd-pstate: fix the MSR highest perf will be reset issue
> > while cpb boost off
> > Documentation: cpufreq: amd-pstate: introduce the new cpu boost
> > control method
> > Documentation: cpufreq: amd-pstate: update doc for Per CPU boost
> > control method
> >
> > Documentation/admin-guide/pm/amd-pstate.rst | 30 +++
> > arch/x86/include/asm/msr-index.h | 2 +
> > drivers/cpufreq/acpi-cpufreq.c | 2 -
> > drivers/cpufreq/amd-pstate-ut.c | 2 +-
> > drivers/cpufreq/amd-pstate.c | 197 +++++++++++++++++---
> > drivers/cpufreq/amd-pstate.h | 14 ++
> > drivers/cpufreq/cpufreq.c | 23 ++-
> > include/linux/cpufreq.h | 2 +
> > 8 files changed, 237 insertions(+), 35 deletions(-)
> >
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Limonciello, Mario <[email protected]>
> Sent: Friday, June 14, 2024 1:55 AM
> To: Yuan, Perry <[email protected]>; Shenoy, Gautham Ranjal
> <[email protected]>; Petkov, Borislav <[email protected]>
> Cc: [email protected]; [email protected]; Deucher, Alexander
> <[email protected]>; Huang, Shimmer
> <[email protected]>; Du, Xiaojian <[email protected]>; Meng,
> Li (Jassmine) <[email protected]>; [email protected]; linux-
> [email protected]
> Subject: Re: [PATCH v11 4/9] cpufreq: amd-pstate: initialize new core
> precision boost state
>
> On 6/13/2024 02:25, Perry Yuan wrote:
> > 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
> >
> > Reported-by: Artem S. Tashkinov" <[email protected]>
> > Cc: Oleksandr Natalenko <[email protected]>
> > Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217931
> > Signed-off-by: Perry Yuan <[email protected]>
> > ---
> > drivers/cpufreq/amd-pstate.c | 59 +++++++++++++++++++++++++++++-----
> --
> > drivers/cpufreq/amd-pstate.h | 13 ++++++++
> > 2 files changed, 61 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/cpufreq/amd-pstate.c
> > b/drivers/cpufreq/amd-pstate.c index fda8f86c90e0..9f42524074a9 100644
> > --- a/drivers/cpufreq/amd-pstate.c
> > +++ b/drivers/cpufreq/amd-pstate.c
> > @@ -102,6 +102,8 @@ static int cppc_state = AMD_PSTATE_UNDEFINED;
> > static bool cppc_enabled;
> > static bool amd_pstate_prefcore = true;
> > static struct quirk_entry *quirks;
> > +struct amd_pstate_global_params amd_pstate_global_params;
> > +EXPORT_SYMBOL_GPL(amd_pstate_global_params);
> >
> > /*
> > * AMD Energy Preference Performance (EPP) @@ -696,7 +698,7 @@
> > static int amd_pstate_set_boost(struct cpufreq_policy *policy, int
> > state)
> >
> > if (!cpudata->boost_supported) {
> > pr_err("Boost mode is not supported by this processor or
> SBIOS\n");
> > - return -EINVAL;
> > + return -ENOTSUPP;
> > }
> >
> > if (state)
> > @@ -714,18 +716,38 @@ static int amd_pstate_set_boost(struct
> cpufreq_policy *policy, int state)
> > return 0;
> > }
> >
> > -static void amd_pstate_boost_init(struct amd_cpudata *cpudata)
> > +static int amd_pstate_boost_set(struct amd_cpudata *cpudata)
> > {
> > - u32 highest_perf, nominal_perf;
> > + u64 boost_val;
> > + int ret = -1;
> >
> > - highest_perf = READ_ONCE(cpudata->highest_perf);
> > - nominal_perf = READ_ONCE(cpudata->nominal_perf);
> > + if (!cpu_feature_enabled(X86_FEATURE_CPB)) {
> > + pr_debug_once("Boost CPB capabilities not present in the
> processor\n");
> > + ret = -EOPNOTSUPP;
> > + goto exit_err;
> > + }
> >
> > - if (highest_perf <= nominal_perf)
> > - return;
> > + ret = rdmsrl_on_cpu(cpudata->cpu, MSR_K7_HWCR, &boost_val);
> > + if (ret) {
> > + pr_err_once("failed to read initial CPU boost state!\n");
> > + ret = -EIO;
> > + goto exit_err;
> > + }
> > +
> > + amd_pstate_global_params.cpb_supported = !(boost_val &
> MSR_K7_HWCR_CPB_DIS);
> > + if (amd_pstate_global_params.cpb_supported) {
> > + current_pstate_driver->boost_enabled = true;
> > + WRITE_ONCE(cpudata->boost_supported, true);
> > + }
> >
> > - cpudata->boost_supported = true;
> > - current_pstate_driver->boost_enabled = true;
> > + amd_pstate_global_params.cpb_boost =
> amd_pstate_global_params.cpb_supported;
> > + return 0;
> > +
> > +exit_err:
> > + WRITE_ONCE(cpudata->boost_supported, false);
> > + current_pstate_driver->boost_enabled = false;
> > + amd_pstate_global_params.cpb_boost = false;
> > + return ret;
> > }
> >
> > static void amd_perf_ctl_reset(unsigned int cpu) @@ -1007,7 +1029,6
> > @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
> >
> > policy->driver_data = cpudata;
> >
> > - amd_pstate_boost_init(cpudata);
> > if (!current_pstate_driver->adjust_perf)
> > current_pstate_driver->adjust_perf =
> amd_pstate_adjust_perf;
> >
> > @@ -1389,6 +1410,21 @@ static bool
> amd_pstate_acpi_pm_profile_undefined(void)
> > return false;
> > }
> >
> > +static int amd_pstate_init_boost(struct cpufreq_policy *policy) {
> > + struct amd_cpudata *cpudata = policy->driver_data;
> > + int ret;
> > +
> > + /* initialize cpu cores boot state */
> > + ret = amd_pstate_boost_set(cpudata);
> > + if (ret)
> > + return ret;
> > +
> > + policy->boost_enabled = READ_ONCE(cpudata->boost_supported);
>
> Because of the change I suggested in patch 3/9, I believe you should move
> the check for
>
> if (!cpudata->boost_supported)
>
> from amd_pstate_boost_set() to the beginning of amd_pstate_init_boost().
> Something like this:
cpudata->boost_supported will be initialized in amd_pstate_init_boost(), if system is identified to support boost control, then each CPU will mark boost_supported to be true.
In the next, the set_boost callback will check boost mode is not supported or not before it do real boost switching operation.
amd_pstate_init_boost() was added to initialize everything that control needs, the below function will set “cpudata->boost_supported” value when it returns.
static int amd_pstate_init_boost(struct cpufreq_policy *policy)
{
struct amd_cpudata *cpudata = policy->driver_data;
int ret;
/* initialize cpu cores boot state */
ret = amd_pstate_boost_set(cpudata);<<<<------- “cpudata->boost_supported” will be set to true or false.
if (ret)
return ret;
policy->boost_enabled = READ_ONCE(cpudata->boost_state);
return 0;
}
>
> static int amd_pstate_init_boost(struct cpufreq_policy *policy) {
> struct amd_cpudata *cpudata = policy->driver_data;
> int ret;
>
> if (!cpudata->boost_supported) {
> policy->boost_enabled = false;
> return 0;
> }
> ret = amd_pstate_boost_set(cpudata);
> if (ret)
> return ret;
>
> policy->boost_enabled = true;
>
> return ret;
> }
>
> > +
> > + return 0;
> > +}
> > +
> > static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
> > {
> > int min_freq, max_freq, nominal_freq, ret; @@ -1467,7 +1503,6 @@
> > static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
> > return ret;
> > WRITE_ONCE(cpudata->cppc_cap1_cached, value);
> > }
> > - amd_pstate_boost_init(cpudata);
> >
> > return 0;
> >
> > @@ -1706,6 +1741,7 @@ static struct cpufreq_driver amd_pstate_driver =
> {
> > .exit = amd_pstate_cpu_exit,
> > .suspend = amd_pstate_cpu_suspend,
> > .resume = amd_pstate_cpu_resume,
> > + .init_boost = amd_pstate_init_boost,
> > .set_boost = amd_pstate_set_boost,
> > .update_limits = amd_pstate_update_limits,
> > .name = "amd-pstate",
> > @@ -1723,6 +1759,7 @@ static struct cpufreq_driver
> amd_pstate_epp_driver = {
> > .suspend = amd_pstate_epp_suspend,
> > .resume = amd_pstate_epp_resume,
> > .update_limits = amd_pstate_update_limits,
> > + .init_boost = amd_pstate_init_boost,
> > .name = "amd-pstate-epp",
> > .attr = amd_pstate_epp_attr,
> > };
> > diff --git a/drivers/cpufreq/amd-pstate.h
> > b/drivers/cpufreq/amd-pstate.h index e6a28e7f4dbf..0b75a6267fca 100644
> > --- a/drivers/cpufreq/amd-pstate.h
> > +++ b/drivers/cpufreq/amd-pstate.h
> > @@ -101,4 +101,17 @@ struct amd_cpudata {
> > bool suspended;
> > };
> >
> > +/**
> > + * struct amd_pstate_global_params - Global parameters, mostly tunable
> via sysfs.
> > + * @cpb_boost: Whether or not to use boost CPU P-states.
> > + * @cpb_supported: Whether or not CPU boost P-states are available
> > + * based on the MSR_K7_HWCR bit[25] state
> > + */
> > +struct amd_pstate_global_params {
> > + bool cpb_boost;
> > + bool cpb_supported;
> > +};
> > +
> > +extern struct amd_pstate_global_params amd_pstate_global_params;
> > +
> > #endif /* _LINUX_AMD_PSTATE_H */