Jiri Slaby ef7db2
From: Kan Liang <kan.liang@linux.intel.com>
Jiri Slaby ef7db2
Date: Fri, 10 Feb 2023 11:02:38 -0800
Jiri Slaby ef7db2
Subject: [PATCH] perf/x86/intel/uncore: Add Meteor Lake support
Jiri Slaby ef7db2
References: bsc#1012628
Jiri Slaby ef7db2
Patch-mainline: 6.2.3
Jiri Slaby ef7db2
Git-commit: c828441f21ddc819a28b5723a72e3c840e9de1c6
Jiri Slaby ef7db2
Jiri Slaby ef7db2
[ Upstream commit c828441f21ddc819a28b5723a72e3c840e9de1c6 ]
Jiri Slaby ef7db2
Jiri Slaby ef7db2
The uncore subsystem for Meteor Lake is similar to the previous Alder
Jiri Slaby ef7db2
Lake. The main difference is that MTL provides PMU support for different
Jiri Slaby ef7db2
tiles, while ADL only provides PMU support for the whole package. On
Jiri Slaby ef7db2
ADL, there are CBOX, ARB, and clockbox uncore PMON units. On MTL, they
Jiri Slaby ef7db2
are split into CBOX/HAC_CBOX, ARB/HAC_ARB, and cncu/sncu which provides
Jiri Slaby ef7db2
a fixed counter for clockticks. Also, new MSR addresses are introduced
Jiri Slaby ef7db2
on MTL.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
The IMC uncore PMON is the same as Alder Lake. Add new PCIIDs of IMC for
Jiri Slaby ef7db2
Meteor Lake.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Jiri Slaby ef7db2
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Jiri Slaby ef7db2
Link: https://lore.kernel.org/r/20230210190238.1726237-1-kan.liang@linux.intel.com
Jiri Slaby ef7db2
Signed-off-by: Sasha Levin <sashal@kernel.org>
Jiri Slaby ef7db2
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby ef7db2
---
Jiri Slaby ef7db2
 arch/x86/events/intel/uncore.c     |   7 ++
Jiri Slaby ef7db2
 arch/x86/events/intel/uncore.h     |   1 +
Jiri Slaby ef7db2
 arch/x86/events/intel/uncore_snb.c | 161 +++++++++++++++++++++++++++++
Jiri Slaby ef7db2
 3 files changed, 169 insertions(+)
Jiri Slaby ef7db2
Jiri Slaby ef7db2
diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c
Jiri Slaby ef7db2
index 459b1aaf..27b34f5b 100644
Jiri Slaby ef7db2
--- a/arch/x86/events/intel/uncore.c
Jiri Slaby ef7db2
+++ b/arch/x86/events/intel/uncore.c
Jiri Slaby ef7db2
@@ -1765,6 +1765,11 @@ static const struct intel_uncore_init_fun adl_uncore_init __initconst = {
Jiri Slaby ef7db2
 	.mmio_init = adl_uncore_mmio_init,
Jiri Slaby ef7db2
 };
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
+static const struct intel_uncore_init_fun mtl_uncore_init __initconst = {
Jiri Slaby ef7db2
+	.cpu_init = mtl_uncore_cpu_init,
Jiri Slaby ef7db2
+	.mmio_init = adl_uncore_mmio_init,
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
 static const struct intel_uncore_init_fun icx_uncore_init __initconst = {
Jiri Slaby ef7db2
 	.cpu_init = icx_uncore_cpu_init,
Jiri Slaby ef7db2
 	.pci_init = icx_uncore_pci_init,
Jiri Slaby ef7db2
@@ -1832,6 +1837,8 @@ static const struct x86_cpu_id intel_uncore_match[] __initconst = {
Jiri Slaby ef7db2
 	X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE,		&adl_uncore_init),
Jiri Slaby ef7db2
 	X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_P,	&adl_uncore_init),
Jiri Slaby ef7db2
 	X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_S,	&adl_uncore_init),
Jiri Slaby ef7db2
+	X86_MATCH_INTEL_FAM6_MODEL(METEORLAKE,		&mtl_uncore_init),
Jiri Slaby ef7db2
+	X86_MATCH_INTEL_FAM6_MODEL(METEORLAKE_L,	&mtl_uncore_init),
Jiri Slaby ef7db2
 	X86_MATCH_INTEL_FAM6_MODEL(SAPPHIRERAPIDS_X,	&spr_uncore_init),
Jiri Slaby ef7db2
 	X86_MATCH_INTEL_FAM6_MODEL(EMERALDRAPIDS_X,	&spr_uncore_init),
Jiri Slaby ef7db2
 	X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_D,	&snr_uncore_init),
