/* SPDX-License-Identifier: GPL-2.0 */ /* Copyright(c) 2020 Intel Corporation. All rights rsvd. */ #ifndef _PERFMON_H_ #define _PERFMON_H_ #include #include #include #include #include #include #include #include #include #include #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