File Index
Files and directories
Sign in
FILE

arm_cspmu.h

File preview with syntax highlighting.

linux-6.19.14/drivers/perf/arm_cspmu/arm_cspmu.h C
  1/* SPDX-License-Identifier: GPL-2.0
  2 *
  3 * ARM CoreSight Architecture PMU driver.
  4 * Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
  5 *
  6 */
  7
  8#ifndef __ARM_CSPMU_H__
  9#define __ARM_CSPMU_H__
 10
 11#include <linux/bitfield.h>
 12#include <linux/cpumask.h>
 13#include <linux/device.h>
 14#include <linux/kernel.h>
 15#include <linux/module.h>
 16#include <linux/perf_event.h>
 17#include <linux/platform_device.h>
 18#include <linux/types.h>
 19
 20#define to_arm_cspmu(p) (container_of(p, struct arm_cspmu, pmu))
 21
 22#define ARM_CSPMU_EXT_ATTR(_name, _func, _config)			\
 23	(&((struct dev_ext_attribute[]){				\
 24		{							\
 25			.attr = __ATTR(_name, 0444, _func, NULL),	\
 26			.var = (void *)_config				\
 27		}							\
 28	})[0].attr.attr)
 29
 30#define ARM_CSPMU_FORMAT_ATTR(_name, _config)				\
 31	ARM_CSPMU_EXT_ATTR(_name, device_show_string, _config)
 32
 33#define ARM_CSPMU_EVENT_ATTR(_name, _config)				\
 34	PMU_EVENT_ATTR_ID(_name, arm_cspmu_sysfs_event_show, _config)
 35
 36
 37/* Default event id mask */
 38#define ARM_CSPMU_EVENT_MASK	GENMASK_ULL(63, 0)
 39
 40/* Default filter value mask */
 41#define ARM_CSPMU_FILTER_MASK	GENMASK_ULL(63, 0)
 42
 43/* Default event format */
 44#define ARM_CSPMU_FORMAT_EVENT_ATTR	\
 45	ARM_CSPMU_FORMAT_ATTR(event, "config:0-32")
 46
 47/* Default filter format */
 48#define ARM_CSPMU_FORMAT_FILTER_ATTR	\
 49	ARM_CSPMU_FORMAT_ATTR(filter, "config1:0-31")
 50#define ARM_CSPMU_FORMAT_FILTER2_ATTR	\
 51	ARM_CSPMU_FORMAT_ATTR(filter2, "config2:0-31")
 52
 53/*
 54 * This is the default event number for cycle count, if supported, since the
 55 * ARM Coresight PMU specification does not define a standard event code
 56 * for cycle count.
 57 */
 58#define ARM_CSPMU_EVT_CYCLES_DEFAULT	(0x1ULL << 32)
 59
 60/*
 61 * The ARM Coresight PMU supports up to 256 event counters.
 62 * If the counters are larger-than 32-bits, then the PMU includes at
 63 * most 128 counters.
 64 */
 65#define ARM_CSPMU_MAX_HW_CNTRS		256
 66
 67/* The cycle counter, if implemented, is located at counter[31]. */
 68#define ARM_CSPMU_CYCLE_CNTR_IDX	31
 69
 70/*
 71 * CoreSight PMU Arch register offsets.
 72 */
 73#define PMEVCNTR_LO			0x0
 74#define PMEVCNTR_HI			0x4
 75#define PMEVTYPER			0x400
 76#define PMCCFILTR			0x47C
 77#define PMEVFILT2R			0x800
 78#define PMEVFILTR			0xA00
 79#define PMCNTENSET			0xC00
 80#define PMCNTENCLR			0xC20
 81#define PMINTENSET			0xC40
 82#define PMINTENCLR			0xC60
 83#define PMOVSCLR			0xC80
 84#define PMOVSSET			0xCC0
 85#define PMIMPDEF			0xD80
 86#define PMCFGR				0xE00
 87#define PMCR				0xE04
 88#define PMIIDR				0xE08
 89#define PMPIDR0				0xFE0
 90#define PMPIDR1				0xFE4
 91#define PMPIDR2				0xFE8
 92#define PMPIDR3				0xFEC
 93#define PMPIDR4				0xFD0
 94
 95/* PMCFGR register field */
 96#define PMCFGR_NCG			GENMASK(31, 28)
 97#define PMCFGR_HDBG			BIT(24)
 98#define PMCFGR_TRO			BIT(23)
 99#define PMCFGR_SS			BIT(22)
