xref: /openbmc/linux/drivers/dma/idxd/perfmon.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1*81dd4d4dSTom Zanussi /* SPDX-License-Identifier: GPL-2.0 */
2*81dd4d4dSTom Zanussi /* Copyright(c) 2020 Intel Corporation. All rights rsvd. */
3*81dd4d4dSTom Zanussi 
4*81dd4d4dSTom Zanussi #ifndef _PERFMON_H_
5*81dd4d4dSTom Zanussi #define _PERFMON_H_
6*81dd4d4dSTom Zanussi 
7*81dd4d4dSTom Zanussi #include <linux/slab.h>
8*81dd4d4dSTom Zanussi #include <linux/pci.h>
9*81dd4d4dSTom Zanussi #include <linux/sbitmap.h>
10*81dd4d4dSTom Zanussi #include <linux/dmaengine.h>
11*81dd4d4dSTom Zanussi #include <linux/percpu-rwsem.h>
12*81dd4d4dSTom Zanussi #include <linux/wait.h>
13*81dd4d4dSTom Zanussi #include <linux/cdev.h>
14*81dd4d4dSTom Zanussi #include <linux/uuid.h>
15*81dd4d4dSTom Zanussi #include <linux/idxd.h>
16*81dd4d4dSTom Zanussi #include <linux/perf_event.h>
17*81dd4d4dSTom Zanussi #include "registers.h"
18*81dd4d4dSTom Zanussi 
event_to_pmu(struct perf_event * event)19*81dd4d4dSTom Zanussi static inline struct idxd_pmu *event_to_pmu(struct perf_event *event)
20*81dd4d4dSTom Zanussi {
21*81dd4d4dSTom Zanussi 	struct idxd_pmu *idxd_pmu;
22*81dd4d4dSTom Zanussi 	struct pmu *pmu;
23*81dd4d4dSTom Zanussi 
24*81dd4d4dSTom Zanussi 	pmu = event->pmu;
25*81dd4d4dSTom Zanussi 	idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
26*81dd4d4dSTom Zanussi 
27*81dd4d4dSTom Zanussi 	return idxd_pmu;
28*81dd4d4dSTom Zanussi }
29*81dd4d4dSTom Zanussi 
event_to_idxd(struct perf_event * event)30*81dd4d4dSTom Zanussi static inline struct idxd_device *event_to_idxd(struct perf_event *event)
31*81dd4d4dSTom Zanussi {
32*81dd4d4dSTom Zanussi 	struct idxd_pmu *idxd_pmu;
33*81dd4d4dSTom Zanussi 	struct pmu *pmu;
34*81dd4d4dSTom Zanussi 
35*81dd4d4dSTom Zanussi 	pmu = event->pmu;
36*81dd4d4dSTom Zanussi 	idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
37*81dd4d4dSTom Zanussi 
38*81dd4d4dSTom Zanussi 	return idxd_pmu->idxd;
39*81dd4d4dSTom Zanussi }
40*81dd4d4dSTom Zanussi 
pmu_to_idxd(struct pmu * pmu)41*81dd4d4dSTom Zanussi static inline struct idxd_device *pmu_to_idxd(struct pmu *pmu)
42*81dd4d4dSTom Zanussi {
43*81dd4d4dSTom Zanussi 	struct idxd_pmu *idxd_pmu;
44*81dd4d4dSTom Zanussi 
45*81dd4d4dSTom Zanussi 	idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
46*81dd4d4dSTom Zanussi 
47*81dd4d4dSTom Zanussi 	return idxd_pmu->idxd;
48*81dd4d4dSTom Zanussi }
49*81dd4d4dSTom Zanussi 
50*81dd4d4dSTom Zanussi enum dsa_perf_events {
51*81dd4d4dSTom Zanussi 	DSA_PERF_EVENT_WQ = 0,
52*81dd4d4dSTom Zanussi 	DSA_PERF_EVENT_ENGINE,
53*81dd4d4dSTom Zanussi 	DSA_PERF_EVENT_ADDR_TRANS,
54*81dd4d4dSTom Zanussi 	DSA_PERF_EVENT_OP,
55*81dd4d4dSTom Zanussi 	DSA_PERF_EVENT_COMPL,
56*81dd4d4dSTom Zanussi 	DSA_PERF_EVENT_MAX,
57*81dd4d4dSTom Zanussi };
58*81dd4d4dSTom Zanussi 
59*81dd4d4dSTom Zanussi enum filter_enc {
60*81dd4d4dSTom Zanussi 	FLT_WQ = 0,
61*81dd4d4dSTom Zanussi 	FLT_TC,
62*81dd4d4dSTom Zanussi 	FLT_PG_SZ,
63*81dd4d4dSTom Zanussi 	FLT_XFER_SZ,
64*81dd4d4dSTom Zanussi 	FLT_ENG,
65*81dd4d4dSTom Zanussi 	FLT_MAX,
66*81dd4d4dSTom Zanussi };
67*81dd4d4dSTom Zanussi 
68*81dd4d4dSTom Zanussi #define CONFIG_RESET		0x0000000000000001
69*81dd4d4dSTom Zanussi #define CNTR_RESET		0x0000000000000002
70*81dd4d4dSTom Zanussi #define CNTR_ENABLE		0x0000000000000001
71*81dd4d4dSTom Zanussi #define INTR_OVFL		0x0000000000000002
72*81dd4d4dSTom Zanussi 
73*81dd4d4dSTom Zanussi #define COUNTER_FREEZE		0x00000000FFFFFFFF
74*81dd4d4dSTom Zanussi #define COUNTER_UNFREEZE	0x0000000000000000
75*81dd4d4dSTom Zanussi #define OVERFLOW_SIZE		32
76*81dd4d4dSTom Zanussi 
77*81dd4d4dSTom Zanussi #define CNTRCFG_ENABLE		BIT(0)
78*81dd4d4dSTom Zanussi #define CNTRCFG_IRQ_OVERFLOW	BIT(1)
79*81dd4d4dSTom Zanussi #define CNTRCFG_CATEGORY_SHIFT	8
80*81dd4d4dSTom Zanussi #define CNTRCFG_EVENT_SHIFT	32
81*81dd4d4dSTom Zanussi 
82*81dd4d4dSTom Zanussi #define PERFMON_TABLE_OFFSET(_idxd)				\
83*81dd4d4dSTom Zanussi ({								\
84*81dd4d4dSTom Zanussi 	typeof(_idxd) __idxd = (_idxd);				\
85*81dd4d4dSTom Zanussi 	((__idxd)->reg_base + (__idxd)->perfmon_offset);	\
86*81dd4d4dSTom Zanussi })
87*81dd4d4dSTom Zanussi #define PERFMON_REG_OFFSET(idxd, offset)			\
88*81dd4d4dSTom Zanussi 	(PERFMON_TABLE_OFFSET(idxd) + (offset))
89*81dd4d4dSTom Zanussi 
90*81dd4d4dSTom Zanussi #define PERFCAP_REG(idxd)	(PERFMON_REG_OFFSET(idxd, IDXD_PERFCAP_OFFSET))
91*81dd4d4dSTom Zanussi #define PERFRST_REG(idxd)	(PERFMON_REG_OFFSET(idxd, IDXD_PERFRST_OFFSET))
92*81dd4d4dSTom Zanussi #define OVFSTATUS_REG(idxd)	(PERFMON_REG_OFFSET(idxd, IDXD_OVFSTATUS_OFFSET))
93*81dd4d4dSTom Zanussi #define PERFFRZ_REG(idxd)	(PERFMON_REG_OFFSET(idxd, IDXD_PERFFRZ_OFFSET))
94*81dd4d4dSTom Zanussi 
95*81dd4d4dSTom Zanussi #define FLTCFG_REG(idxd, cntr, flt)				\
96*81dd4d4dSTom Zanussi 	(PERFMON_REG_OFFSET(idxd, IDXD_FLTCFG_OFFSET) +	((cntr) * 32) + ((flt) * 4))
97*81dd4d4dSTom Zanussi 
98*81dd4d4dSTom Zanussi #define CNTRCFG_REG(idxd, cntr)					\
99*81dd4d4dSTom Zanussi 	(PERFMON_REG_OFFSET(idxd, IDXD_CNTRCFG_OFFSET) + ((cntr) * 8))
100*81dd4d4dSTom Zanussi #define CNTRDATA_REG(idxd, cntr)					\
101*81dd4d4dSTom Zanussi 	(PERFMON_REG_OFFSET(idxd, IDXD_CNTRDATA_OFFSET) + ((cntr) * 8))
102*81dd4d4dSTom Zanussi #define CNTRCAP_REG(idxd, cntr)					\
103*81dd4d4dSTom Zanussi 	(PERFMON_REG_OFFSET(idxd, IDXD_CNTRCAP_OFFSET) + ((cntr) * 8))
104*81dd4d4dSTom Zanussi 
105*81dd4d4dSTom Zanussi #define EVNTCAP_REG(idxd, category) \
106*81dd4d4dSTom Zanussi 	(PERFMON_REG_OFFSET(idxd, IDXD_EVNTCAP_OFFSET) + ((category) * 8))
107*81dd4d4dSTom Zanussi 
108*81dd4d4dSTom Zanussi #define DEFINE_PERFMON_FORMAT_ATTR(_name, _format)			\
109*81dd4d4dSTom Zanussi static ssize_t __perfmon_idxd_##_name##_show(struct kobject *kobj,	\
110*81dd4d4dSTom Zanussi 				struct kobj_attribute *attr,		\
111*81dd4d4dSTom Zanussi 				char *page)				\
112*81dd4d4dSTom Zanussi {									\
113*81dd4d4dSTom Zanussi 	BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE);			\
114*81dd4d4dSTom Zanussi 	return sprintf(page, _format "\n");				\
115*81dd4d4dSTom Zanussi }									\
116*81dd4d4dSTom Zanussi static struct kobj_attribute format_attr_idxd_##_name =			\
117*81dd4d4dSTom Zanussi 	__ATTR(_name, 0444, __perfmon_idxd_##_name##_show, NULL)
118*81dd4d4dSTom Zanussi 
119*81dd4d4dSTom Zanussi #endif
120