Jiri Slaby ef7db2
diff --git a/arch/x86/events/intel/uncore.h b/arch/x86/events/intel/uncore.h
Jiri Slaby ef7db2
index e278e2e7..305a54d8 100644
Jiri Slaby ef7db2
--- a/arch/x86/events/intel/uncore.h
Jiri Slaby ef7db2
+++ b/arch/x86/events/intel/uncore.h
Jiri Slaby ef7db2
@@ -602,6 +602,7 @@ void skl_uncore_cpu_init(void);
Jiri Slaby ef7db2
 void icl_uncore_cpu_init(void);
Jiri Slaby ef7db2
 void tgl_uncore_cpu_init(void);
Jiri Slaby ef7db2
 void adl_uncore_cpu_init(void);
Jiri Slaby ef7db2
+void mtl_uncore_cpu_init(void);
Jiri Slaby ef7db2
 void tgl_uncore_mmio_init(void);
Jiri Slaby ef7db2
 void tgl_l_uncore_mmio_init(void);
Jiri Slaby ef7db2
 void adl_uncore_mmio_init(void);
Jiri Slaby ef7db2
diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c
Jiri Slaby ef7db2
index 1f486922..7fd4334e 100644
Jiri Slaby ef7db2
--- a/arch/x86/events/intel/uncore_snb.c
Jiri Slaby ef7db2
+++ b/arch/x86/events/intel/uncore_snb.c
Jiri Slaby ef7db2
@@ -109,6 +109,19 @@
Jiri Slaby ef7db2
 #define PCI_DEVICE_ID_INTEL_RPL_23_IMC		0xA728
Jiri Slaby ef7db2
 #define PCI_DEVICE_ID_INTEL_RPL_24_IMC		0xA729
Jiri Slaby ef7db2
 #define PCI_DEVICE_ID_INTEL_RPL_25_IMC		0xA72A
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_1_IMC		0x7d00
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_2_IMC		0x7d01
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_3_IMC		0x7d02
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_4_IMC		0x7d05
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_5_IMC		0x7d10
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_6_IMC		0x7d14
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_7_IMC		0x7d15
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_8_IMC		0x7d16
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_9_IMC		0x7d21
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_10_IMC		0x7d22
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_11_IMC		0x7d23
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_12_IMC		0x7d24
Jiri Slaby ef7db2
+#define PCI_DEVICE_ID_INTEL_MTL_13_IMC		0x7d28
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 #define IMC_UNCORE_DEV(a)						\
Jiri Slaby ef7db2
@@ -205,6 +218,32 @@
Jiri Slaby ef7db2
 #define ADL_UNC_ARB_PERFEVTSEL0			0x2FD0
Jiri Slaby ef7db2
 #define ADL_UNC_ARB_MSR_OFFSET			0x8
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
+/* MTL Cbo register */
Jiri Slaby ef7db2
+#define MTL_UNC_CBO_0_PER_CTR0			0x2448
Jiri Slaby ef7db2
+#define MTL_UNC_CBO_0_PERFEVTSEL0		0x2442
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+/* MTL HAC_ARB register */
Jiri Slaby ef7db2
+#define MTL_UNC_HAC_ARB_CTR			0x2018
Jiri Slaby ef7db2
+#define MTL_UNC_HAC_ARB_CTRL			0x2012
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+/* MTL ARB register */
Jiri Slaby ef7db2
+#define MTL_UNC_ARB_CTR				0x2418
Jiri Slaby ef7db2
+#define MTL_UNC_ARB_CTRL			0x2412
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+/* MTL cNCU register */
Jiri Slaby ef7db2
+#define MTL_UNC_CNCU_FIXED_CTR			0x2408
Jiri Slaby ef7db2
+#define MTL_UNC_CNCU_FIXED_CTRL			0x2402
Jiri Slaby ef7db2
+#define MTL_UNC_CNCU_BOX_CTL			0x240e
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+/* MTL sNCU register */
Jiri Slaby ef7db2
+#define MTL_UNC_SNCU_FIXED_CTR			0x2008
Jiri Slaby ef7db2
+#define MTL_UNC_SNCU_FIXED_CTRL			0x2002
Jiri Slaby ef7db2
+#define MTL_UNC_SNCU_BOX_CTL			0x200e
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+/* MTL HAC_CBO register */
Jiri Slaby ef7db2
+#define MTL_UNC_HBO_CTR				0x2048
Jiri Slaby ef7db2
+#define MTL_UNC_HBO_CTRL			0x2042
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
 DEFINE_UNCORE_FORMAT_ATTR(event, event, "config:0-7");
Jiri Slaby ef7db2
 DEFINE_UNCORE_FORMAT_ATTR(umask, umask, "config:8-15");
