aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0064-perf-x86-amd-Make-Zen3-branch-sampling-opt-in.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0064-perf-x86-amd-Make-Zen3-branch-sampling-opt-in.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0064-perf-x86-amd-Make-Zen3-branch-sampling-opt-in.patch129
1 files changed, 129 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0064-perf-x86-amd-Make-Zen3-branch-sampling-opt-in.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0064-perf-x86-amd-Make-Zen3-branch-sampling-opt-in.patch
new file mode 100644
index 00000000..49b0d70d
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0064-perf-x86-amd-Make-Zen3-branch-sampling-opt-in.patch
@@ -0,0 +1,129 @@
+From cde85a9d795f51d0fcdc6f0e7e5f15aa15101d5f Mon Sep 17 00:00:00 2001
+From: Stephane Eranian <eranian@google.com>
+Date: Tue, 22 Mar 2022 15:15:11 -0700
+Subject: [PATCH 64/86] perf/x86/amd: Make Zen3 branch sampling opt-in
+
+commit cc37e520a236069c0de0e7ea455082fa11c73b12 upstream
+
+Add a kernel config option CONFIG_PERF_EVENTS_AMD_BRS
+to make the support for AMD Zen3 Branch Sampling (BRS) an opt-in
+compile time option.
+
+Signed-off-by: Stephane Eranian <eranian@google.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lore.kernel.org/r/20220322221517.2510440-8-eranian@google.com
+Signed-off-by: Zhaolong Zhang <zhaolong.zhang@windriver.com>
+---
+ arch/x86/events/Kconfig | 8 ++++++
+ arch/x86/events/amd/Makefile | 3 ++-
+ arch/x86/events/perf_event.h | 49 ++++++++++++++++++++++++++++--------
+ 3 files changed, 49 insertions(+), 11 deletions(-)
+
+diff --git a/arch/x86/events/Kconfig b/arch/x86/events/Kconfig
+index d6cdfe631674..09c56965750a 100644
+--- a/arch/x86/events/Kconfig
++++ b/arch/x86/events/Kconfig
+@@ -44,4 +44,12 @@ config PERF_EVENTS_AMD_UNCORE
+
+ To compile this driver as a module, choose M here: the
+ module will be called 'amd-uncore'.
++
++config PERF_EVENTS_AMD_BRS
++ depends on PERF_EVENTS && CPU_SUP_AMD
++ bool "AMD Zen3 Branch Sampling support"
++ help
++ Enable AMD Zen3 branch sampling support (BRS) which samples up to
++ 16 consecutive taken branches in registers.
++
+ endmenu
+diff --git a/arch/x86/events/amd/Makefile b/arch/x86/events/amd/Makefile
+index cf323ffab5cd..b9f5d4610256 100644
+--- a/arch/x86/events/amd/Makefile
++++ b/arch/x86/events/amd/Makefile
+@@ -1,5 +1,6 @@
+ # SPDX-License-Identifier: GPL-2.0
+-obj-$(CONFIG_CPU_SUP_AMD) += core.o brs.o
++obj-$(CONFIG_CPU_SUP_AMD) += core.o
++obj-$(CONFIG_PERF_EVENTS_AMD_BRS) += brs.o
+ obj-$(CONFIG_PERF_EVENTS_AMD_POWER) += power.o
+ obj-$(CONFIG_X86_LOCAL_APIC) += ibs.o
+ obj-$(CONFIG_PERF_EVENTS_AMD_UNCORE) += amd-uncore.o
+diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
+index 19a254cf8c7d..e2c4dc114bda 100644
+--- a/arch/x86/events/perf_event.h
++++ b/arch/x86/events/perf_event.h
+@@ -1216,6 +1216,8 @@ static inline bool fixed_counter_disabled(int i, struct pmu *pmu)
+ #ifdef CONFIG_CPU_SUP_AMD
+
+ int amd_pmu_init(void);
++
++#ifdef CONFIG_PERF_EVENTS_AMD_BRS
+ int amd_brs_init(void);
+ void amd_brs_disable(void);
+ void amd_brs_enable(void);
+@@ -1250,25 +1252,52 @@ static inline void amd_pmu_brs_del(struct perf_event *event)
+
+ void amd_pmu_brs_sched_task(struct perf_event_context *ctx, bool sched_in);
+
+-/*
+- * check if BRS is activated on the CPU
+- * active defined as it has non-zero users and DBG_EXT_CFG.BRSEN=1
+- */
+-static inline bool amd_brs_active(void)
++static inline s64 amd_brs_adjust_period(s64 period)
+ {
+- struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
++ if (period > x86_pmu.lbr_nr)
++ return period - x86_pmu.lbr_nr;
+
+- return cpuc->brs_active;
++ return period;
++}
++#else
++static inline int amd_brs_init(void)
++{
++ return 0;
+ }
++static inline void amd_brs_disable(void) {}
++static inline void amd_brs_enable(void) {}
++static inline void amd_brs_drain(void) {}
++static inline void amd_brs_lopwr_init(void) {}
++static inline void amd_brs_disable_all(void) {}
++static inline int amd_brs_setup_filter(struct perf_event *event)
++{
++ return 0;
++}
++static inline void amd_brs_reset(void) {}
+
+-static inline s64 amd_brs_adjust_period(s64 period)
++static inline void amd_pmu_brs_add(struct perf_event *event)
+ {
+- if (period > x86_pmu.lbr_nr)
+- return period - x86_pmu.lbr_nr;
++}
++
++static inline void amd_pmu_brs_del(struct perf_event *event)
++{
++}
++
++static inline void amd_pmu_brs_sched_task(struct perf_event_context *ctx, bool sched_in)
++{
++}
+
++static inline s64 amd_brs_adjust_period(s64 period)
++{
+ return period;
+ }
+
++static inline void amd_brs_enable_all(void)
++{
++}
++
++#endif
++
+ #else /* CONFIG_CPU_SUP_AMD */
+
+ static inline int amd_pmu_init(void)
+--
+2.37.3
+