aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0071-perf-x86-amd-core-Detect-PerfMonV2-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0071-perf-x86-amd-core-Detect-PerfMonV2-support.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0071-perf-x86-amd-core-Detect-PerfMonV2-support.patch97
1 files changed, 97 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0071-perf-x86-amd-core-Detect-PerfMonV2-support.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0071-perf-x86-amd-core-Detect-PerfMonV2-support.patch
new file mode 100644
index 00000000..69a8b20a
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0071-perf-x86-amd-core-Detect-PerfMonV2-support.patch
@@ -0,0 +1,97 @@
+From 0ab25d82c2929c87fc132e92192c88eeffd6f438 Mon Sep 17 00:00:00 2001
+From: Sandipan Das <sandipan.das@amd.com>
+Date: Thu, 21 Apr 2022 11:16:55 +0530
+Subject: [PATCH 71/86] perf/x86/amd/core: Detect PerfMonV2 support
+
+commit 21d59e3e2c403c83ba196a5857d517054124168e upstream
+
+AMD Performance Monitoring Version 2 (PerfMonV2) introduces
+some new Core PMU features such as detection of the number
+of available PMCs and managing PMCs using global registers
+namely, PerfCntrGlobalCtl and PerfCntrGlobalStatus.
+
+Clearing PerfCntrGlobalCtl and PerfCntrGlobalStatus ensures
+that all PMCs are inactive and have no pending overflows
+when CPUs are onlined or offlined.
+
+The PMU version (x86_pmu.version) now indicates PerfMonV2
+support and will be used to bypass the new features on
+unsupported processors.
+
+Signed-off-by: Sandipan Das <sandipan.das@amd.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lkml.kernel.org/r/dc8672ecbddff394e088ca8abf94b089b8ecc2e7.1650515382.git.sandipan.das@amd.com
+Signed-off-by: Zhaolong Zhang <zhaolong.zhang@windriver.com>
+---
+ arch/x86/events/amd/core.c | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c
+index 8e1e818f8195..b70dfa028ba5 100644
+--- a/arch/x86/events/amd/core.c
++++ b/arch/x86/events/amd/core.c
+@@ -19,6 +19,9 @@ static unsigned long perf_nmi_window;
+ #define AMD_MERGE_EVENT ((0xFULL << 32) | 0xFFULL)
+ #define AMD_MERGE_EVENT_ENABLE (AMD_MERGE_EVENT | ARCH_PERFMON_EVENTSEL_ENABLE)
+
++/* PMC Enable and Overflow bits for PerfCntrGlobal* registers */
++static u64 amd_pmu_global_cntr_mask __read_mostly;
++
+ static __initconst const u64 amd_hw_cache_event_ids
+ [PERF_COUNT_HW_CACHE_MAX]
+ [PERF_COUNT_HW_CACHE_OP_MAX]
+@@ -578,6 +581,18 @@ static struct amd_nb *amd_alloc_nb(int cpu)
+ return nb;
+ }
+
++static void amd_pmu_cpu_reset(int cpu)
++{
++ if (x86_pmu.version < 2)
++ return;
++
++ /* Clear enable bits i.e. PerfCntrGlobalCtl.PerfCntrEn */
++ wrmsrl(MSR_AMD64_PERF_CNTR_GLOBAL_CTL, 0);
++
++ /* Clear overflow bits i.e. PerfCntrGLobalStatus.PerfCntrOvfl */
++ wrmsrl(MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_CLR, amd_pmu_global_cntr_mask);
++}
++
+ static int amd_pmu_cpu_prepare(int cpu)
+ {
+ struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
+@@ -625,6 +640,7 @@ static void amd_pmu_cpu_starting(int cpu)
+ cpuc->amd_nb->refcnt++;
+
+ amd_brs_reset();
++ amd_pmu_cpu_reset(cpu);
+ }
+
+ static void amd_pmu_cpu_dead(int cpu)
+@@ -644,6 +660,8 @@ static void amd_pmu_cpu_dead(int cpu)
+
+ cpuhw->amd_nb = NULL;
+ }
++
++ amd_pmu_cpu_reset(cpu);
+ }
+
+ /*
+@@ -1185,6 +1203,15 @@ static int __init amd_core_pmu_init(void)
+ x86_pmu.eventsel = MSR_F15H_PERF_CTL;
+ x86_pmu.perfctr = MSR_F15H_PERF_CTR;
+ x86_pmu.num_counters = AMD64_NUM_COUNTERS_CORE;
++
++ /* Check for Performance Monitoring v2 support */
++ if (boot_cpu_has(X86_FEATURE_PERFMON_V2)) {
++ /* Update PMU version for later usage */
++ x86_pmu.version = 2;
++
++ amd_pmu_global_cntr_mask = (1ULL << x86_pmu.num_counters) - 1;
++ }
++
+ /*
+ * AMD Core perfctr has separate MSRs for the NB events, see
+ * the amd/uncore.c driver.
+--
+2.37.3
+