72 lines
2.3 KiB
Diff
72 lines
2.3 KiB
Diff
From ab9618cbe5e3d55b09b59f5e18e890be80ca1076 Mon Sep 17 00:00:00 2001
|
|
From: Mario Limonciello <mario.limonciello@amd.com>
|
|
Date: Fri, 25 Oct 2024 12:14:59 -0500
|
|
Subject: x86/amd: Use heterogeneous core topology for identifying boost
|
|
numerator
|
|
|
|
AMD heterogeneous designs include two types of cores:
|
|
* Performance
|
|
* Efficiency
|
|
|
|
Each core type has different highest performance values configured by the
|
|
platform. Drivers such as `amd_pstate` need to identify the type of
|
|
core to correctly set an appropriate boost numerator to calculate the
|
|
maximum frequency.
|
|
|
|
X86_FEATURE_AMD_HETEROGENEOUS_CORES is used to identify whether the SoC
|
|
supports heterogeneous core type by reading CPUID leaf Fn_0x80000026.
|
|
|
|
On performance cores the scaling factor of 196 is used. On efficiency
|
|
cores the scaling factor is the value reported as the highest perf.
|
|
Efficiency cores have the same preferred core rankings.
|
|
|
|
Tested-by: Eric Naim <dnaim@cachyos.org>
|
|
Tested-by: Peter Jung <ptr1337@cachyos.org>
|
|
Suggested-by: Perry Yuan <perry.yuan@amd.com>
|
|
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
|
---
|
|
arch/x86/kernel/acpi/cppc.c | 23 +++++++++++++++++++++++
|
|
1 file changed, 23 insertions(+)
|
|
|
|
--- a/arch/x86/kernel/acpi/cppc.c
|
|
+++ b/arch/x86/kernel/acpi/cppc.c
|
|
@@ -239,8 +239,10 @@ EXPORT_SYMBOL_GPL(amd_detect_prefcore);
|
|
*/
|
|
int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator)
|
|
{
|
|
+ enum x86_topology_cpu_type core_type = get_topology_cpu_type(&cpu_data(cpu));
|
|
bool prefcore;
|
|
int ret;
|
|
+ u32 tmp;
|
|
|
|
ret = amd_detect_prefcore(&prefcore);
|
|
if (ret)
|
|
@@ -266,6 +268,27 @@ int amd_get_boost_ratio_numerator(unsign
|
|
break;
|
|
}
|
|
}
|
|
+
|
|
+ /* detect if running on heterogeneous design */
|
|
+ if (cpu_feature_enabled(X86_FEATURE_AMD_HETEROGENEOUS_CORES)) {
|
|
+ switch (core_type) {
|
|
+ case TOPO_CPU_TYPE_UNKNOWN:
|
|
+ pr_warn("Undefined core type found for cpu %d\n", cpu);
|
|
+ break;
|
|
+ case TOPO_CPU_TYPE_PERFORMANCE:
|
|
+ /* use the max scale for performance cores */
|
|
+ *numerator = CPPC_HIGHEST_PERF_PERFORMANCE;
|
|
+ return 0;
|
|
+ case TOPO_CPU_TYPE_EFFICIENCY:
|
|
+ /* use the highest perf value for efficiency cores */
|
|
+ ret = amd_get_highest_perf(cpu, &tmp);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ *numerator = tmp;
|
|
+ return 0;
|
|
+ }
|
|
+ }
|
|
+
|
|
*numerator = CPPC_HIGHEST_PERF_PREFCORE;
|
|
|
|
return 0;
|