* [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements
@ 2024-06-17 6:59 Perry Yuan
2024-06-17 6:59 ` [PATCH v4 01/11] cpufreq: amd-pstate: optimize the initial frequency values verification Perry Yuan
` (10 more replies)
0 siblings, 11 replies; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
Hello everyone,
This patchset addresses critical issues and enhances performance settings for CPUs
with heterogeneous core types in the AMD pstate driver.
Specifically, it resolves problems related to calculating the highest performance
and frequency on the latest CPUs with preferred cores.
Additionally, the patchset includes documentation improvements in amd-pstate.rst,
offering a comprehensive guide covering topics such as recommended reboot requirements
during driver switching, debugging procedures for driver loading failures.
Your feedback and suggestions for improvement are highly appreciated.
Please review the patches and provide your valuable input.
Thank you.
Best regards,
Perry.
Changes from V3:
* add one new patch to enable shared memory type CPPC by default
* pick all the RB by and ACk by flags from Mario and Gautham
* update the patch #7 PPR link with doc id (Boris & Mario)
* fix the highest perf initialization issue with preferred core check
for patch #9 (Gautham)
* rework return core type and commit log for the patch #9 (Mario)
* address feedback for patch #5 for the debugging suggestions.(Mario)
* retest the patches on MSR and shared memory type CPPC systems, no regression seen.
Changes from V2:
* pick review by and ack by flags from Mario and Gautham
* rebase to latest linux-pm bleeding edge branch
* fix driver loading block issue for patch 4, make sure the warning will
not abort the driver loading in case there are some new family/model id.
* fix the driver loading sequence issue for patch 10, it allows command line
and kernel config option together. command line will override kconfig option.
* add back the AMD CPUs with Family ID 19H and Model ID range 0x70 to 0x7f to return
the highest perf and check others CPU core type in the following codes.
* run some testing on the local system.
* move the amd_core_type to amd-pstate.c because of the amd-pstate.h was removed lately.
Changes from V1:
* drop patch 11 which has been merged in a separate patch. (Mario)
* fix some typos in commit log and tile (Mario)
* fix the patch 11 regression issue of kernel command line (Oleksandr Natalenko)
* pick ack flag for patch 7 (Mario)
* drop patch 4 which is not recommended for user(Mario)
* rebase to linux-pm/bleeding-edge branch
* fix some build warning
* rework the patch 3 for CPU ID matching(Mario)
* address feedback for patch 5 (Mario)
* move the acpi pm profile after got default mode(Mario)
Perry Yuan (11):
cpufreq: amd-pstate: optimize the initial frequency values
verification
cpufreq: amd-pstate: remove unused variable nominal_freq
cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
cpufreq: amd-pstate: add debug message while CPPC is supported and
disabled by SBIOS
Documentation: PM: amd-pstate: add debugging section for driver
loading failure
Documentation: PM: amd-pstate: add guided mode to the Operation mode
cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
x86/cpufeatures: Add feature bits for AMD heterogeneous processor
cpufreq: amd-pstate: implement heterogeneous core topology for highest
performance initialization
cpufreq: amd-pstate: auto-load pstate driver by default
cpufreq: amd-pstate: enable shared memory type CPPC by default
Documentation/admin-guide/pm/amd-pstate.rst | 16 +-
arch/x86/include/asm/cpufeatures.h | 1 +
arch/x86/include/asm/processor.h | 2 +
arch/x86/kernel/cpu/amd.c | 19 ++
arch/x86/kernel/cpu/scattered.c | 1 +
drivers/cpufreq/amd-pstate.c | 198 ++++++++++++++------
6 files changed, 182 insertions(+), 55 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v4 01/11] cpufreq: amd-pstate: optimize the initial frequency values verification
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-17 6:59 ` [PATCH v4 02/11] cpufreq: amd-pstate: remove unused variable nominal_freq Perry Yuan
` (9 subsequent siblings)
10 siblings, 0 replies; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
To enhance the debugging capability of the driver loading failure for
broken CPPC ACPI tables, it can optimize the expression by moving the
verification of `min_freq`, `nominal_freq`, and other dependency values
to the `amd_pstate_init_freq()` function where they are initialized.
If any of these values are incorrect, the `amd-pstate` driver will not be registered.
By ensuring that these values are correct before they are used, it will facilitate
the debugging process when encountering driver loading failures due to faulty CPPC
ACPI tables from BIOS
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Acked-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Acked-by: Mario Limonciello <mario.limonciello@amd.com>
---
drivers/cpufreq/amd-pstate.c | 35 ++++++++++++++++++-----------------
1 file changed, 18 insertions(+), 17 deletions(-)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index 5bdcdd3ea163..d4d7b7cdc4eb 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -924,6 +924,24 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
WRITE_ONCE(cpudata->nominal_freq, nominal_freq);
WRITE_ONCE(cpudata->max_freq, max_freq);
+ /**
+ * Below values need to be initialized correctly, otherwise driver will fail to load
+ * max_freq is calculated according to (nominal_freq * highest_perf)/nominal_perf
+ * lowest_nonlinear_freq is a value between [min_freq, nominal_freq]
+ * Check _CPC in ACPI table objects if any values are incorrect
+ */
+ if (min_freq <= 0 || max_freq <= 0 || nominal_freq <= 0 || min_freq > max_freq) {
+ pr_err("min_freq(%d) or max_freq(%d) or nominal_freq(%d) value is incorrect\n",
+ min_freq, max_freq, nominal_freq * 1000);
+ return -EINVAL;
+ }
+
+ if (lowest_nonlinear_freq <= min_freq || lowest_nonlinear_freq > nominal_freq * 1000) {
+ pr_err("lowest_nonlinear_freq(%d) value is out of range [min_freq(%d), nominal_freq(%d)]\n",
+ lowest_nonlinear_freq, min_freq, nominal_freq * 1000);
+ return -EINVAL;
+ }
+
return 0;
}
@@ -962,15 +980,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
max_freq = READ_ONCE(cpudata->max_freq);
nominal_freq = READ_ONCE(cpudata->nominal_freq);
- if (min_freq <= 0 || max_freq <= 0 ||
- nominal_freq <= 0 || min_freq > max_freq) {
- dev_err(dev,
- "min_freq(%d) or max_freq(%d) or nominal_freq (%d) value is incorrect, check _CPC in ACPI tables\n",
- min_freq, max_freq, nominal_freq);
- ret = -EINVAL;
- goto free_cpudata1;
- }
-
policy->cpuinfo.transition_latency = amd_pstate_get_transition_latency(policy->cpu);
policy->transition_delay_us = amd_pstate_get_transition_delay_us(policy->cpu);
@@ -1423,14 +1432,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
min_freq = READ_ONCE(cpudata->min_freq);
max_freq = READ_ONCE(cpudata->max_freq);
nominal_freq = READ_ONCE(cpudata->nominal_freq);
- if (min_freq <= 0 || max_freq <= 0 ||
- nominal_freq <= 0 || min_freq > max_freq) {
- dev_err(dev,
- "min_freq(%d) or max_freq(%d) or nominal_freq(%d) value is incorrect, check _CPC in ACPI tables\n",
- min_freq, max_freq, nominal_freq);
- ret = -EINVAL;
- goto free_cpudata1;
- }
policy->cpuinfo.min_freq = min_freq;
policy->cpuinfo.max_freq = max_freq;
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 02/11] cpufreq: amd-pstate: remove unused variable nominal_freq
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
2024-06-17 6:59 ` [PATCH v4 01/11] cpufreq: amd-pstate: optimize the initial frequency values verification Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-17 6:59 ` [PATCH v4 03/11] cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported Perry Yuan
` (8 subsequent siblings)
10 siblings, 0 replies; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
removed the unused variable `nominal_freq` for build warning.
This variable was defined and assigned a value in the previous code,
but it was not used in the subsequent code.
Closes: https://lore.kernel.org/oe-kbuild-all/202405080431.BPU6Yg9s-lkp@intel.com/
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Acked-by: Mario Limonciello <mario.limonciello@amd.com>
---
drivers/cpufreq/amd-pstate.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index d4d7b7cdc4eb..1ce063a22214 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -947,7 +947,7 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
{
- int min_freq, max_freq, nominal_freq, ret;
+ int min_freq, max_freq, ret;
struct device *dev;
struct amd_cpudata *cpudata;
@@ -978,7 +978,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
min_freq = READ_ONCE(cpudata->min_freq);
max_freq = READ_ONCE(cpudata->max_freq);
- nominal_freq = READ_ONCE(cpudata->nominal_freq);
policy->cpuinfo.transition_latency = amd_pstate_get_transition_latency(policy->cpu);
policy->transition_delay_us = amd_pstate_get_transition_delay_us(policy->cpu);
@@ -1398,7 +1397,7 @@ static bool amd_pstate_acpi_pm_profile_undefined(void)
static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
{
- int min_freq, max_freq, nominal_freq, ret;
+ int min_freq, max_freq, ret;
struct amd_cpudata *cpudata;
struct device *dev;
u64 value;
@@ -1431,7 +1430,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
min_freq = READ_ONCE(cpudata->min_freq);
max_freq = READ_ONCE(cpudata->max_freq);
- nominal_freq = READ_ONCE(cpudata->nominal_freq);
policy->cpuinfo.min_freq = min_freq;
policy->cpuinfo.max_freq = max_freq;
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 03/11] cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
2024-06-17 6:59 ` [PATCH v4 01/11] cpufreq: amd-pstate: optimize the initial frequency values verification Perry Yuan
2024-06-17 6:59 ` [PATCH v4 02/11] cpufreq: amd-pstate: remove unused variable nominal_freq Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-17 6:59 ` [PATCH v4 04/11] cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS Perry Yuan
` (7 subsequent siblings)
10 siblings, 0 replies; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
Add CPU ID checking in case the driver attempt to load on systems where
CPPC functionality is unavailable. And the warning message will not
be shown if CPPC is not supported.
It will also print debug message if the CPU has no CPPC support that
helps to debug the driver loading failure issue.
Reported-by: Paul Menzel <pmenzel@molgen.mpg.de>
Closes: https://lore.kernel.org/linux-pm/CYYPR12MB8655D32EA18574C9497E888A9C122@CYYPR12MB8655.namprd12.prod.outlook.com/T/#t
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Acked-by: Mario Limonciello <mario.limonciello@amd.com>
---
drivers/cpufreq/amd-pstate.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index 1ce063a22214..76419762c04f 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -1743,6 +1743,20 @@ static int __init amd_pstate_set_driver(int mode_idx)
return -EINVAL;
}
+/**
+ * CPPC function is not supported for family ID 17H with model_ID ranging from 0x10 to 0x2F.
+ * show the debug message that helps to check if the CPU has CPPC support for loading issue.
+ */
+static bool amd_cppc_supported(void)
+{
+ if ((boot_cpu_data.x86 == 0x17) && (boot_cpu_data.x86_model < 0x30)) {
+ pr_debug_once("CPPC feature is not supported by the processor\n");
+ return false;
+ }
+
+ return true;
+}
+
static int __init amd_pstate_init(void)
{
struct device *dev_root;
@@ -1751,6 +1765,11 @@ static int __init amd_pstate_init(void)
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
return -ENODEV;
+ /* show debug message only if CPPC is not supported */
+ if (!amd_cppc_supported())
+ return -EOPNOTSUPP;
+
+ /* show warning message when BIOS broken or ACPI disabled */
if (!acpi_cpc_valid()) {
pr_warn_once("the _CPC object is not present in SBIOS or ACPI disabled\n");
return -ENODEV;
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 04/11] cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
` (2 preceding siblings ...)
2024-06-17 6:59 ` [PATCH v4 03/11] cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-18 19:25 ` Mario Limonciello
2024-06-17 6:59 ` [PATCH v4 05/11] Documentation: PM: amd-pstate: add debugging section for driver loading failure Perry Yuan
` (6 subsequent siblings)
10 siblings, 1 reply; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
If CPPC feature is supported by the CPU however the CPUID flag bit is not
set by SBIOS, the `amd_pstate` will be failed to load while system
booting.
So adding one more debug message to inform user to check the SBIOS setting,
The change also can help maintainers to debug why amd_pstate driver failed
to be loaded at system booting if the processor support CPPC.
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218686
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
---
drivers/cpufreq/amd-pstate.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index 76419762c04f..9aa220a0e3fe 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -1749,11 +1749,37 @@ static int __init amd_pstate_set_driver(int mode_idx)
*/
static bool amd_cppc_supported(void)
{
+ struct cpuinfo_x86 *c = &cpu_data(0);
+ bool warn = false;
+
if ((boot_cpu_data.x86 == 0x17) && (boot_cpu_data.x86_model < 0x30)) {
pr_debug_once("CPPC feature is not supported by the processor\n");
return false;
}
+ /*
+ * If the CPPC feature is disabled in the BIOS for processors that support MSR-based CPPC,
+ * the AMD Pstate driver may not function correctly.
+ * Check the CPPC flag and display a warning message if the platform supports CPPC.
+ * Note: below checking code will not abort the driver registeration process because of
+ * the code is added for debugging purposes.
+ */
+ if (!cpu_feature_enabled(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_ZEN1) || cpu_feature_enabled(X86_FEATURE_ZEN2)) {
+ if (c->x86_model > 0x60 && c->x86_model < 0xaf)
+ warn = true;
+ } else if (cpu_feature_enabled(X86_FEATURE_ZEN3) || cpu_feature_enabled(X86_FEATURE_ZEN4)) {
+ if ((c->x86_model > 0x10 && c->x86_model < 0x1F) ||
+ (c->x86_model > 0x40 && c->x86_model < 0xaf))
+ warn = true;
+ } else if (cpu_feature_enabled(X86_FEATURE_ZEN5)) {
+ warn = true;
+ }
+ }
+
+ if (warn)
+ pr_warn_once("The CPPC feature is supported but currently disabled by the BIOS.\n"
+ "Please enable it if your BIOS has the CPPC option.\n");
return true;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 05/11] Documentation: PM: amd-pstate: add debugging section for driver loading failure
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
` (3 preceding siblings ...)
2024-06-17 6:59 ` [PATCH v4 04/11] cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-18 19:24 ` Mario Limonciello
2024-06-17 6:59 ` [PATCH v4 06/11] Documentation: PM: amd-pstate: add guided mode to the Operation mode Perry Yuan
` (5 subsequent siblings)
10 siblings, 1 reply; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
To address issues with the loading of the amd-pstate driver on certain platforms,
It needs to enable dynamic debugging to capture debug messages during the driver
loading process. By adding "amd_pstate.dyndbg=+p cppc_acpi.dyndbg=+p debug
amd_pstate=active" and loglevel to the kernel command line, then driver debug
logging is enabled.
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
---
Documentation/admin-guide/pm/amd-pstate.rst | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
index 1e0d101b020a..ceeb073c9ada 100644
--- a/Documentation/admin-guide/pm/amd-pstate.rst
+++ b/Documentation/admin-guide/pm/amd-pstate.rst
@@ -472,6 +472,20 @@ operations for the new ``amd-pstate`` module with this tool. ::
Diagnostics and Tuning
=======================
+Debugging AMD P-State Driver Loading Issues
+------------------------------------------
+
+If the amd-pstate driver fails to load, additional debug information
+may be necessary.
+To capture debug messages for issue analysis, users can add below parameter,
+"amd_pstate.dyndbg=+p cppc_acpi.dyndbg=+p debug"
+to the kernel command line. This will enable dynamic debugging and allow better
+analysis and troubleshooting of the driver loading process.
+
+Please note that adding this parameter will only enable debug logging during the
+driver loading phase and may affect system behavior. Use this option with caution
+and only for debugging purposes.
+
Trace Events
--------------
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 06/11] Documentation: PM: amd-pstate: add guided mode to the Operation mode
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
` (4 preceding siblings ...)
2024-06-17 6:59 ` [PATCH v4 05/11] Documentation: PM: amd-pstate: add debugging section for driver loading failure Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-17 6:59 ` [PATCH v4 07/11] cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled() Perry Yuan
` (4 subsequent siblings)
10 siblings, 0 replies; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
the guided mode is also supported, so the operation mode should include
that mode as well.
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
---
Documentation/admin-guide/pm/amd-pstate.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
index ceeb073c9ada..3e2d085a6999 100644
--- a/Documentation/admin-guide/pm/amd-pstate.rst
+++ b/Documentation/admin-guide/pm/amd-pstate.rst
@@ -406,7 +406,7 @@ control its functionality at the system level. They are located in the
``/sys/devices/system/cpu/amd_pstate/`` directory and affect all CPUs.
``status``
- Operation mode of the driver: "active", "passive" or "disable".
+ Operation mode of the driver: "active", "passive", "guided" or "disable".
"active"
The driver is functional and in the ``active mode``
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 07/11] cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled()
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
` (5 preceding siblings ...)
2024-06-17 6:59 ` [PATCH v4 06/11] Documentation: PM: amd-pstate: add guided mode to the Operation mode Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-17 6:59 ` [PATCH v4 08/11] x86/cpufeatures: Add feature bits for AMD heterogeneous processor Perry Yuan
` (3 subsequent siblings)
10 siblings, 0 replies; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
replace the usage of the deprecated boot_cpu_has() function with
the modern cpu_feature_enabled() function. The switch to cpu_feature_enabled()
ensures compatibility with the latest CPU feature detection mechanisms and
improves code maintainability.
Acked-by: Mario Limonciello <mario.limonciello@amd.com>
Suggested-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
---
drivers/cpufreq/amd-pstate.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index 9aa220a0e3fe..cb750ef305fe 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -158,7 +158,7 @@ static int __init dmi_matched_7k62_bios_bug(const struct dmi_system_id *dmi)
* broken BIOS lack of nominal_freq and lowest_freq capabilities
* definition in ACPI tables
*/
- if (boot_cpu_has(X86_FEATURE_ZEN2)) {
+ if (cpu_feature_enabled(X86_FEATURE_ZEN2)) {
quirks = dmi->driver_data;
pr_info("Overriding nominal and lowest frequencies for %s\n", dmi->ident);
return 1;
@@ -200,7 +200,7 @@ static s16 amd_pstate_get_epp(struct amd_cpudata *cpudata, u64 cppc_req_cached)
u64 epp;
int ret;
- if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
if (!cppc_req_cached) {
epp = rdmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ,
&cppc_req_cached);
@@ -253,7 +253,7 @@ static int amd_pstate_set_epp(struct amd_cpudata *cpudata, u32 epp)
int ret;
struct cppc_perf_ctrls perf_ctrls;
- if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
u64 value = READ_ONCE(cpudata->cppc_req_cached);
value &= ~GENMASK_ULL(31, 24);
@@ -752,7 +752,7 @@ static int amd_pstate_get_highest_perf(int cpu, u32 *highest_perf)
{
int ret;
- if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
u64 cap1;
ret = rdmsrl_safe_on_cpu(cpu, MSR_AMD_CPPC_CAP1, &cap1);
@@ -991,7 +991,7 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
/* It will be updated by governor */
policy->cur = policy->cpuinfo.min_freq;
- if (boot_cpu_has(X86_FEATURE_CPPC))
+ if (cpu_feature_enabled(X86_FEATURE_CPPC))
policy->fast_switch_possible = true;
ret = freq_qos_add_request(&policy->constraints, &cpudata->req[0],
@@ -1224,7 +1224,7 @@ static int amd_pstate_change_mode_without_dvr_change(int mode)
cppc_state = mode;
- if (boot_cpu_has(X86_FEATURE_CPPC) || cppc_state == AMD_PSTATE_ACTIVE)
+ if (cpu_feature_enabled(X86_FEATURE_CPPC) || cppc_state == AMD_PSTATE_ACTIVE)
return 0;
for_each_present_cpu(cpu) {
@@ -1453,7 +1453,7 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
else
policy->policy = CPUFREQ_POLICY_POWERSAVE;
- if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
ret = rdmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ, &value);
if (ret)
return ret;
@@ -1543,7 +1543,7 @@ static void amd_pstate_epp_update_limit(struct cpufreq_policy *policy)
epp = 0;
/* Set initial EPP value */
- if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
value &= ~GENMASK_ULL(31, 24);
value |= (u64)epp << 24;
}
@@ -1582,7 +1582,7 @@ static void amd_pstate_epp_reenable(struct amd_cpudata *cpudata)
value = READ_ONCE(cpudata->cppc_req_cached);
max_perf = READ_ONCE(cpudata->highest_perf);
- if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
wrmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ, value);
} else {
perf_ctrls.max_perf = max_perf;
@@ -1616,7 +1616,7 @@ static void amd_pstate_epp_offline(struct cpufreq_policy *policy)
value = READ_ONCE(cpudata->cppc_req_cached);
mutex_lock(&amd_pstate_limits_lock);
- if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
cpudata->epp_policy = CPUFREQ_POLICY_UNKNOWN;
/* Set max perf same as min perf */
@@ -1819,7 +1819,7 @@ static int __init amd_pstate_init(void)
*/
if (amd_pstate_acpi_pm_profile_undefined() ||
amd_pstate_acpi_pm_profile_server() ||
- !boot_cpu_has(X86_FEATURE_CPPC)) {
+ !cpu_feature_enabled(X86_FEATURE_CPPC)) {
pr_info("driver load is disabled, boot with specific mode to enable this\n");
return -ENODEV;
}
@@ -1838,7 +1838,7 @@ static int __init amd_pstate_init(void)
}
/* capability check */
- if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
pr_debug("AMD CPPC MSR based functionality is supported\n");
if (cppc_state != AMD_PSTATE_ACTIVE)
current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 08/11] x86/cpufeatures: Add feature bits for AMD heterogeneous processor
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
` (6 preceding siblings ...)
2024-06-17 6:59 ` [PATCH v4 07/11] cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled() Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-17 8:39 ` Borislav Petkov
2024-06-17 6:59 ` [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization Perry Yuan
` (2 subsequent siblings)
10 siblings, 1 reply; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
CPUID leaf 0x80000026 advertises core types with different efficiency rankings
Bit 30 indicates the heterogeneous core topology feature, if the bit
set, it means not all instances at the current hierarchical level have
the same core topology.
For better utilization of feature words and help to identify core type,
X86_FEATURE_HETERO_CORE_TOPOLOGY is added as a few scattered feature bits.
Reference:
See the page 119 of PPR for AMD Family 19h Model 61h B1, docID 56713
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
---
arch/x86/include/asm/cpufeatures.h | 1 +
arch/x86/kernel/cpu/scattered.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
index 6c128d463a14..eceaa0df0137 100644
--- a/arch/x86/include/asm/cpufeatures.h
+++ b/arch/x86/include/asm/cpufeatures.h
@@ -471,6 +471,7 @@
#define X86_FEATURE_CLEAR_BHB_HW (21*32+ 3) /* "" BHI_DIS_S HW control enabled */
#define X86_FEATURE_CLEAR_BHB_LOOP_ON_VMEXIT (21*32+ 4) /* "" Clear branch history at vmexit using SW loop */
#define X86_FEATURE_FAST_CPPC (21*32 + 5) /* "" AMD Fast CPPC */
+#define X86_FEATURE_HETERO_CORE_TOPOLOGY (21*32+ 6) /* "" Heterogeneous Core Topology */
/*
* BUG word(s)
diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c
index c84c30188fdf..6b3477503dd0 100644
--- a/arch/x86/kernel/cpu/scattered.c
+++ b/arch/x86/kernel/cpu/scattered.c
@@ -52,6 +52,7 @@ static const struct cpuid_bit cpuid_bits[] = {
{ X86_FEATURE_PERFMON_V2, CPUID_EAX, 0, 0x80000022, 0 },
{ X86_FEATURE_AMD_LBR_V2, CPUID_EAX, 1, 0x80000022, 0 },
{ X86_FEATURE_AMD_LBR_PMC_FREEZE, CPUID_EAX, 2, 0x80000022, 0 },
+ { X86_FEATURE_HETERO_CORE_TOPOLOGY, CPUID_EAX, 30, 0x80000026, 0 },
{ 0, 0, 0, 0, 0 }
};
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
` (7 preceding siblings ...)
2024-06-17 6:59 ` [PATCH v4 08/11] x86/cpufeatures: Add feature bits for AMD heterogeneous processor Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-18 19:22 ` Mario Limonciello
2024-06-18 21:23 ` Borislav Petkov
2024-06-17 6:59 ` [PATCH v4 10/11] cpufreq: amd-pstate: auto-load pstate driver by default Perry Yuan
2024-06-17 6:59 ` [PATCH v4 11/11] cpufreq: amd-pstate: enable shared memory type CPPC " Perry Yuan
10 siblings, 2 replies; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
Introduces an optimization to the AMD-Pstate driver by implementing
a heterogeneous core topology for the initialization of the highest
performance value while driver loading.
The two core types supported are "performance" and "efficiency".
Each core type has different highest performance and frequency values
configured by the platform. The `amd_pstate` driver needs to identify
the type of core to correctly set an appropriate highest perf value.
X86_FEATURE_HETERO_CORE_TOPOLOGY is used to identify whether the
processor support heterogeneous core type by reading CPUID leaf
Fn_0x80000026_EAX and bit 30. if the bit is set as one, then amd_pstate
driver will check EBX 30:28 bits to get the core type.
Reference:
See the page 119 of PPR for AMD Family 19h Model 61h B1, docID 56713
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
---
arch/x86/include/asm/processor.h | 2 ++
arch/x86/kernel/cpu/amd.c | 19 ++++++++++++
drivers/cpufreq/amd-pstate.c | 53 ++++++++++++++++++++++++++++++--
3 files changed, 71 insertions(+), 3 deletions(-)
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index cb4f6c513c48..223aa58e2d5c 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -694,10 +694,12 @@ static inline u32 per_cpu_l2c_id(unsigned int cpu)
extern u32 amd_get_highest_perf(void);
extern void amd_clear_divider(void);
extern void amd_check_microcode(void);
+extern int amd_get_this_core_type(void);
#else
static inline u32 amd_get_highest_perf(void) { return 0; }
static inline void amd_clear_divider(void) { }
static inline void amd_check_microcode(void) { }
+static inline int amd_get_this_core_type(void) { return -1; }
#endif
extern unsigned long arch_align_stack(unsigned long sp);
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 44df3f11e731..62a4ef21ef79 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -1231,3 +1231,22 @@ void noinstr amd_clear_divider(void)
:: "a" (0), "d" (0), "r" (1));
}
EXPORT_SYMBOL_GPL(amd_clear_divider);
+
+#define X86_CPU_TYPE_ID_SHIFT 28
+
+/**
+ * amd_get_this_core_type - Get the type of this heterogeneous CPU
+ *
+ * Returns the CPU type [31:28] (i.e., performance or efficient) of
+ * a CPU in the processor.
+ * If the processor has no core type support, returns -1.
+ */
+
+int amd_get_this_core_type(void)
+{
+ if (!cpu_feature_enabled(X86_FEATURE_HETERO_CORE_TOPOLOGY))
+ return -1;
+
+ return cpuid_ebx(0x80000026) >> X86_CPU_TYPE_ID_SHIFT;
+}
+EXPORT_SYMBOL_GPL(amd_get_this_core_type);
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index cb750ef305fe..cf68343219d1 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -52,8 +52,10 @@
#define AMD_PSTATE_TRANSITION_LATENCY 20000
#define AMD_PSTATE_TRANSITION_DELAY 1000
#define AMD_PSTATE_FAST_CPPC_TRANSITION_DELAY 600
-#define CPPC_HIGHEST_PERF_PERFORMANCE 196
-#define CPPC_HIGHEST_PERF_DEFAULT 166
+
+#define CPPC_HIGHEST_PERF_EFFICIENT 132
+#define CPPC_HIGHEST_PERF_PERFORMANCE 196
+#define CPPC_HIGHEST_PERF_DEFAULT 166
#define AMD_CPPC_EPP_PERFORMANCE 0x00
#define AMD_CPPC_EPP_BALANCE_PERFORMANCE 0x80
@@ -86,6 +88,14 @@ struct quirk_entry {
u32 lowest_freq;
};
+/* defined by CPUID_Fn80000026_EBX BIT [31:28] */
+enum amd_core_type {
+ CPU_CORE_TYPE_NO_HETERO_SUP = -1,
+ CPU_CORE_TYPE_PERFORMANCE = 0,
+ CPU_CORE_TYPE_EFFICIENCY = 1,
+ CPU_CORE_TYPE_UNDEFINED = 2,
+};
+
/*
* TODO: We need more time to fine tune processors with shared memory solution
* with community together.
@@ -358,9 +368,27 @@ static inline int amd_pstate_enable(bool enable)
return static_call(amd_pstate_enable)(enable);
}
+static void get_this_core_type(void *data)
+{
+ enum amd_core_type *cpu_type = data;
+
+ *cpu_type = amd_get_this_core_type();
+}
+
+static enum amd_core_type amd_pstate_get_cpu_type(int cpu)
+{
+ enum amd_core_type cpu_type;
+
+ smp_call_function_single(cpu, get_this_core_type, &cpu_type, 1);
+
+ return cpu_type;
+}
+
static u32 amd_pstate_highest_perf_set(struct amd_cpudata *cpudata)
{
struct cpuinfo_x86 *c = &cpu_data(0);
+ u32 highest_perf;
+ enum amd_core_type core_type;
/*
* For AMD CPUs with Family ID 19H and Model ID range 0x70 to 0x7f,
@@ -370,7 +398,26 @@ static u32 amd_pstate_highest_perf_set(struct amd_cpudata *cpudata)
if (c->x86 == 0x19 && (c->x86_model >= 0x70 && c->x86_model <= 0x7f))
return CPPC_HIGHEST_PERF_PERFORMANCE;
- return CPPC_HIGHEST_PERF_DEFAULT;
+ core_type = amd_pstate_get_cpu_type(cpudata->cpu);
+ pr_debug("core_type %d found\n", core_type);
+
+ switch (core_type) {
+ case CPU_CORE_TYPE_NO_HETERO_SUP:
+ highest_perf = CPPC_HIGHEST_PERF_DEFAULT;
+ break;
+ case CPU_CORE_TYPE_PERFORMANCE:
+ highest_perf = CPPC_HIGHEST_PERF_PERFORMANCE;
+ break;
+ case CPU_CORE_TYPE_EFFICIENCY:
+ highest_perf = CPPC_HIGHEST_PERF_EFFICIENT;
+ break;
+ default:
+ highest_perf = CPPC_HIGHEST_PERF_DEFAULT;
+ WARN_ONCE(true, "WARNING: Undefined core type found");
+ break;
+ }
+
+ return highest_perf;
}
static int pstate_init_perf(struct amd_cpudata *cpudata)
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 10/11] cpufreq: amd-pstate: auto-load pstate driver by default
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
` (8 preceding siblings ...)
2024-06-17 6:59 ` [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-18 19:25 ` Mario Limonciello
2024-06-17 6:59 ` [PATCH v4 11/11] cpufreq: amd-pstate: enable shared memory type CPPC " Perry Yuan
10 siblings, 1 reply; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
If the `amd-pstate` driver is not loaded automatically by default,
it is because the kernel command line parameter has not been added.
To resolve this issue, it is necessary to call the `amd_pstate_set_driver()`
function to enable the desired mode (passive/active/guided) before registering
the driver instance.
This ensures that the driver is loaded correctly without relying on the kernel
command line parameter.
When there is no parameter added to command line, Kernel config will
provide the default mode to load.
Meanwhle, user can add driver mode in command line which will override
the kernel config default option.
Reported-by: Andrei Amuraritei <andamu@posteo.net>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218705
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
---
drivers/cpufreq/amd-pstate.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index cf68343219d1..b48fd60cbc6d 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -1857,8 +1857,13 @@ static int __init amd_pstate_init(void)
/* check if this machine need CPPC quirks */
dmi_check_system(amd_pstate_quirks_table);
- switch (cppc_state) {
- case AMD_PSTATE_UNDEFINED:
+ /*
+ * determine the driver mode from the command line or kernel config.
+ * If no command line input is provided, cppc_state will be AMD_PSTATE_UNDEFINED.
+ * command line options will override the kernel config settings.
+ */
+
+ if (cppc_state == AMD_PSTATE_UNDEFINED) {
/* Disable on the following configs by default:
* 1. Undefined platforms
* 2. Server platforms
@@ -1870,15 +1875,20 @@ static int __init amd_pstate_init(void)
pr_info("driver load is disabled, boot with specific mode to enable this\n");
return -ENODEV;
}
- ret = amd_pstate_set_driver(CONFIG_X86_AMD_PSTATE_DEFAULT_MODE);
- if (ret)
- return ret;
- break;
+ /* get driver mode from kernel config option [1:4] */
+ cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
+ }
+
+ switch (cppc_state) {
case AMD_PSTATE_DISABLE:
+ pr_info("driver load is disabled, boot with specific mode to enable this\n");
return -ENODEV;
case AMD_PSTATE_PASSIVE:
case AMD_PSTATE_ACTIVE:
case AMD_PSTATE_GUIDED:
+ ret = amd_pstate_set_driver(cppc_state);
+ if (ret)
+ return ret;
break;
default:
return -EINVAL;
@@ -1899,7 +1909,7 @@ static int __init amd_pstate_init(void)
/* enable amd pstate feature */
ret = amd_pstate_enable(true);
if (ret) {
- pr_err("failed to enable with return %d\n", ret);
+ pr_err("failed to enable driver mode(%d)\n", cppc_state);
return ret;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 11/11] cpufreq: amd-pstate: enable shared memory type CPPC by default
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
` (9 preceding siblings ...)
2024-06-17 6:59 ` [PATCH v4 10/11] cpufreq: amd-pstate: auto-load pstate driver by default Perry Yuan
@ 2024-06-17 6:59 ` Perry Yuan
2024-06-18 19:25 ` Mario Limonciello
10 siblings, 1 reply; 24+ messages in thread
From: Perry Yuan @ 2024-06-17 6:59 UTC (permalink / raw)
To: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
The amd-pstate-epp driver has been implemented and resolves the
performance drop issue seen in passive mode. Users who enable the
active mode driver will not experience a performance drop compared
to the passive mode driver. Therefore, the EPP driver should be
loaded by default at system boot.
Signed-off-by: Perry Yuan <perry.yuan@amd.com>
---
drivers/cpufreq/amd-pstate.c | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index b48fd60cbc6d..eca2f7dcf7ce 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -96,15 +96,6 @@ enum amd_core_type {
CPU_CORE_TYPE_UNDEFINED = 2,
};
-/*
- * TODO: We need more time to fine tune processors with shared memory solution
- * with community together.
- *
- * There are some performance drops on the CPU benchmarks which reports from
- * Suse. We are co-working with them to fine tune the shared memory solution. So
- * we disable it by default to go acpi-cpufreq on these processors and add a
- * module parameter to be able to enable it manually for debugging.
- */
static struct cpufreq_driver *current_pstate_driver;
static struct cpufreq_driver amd_pstate_driver;
static struct cpufreq_driver amd_pstate_epp_driver;
@@ -1867,11 +1858,9 @@ static int __init amd_pstate_init(void)
/* Disable on the following configs by default:
* 1. Undefined platforms
* 2. Server platforms
- * 3. Shared memory designs
*/
if (amd_pstate_acpi_pm_profile_undefined() ||
- amd_pstate_acpi_pm_profile_server() ||
- !cpu_feature_enabled(X86_FEATURE_CPPC)) {
+ amd_pstate_acpi_pm_profile_server()) {
pr_info("driver load is disabled, boot with specific mode to enable this\n");
return -ENODEV;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH v4 08/11] x86/cpufeatures: Add feature bits for AMD heterogeneous processor
2024-06-17 6:59 ` [PATCH v4 08/11] x86/cpufeatures: Add feature bits for AMD heterogeneous processor Perry Yuan
@ 2024-06-17 8:39 ` Borislav Petkov
2024-06-19 3:40 ` Yuan, Perry
0 siblings, 1 reply; 24+ messages in thread
From: Borislav Petkov @ 2024-06-17 8:39 UTC (permalink / raw)
To: Perry Yuan
Cc: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Alexander.Deucher, Xinmei.Huang, Xiaojian.Du,
Li.Meng, linux-pm, linux-kernel
On Mon, Jun 17, 2024 at 02:59:10PM +0800, Perry Yuan wrote:
> CPUID leaf 0x80000026 advertises core types with different efficiency rankings
>
> Bit 30 indicates the heterogeneous core topology feature, if the bit
> set, it means not all instances at the current hierarchical level have
> the same core topology.
>
> For better utilization of feature words and help to identify core type,
> X86_FEATURE_HETERO_CORE_TOPOLOGY is added as a few scattered feature bits.
>
> Reference:
> See the page 119 of PPR for AMD Family 19h Model 61h B1, docID 56713
>
> Signed-off-by: Perry Yuan <perry.yuan@amd.com>
> ---
> arch/x86/include/asm/cpufeatures.h | 1 +
> arch/x86/kernel/cpu/scattered.c | 1 +
> 2 files changed, 2 insertions(+)
>
> diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
> index 6c128d463a14..eceaa0df0137 100644
> --- a/arch/x86/include/asm/cpufeatures.h
> +++ b/arch/x86/include/asm/cpufeatures.h
> @@ -471,6 +471,7 @@
> #define X86_FEATURE_CLEAR_BHB_HW (21*32+ 3) /* "" BHI_DIS_S HW control enabled */
> #define X86_FEATURE_CLEAR_BHB_LOOP_ON_VMEXIT (21*32+ 4) /* "" Clear branch history at vmexit using SW loop */
> #define X86_FEATURE_FAST_CPPC (21*32 + 5) /* "" AMD Fast CPPC */
> +#define X86_FEATURE_HETERO_CORE_TOPOLOGY (21*32+ 6) /* "" Heterogeneous Core Topology */
>
> /*
> * BUG word(s)
> diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c
> index c84c30188fdf..6b3477503dd0 100644
> --- a/arch/x86/kernel/cpu/scattered.c
> +++ b/arch/x86/kernel/cpu/scattered.c
> @@ -52,6 +52,7 @@ static const struct cpuid_bit cpuid_bits[] = {
> { X86_FEATURE_PERFMON_V2, CPUID_EAX, 0, 0x80000022, 0 },
> { X86_FEATURE_AMD_LBR_V2, CPUID_EAX, 1, 0x80000022, 0 },
> { X86_FEATURE_AMD_LBR_PMC_FREEZE, CPUID_EAX, 2, 0x80000022, 0 },
> + { X86_FEATURE_HETERO_CORE_TOPOLOGY, CPUID_EAX, 30, 0x80000026, 0 },
> { 0, 0, 0, 0, 0 }
> };
>
> --
Nacked-by: Borislav Petkov (AMD) <bp@alien8.de>
Until all review comments have been addressed:
https://lore.kernel.org/r/20240611105216.GAZmgsYC-J_yLfdupF@fat_crate.local
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
2024-06-17 6:59 ` [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization Perry Yuan
@ 2024-06-18 19:22 ` Mario Limonciello
2024-06-19 3:23 ` Yuan, Perry
2024-06-18 21:23 ` Borislav Petkov
1 sibling, 1 reply; 24+ messages in thread
From: Mario Limonciello @ 2024-06-18 19:22 UTC (permalink / raw)
To: Perry Yuan, rafael.j.wysocki, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
On 6/17/2024 01:59, Perry Yuan wrote:
> Introduces an optimization to the AMD-Pstate driver by implementing
> a heterogeneous core topology for the initialization of the highest
> performance value while driver loading.
> The two core types supported are "performance" and "efficiency".
> Each core type has different highest performance and frequency values
> configured by the platform. The `amd_pstate` driver needs to identify
> the type of core to correctly set an appropriate highest perf value.
>
> X86_FEATURE_HETERO_CORE_TOPOLOGY is used to identify whether the
> processor support heterogeneous core type by reading CPUID leaf
> Fn_0x80000026_EAX and bit 30. if the bit is set as one, then amd_pstate
> driver will check EBX 30:28 bits to get the core type.
>
> Reference:
> See the page 119 of PPR for AMD Family 19h Model 61h B1, docID 56713
>
> Signed-off-by: Perry Yuan <perry.yuan@amd.com>
> ---
> arch/x86/include/asm/processor.h | 2 ++
> arch/x86/kernel/cpu/amd.c | 19 ++++++++++++
> drivers/cpufreq/amd-pstate.c | 53 ++++++++++++++++++++++++++++++--
> 3 files changed, 71 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index cb4f6c513c48..223aa58e2d5c 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -694,10 +694,12 @@ static inline u32 per_cpu_l2c_id(unsigned int cpu)
> extern u32 amd_get_highest_perf(void);
> extern void amd_clear_divider(void);
> extern void amd_check_microcode(void);
> +extern int amd_get_this_core_type(void);
> #else
> static inline u32 amd_get_highest_perf(void) { return 0; }
> static inline void amd_clear_divider(void) { }
> static inline void amd_check_microcode(void) { }
> +static inline int amd_get_this_core_type(void) { return -1; }
> #endif
>
> extern unsigned long arch_align_stack(unsigned long sp);
> diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
> index 44df3f11e731..62a4ef21ef79 100644
> --- a/arch/x86/kernel/cpu/amd.c
> +++ b/arch/x86/kernel/cpu/amd.c
> @@ -1231,3 +1231,22 @@ void noinstr amd_clear_divider(void)
> :: "a" (0), "d" (0), "r" (1));
> }
> EXPORT_SYMBOL_GPL(amd_clear_divider);
> +
> +#define X86_CPU_TYPE_ID_SHIFT 28
> +
> +/**
> + * amd_get_this_core_type - Get the type of this heterogeneous CPU
> + *
> + * Returns the CPU type [31:28] (i.e., performance or efficient) of
> + * a CPU in the processor.
> + * If the processor has no core type support, returns -1.
> + */
> +
> +int amd_get_this_core_type(void)
Did you miss my feedback from v3? I don't see changes for the return
type or for returning CPU_CORE_TYPE_NO_HETERO_SUP instead of -1.
> +{
> + if (!cpu_feature_enabled(X86_FEATURE_HETERO_CORE_TOPOLOGY))
> + return -1;
> +
> + return cpuid_ebx(0x80000026) >> X86_CPU_TYPE_ID_SHIFT;
> +}
> +EXPORT_SYMBOL_GPL(amd_get_this_core_type);
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index cb750ef305fe..cf68343219d1 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -52,8 +52,10 @@
> #define AMD_PSTATE_TRANSITION_LATENCY 20000
> #define AMD_PSTATE_TRANSITION_DELAY 1000
> #define AMD_PSTATE_FAST_CPPC_TRANSITION_DELAY 600
> -#define CPPC_HIGHEST_PERF_PERFORMANCE 196
> -#define CPPC_HIGHEST_PERF_DEFAULT 166
> +
> +#define CPPC_HIGHEST_PERF_EFFICIENT 132
> +#define CPPC_HIGHEST_PERF_PERFORMANCE 196
> +#define CPPC_HIGHEST_PERF_DEFAULT 166
>
> #define AMD_CPPC_EPP_PERFORMANCE 0x00
> #define AMD_CPPC_EPP_BALANCE_PERFORMANCE 0x80
> @@ -86,6 +88,14 @@ struct quirk_entry {
> u32 lowest_freq;
> };
>
> +/* defined by CPUID_Fn80000026_EBX BIT [31:28] */
> +enum amd_core_type {
> + CPU_CORE_TYPE_NO_HETERO_SUP = -1,
> + CPU_CORE_TYPE_PERFORMANCE = 0,
> + CPU_CORE_TYPE_EFFICIENCY = 1,
> + CPU_CORE_TYPE_UNDEFINED = 2,
> +};
> +
> /*
> * TODO: We need more time to fine tune processors with shared memory solution
> * with community together.
> @@ -358,9 +368,27 @@ static inline int amd_pstate_enable(bool enable)
> return static_call(amd_pstate_enable)(enable);
> }
>
> +static void get_this_core_type(void *data)
> +{
> + enum amd_core_type *cpu_type = data;
> +
> + *cpu_type = amd_get_this_core_type();
> +}
> +
> +static enum amd_core_type amd_pstate_get_cpu_type(int cpu)
> +{
> + enum amd_core_type cpu_type;
> +
> + smp_call_function_single(cpu, get_this_core_type, &cpu_type, 1);
> +
> + return cpu_type;
> +}
> +
> static u32 amd_pstate_highest_perf_set(struct amd_cpudata *cpudata)
> {
> struct cpuinfo_x86 *c = &cpu_data(0);
> + u32 highest_perf;
> + enum amd_core_type core_type;
>
> /*
> * For AMD CPUs with Family ID 19H and Model ID range 0x70 to 0x7f,
> @@ -370,7 +398,26 @@ static u32 amd_pstate_highest_perf_set(struct amd_cpudata *cpudata)
> if (c->x86 == 0x19 && (c->x86_model >= 0x70 && c->x86_model <= 0x7f))
> return CPPC_HIGHEST_PERF_PERFORMANCE;
>
> - return CPPC_HIGHEST_PERF_DEFAULT;
> + core_type = amd_pstate_get_cpu_type(cpudata->cpu);
> + pr_debug("core_type %d found\n", core_type);
> +
> + switch (core_type) {
> + case CPU_CORE_TYPE_NO_HETERO_SUP:
> + highest_perf = CPPC_HIGHEST_PERF_DEFAULT;
> + break;
> + case CPU_CORE_TYPE_PERFORMANCE:
> + highest_perf = CPPC_HIGHEST_PERF_PERFORMANCE;
> + break;
> + case CPU_CORE_TYPE_EFFICIENCY:
> + highest_perf = CPPC_HIGHEST_PERF_EFFICIENT;
> + break;
> + default:
> + highest_perf = CPPC_HIGHEST_PERF_DEFAULT;
> + WARN_ONCE(true, "WARNING: Undefined core type found");
> + break;
> + }
> +
> + return highest_perf;
> }
>
> static int pstate_init_perf(struct amd_cpudata *cpudata)
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 05/11] Documentation: PM: amd-pstate: add debugging section for driver loading failure
2024-06-17 6:59 ` [PATCH v4 05/11] Documentation: PM: amd-pstate: add debugging section for driver loading failure Perry Yuan
@ 2024-06-18 19:24 ` Mario Limonciello
0 siblings, 0 replies; 24+ messages in thread
From: Mario Limonciello @ 2024-06-18 19:24 UTC (permalink / raw)
To: Perry Yuan, rafael.j.wysocki, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
On 6/17/2024 01:59, Perry Yuan wrote:
> To address issues with the loading of the amd-pstate driver on certain platforms,
> It needs to enable dynamic debugging to capture debug messages during the driver
> loading process. By adding "amd_pstate.dyndbg=+p cppc_acpi.dyndbg=+p debug
> amd_pstate=active" and loglevel to the kernel command line, then driver debug
> logging is enabled.
>
> Signed-off-by: Perry Yuan <perry.yuan@amd.com>
> ---
> Documentation/admin-guide/pm/amd-pstate.rst | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
> index 1e0d101b020a..ceeb073c9ada 100644
> --- a/Documentation/admin-guide/pm/amd-pstate.rst
> +++ b/Documentation/admin-guide/pm/amd-pstate.rst
> @@ -472,6 +472,20 @@ operations for the new ``amd-pstate`` module with this tool. ::
> Diagnostics and Tuning
> =======================
>
> +Debugging AMD P-State Driver Loading Issues
> +------------------------------------------
> +
> +If the amd-pstate driver fails to load, additional debug information
> +may be necessary.
> +To capture debug messages for issue analysis, users can add below parameter,
> +"amd_pstate.dyndbg=+p cppc_acpi.dyndbg=+p debug"
What keys off "debug"? I would expect that dynamic debugging for the
first two is sufficient.
That being said; isn't everything important shown as a warning now with
this series?
Is this patch still needed?
> +to the kernel command line. This will enable dynamic debugging and allow better
> +analysis and troubleshooting of the driver loading process.
> +
> +Please note that adding this parameter will only enable debug logging during the
> +driver loading phase and may affect system behavior. Use this option with caution
> +and only for debugging purposes.
> +
> Trace Events
> --------------
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 04/11] cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS
2024-06-17 6:59 ` [PATCH v4 04/11] cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS Perry Yuan
@ 2024-06-18 19:25 ` Mario Limonciello
0 siblings, 0 replies; 24+ messages in thread
From: Mario Limonciello @ 2024-06-18 19:25 UTC (permalink / raw)
To: Perry Yuan, rafael.j.wysocki, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
On 6/17/2024 01:59, Perry Yuan wrote:
> If CPPC feature is supported by the CPU however the CPUID flag bit is not
> set by SBIOS, the `amd_pstate` will be failed to load while system
> booting.
> So adding one more debug message to inform user to check the SBIOS setting,
> The change also can help maintainers to debug why amd_pstate driver failed
> to be loaded at system booting if the processor support CPPC.
>
> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218686
> Signed-off-by: Perry Yuan <perry.yuan@amd.com>
> Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Acked-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
> drivers/cpufreq/amd-pstate.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index 76419762c04f..9aa220a0e3fe 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -1749,11 +1749,37 @@ static int __init amd_pstate_set_driver(int mode_idx)
> */
> static bool amd_cppc_supported(void)
> {
> + struct cpuinfo_x86 *c = &cpu_data(0);
> + bool warn = false;
> +
> if ((boot_cpu_data.x86 == 0x17) && (boot_cpu_data.x86_model < 0x30)) {
> pr_debug_once("CPPC feature is not supported by the processor\n");
> return false;
> }
>
> + /*
> + * If the CPPC feature is disabled in the BIOS for processors that support MSR-based CPPC,
> + * the AMD Pstate driver may not function correctly.
> + * Check the CPPC flag and display a warning message if the platform supports CPPC.
> + * Note: below checking code will not abort the driver registeration process because of
> + * the code is added for debugging purposes.
> + */
> + if (!cpu_feature_enabled(X86_FEATURE_CPPC)) {
> + if (cpu_feature_enabled(X86_FEATURE_ZEN1) || cpu_feature_enabled(X86_FEATURE_ZEN2)) {
> + if (c->x86_model > 0x60 && c->x86_model < 0xaf)
> + warn = true;
> + } else if (cpu_feature_enabled(X86_FEATURE_ZEN3) || cpu_feature_enabled(X86_FEATURE_ZEN4)) {
> + if ((c->x86_model > 0x10 && c->x86_model < 0x1F) ||
> + (c->x86_model > 0x40 && c->x86_model < 0xaf))
> + warn = true;
> + } else if (cpu_feature_enabled(X86_FEATURE_ZEN5)) {
> + warn = true;
> + }
> + }
> +
> + if (warn)
> + pr_warn_once("The CPPC feature is supported but currently disabled by the BIOS.\n"
> + "Please enable it if your BIOS has the CPPC option.\n");
> return true;
> }
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 11/11] cpufreq: amd-pstate: enable shared memory type CPPC by default
2024-06-17 6:59 ` [PATCH v4 11/11] cpufreq: amd-pstate: enable shared memory type CPPC " Perry Yuan
@ 2024-06-18 19:25 ` Mario Limonciello
2024-06-19 3:06 ` Yuan, Perry
0 siblings, 1 reply; 24+ messages in thread
From: Mario Limonciello @ 2024-06-18 19:25 UTC (permalink / raw)
To: Perry Yuan, rafael.j.wysocki, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
On 6/17/2024 01:59, Perry Yuan wrote:
> The amd-pstate-epp driver has been implemented and resolves the
> performance drop issue seen in passive mode. Users who enable the
> active mode driver will not experience a performance drop compared
> to the passive mode driver. Therefore, the EPP driver should be
> loaded by default at system boot.
I think this commit message should specifically reference that it's
being enabled by default on shared memory designs as that's the net new.
The code change looks good, go ahead and add
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
on the next version as long as you've added a sentence about shared
memory designs to commit message.
>
> Signed-off-by: Perry Yuan <perry.yuan@amd.com>
> ---
> drivers/cpufreq/amd-pstate.c | 13 +------------
> 1 file changed, 1 insertion(+), 12 deletions(-)
>
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index b48fd60cbc6d..eca2f7dcf7ce 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -96,15 +96,6 @@ enum amd_core_type {
> CPU_CORE_TYPE_UNDEFINED = 2,
> };
>
> -/*
> - * TODO: We need more time to fine tune processors with shared memory solution
> - * with community together.
> - *
> - * There are some performance drops on the CPU benchmarks which reports from
> - * Suse. We are co-working with them to fine tune the shared memory solution. So
> - * we disable it by default to go acpi-cpufreq on these processors and add a
> - * module parameter to be able to enable it manually for debugging.
> - */
> static struct cpufreq_driver *current_pstate_driver;
> static struct cpufreq_driver amd_pstate_driver;
> static struct cpufreq_driver amd_pstate_epp_driver;
> @@ -1867,11 +1858,9 @@ static int __init amd_pstate_init(void)
> /* Disable on the following configs by default:
> * 1. Undefined platforms
> * 2. Server platforms
> - * 3. Shared memory designs
> */
> if (amd_pstate_acpi_pm_profile_undefined() ||
> - amd_pstate_acpi_pm_profile_server() ||
> - !cpu_feature_enabled(X86_FEATURE_CPPC)) {
> + amd_pstate_acpi_pm_profile_server()) {
> pr_info("driver load is disabled, boot with specific mode to enable this\n");
> return -ENODEV;
> }
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 10/11] cpufreq: amd-pstate: auto-load pstate driver by default
2024-06-17 6:59 ` [PATCH v4 10/11] cpufreq: amd-pstate: auto-load pstate driver by default Perry Yuan
@ 2024-06-18 19:25 ` Mario Limonciello
2024-06-19 3:08 ` Yuan, Perry
0 siblings, 1 reply; 24+ messages in thread
From: Mario Limonciello @ 2024-06-18 19:25 UTC (permalink / raw)
To: Perry Yuan, rafael.j.wysocki, viresh.kumar, Ray.Huang,
gautham.shenoy, Borislav.Petkov
Cc: Alexander.Deucher, Xinmei.Huang, Xiaojian.Du, Li.Meng, linux-pm,
linux-kernel
On 6/17/2024 01:59, Perry Yuan wrote:
> If the `amd-pstate` driver is not loaded automatically by default,
> it is because the kernel command line parameter has not been added.
> To resolve this issue, it is necessary to call the `amd_pstate_set_driver()`
> function to enable the desired mode (passive/active/guided) before registering
> the driver instance.
>
> This ensures that the driver is loaded correctly without relying on the kernel
> command line parameter.
>
> When there is no parameter added to command line, Kernel config will
> provide the default mode to load.
>
> Meanwhle, user can add driver mode in command line which will override
Meanwhile
> the kernel config default option.
I think you'll probably want to swap the order of patch 10 and patch 11.
>
> Reported-by: Andrei Amuraritei <andamu@posteo.net>
> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218705
> Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
> drivers/cpufreq/amd-pstate.c | 24 +++++++++++++++++-------
> 1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index cf68343219d1..b48fd60cbc6d 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -1857,8 +1857,13 @@ static int __init amd_pstate_init(void)
> /* check if this machine need CPPC quirks */
> dmi_check_system(amd_pstate_quirks_table);
>
> - switch (cppc_state) {
> - case AMD_PSTATE_UNDEFINED:
> + /*
> + * determine the driver mode from the command line or kernel config.
> + * If no command line input is provided, cppc_state will be AMD_PSTATE_UNDEFINED.
> + * command line options will override the kernel config settings.
> + */
> +
> + if (cppc_state == AMD_PSTATE_UNDEFINED) {
> /* Disable on the following configs by default:
> * 1. Undefined platforms
> * 2. Server platforms
> @@ -1870,15 +1875,20 @@ static int __init amd_pstate_init(void)
> pr_info("driver load is disabled, boot with specific mode to enable this\n");
> return -ENODEV;
> }
> - ret = amd_pstate_set_driver(CONFIG_X86_AMD_PSTATE_DEFAULT_MODE);
> - if (ret)
> - return ret;
> - break;
> + /* get driver mode from kernel config option [1:4] */
> + cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> + }
> +
> + switch (cppc_state) {
> case AMD_PSTATE_DISABLE:
> + pr_info("driver load is disabled, boot with specific mode to enable this\n");
> return -ENODEV;
> case AMD_PSTATE_PASSIVE:
> case AMD_PSTATE_ACTIVE:
> case AMD_PSTATE_GUIDED:
> + ret = amd_pstate_set_driver(cppc_state);
> + if (ret)
> + return ret;
> break;
> default:
> return -EINVAL;
> @@ -1899,7 +1909,7 @@ static int __init amd_pstate_init(void)
> /* enable amd pstate feature */
> ret = amd_pstate_enable(true);
> if (ret) {
> - pr_err("failed to enable with return %d\n", ret);
> + pr_err("failed to enable driver mode(%d)\n", cppc_state);
> return ret;
> }
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
2024-06-17 6:59 ` [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization Perry Yuan
2024-06-18 19:22 ` Mario Limonciello
@ 2024-06-18 21:23 ` Borislav Petkov
2024-06-19 3:25 ` Yuan, Perry
1 sibling, 1 reply; 24+ messages in thread
From: Borislav Petkov @ 2024-06-18 21:23 UTC (permalink / raw)
To: Perry Yuan
Cc: rafael.j.wysocki, Mario.Limonciello, viresh.kumar, Ray.Huang,
gautham.shenoy, Alexander.Deucher, Xinmei.Huang, Xiaojian.Du,
Li.Meng, linux-pm, linux-kernel
On Mon, Jun 17, 2024 at 02:59:11PM +0800, Perry Yuan wrote:
> Introduces an optimization to the AMD-Pstate driver by implementing
> a heterogeneous core topology for the initialization of the highest
> performance value while driver loading.
> The two core types supported are "performance" and "efficiency".
> Each core type has different highest performance and frequency values
> configured by the platform. The `amd_pstate` driver needs to identify
> the type of core to correctly set an appropriate highest perf value.
>
> X86_FEATURE_HETERO_CORE_TOPOLOGY is used to identify whether the
> processor support heterogeneous core type by reading CPUID leaf
> Fn_0x80000026_EAX and bit 30. if the bit is set as one, then amd_pstate
> driver will check EBX 30:28 bits to get the core type.
There will be a special ->cpu_type member for that eventually:
https://lore.kernel.org/r/20240617-add-cpu-type-v1-1-b88998c01e76@linux.intel.com
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 24+ messages in thread
* RE: [PATCH v4 11/11] cpufreq: amd-pstate: enable shared memory type CPPC by default
2024-06-18 19:25 ` Mario Limonciello
@ 2024-06-19 3:06 ` Yuan, Perry
0 siblings, 0 replies; 24+ messages in thread
From: Yuan, Perry @ 2024-06-19 3:06 UTC (permalink / raw)
To: Limonciello, Mario, rafael.j.wysocki@intel.com,
viresh.kumar@linaro.org, Huang, Ray, Shenoy, Gautham Ranjal,
Petkov, Borislav
Cc: Deucher, Alexander, Huang, Shimmer, Du, Xiaojian,
Meng, Li (Jassmine), linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Limonciello, Mario <Mario.Limonciello@amd.com>
> Sent: Wednesday, June 19, 2024 3:25 AM
> To: Yuan, Perry <Perry.Yuan@amd.com>; rafael.j.wysocki@intel.com;
> viresh.kumar@linaro.org; Huang, Ray <Ray.Huang@amd.com>; Shenoy,
> Gautham Ranjal <gautham.shenoy@amd.com>; Petkov, Borislav
> <Borislav.Petkov@amd.com>
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>; Huang, Shimmer
> <Shimmer.Huang@amd.com>; Du, Xiaojian <Xiaojian.Du@amd.com>; Meng,
> Li (Jassmine) <Li.Meng@amd.com>; linux-pm@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH v4 11/11] cpufreq: amd-pstate: enable shared memory
> type CPPC by default
>
> On 6/17/2024 01:59, Perry Yuan wrote:
> > The amd-pstate-epp driver has been implemented and resolves the
> > performance drop issue seen in passive mode. Users who enable the
> > active mode driver will not experience a performance drop compared to
> > the passive mode driver. Therefore, the EPP driver should be loaded by
> > default at system boot.
>
> I think this commit message should specifically reference that it's being
> enabled by default on shared memory designs as that's the net new.
>
> The code change looks good, go ahead and add
>
> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
>
> on the next version as long as you've added a sentence about shared
> memory designs to commit message.
Thanks for the review, will add the shared memory systems words to commit log in the next version.
>
> >
> > Signed-off-by: Perry Yuan <perry.yuan@amd.com>
> > ---
> > drivers/cpufreq/amd-pstate.c | 13 +------------
> > 1 file changed, 1 insertion(+), 12 deletions(-)
> >
> > diff --git a/drivers/cpufreq/amd-pstate.c
> > b/drivers/cpufreq/amd-pstate.c index b48fd60cbc6d..eca2f7dcf7ce 100644
> > --- a/drivers/cpufreq/amd-pstate.c
> > +++ b/drivers/cpufreq/amd-pstate.c
> > @@ -96,15 +96,6 @@ enum amd_core_type {
> > CPU_CORE_TYPE_UNDEFINED = 2,
> > };
> >
> > -/*
> > - * TODO: We need more time to fine tune processors with shared memory
> > solution
> > - * with community together.
> > - *
> > - * There are some performance drops on the CPU benchmarks which
> > reports from
> > - * Suse. We are co-working with them to fine tune the shared memory
> > solution. So
> > - * we disable it by default to go acpi-cpufreq on these processors
> > and add a
> > - * module parameter to be able to enable it manually for debugging.
> > - */
> > static struct cpufreq_driver *current_pstate_driver;
> > static struct cpufreq_driver amd_pstate_driver;
> > static struct cpufreq_driver amd_pstate_epp_driver; @@ -1867,11
> > +1858,9 @@ static int __init amd_pstate_init(void)
> > /* Disable on the following configs by default:
> > * 1. Undefined platforms
> > * 2. Server platforms
> > - * 3. Shared memory designs
> > */
> > if (amd_pstate_acpi_pm_profile_undefined() ||
> > - amd_pstate_acpi_pm_profile_server() ||
> > - !cpu_feature_enabled(X86_FEATURE_CPPC)) {
> > + amd_pstate_acpi_pm_profile_server()) {
> > pr_info("driver load is disabled, boot with specific
> mode to enable this\n");
> > return -ENODEV;
> > }
^ permalink raw reply [flat|nested] 24+ messages in thread
* RE: [PATCH v4 10/11] cpufreq: amd-pstate: auto-load pstate driver by default
2024-06-18 19:25 ` Mario Limonciello
@ 2024-06-19 3:08 ` Yuan, Perry
0 siblings, 0 replies; 24+ messages in thread
From: Yuan, Perry @ 2024-06-19 3:08 UTC (permalink / raw)
To: Limonciello, Mario, rafael.j.wysocki@intel.com,
viresh.kumar@linaro.org, Huang, Ray, Shenoy, Gautham Ranjal,
Petkov, Borislav
Cc: Deucher, Alexander, Huang, Shimmer, Du, Xiaojian,
Meng, Li (Jassmine), linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org
[AMD Official Use Only - AMD Internal Distribution Only]
Hi Mario
> -----Original Message-----
> From: Limonciello, Mario <Mario.Limonciello@amd.com>
> Sent: Wednesday, June 19, 2024 3:25 AM
> To: Yuan, Perry <Perry.Yuan@amd.com>; rafael.j.wysocki@intel.com;
> viresh.kumar@linaro.org; Huang, Ray <Ray.Huang@amd.com>; Shenoy,
> Gautham Ranjal <gautham.shenoy@amd.com>; Petkov, Borislav
> <Borislav.Petkov@amd.com>
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>; Huang, Shimmer
> <Shimmer.Huang@amd.com>; Du, Xiaojian <Xiaojian.Du@amd.com>; Meng,
> Li (Jassmine) <Li.Meng@amd.com>; linux-pm@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH v4 10/11] cpufreq: amd-pstate: auto-load pstate driver by
> default
>
> On 6/17/2024 01:59, Perry Yuan wrote:
> > If the `amd-pstate` driver is not loaded automatically by default, it
> > is because the kernel command line parameter has not been added.
> > To resolve this issue, it is necessary to call the
> > `amd_pstate_set_driver()` function to enable the desired mode
> > (passive/active/guided) before registering the driver instance.
> >
> > This ensures that the driver is loaded correctly without relying on
> > the kernel command line parameter.
> >
> > When there is no parameter added to command line, Kernel config will
> > provide the default mode to load.
> >
> > Meanwhle, user can add driver mode in command line which will override
>
> Meanwhile
>
> > the kernel config default option.
>
> I think you'll probably want to swap the order of patch 10 and patch 11.
Sure, that will be more reasonable to set epp loaded by default for MSR and shared memory systems.
Let me swap them in v5.
Thanks for the review.
>
> >
> > Reported-by: Andrei Amuraritei <andamu@posteo.net>
> > Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218705
> > Signed-off-by: Perry Yuan <perry.yuan@amd.com>
>
> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
>
> > ---
> > drivers/cpufreq/amd-pstate.c | 24 +++++++++++++++++-------
> > 1 file changed, 17 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/cpufreq/amd-pstate.c
> > b/drivers/cpufreq/amd-pstate.c index cf68343219d1..b48fd60cbc6d
> 100644
> > --- a/drivers/cpufreq/amd-pstate.c
> > +++ b/drivers/cpufreq/amd-pstate.c
> > @@ -1857,8 +1857,13 @@ static int __init amd_pstate_init(void)
> > /* check if this machine need CPPC quirks */
> > dmi_check_system(amd_pstate_quirks_table);
> >
> > - switch (cppc_state) {
> > - case AMD_PSTATE_UNDEFINED:
> > + /*
> > + * determine the driver mode from the command line or kernel
> config.
> > + * If no command line input is provided, cppc_state will be
> AMD_PSTATE_UNDEFINED.
> > + * command line options will override the kernel config settings.
> > + */
> > +
> > + if (cppc_state == AMD_PSTATE_UNDEFINED) {
> > /* Disable on the following configs by default:
> > * 1. Undefined platforms
> > * 2. Server platforms
> > @@ -1870,15 +1875,20 @@ static int __init amd_pstate_init(void)
> > pr_info("driver load is disabled, boot with specific
> mode to enable this\n");
> > return -ENODEV;
> > }
> > - ret =
> amd_pstate_set_driver(CONFIG_X86_AMD_PSTATE_DEFAULT_MODE);
> > - if (ret)
> > - return ret;
> > - break;
> > + /* get driver mode from kernel config option [1:4] */
> > + cppc_state = CONFIG_X86_AMD_PSTATE_DEFAULT_MODE;
> > + }
> > +
> > + switch (cppc_state) {
> > case AMD_PSTATE_DISABLE:
> > + pr_info("driver load is disabled, boot with specific mode to
> enable
> > +this\n");
> > return -ENODEV;
> > case AMD_PSTATE_PASSIVE:
> > case AMD_PSTATE_ACTIVE:
> > case AMD_PSTATE_GUIDED:
> > + ret = amd_pstate_set_driver(cppc_state);
> > + if (ret)
> > + return ret;
> > break;
> > default:
> > return -EINVAL;
> > @@ -1899,7 +1909,7 @@ static int __init amd_pstate_init(void)
> > /* enable amd pstate feature */
> > ret = amd_pstate_enable(true);
> > if (ret) {
> > - pr_err("failed to enable with return %d\n", ret);
> > + pr_err("failed to enable driver mode(%d)\n", cppc_state);
> > return ret;
> > }
> >
^ permalink raw reply [flat|nested] 24+ messages in thread
* RE: [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
2024-06-18 19:22 ` Mario Limonciello
@ 2024-06-19 3:23 ` Yuan, Perry
0 siblings, 0 replies; 24+ messages in thread
From: Yuan, Perry @ 2024-06-19 3:23 UTC (permalink / raw)
To: Limonciello, Mario, rafael.j.wysocki@intel.com,
viresh.kumar@linaro.org, Huang, Ray, Shenoy, Gautham Ranjal,
Petkov, Borislav
Cc: Deucher, Alexander, Huang, Shimmer, Du, Xiaojian,
Meng, Li (Jassmine), linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Limonciello, Mario <Mario.Limonciello@amd.com>
> Sent: Wednesday, June 19, 2024 3:23 AM
> To: Yuan, Perry <Perry.Yuan@amd.com>; rafael.j.wysocki@intel.com;
> viresh.kumar@linaro.org; Huang, Ray <Ray.Huang@amd.com>; Shenoy,
> Gautham Ranjal <gautham.shenoy@amd.com>; Petkov, Borislav
> <Borislav.Petkov@amd.com>
> Cc: Deucher, Alexander <Alexander.Deucher@amd.com>; Huang, Shimmer
> <Shimmer.Huang@amd.com>; Du, Xiaojian <Xiaojian.Du@amd.com>; Meng,
> Li (Jassmine) <Li.Meng@amd.com>; linux-pm@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH v4 09/11] cpufreq: amd-pstate: implement
> heterogeneous core topology for highest performance initialization
>
> On 6/17/2024 01:59, Perry Yuan wrote:
> > Introduces an optimization to the AMD-Pstate driver by implementing a
> > heterogeneous core topology for the initialization of the highest
> > performance value while driver loading.
> > The two core types supported are "performance" and "efficiency".
> > Each core type has different highest performance and frequency values
> > configured by the platform. The `amd_pstate` driver needs to identify
> > the type of core to correctly set an appropriate highest perf value.
> >
> > X86_FEATURE_HETERO_CORE_TOPOLOGY is used to identify whether the
> > processor support heterogeneous core type by reading CPUID leaf
> > Fn_0x80000026_EAX and bit 30. if the bit is set as one, then
> > amd_pstate driver will check EBX 30:28 bits to get the core type.
> >
> > Reference:
> > See the page 119 of PPR for AMD Family 19h Model 61h B1, docID 56713
> >
> > Signed-off-by: Perry Yuan <perry.yuan@amd.com>
> > ---
> > arch/x86/include/asm/processor.h | 2 ++
> > arch/x86/kernel/cpu/amd.c | 19 ++++++++++++
> > drivers/cpufreq/amd-pstate.c | 53 ++++++++++++++++++++++++++++++-
> -
> > 3 files changed, 71 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/x86/include/asm/processor.h
> > b/arch/x86/include/asm/processor.h
> > index cb4f6c513c48..223aa58e2d5c 100644
> > --- a/arch/x86/include/asm/processor.h
> > +++ b/arch/x86/include/asm/processor.h
> > @@ -694,10 +694,12 @@ static inline u32 per_cpu_l2c_id(unsigned int
> cpu)
> > extern u32 amd_get_highest_perf(void);
> > extern void amd_clear_divider(void);
> > extern void amd_check_microcode(void);
> > +extern int amd_get_this_core_type(void);
> > #else
> > static inline u32 amd_get_highest_perf(void) { return 0; }
> > static inline void amd_clear_divider(void) { }
> > static inline void amd_check_microcode(void) { }
> > +static inline int amd_get_this_core_type(void) { return -1; }
> > #endif
> >
> > extern unsigned long arch_align_stack(unsigned long sp); diff --git
> > a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index
> > 44df3f11e731..62a4ef21ef79 100644
> > --- a/arch/x86/kernel/cpu/amd.c
> > +++ b/arch/x86/kernel/cpu/amd.c
> > @@ -1231,3 +1231,22 @@ void noinstr amd_clear_divider(void)
> > :: "a" (0), "d" (0), "r" (1));
> > }
> > EXPORT_SYMBOL_GPL(amd_clear_divider);
> > +
> > +#define X86_CPU_TYPE_ID_SHIFT 28
> > +
> > +/**
> > + * amd_get_this_core_type - Get the type of this heterogeneous CPU
> > + *
> > + * Returns the CPU type [31:28] (i.e., performance or efficient) of
> > + * a CPU in the processor.
> > + * If the processor has no core type support, returns -1.
> > + */
> > +
> > +int amd_get_this_core_type(void)
>
>
> Did you miss my feedback from v3? I don't see changes for the return type
> or for returning CPU_CORE_TYPE_NO_HETERO_SUP instead of -1.
This CPU_CORE_TYPE_NO_HETERO_SUP is defined in the amd_pstate.c, if we want to use it, it will need to define them in another header.
Boris also mentioned that there is another patchset working to export core types in future, we can use "-1" in short term.
Once the core type patches finalize the solution, we can rework the pstate driver.
Firstly, let`s provide a workable solution, then improve the driver with coming patches.
Perry.
>
>
> > +{
> > + if (!cpu_feature_enabled(X86_FEATURE_HETERO_CORE_TOPOLOGY))
> > + return -1;
> > +
> > + return cpuid_ebx(0x80000026) >> X86_CPU_TYPE_ID_SHIFT;
> > +}
> > +EXPORT_SYMBOL_GPL(amd_get_this_core_type);
> > diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> > index cb750ef305fe..cf68343219d1 100644
> > --- a/drivers/cpufreq/amd-pstate.c
> > +++ b/drivers/cpufreq/amd-pstate.c
> > @@ -52,8 +52,10 @@
> > #define AMD_PSTATE_TRANSITION_LATENCY 20000
> > #define AMD_PSTATE_TRANSITION_DELAY 1000
> > #define AMD_PSTATE_FAST_CPPC_TRANSITION_DELAY 600
> > -#define CPPC_HIGHEST_PERF_PERFORMANCE 196
> > -#define CPPC_HIGHEST_PERF_DEFAULT 166
> > +
> > +#define CPPC_HIGHEST_PERF_EFFICIENT 132
> > +#define CPPC_HIGHEST_PERF_PERFORMANCE 196
> > +#define CPPC_HIGHEST_PERF_DEFAULT 166
> >
> > #define AMD_CPPC_EPP_PERFORMANCE 0x00
> > #define AMD_CPPC_EPP_BALANCE_PERFORMANCE 0x80
> > @@ -86,6 +88,14 @@ struct quirk_entry {
> > u32 lowest_freq;
> > };
> >
> > +/* defined by CPUID_Fn80000026_EBX BIT [31:28] */
> > +enum amd_core_type {
> > + CPU_CORE_TYPE_NO_HETERO_SUP = -1,
> > + CPU_CORE_TYPE_PERFORMANCE = 0,
> > + CPU_CORE_TYPE_EFFICIENCY = 1,
> > + CPU_CORE_TYPE_UNDEFINED = 2,
> > +};
> > +
> > /*
> > * TODO: We need more time to fine tune processors with shared memory
> solution
> > * with community together.
> > @@ -358,9 +368,27 @@ static inline int amd_pstate_enable(bool enable)
> > return static_call(amd_pstate_enable)(enable);
> > }
> >
> > +static void get_this_core_type(void *data)
> > +{
> > + enum amd_core_type *cpu_type = data;
> > +
> > + *cpu_type = amd_get_this_core_type();
> > +}
> > +
> > +static enum amd_core_type amd_pstate_get_cpu_type(int cpu)
> > +{
> > + enum amd_core_type cpu_type;
> > +
> > + smp_call_function_single(cpu, get_this_core_type, &cpu_type, 1);
> > +
> > + return cpu_type;
> > +}
> > +
> > static u32 amd_pstate_highest_perf_set(struct amd_cpudata *cpudata)
> > {
> > struct cpuinfo_x86 *c = &cpu_data(0);
> > + u32 highest_perf;
> > + enum amd_core_type core_type;
> >
> > /*
> > * For AMD CPUs with Family ID 19H and Model ID range 0x70 to 0x7f,
> > @@ -370,7 +398,26 @@ static u32 amd_pstate_highest_perf_set(struct
> amd_cpudata *cpudata)
> > if (c->x86 == 0x19 && (c->x86_model >= 0x70 && c->x86_model <=
> 0x7f))
> > return CPPC_HIGHEST_PERF_PERFORMANCE;
> >
> > - return CPPC_HIGHEST_PERF_DEFAULT;
> > + core_type = amd_pstate_get_cpu_type(cpudata->cpu);
> > + pr_debug("core_type %d found\n", core_type);
> > +
> > + switch (core_type) {
> > + case CPU_CORE_TYPE_NO_HETERO_SUP:
> > + highest_perf = CPPC_HIGHEST_PERF_DEFAULT;
> > + break;
> > + case CPU_CORE_TYPE_PERFORMANCE:
> > + highest_perf = CPPC_HIGHEST_PERF_PERFORMANCE;
> > + break;
> > + case CPU_CORE_TYPE_EFFICIENCY:
> > + highest_perf = CPPC_HIGHEST_PERF_EFFICIENT;
> > + break;
> > + default:
> > + highest_perf = CPPC_HIGHEST_PERF_DEFAULT;
> > + WARN_ONCE(true, "WARNING: Undefined core type found");
> > + break;
> > + }
> > +
> > + return highest_perf;
> > }
> >
> > static int pstate_init_perf(struct amd_cpudata *cpudata)
^ permalink raw reply [flat|nested] 24+ messages in thread
* RE: [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization
2024-06-18 21:23 ` Borislav Petkov
@ 2024-06-19 3:25 ` Yuan, Perry
0 siblings, 0 replies; 24+ messages in thread
From: Yuan, Perry @ 2024-06-19 3:25 UTC (permalink / raw)
To: Borislav Petkov
Cc: rafael.j.wysocki@intel.com, Limonciello, Mario,
viresh.kumar@linaro.org, Huang, Ray, Shenoy, Gautham Ranjal,
Deucher, Alexander, Huang, Shimmer, Du, Xiaojian,
Meng, Li (Jassmine), linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org
[AMD Official Use Only - AMD Internal Distribution Only]
Hi Boris,
> -----Original Message-----
> From: Borislav Petkov <bp@alien8.de>
> Sent: Wednesday, June 19, 2024 5:24 AM
> To: Yuan, Perry <Perry.Yuan@amd.com>
> Cc: rafael.j.wysocki@intel.com; Limonciello, Mario
> <Mario.Limonciello@amd.com>; viresh.kumar@linaro.org; Huang, Ray
> <Ray.Huang@amd.com>; Shenoy, Gautham Ranjal
> <gautham.shenoy@amd.com>; Deucher, Alexander
> <Alexander.Deucher@amd.com>; Huang, Shimmer
> <Shimmer.Huang@amd.com>; Du, Xiaojian <Xiaojian.Du@amd.com>; Meng,
> Li (Jassmine) <Li.Meng@amd.com>; linux-pm@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH v4 09/11] cpufreq: amd-pstate: implement
> heterogeneous core topology for highest performance initialization
>
> On Mon, Jun 17, 2024 at 02:59:11PM +0800, Perry Yuan wrote:
> > Introduces an optimization to the AMD-Pstate driver by implementing a
> > heterogeneous core topology for the initialization of the highest
> > performance value while driver loading.
> > The two core types supported are "performance" and "efficiency".
> > Each core type has different highest performance and frequency values
> > configured by the platform. The `amd_pstate` driver needs to identify
> > the type of core to correctly set an appropriate highest perf value.
> >
> > X86_FEATURE_HETERO_CORE_TOPOLOGY is used to identify whether the
> > processor support heterogeneous core type by reading CPUID leaf
> > Fn_0x80000026_EAX and bit 30. if the bit is set as one, then
> > amd_pstate driver will check EBX 30:28 bits to get the core type.
>
> There will be a special ->cpu_type member for that eventually:
>
> https://lore.kernel.org/r/20240617-add-cpu-type-v1-1-
> b88998c01e76@linux.intel.com
Great, I saw your comments in that patchset, hopefully Intel and AMD can have a common design for the core type.
Feel free to let me know if you want me to try any testing patches.
>
> --
> Regards/Gruss,
> Boris.
>
> https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 24+ messages in thread
* RE: [PATCH v4 08/11] x86/cpufeatures: Add feature bits for AMD heterogeneous processor
2024-06-17 8:39 ` Borislav Petkov
@ 2024-06-19 3:40 ` Yuan, Perry
0 siblings, 0 replies; 24+ messages in thread
From: Yuan, Perry @ 2024-06-19 3:40 UTC (permalink / raw)
To: Borislav Petkov
Cc: rafael.j.wysocki@intel.com, Limonciello, Mario,
viresh.kumar@linaro.org, Huang, Ray, Shenoy, Gautham Ranjal,
Deucher, Alexander, Huang, Shimmer, Du, Xiaojian,
Meng, Li (Jassmine), linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Borislav Petkov <bp@alien8.de>
> Sent: Monday, June 17, 2024 4:39 PM
> To: Yuan, Perry <Perry.Yuan@amd.com>
> Cc: rafael.j.wysocki@intel.com; Limonciello, Mario
> <Mario.Limonciello@amd.com>; viresh.kumar@linaro.org; Huang, Ray
> <Ray.Huang@amd.com>; Shenoy, Gautham Ranjal
> <gautham.shenoy@amd.com>; Deucher, Alexander
> <Alexander.Deucher@amd.com>; Huang, Shimmer
> <Shimmer.Huang@amd.com>; Du, Xiaojian <Xiaojian.Du@amd.com>; Meng,
> Li (Jassmine) <Li.Meng@amd.com>; linux-pm@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH v4 08/11] x86/cpufeatures: Add feature bits for AMD
> heterogeneous processor
>
> On Mon, Jun 17, 2024 at 02:59:10PM +0800, Perry Yuan wrote:
> > CPUID leaf 0x80000026 advertises core types with different efficiency
> > rankings
> >
> > Bit 30 indicates the heterogeneous core topology feature, if the bit
> > set, it means not all instances at the current hierarchical level have
> > the same core topology.
> >
> > For better utilization of feature words and help to identify core
> > type, X86_FEATURE_HETERO_CORE_TOPOLOGY is added as a few scattered
> feature bits.
> >
> > Reference:
> > See the page 119 of PPR for AMD Family 19h Model 61h B1, docID 56713
> >
> > Signed-off-by: Perry Yuan <perry.yuan@amd.com>
> > ---
> > arch/x86/include/asm/cpufeatures.h | 1 +
> > arch/x86/kernel/cpu/scattered.c | 1 +
> > 2 files changed, 2 insertions(+)
> >
> > diff --git a/arch/x86/include/asm/cpufeatures.h
> > b/arch/x86/include/asm/cpufeatures.h
> > index 6c128d463a14..eceaa0df0137 100644
> > --- a/arch/x86/include/asm/cpufeatures.h
> > +++ b/arch/x86/include/asm/cpufeatures.h
> > @@ -471,6 +471,7 @@
> > #define X86_FEATURE_CLEAR_BHB_HW (21*32+ 3) /* "" BHI_DIS_S
> HW control enabled */
> > #define X86_FEATURE_CLEAR_BHB_LOOP_ON_VMEXIT (21*32+ 4) /* ""
> Clear branch history at vmexit using SW loop */
> > #define X86_FEATURE_FAST_CPPC (21*32 + 5) /* "" AMD Fast
> CPPC */
> > +#define X86_FEATURE_HETERO_CORE_TOPOLOGY (21*32+ 6) /* ""
> Heterogeneous Core Topology */
> >
> > /*
> > * BUG word(s)
> > diff --git a/arch/x86/kernel/cpu/scattered.c
> > b/arch/x86/kernel/cpu/scattered.c index c84c30188fdf..6b3477503dd0
> > 100644
> > --- a/arch/x86/kernel/cpu/scattered.c
> > +++ b/arch/x86/kernel/cpu/scattered.c
> > @@ -52,6 +52,7 @@ static const struct cpuid_bit cpuid_bits[] = {
> > { X86_FEATURE_PERFMON_V2, CPUID_EAX, 0, 0x80000022, 0 },
> > { X86_FEATURE_AMD_LBR_V2, CPUID_EAX, 1, 0x80000022, 0 },
> > { X86_FEATURE_AMD_LBR_PMC_FREEZE, CPUID_EAX, 2,
> 0x80000022, 0 },
> > + { X86_FEATURE_HETERO_CORE_TOPOLOGY, CPUID_EAX, 30,
> 0x80000026, 0 },
> > { 0, 0, 0, 0, 0 }
> > };
> >
> > --
>
> Nacked-by: Borislav Petkov (AMD) <bp@alien8.de>
>
> Until all review comments have been addressed:
>
> https://lore.kernel.org/r/20240611105216.GAZmgsYC-
> J_yLfdupF@fat_crate.local
>
> --
> Regards/Gruss,
> Boris.
>
> https://people.kernel.org/tglx/notes-about-netiquette
Boris,
I Just accidentally missed the other comments, will address it in v5.
Thanks for your review ~
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2024-06-19 3:40 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-17 6:59 [PATCH v4 00/11] AMD Pstate Driver Fixes and Improvements Perry Yuan
2024-06-17 6:59 ` [PATCH v4 01/11] cpufreq: amd-pstate: optimize the initial frequency values verification Perry Yuan
2024-06-17 6:59 ` [PATCH v4 02/11] cpufreq: amd-pstate: remove unused variable nominal_freq Perry Yuan
2024-06-17 6:59 ` [PATCH v4 03/11] cpufreq: amd-pstate: show CPPC debug message if CPPC is not supported Perry Yuan
2024-06-17 6:59 ` [PATCH v4 04/11] cpufreq: amd-pstate: add debug message while CPPC is supported and disabled by SBIOS Perry Yuan
2024-06-18 19:25 ` Mario Limonciello
2024-06-17 6:59 ` [PATCH v4 05/11] Documentation: PM: amd-pstate: add debugging section for driver loading failure Perry Yuan
2024-06-18 19:24 ` Mario Limonciello
2024-06-17 6:59 ` [PATCH v4 06/11] Documentation: PM: amd-pstate: add guided mode to the Operation mode Perry Yuan
2024-06-17 6:59 ` [PATCH v4 07/11] cpufreq: amd-pstate: switch boot_cpu_has() to cpu_feature_enabled() Perry Yuan
2024-06-17 6:59 ` [PATCH v4 08/11] x86/cpufeatures: Add feature bits for AMD heterogeneous processor Perry Yuan
2024-06-17 8:39 ` Borislav Petkov
2024-06-19 3:40 ` Yuan, Perry
2024-06-17 6:59 ` [PATCH v4 09/11] cpufreq: amd-pstate: implement heterogeneous core topology for highest performance initialization Perry Yuan
2024-06-18 19:22 ` Mario Limonciello
2024-06-19 3:23 ` Yuan, Perry
2024-06-18 21:23 ` Borislav Petkov
2024-06-19 3:25 ` Yuan, Perry
2024-06-17 6:59 ` [PATCH v4 10/11] cpufreq: amd-pstate: auto-load pstate driver by default Perry Yuan
2024-06-18 19:25 ` Mario Limonciello
2024-06-19 3:08 ` Yuan, Perry
2024-06-17 6:59 ` [PATCH v4 11/11] cpufreq: amd-pstate: enable shared memory type CPPC " Perry Yuan
2024-06-18 19:25 ` Mario Limonciello
2024-06-19 3:06 ` Yuan, Perry
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).