52 lines
2.0 KiB
Diff
52 lines
2.0 KiB
Diff
From aa7300919d0656a001fe0d526508b8c5958e7630 Mon Sep 17 00:00:00 2001
|
|
From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
|
|
Date: Thu, 18 Nov 2021 21:18:01 -0800
|
|
Subject: [PATCH] cpufreq: intel_pstate: ITMT support for overclocked system
|
|
|
|
On systems with overclocking enabled, CPPC Highest Performance can be
|
|
hard coded to 0xff. In this case even if we have cores with different
|
|
highest performance, ITMT can't be enabled as the current implementation
|
|
depends on CPPC Highest Performance.
|
|
|
|
On such systems we can use MSR_HWP_CAPABILITIES maximum performance field
|
|
when CPPC.Highest Performance is 0xff.
|
|
|
|
Due to legacy reasons, we can't solely depend on MSR_HWP_CAPABILITIES as
|
|
in some older systems CPPC Highest Performance is the only way to identify
|
|
different performing cores.
|
|
|
|
Reported-by: Michael Larabel <Michael@MichaelLarabel.com>
|
|
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
|
|
---
|
|
drivers/cpufreq/intel_pstate.c | 10 ++++++++++
|
|
1 file changed, 10 insertions(+)
|
|
|
|
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
|
|
index e15c3bc17a55c..8a2c6b58b6524 100644
|
|
--- a/drivers/cpufreq/intel_pstate.c
|
|
+++ b/drivers/cpufreq/intel_pstate.c
|
|
@@ -335,6 +335,8 @@ static void intel_pstste_sched_itmt_work_fn(struct work_struct *work)
|
|
|
|
static DECLARE_WORK(sched_itmt_work, intel_pstste_sched_itmt_work_fn);
|
|
|
|
+#define CPPC_MAX_PERF U8_MAX
|
|
+
|
|
static void intel_pstate_set_itmt_prio(int cpu)
|
|
{
|
|
struct cppc_perf_caps cppc_perf;
|
|
@@ -345,6 +347,14 @@ static void intel_pstate_set_itmt_prio(int cpu)
|
|
if (ret)
|
|
return;
|
|
|
|
+ /*
|
|
+ * On some systems with overclocking enabled, CPPC.highest_perf is hardcoded to 0xff.
|
|
+ * In this case we can't use CPPC.highest_perf to enable ITMT.
|
|
+ * In this case we can look at MSR_HWP_CAPABILITIES bits [8:0] to decide.
|
|
+ */
|
|
+ if (cppc_perf.highest_perf == CPPC_MAX_PERF)
|
|
+ cppc_perf.highest_perf = HWP_HIGHEST_PERF(READ_ONCE(all_cpu_data[cpu]->hwp_cap_cached));
|
|
+
|
|
/*
|
|
* The priorities can be set regardless of whether or not
|
|
* sched_set_itmt_support(true) has been called and it is valid to
|