100#define PMCFGR_FZO			BIT(21)
101#define PMCFGR_MSI			BIT(20)
102#define PMCFGR_UEN			BIT(19)
103#define PMCFGR_NA			BIT(17)
104#define PMCFGR_EX			BIT(16)
105#define PMCFGR_CCD			BIT(15)
106#define PMCFGR_CC			BIT(14)
107#define PMCFGR_SIZE			GENMASK(13, 8)
108#define PMCFGR_N			GENMASK(7, 0)
109
110/* PMCR register field */
111#define PMCR_TRO			BIT(11)
112#define PMCR_HDBG			BIT(10)
113#define PMCR_FZO			BIT(9)
114#define PMCR_NA				BIT(8)
115#define PMCR_DP				BIT(5)
116#define PMCR_X				BIT(4)
117#define PMCR_D				BIT(3)
118#define PMCR_C				BIT(2)
119#define PMCR_P				BIT(1)
120#define PMCR_E				BIT(0)
121
122/* PMIIDR register field */
123#define PMIIDR_IMPLEMENTER		GENMASK(11, 0)
124#define PMIIDR_IMPLEMENTER_DES_0	GENMASK(3, 0)
125#define PMIIDR_IMPLEMENTER_DES_1	GENMASK(6, 4)
126#define PMIIDR_IMPLEMENTER_DES_2	GENMASK(11, 8)
127#define PMIIDR_REVISION			GENMASK(15, 12)
128#define PMIIDR_VARIANT			GENMASK(19, 16)
129#define PMIIDR_PRODUCTID		GENMASK(31, 20)
130#define PMIIDR_PRODUCTID_PART_0		GENMASK(27, 20)
131#define PMIIDR_PRODUCTID_PART_1		GENMASK(31, 28)
132
133/* PMPIDR0 register field */
134#define PMPIDR0_PART_0			GENMASK(7, 0)
135
136/* PMPIDR1 register field */
137#define PMPIDR1_DES_0			GENMASK(7, 4)
138#define PMPIDR1_PART_1			GENMASK(3, 0)
139
140/* PMPIDR2 register field */
141#define PMPIDR2_REVISION		GENMASK(7, 4)
142#define PMPIDR2_DES_1			GENMASK(2, 0)
143
144/* PMPIDR3 register field */
145#define PMPIDR3_REVAND			GENMASK(7, 4)
146#define PMPIDR3_CMOD			GENMASK(3, 0)
147
148/* PMPIDR4 register field */
149#define PMPIDR4_SIZE			GENMASK(7, 4)
150#define PMPIDR4_DES_2			GENMASK(3, 0)
151
152/* JEDEC-assigned JEP106 identification code */
153#define ARM_CSPMU_IMPL_ID_NVIDIA	0x36B
154#define ARM_CSPMU_IMPL_ID_AMPERE	0xA16
155
156struct arm_cspmu;
157
158/* This tracks the events assigned to each counter in the PMU. */
159struct arm_cspmu_hw_events {
160	/* The events that are active on the PMU for a given logical index. */
161	struct perf_event **events;
162
163	/*
164	 * Each bit indicates a logical counter is being used (or not) for an
165	 * event. If cycle counter is supported and there is a gap between
166	 * regular and cycle counter, the last logical counter is mapped to
167	 * cycle counter. Otherwise, logical and physical have 1-to-1 mapping.
168	 */
169	DECLARE_BITMAP(used_ctrs, ARM_CSPMU_MAX_HW_CNTRS);
170};
171
172/* Contains ops to query vendor/implementer specific attribute. */
173struct arm_cspmu_impl_ops {
174	/* Get event attributes */
175	struct attribute **(*get_event_attrs)(const struct arm_cspmu *cspmu);
176	/* Get format attributes */
177	struct attribute **(*get_format_attrs)(const struct arm_cspmu *cspmu);
178	/* Get string identifier */
179	const char *(*get_identifier)(const struct arm_cspmu *cspmu);
180	/* Get PMU name to register to core perf */
181	const char *(*get_name)(const struct arm_cspmu *cspmu);
182	/* Check if the event corresponds to cycle count event */
183	bool (*is_cycle_counter_event)(const struct perf_event *event);
184	/* Decode event type/id from configs */
185	u32 (*event_type)(const struct perf_event *event);
186	/* Set/reset event filters */
187	void (*set_cc_filter)(struct arm_cspmu *cspmu,
188			      const struct perf_event *event);
189	void (*set_ev_filter)(struct arm_cspmu *cspmu,
190			      const struct perf_event *event);
191	void (*reset_ev_filter)(struct arm_cspmu *cspmu,
192				const struct perf_event *event);
193	/* Implementation specific event validation */
194	int (*validate_event)(struct arm_cspmu *cspmu,
195			      struct perf_event *event);
196	/* Hide/show unsupported events */
197	umode_t (*event_attr_is_visible)(struct kobject *kobj,
198					 struct attribute *attr, int unused);
199};
200
201/* Vendor/implementer registration parameter. */
202struct arm_cspmu_impl_match {
203	/* Backend module. */
204	struct module *module;
205	const char *module_name;
206	/* PMIIDR value/mask. */
207	u32 pmiidr_val;
208	u32 pmiidr_mask;
209	/* Callback to vendor backend to init arm_cspmu_impl::ops. */
210	int (*impl_init_ops)(struct arm_cspmu *cspmu);
211};
212
213/* Vendor/implementer descriptor. */
214struct arm_cspmu_impl {
215	u32 pmiidr;
216	struct module *module;
217	struct arm_cspmu_impl_match *match;
218	struct arm_cspmu_impl_ops ops;
219	void *ctx;
220};
221
222/* Coresight PMU descriptor. */
223struct arm_cspmu {
224	struct pmu pmu;
225	struct device *dev;
226	const char *name;
227	const char *identifier;
228	void __iomem *base0;
229	void __iomem *base1;
230	cpumask_t associated_cpus;
231	cpumask_t active_cpu;
232	struct hlist_node cpuhp_node;
233	int irq;
234
235	bool has_atomic_dword;
236	u32 pmcfgr;
237	u32 num_logical_ctrs;
238	u32 num_set_clr_reg;
239	int cycle_counter_logical_idx;
240
241	struct arm_cspmu_hw_events hw_events;
242	const struct attribute_group *attr_groups[5];
243
244	struct arm_cspmu_impl impl;
245};
246
247/* Default function to show event attribute in sysfs. */
248ssize_t arm_cspmu_sysfs_event_show(struct device *dev,
249				   struct device_attribute *attr,
250				   char *buf);
251
252/* Register vendor backend. */
253int arm_cspmu_impl_register(const struct arm_cspmu_impl_match *impl_match);
254
255/* Unregister vendor backend. */
256void arm_cspmu_impl_unregister(const struct arm_cspmu_impl_match *impl_match);
257
258#endif /* __ARM_CSPMU_H__ */
~/ Read-only file preview.