Tony Jones 190ea0
From: Kim Phillips <kim.phillips@amd.com>
Tony Jones 190ea0
Date: Tue, 17 Aug 2021 17:10:48 -0500
Tony Jones 190ea0
Subject: perf/x86/amd/ibs: Add bitfield definitions in new <asm/amd-ibs.h>
Tony Jones 190ea0
 header
Tony Jones 190ea0
Git-commit: 6a371bafe613b7746c3d3ac486bdb3035f77e029
Tony Jones 190ea0
Patch-mainline: v5.15-rc1
Tony Jones 190ea0
References: jsc#PED-1755 (dependent patch)
Tony Jones 190ea0
Tony Jones 190ea0
Add <asm/amd-ibs.h> with bitfield definitions for IBS MSRs,
Tony Jones 190ea0
and demonstrate usage within the driver.
Tony Jones 190ea0
Tony Jones 190ea0
Also move 'struct perf_ibs_data' where it can be shared with
Tony Jones 190ea0
the perf tool that will soon be using it.
Tony Jones 190ea0
Tony Jones 190ea0
No functional changes.
Tony Jones 190ea0
Tony Jones 190ea0
Signed-off-by: Kim Phillips <kim.phillips@amd.com>
Tony Jones 190ea0
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tony Jones 190ea0
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Tony Jones 190ea0
Link: https://lore.kernel.org/r/20210817221048.88063-9-kim.phillips@amd.com
Tony Jones 190ea0
Tony Jones 190ea0
Signed-off-by: Tony Jones <tonyj@suse.de>
Tony Jones 190ea0
---
Tony Jones 190ea0
 arch/x86/events/amd/ibs.c      |  23 +++----
Tony Jones 190ea0
 arch/x86/include/asm/amd-ibs.h | 132 +++++++++++++++++++++++++++++++++++++++++
Tony Jones 190ea0
 2 files changed, 141 insertions(+), 14 deletions(-)
Tony Jones 190ea0
Tony Jones 190ea0
diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
Tony Jones 190ea0
index ccc9ee1971e8..9739019d4b67 100644
Tony Jones 190ea0
--- a/arch/x86/events/amd/ibs.c
Tony Jones 190ea0
+++ b/arch/x86/events/amd/ibs.c
Tony Jones 190ea0
@@ -26,6 +26,7 @@ static u32 ibs_caps;
Tony Jones 190ea0
 #include <linux/hardirq.h>
Tony Jones 190ea0
 
Tony Jones 190ea0
 #include <asm/nmi.h>
Tony Jones 190ea0
+#include <asm/amd-ibs.h>
Tony Jones 190ea0
 
Tony Jones 190ea0
 #define IBS_FETCH_CONFIG_MASK	(IBS_FETCH_RAND_EN | IBS_FETCH_MAX_CNT)
Tony Jones 190ea0
 #define IBS_OP_CONFIG_MASK	IBS_OP_MAX_CNT
Tony Jones 190ea0
@@ -100,15 +101,6 @@ struct perf_ibs {
Tony Jones 190ea0
 	u64				(*get_count)(u64 config);
Tony Jones 190ea0
 };
Tony Jones 190ea0
 
Tony Jones 190ea0
-struct perf_ibs_data {
Tony Jones 190ea0
-	u32		size;
Tony Jones 190ea0
-	union {
Tony Jones 190ea0
-		u32	data[0];	/* data buffer starts here */
Tony Jones 190ea0
-		u32	caps;
Tony Jones 190ea0
-	};
Tony Jones 190ea0
-	u64		regs[MSR_AMD64_IBS_REG_COUNT_MAX];
Tony Jones 190ea0
-};
Tony Jones 190ea0
-
Tony Jones 190ea0
 static int
Tony Jones 190ea0
 perf_event_set_period(struct hw_perf_event *hwc, u64 min, u64 max, u64 *hw_period)