Jiri Slaby ef7db2
 DEFINE_UNCORE_FORMAT_ATTR(chmask, chmask, "config:8-11");
Jiri Slaby ef7db2
@@ -598,6 +637,115 @@ void adl_uncore_cpu_init(void)
Jiri Slaby ef7db2
 	uncore_msr_uncores = adl_msr_uncores;
Jiri Slaby ef7db2
 }
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
+static struct intel_uncore_type mtl_uncore_cbox = {
Jiri Slaby ef7db2
+	.name		= "cbox",
Jiri Slaby ef7db2
+	.num_counters   = 2,
Jiri Slaby ef7db2
+	.perf_ctr_bits	= 48,
Jiri Slaby ef7db2
+	.perf_ctr	= MTL_UNC_CBO_0_PER_CTR0,
Jiri Slaby ef7db2
+	.event_ctl	= MTL_UNC_CBO_0_PERFEVTSEL0,
Jiri Slaby ef7db2
+	.event_mask	= ADL_UNC_RAW_EVENT_MASK,
Jiri Slaby ef7db2
+	.msr_offset	= SNB_UNC_CBO_MSR_OFFSET,
Jiri Slaby ef7db2
+	.ops		= &icl_uncore_msr_ops,
Jiri Slaby ef7db2
+	.format_group	= &adl_uncore_format_group,
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+static struct intel_uncore_type mtl_uncore_hac_arb = {
Jiri Slaby ef7db2
+	.name		= "hac_arb",
Jiri Slaby ef7db2
+	.num_counters   = 2,
Jiri Slaby ef7db2
+	.num_boxes	= 2,
Jiri Slaby ef7db2
+	.perf_ctr_bits	= 48,
Jiri Slaby ef7db2
+	.perf_ctr	= MTL_UNC_HAC_ARB_CTR,
Jiri Slaby ef7db2
+	.event_ctl	= MTL_UNC_HAC_ARB_CTRL,
Jiri Slaby ef7db2
+	.event_mask	= ADL_UNC_RAW_EVENT_MASK,
Jiri Slaby ef7db2
+	.msr_offset	= SNB_UNC_CBO_MSR_OFFSET,
Jiri Slaby ef7db2
+	.ops		= &icl_uncore_msr_ops,
Jiri Slaby ef7db2
+	.format_group	= &adl_uncore_format_group,
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+static struct intel_uncore_type mtl_uncore_arb = {
Jiri Slaby ef7db2
+	.name		= "arb",
Jiri Slaby ef7db2
+	.num_counters   = 2,
Jiri Slaby ef7db2
+	.num_boxes	= 2,
Jiri Slaby ef7db2
+	.perf_ctr_bits	= 48,
Jiri Slaby ef7db2
+	.perf_ctr	= MTL_UNC_ARB_CTR,
Jiri Slaby ef7db2
+	.event_ctl	= MTL_UNC_ARB_CTRL,
Jiri Slaby ef7db2
+	.event_mask	= ADL_UNC_RAW_EVENT_MASK,
Jiri Slaby ef7db2
+	.msr_offset	= SNB_UNC_CBO_MSR_OFFSET,
Jiri Slaby ef7db2
+	.ops		= &icl_uncore_msr_ops,
Jiri Slaby ef7db2
+	.format_group	= &adl_uncore_format_group,
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+static struct intel_uncore_type mtl_uncore_hac_cbox = {
Jiri Slaby ef7db2
+	.name		= "hac_cbox",
Jiri Slaby ef7db2
+	.num_counters   = 2,
Jiri Slaby ef7db2
+	.num_boxes	= 2,
Jiri Slaby ef7db2
+	.perf_ctr_bits	= 48,
Jiri Slaby ef7db2
+	.perf_ctr	= MTL_UNC_HBO_CTR,
Jiri Slaby ef7db2
+	.event_ctl	= MTL_UNC_HBO_CTRL,
Jiri Slaby ef7db2
+	.event_mask	= ADL_UNC_RAW_EVENT_MASK,
Jiri Slaby ef7db2
+	.msr_offset	= SNB_UNC_CBO_MSR_OFFSET,
Jiri Slaby ef7db2
+	.ops		= &icl_uncore_msr_ops,
Jiri Slaby ef7db2
+	.format_group	= &adl_uncore_format_group,
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+static void mtl_uncore_msr_init_box(struct intel_uncore_box *box)
Jiri Slaby ef7db2
+{
Jiri Slaby ef7db2
+	wrmsrl(uncore_msr_box_ctl(box), SNB_UNC_GLOBAL_CTL_EN);
Jiri Slaby ef7db2
+}
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+static struct intel_uncore_ops mtl_uncore_msr_ops = {
Jiri Slaby ef7db2
+	.init_box	= mtl_uncore_msr_init_box,
Jiri Slaby ef7db2
+	.disable_event	= snb_uncore_msr_disable_event,
Jiri Slaby ef7db2
+	.enable_event	= snb_uncore_msr_enable_event,
Jiri Slaby ef7db2
+	.read_counter	= uncore_msr_read_counter,
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+static struct intel_uncore_type mtl_uncore_cncu = {
Jiri Slaby ef7db2
+	.name		= "cncu",
Jiri Slaby ef7db2
+	.num_counters   = 1,
Jiri Slaby ef7db2
+	.num_boxes	= 1,
Jiri Slaby ef7db2
+	.box_ctl	= MTL_UNC_CNCU_BOX_CTL,
Jiri Slaby ef7db2
+	.fixed_ctr_bits = 48,
Jiri Slaby ef7db2
+	.fixed_ctr	= MTL_UNC_CNCU_FIXED_CTR,
Jiri Slaby ef7db2
+	.fixed_ctl	= MTL_UNC_CNCU_FIXED_CTRL,
Jiri Slaby ef7db2
+	.single_fixed	= 1,
Jiri Slaby ef7db2
+	.event_mask	= SNB_UNC_CTL_EV_SEL_MASK,
Jiri Slaby ef7db2
+	.format_group	= &icl_uncore_clock_format_group,
Jiri Slaby ef7db2
+	.ops		= &mtl_uncore_msr_ops,
Jiri Slaby ef7db2
+	.event_descs	= icl_uncore_events,
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+static struct intel_uncore_type mtl_uncore_sncu = {
Jiri Slaby ef7db2
+	.name		= "sncu",
Jiri Slaby ef7db2
+	.num_counters   = 1,
Jiri Slaby ef7db2
+	.num_boxes	= 1,
Jiri Slaby ef7db2
+	.box_ctl	= MTL_UNC_SNCU_BOX_CTL,
Jiri Slaby ef7db2
+	.fixed_ctr_bits	= 48,
Jiri Slaby ef7db2
+	.fixed_ctr	= MTL_UNC_SNCU_FIXED_CTR,
Jiri Slaby ef7db2
+	.fixed_ctl	= MTL_UNC_SNCU_FIXED_CTRL,
Jiri Slaby ef7db2
+	.single_fixed	= 1,
Jiri Slaby ef7db2
+	.event_mask	= SNB_UNC_CTL_EV_SEL_MASK,
Jiri Slaby ef7db2
+	.format_group	= &icl_uncore_clock_format_group,
Jiri Slaby ef7db2
+	.ops		= &mtl_uncore_msr_ops,
Jiri Slaby ef7db2
+	.event_descs	= icl_uncore_events,
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+static struct intel_uncore_type *mtl_msr_uncores[] = {
Jiri Slaby ef7db2
+	&mtl_uncore_cbox,
Jiri Slaby ef7db2
+	&mtl_uncore_hac_arb,
Jiri Slaby ef7db2
+	&mtl_uncore_arb,
Jiri Slaby ef7db2
+	&mtl_uncore_hac_cbox,
Jiri Slaby ef7db2
+	&mtl_uncore_cncu,
Jiri Slaby ef7db2
+	&mtl_uncore_sncu,
Jiri Slaby ef7db2
+	NULL
Jiri Slaby ef7db2
+};
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
+void mtl_uncore_cpu_init(void)
Jiri Slaby ef7db2
+{
Jiri Slaby ef7db2
+	mtl_uncore_cbox.num_boxes = icl_get_cbox_num();
Jiri Slaby ef7db2
+	uncore_msr_uncores = mtl_msr_uncores;
Jiri Slaby ef7db2
+}
Jiri Slaby ef7db2
+
Jiri Slaby ef7db2
 enum {
Jiri Slaby ef7db2
 	SNB_PCI_UNCORE_IMC,
Jiri Slaby ef7db2
 };
Jiri Slaby ef7db2
@@ -1264,6 +1412,19 @@ static const struct pci_device_id tgl_uncore_pci_ids[] = {
Jiri Slaby ef7db2
 	IMC_UNCORE_DEV(RPL_23),
Jiri Slaby ef7db2
 	IMC_UNCORE_DEV(RPL_24),
Jiri Slaby ef7db2
 	IMC_UNCORE_DEV(RPL_25),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_1),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_2),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_3),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_4),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_5),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_6),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_7),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_8),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_9),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_10),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_11),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_12),
Jiri Slaby ef7db2
+	IMC_UNCORE_DEV(MTL_13),
Jiri Slaby ef7db2
 	{ /* end: all zeroes */ }
Jiri Slaby ef7db2
 };
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
-- 
Jiri Slaby ef7db2
2.35.3
Jiri Slaby ef7db2