120 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /* Copyright(c) 2020 Intel Corporation. All rights rsvd. */
 | |
| 
 | |
| #ifndef _PERFMON_H_
 | |
| #define _PERFMON_H_
 | |
| 
 | |
| #include <linux/slab.h>
 | |
| #include <linux/pci.h>
 | |
| #include <linux/sbitmap.h>
 | |
| #include <linux/dmaengine.h>
 | |
| #include <linux/percpu-rwsem.h>
 | |
| #include <linux/wait.h>
 | |
| #include <linux/cdev.h>
 | |
| #include <linux/uuid.h>
 | |
| #include <linux/idxd.h>
 | |
| #include <linux/perf_event.h>
 | |
| #include "registers.h"
 | |
| 
 | |
| static inline struct idxd_pmu *event_to_pmu(struct perf_event *event)
 | |
| {
 | |
| 	struct idxd_pmu *idxd_pmu;
 | |
| 	struct pmu *pmu;
 | |
| 
 | |
| 	pmu = event->pmu;
 | |
| 	idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
 | |
| 
 | |
| 	return idxd_pmu;
 | |
| }
 | |
| 
 | |
| static inline struct idxd_device *event_to_idxd(struct perf_event *event)
 | |
| {
 | |
| 	struct idxd_pmu *idxd_pmu;
 | |
| 	struct pmu *pmu;
 | |
| 
 | |
| 	pmu = event->pmu;
 | |
| 	idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
 | |
| 
 | |
| 	return idxd_pmu->idxd;
 | |
| }
 | |
| 
 | |
| static inline struct idxd_device *pmu_to_idxd(struct pmu *pmu)
 | |
| {
 | |
| 	struct idxd_pmu *idxd_pmu;
 | |
| 
 | |
| 	idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
 | |
| 
 | |
| 	return idxd_pmu->idxd;
 | |
| }
 | |
| 
 | |
| enum dsa_perf_events {
 | |
| 	DSA_PERF_EVENT_WQ = 0,
 | |
| 	DSA_PERF_EVENT_ENGINE,
 | |
| 	DSA_PERF_EVENT_ADDR_TRANS,
 | |
| 	DSA_PERF_EVENT_OP,
 | |
| 	DSA_PERF_EVENT_COMPL,
 | |
| 	DSA_PERF_EVENT_MAX,
 | |
| };
 | |
| 
 | |
| enum filter_enc {
 | |
| 	FLT_WQ = 0,
 | |
| 	FLT_TC,
 | |
| 	FLT_PG_SZ,
 | |
| 	FLT_XFER_SZ,
 | |
| 	FLT_ENG,
 | |
| 	FLT_MAX,
 | |
| };
 | |
| 
 | |
| #define CONFIG_RESET		0x0000000000000001
 | |
| #define CNTR_RESET		0x0000000000000002
 | |
| #define CNTR_ENABLE		0x0000000000000001
 | |
| #define INTR_OVFL		0x0000000000000002
 | |
| 
 | |
| #define COUNTER_FREEZE		0x00000000FFFFFFFF
 | |
| #define COUNTER_UNFREEZE	0x0000000000000000
 | |
| #define OVERFLOW_SIZE		32
 | |
| 
 | |
| #define CNTRCFG_ENABLE		BIT(0)
 | |
| #define CNTRCFG_IRQ_OVERFLOW	BIT(1)
 | |
| #define CNTRCFG_CATEGORY_SHIFT	8
 | |
| #define CNTRCFG_EVENT_SHIFT	32
 | |
| 
 | |
| #define PERFMON_TABLE_OFFSET(_idxd)				\
 | |
| ({								\
 | |
| 	typeof(_idxd) __idxd = (_idxd);				\
 | |
| 	((__idxd)->reg_base + (__idxd)->perfmon_offset);	\
 | |
| })
 | |
| #define PERFMON_REG_OFFSET(idxd, offset)			\
 | |
| 	(PERFMON_TABLE_OFFSET(idxd) + (offset))
 | |
| 
 | |
| #define PERFCAP_REG(idxd)	(PERFMON_REG_OFFSET(idxd, IDXD_PERFCAP_OFFSET))
 | |
| #define PERFRST_REG(idxd)	(PERFMON_REG_OFFSET(idxd, IDXD_PERFRST_OFFSET))
 | |
| #define OVFSTATUS_REG(idxd)	(PERFMON_REG_OFFSET(idxd, IDXD_OVFSTATUS_OFFSET))
 | |
| #define PERFFRZ_REG(idxd)	(PERFMON_REG_OFFSET(idxd, IDXD_PERFFRZ_OFFSET))
 | |
| 
 | |
| #define FLTCFG_REG(idxd, cntr, flt)				\
 | |
| 	(PERFMON_REG_OFFSET(idxd, IDXD_FLTCFG_OFFSET) +	((cntr) * 32) + ((flt) * 4))
 | |
| 
 | |
| #define CNTRCFG_REG(idxd, cntr)					\
 | |
| 	(PERFMON_REG_OFFSET(idxd, IDXD_CNTRCFG_OFFSET) + ((cntr) * 8))
 | |
| #define CNTRDATA_REG(idxd, cntr)					\
 | |
| 	(PERFMON_REG_OFFSET(idxd, IDXD_CNTRDATA_OFFSET) + ((cntr) * 8))
 | |
| #define CNTRCAP_REG(idxd, cntr)					\
 | |
| 	(PERFMON_REG_OFFSET(idxd, IDXD_CNTRCAP_OFFSET) + ((cntr) * 8))
 | |
| 
 | |
| #define EVNTCAP_REG(idxd, category) \
 | |
| 	(PERFMON_REG_OFFSET(idxd, IDXD_EVNTCAP_OFFSET) + ((category) * 8))
 | |
| 
 | |
| #define DEFINE_PERFMON_FORMAT_ATTR(_name, _format)			\
 | |
| static ssize_t __perfmon_idxd_##_name##_show(struct kobject *kobj,	\
 | |
| 				struct kobj_attribute *attr,		\
 | |
| 				char *page)				\
 | |
| {									\
 | |
| 	BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE);			\
 | |
| 	return sprintf(page, _format "\n");				\
 | |
| }									\
 | |
| static struct kobj_attribute format_attr_idxd_##_name =			\
 | |
| 	__ATTR(_name, 0444, __perfmon_idxd_##_name##_show, NULL)
 | |
| 
 | |
| #endif
 |