Tony Jones 190ea0
 {
Tony Jones 190ea0
@@ -329,11 +321,14 @@ static int perf_ibs_set_period(struct perf_ibs *perf_ibs,
Tony Jones 190ea0
 
Tony Jones 190ea0
 static u64 get_ibs_fetch_count(u64 config)
Tony Jones 190ea0
 {
Tony Jones 190ea0
-	return (config & IBS_FETCH_CNT) >> 12;
Tony Jones 190ea0
+	union ibs_fetch_ctl fetch_ctl = (union ibs_fetch_ctl)config;
Tony Jones 190ea0
+
Tony Jones 190ea0
+	return fetch_ctl.fetch_cnt << 4;
Tony Jones 190ea0
 }
Tony Jones 190ea0
 
Tony Jones 190ea0
 static u64 get_ibs_op_count(u64 config)
Tony Jones 190ea0
 {
Tony Jones 190ea0
+	union ibs_op_ctl op_ctl = (union ibs_op_ctl)config;
Tony Jones 190ea0
 	u64 count = 0;
Tony Jones 190ea0
 
Tony Jones 190ea0
 	/*
Tony Jones 190ea0
@@ -341,12 +336,12 @@ static u64 get_ibs_op_count(u64 config)
Tony Jones 190ea0
 	 * and the lower 7 bits of CurCnt are randomized.
Tony Jones 190ea0
 	 * Otherwise CurCnt has the full 27-bit current counter value.
Tony Jones 190ea0
 	 */
Tony Jones 190ea0
-	if (config & IBS_OP_VAL) {
Tony Jones 190ea0
-		count = (config & IBS_OP_MAX_CNT) << 4;
Tony Jones 190ea0
+	if (op_ctl.op_val) {
Tony Jones 190ea0
+		count = op_ctl.opmaxcnt << 4;
Tony Jones 190ea0
 		if (ibs_caps & IBS_CAPS_OPCNTEXT)
Tony Jones 190ea0
-			count += config & IBS_OP_MAX_CNT_EXT_MASK;
Tony Jones 190ea0
+			count += op_ctl.opmaxcnt_ext << 20;
Tony Jones 190ea0
 	} else if (ibs_caps & IBS_CAPS_RDWROPCNT) {
Tony Jones 190ea0
-		count = (config & IBS_OP_CUR_CNT) >> 32;
Tony Jones 190ea0
+		count = op_ctl.opcurcnt;
Tony Jones 190ea0
 	}
Tony Jones 190ea0
 
Tony Jones 190ea0
 	return count;
Tony Jones 190ea0
diff --git a/arch/x86/include/asm/amd-ibs.h b/arch/x86/include/asm/amd-ibs.h
Tony Jones 190ea0
new file mode 100644
Tony Jones 190ea0
index 000000000000..46e1df45efc0
Tony Jones 190ea0
--- /dev/null
Tony Jones 190ea0
+++ b/arch/x86/include/asm/amd-ibs.h
Tony Jones 190ea0
@@ -0,0 +1,132 @@
Tony Jones 190ea0
+/* SPDX-License-Identifier: GPL-2.0 */
Tony Jones 190ea0
+/*
Tony Jones 190ea0
+ * From PPR Vol 1 for AMD Family 19h Model 01h B1
Tony Jones 190ea0
+ * 55898 Rev 0.35 - Feb 5, 2021
Tony Jones 190ea0
+ */
Tony Jones 190ea0
+
Tony Jones 190ea0
+#include <asm/msr-index.h>
Tony Jones 190ea0
+
Tony Jones 190ea0
+/*
Tony Jones 190ea0
+ * IBS Hardware MSRs
Tony Jones 190ea0
+ */
Tony Jones 190ea0
+
Tony Jones 190ea0
+/* MSR 0xc0011030: IBS Fetch Control */
Tony Jones 190ea0
+union ibs_fetch_ctl {
Tony Jones 190ea0
+	__u64 val;
Tony Jones 190ea0
+	struct {
Tony Jones 190ea0
+		__u64	fetch_maxcnt:16,/* 0-15: instruction fetch max. count */
Tony Jones 190ea0
+			fetch_cnt:16,	/* 16-31: instruction fetch count */
Tony Jones 190ea0
+			fetch_lat:16,	/* 32-47: instruction fetch latency */
Tony Jones 190ea0
+			fetch_en:1,	/* 48: instruction fetch enable */
Tony Jones 190ea0
+			fetch_val:1,	/* 49: instruction fetch valid */
Tony Jones 190ea0
+			fetch_comp:1,	/* 50: instruction fetch complete */
Tony Jones 190ea0
+			ic_miss:1,	/* 51: i-cache miss */
Tony Jones 190ea0
+			phy_addr_valid:1,/* 52: physical address valid */
Tony Jones 190ea0
+			l1tlb_pgsz:2,	/* 53-54: i-cache L1TLB page size
Tony Jones 190ea0
+					 *	  (needs IbsPhyAddrValid) */
Tony Jones 190ea0
+			l1tlb_miss:1,	/* 55: i-cache fetch missed in L1TLB */
Tony Jones 190ea0
+			l2tlb_miss:1,	/* 56: i-cache fetch missed in L2TLB */
Tony Jones 190ea0
+			rand_en:1,	/* 57: random tagging enable */
Tony Jones 190ea0
+			fetch_l2_miss:1,/* 58: L2 miss for sampled fetch
Tony Jones 190ea0
+					 *      (needs IbsFetchComp) */
Tony Jones 190ea0
+			reserved:5;	/* 59-63: reserved */
Tony Jones 190ea0
+	};
Tony Jones 190ea0
+};
Tony Jones 190ea0
+
Tony Jones 190ea0
+/* MSR 0xc0011033: IBS Execution Control */
Tony Jones 190ea0
+union ibs_op_ctl {
Tony Jones 190ea0
+	__u64 val;
Tony Jones 190ea0
+	struct {
Tony Jones 190ea0
+		__u64	opmaxcnt:16,	/* 0-15: periodic op max. count */
Tony Jones 190ea0
+			reserved0:1,	/* 16: reserved */
Tony Jones 190ea0
+			op_en:1,	/* 17: op sampling enable */
Tony Jones 190ea0
+			op_val:1,	/* 18: op sample valid */
Tony Jones 190ea0
+			cnt_ctl:1,	/* 19: periodic op counter control */
Tony Jones 190ea0
+			opmaxcnt_ext:7,	/* 20-26: upper 7 bits of periodic op maximum count */
Tony Jones 190ea0
+			reserved1:5,	/* 27-31: reserved */
Tony Jones 190ea0
+			opcurcnt:27,	/* 32-58: periodic op counter current count */
Tony Jones 190ea0
+			reserved2:5;	/* 59-63: reserved */
Tony Jones 190ea0
+	};
Tony Jones 190ea0
+};
Tony Jones 190ea0
+
Tony Jones 190ea0
+/* MSR 0xc0011035: IBS Op Data 2 */
Tony Jones 190ea0
+union ibs_op_data {
Tony Jones 190ea0
+	__u64 val;
Tony Jones 190ea0
+	struct {
Tony Jones 190ea0
+		__u64	comp_to_ret_ctr:16,	/* 0-15: op completion to retire count */
Tony Jones 190ea0
+			tag_to_ret_ctr:16,	/* 15-31: op tag to retire count */
Tony Jones 190ea0
+			reserved1:2,		/* 32-33: reserved */
Tony Jones 190ea0
+			op_return:1,		/* 34: return op */
Tony Jones 190ea0
+			op_brn_taken:1,		/* 35: taken branch op */
Tony Jones 190ea0
+			op_brn_misp:1,		/* 36: mispredicted branch op */
Tony Jones 190ea0
+			op_brn_ret:1,		/* 37: branch op retired */
Tony Jones 190ea0
+			op_rip_invalid:1,	/* 38: RIP is invalid */
Tony Jones 190ea0
+			op_brn_fuse:1,		/* 39: fused branch op */
Tony Jones 190ea0
+			op_microcode:1,		/* 40: microcode op */
Tony Jones 190ea0
+			reserved2:23;		/* 41-63: reserved */
Tony Jones 190ea0
+	};
Tony Jones 190ea0
+};
Tony Jones 190ea0
+
Tony Jones 190ea0
+/* MSR 0xc0011036: IBS Op Data 2 */
Tony Jones 190ea0
+union ibs_op_data2 {
Tony Jones 190ea0
+	__u64 val;
Tony Jones 190ea0
+	struct {
Tony Jones 190ea0
+		__u64	data_src:3,	/* 0-2: data source */
Tony Jones 190ea0
+			reserved0:1,	/* 3: reserved */
Tony Jones 190ea0
+			rmt_node:1,	/* 4: destination node */
Tony Jones 190ea0
+			cache_hit_st:1,	/* 5: cache hit state */
Tony Jones 190ea0
+			reserved1:57;	/* 5-63: reserved */
Tony Jones 190ea0
+	};
Tony Jones 190ea0
+};
Tony Jones 190ea0
+
Tony Jones 190ea0
+/* MSR 0xc0011037: IBS Op Data 3 */
Tony Jones 190ea0
+union ibs_op_data3 {
Tony Jones 190ea0
+	__u64 val;
Tony Jones 190ea0
+	struct {
Tony Jones 190ea0
+		__u64	ld_op:1,			/* 0: load op */
Tony Jones 190ea0
+			st_op:1,			/* 1: store op */
Tony Jones 190ea0
+			dc_l1tlb_miss:1,		/* 2: data cache L1TLB miss */
Tony Jones 190ea0
+			dc_l2tlb_miss:1,		/* 3: data cache L2TLB hit in 2M page */
Tony Jones 190ea0
+			dc_l1tlb_hit_2m:1,		/* 4: data cache L1TLB hit in 2M page */
Tony Jones 190ea0
+			dc_l1tlb_hit_1g:1,		/* 5: data cache L1TLB hit in 1G page */
Tony Jones 190ea0
+			dc_l2tlb_hit_2m:1,		/* 6: data cache L2TLB hit in 2M page */
Tony Jones 190ea0
+			dc_miss:1,			/* 7: data cache miss */
Tony Jones 190ea0
+			dc_mis_acc:1,			/* 8: misaligned access */
Tony Jones 190ea0
+			reserved:4,			/* 9-12: reserved */
Tony Jones 190ea0
+			dc_wc_mem_acc:1,		/* 13: write combining memory access */
Tony Jones 190ea0
+			dc_uc_mem_acc:1,		/* 14: uncacheable memory access */
Tony Jones 190ea0
+			dc_locked_op:1,			/* 15: locked operation */
Tony Jones 190ea0
+			dc_miss_no_mab_alloc:1,		/* 16: DC miss with no MAB allocated */
Tony Jones 190ea0
+			dc_lin_addr_valid:1,		/* 17: data cache linear address valid */
Tony Jones 190ea0
+			dc_phy_addr_valid:1,		/* 18: data cache physical address valid */
Tony Jones 190ea0
+			dc_l2_tlb_hit_1g:1,		/* 19: data cache L2 hit in 1GB page */
Tony Jones 190ea0
+			l2_miss:1,			/* 20: L2 cache miss */
Tony Jones 190ea0
+			sw_pf:1,			/* 21: software prefetch */
Tony Jones 190ea0
+			op_mem_width:4,			/* 22-25: load/store size in bytes */
Tony Jones 190ea0
+			op_dc_miss_open_mem_reqs:6,	/* 26-31: outstanding mem reqs on DC fill */
Tony Jones 190ea0
+			dc_miss_lat:16,			/* 32-47: data cache miss latency */
Tony Jones 190ea0
+			tlb_refill_lat:16;		/* 48-63: L1 TLB refill latency */
Tony Jones 190ea0
+	};
Tony Jones 190ea0
+};
Tony Jones 190ea0
+
Tony Jones 190ea0
+/* MSR 0xc001103c: IBS Fetch Control Extended */
Tony Jones 190ea0
+union ic_ibs_extd_ctl {
Tony Jones 190ea0
+	__u64 val;
Tony Jones 190ea0
+	struct {
Tony Jones 190ea0
+		__u64	itlb_refill_lat:16,	/* 0-15: ITLB Refill latency for sampled fetch */
Tony Jones 190ea0
+			reserved:48;		/* 16-63: reserved */
Tony Jones 190ea0
+	};
Tony Jones 190ea0
+};
Tony Jones 190ea0
+
Tony Jones 190ea0
+/*
Tony Jones 190ea0
+ * IBS driver related
Tony Jones 190ea0
+ */
Tony Jones 190ea0
+
Tony Jones 190ea0
+struct perf_ibs_data {
Tony Jones 190ea0
+	u32		size;
Tony Jones 190ea0
+	union {
Tony Jones 190ea0
+		u32	data[0];	/* data buffer starts here */
Tony Jones 190ea0
+		u32	caps;
Tony Jones 190ea0
+	};
Tony Jones 190ea0
+	u64		regs[MSR_AMD64_IBS_REG_COUNT_MAX];
Tony Jones 190ea0
+};
Tony Jones 190ea0