162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright(c) 2020 Intel Corporation. All rights rsvd. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef _PERFMON_H_ 562306a36Sopenharmony_ci#define _PERFMON_H_ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/slab.h> 862306a36Sopenharmony_ci#include <linux/pci.h> 962306a36Sopenharmony_ci#include <linux/sbitmap.h> 1062306a36Sopenharmony_ci#include <linux/dmaengine.h> 1162306a36Sopenharmony_ci#include <linux/percpu-rwsem.h> 1262306a36Sopenharmony_ci#include <linux/wait.h> 1362306a36Sopenharmony_ci#include <linux/cdev.h> 1462306a36Sopenharmony_ci#include <linux/uuid.h> 1562306a36Sopenharmony_ci#include <linux/idxd.h> 1662306a36Sopenharmony_ci#include <linux/perf_event.h> 1762306a36Sopenharmony_ci#include "registers.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic inline struct idxd_pmu *event_to_pmu(struct perf_event *event) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci struct idxd_pmu *idxd_pmu; 2262306a36Sopenharmony_ci struct pmu *pmu; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci pmu = event->pmu; 2562306a36Sopenharmony_ci idxd_pmu = container_of(pmu, struct idxd_pmu, pmu); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci return idxd_pmu; 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic inline struct idxd_device *event_to_idxd(struct perf_event *event) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct idxd_pmu *idxd_pmu; 3362306a36Sopenharmony_ci struct pmu *pmu; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci pmu = event->pmu; 3662306a36Sopenharmony_ci idxd_pmu = container_of(pmu, struct idxd_pmu, pmu); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci return idxd_pmu->idxd; 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic inline struct idxd_device *pmu_to_idxd(struct pmu *pmu) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci struct idxd_pmu *idxd_pmu; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci idxd_pmu = container_of(pmu, struct idxd_pmu, pmu); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci return idxd_pmu->idxd; 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cienum dsa_perf_events { 5162306a36Sopenharmony_ci DSA_PERF_EVENT_WQ = 0, 5262306a36Sopenharmony_ci DSA_PERF_EVENT_ENGINE, 5362306a36Sopenharmony_ci DSA_PERF_EVENT_ADDR_TRANS, 5462306a36Sopenharmony_ci DSA_PERF_EVENT_OP, 5562306a36Sopenharmony_ci DSA_PERF_EVENT_COMPL, 5662306a36Sopenharmony_ci DSA_PERF_EVENT_MAX, 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cienum filter_enc { 6062306a36Sopenharmony_ci FLT_WQ = 0, 6162306a36Sopenharmony_ci FLT_TC, 6262306a36Sopenharmony_ci FLT_PG_SZ, 6362306a36Sopenharmony_ci FLT_XFER_SZ, 6462306a36Sopenharmony_ci FLT_ENG, 6562306a36Sopenharmony_ci FLT_MAX, 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci#define CONFIG_RESET 0x0000000000000001 6962306a36Sopenharmony_ci#define CNTR_RESET 0x0000000000000002 7062306a36Sopenharmony_ci#define CNTR_ENABLE 0x0000000000000001 7162306a36Sopenharmony_ci#define INTR_OVFL 0x0000000000000002 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define COUNTER_FREEZE 0x00000000FFFFFFFF 7462306a36Sopenharmony_ci#define COUNTER_UNFREEZE 0x0000000000000000 7562306a36Sopenharmony_ci#define OVERFLOW_SIZE 32 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define CNTRCFG_ENABLE BIT(0) 7862306a36Sopenharmony_ci#define CNTRCFG_IRQ_OVERFLOW BIT(1) 7962306a36Sopenharmony_ci#define CNTRCFG_CATEGORY_SHIFT 8 8062306a36Sopenharmony_ci#define CNTRCFG_EVENT_SHIFT 32 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define PERFMON_TABLE_OFFSET(_idxd) \ 8362306a36Sopenharmony_ci({ \ 8462306a36Sopenharmony_ci typeof(_idxd) __idxd = (_idxd); \ 8562306a36Sopenharmony_ci ((__idxd)->reg_base + (__idxd)->perfmon_offset); \ 8662306a36Sopenharmony_ci}) 8762306a36Sopenharmony_ci#define PERFMON_REG_OFFSET(idxd, offset) \ 8862306a36Sopenharmony_ci (PERFMON_TABLE_OFFSET(idxd) + (offset)) 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci#define PERFCAP_REG(idxd) (PERFMON_REG_OFFSET(idxd, IDXD_PERFCAP_OFFSET)) 9162306a36Sopenharmony_ci#define PERFRST_REG(idxd) (PERFMON_REG_OFFSET(idxd, IDXD_PERFRST_OFFSET)) 9262306a36Sopenharmony_ci#define OVFSTATUS_REG(idxd) (PERFMON_REG_OFFSET(idxd, IDXD_OVFSTATUS_OFFSET)) 9362306a36Sopenharmony_ci#define PERFFRZ_REG(idxd) (PERFMON_REG_OFFSET(idxd, IDXD_PERFFRZ_OFFSET)) 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define FLTCFG_REG(idxd, cntr, flt) \ 9662306a36Sopenharmony_ci (PERFMON_REG_OFFSET(idxd, IDXD_FLTCFG_OFFSET) + ((cntr) * 32) + ((flt) * 4)) 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci#define CNTRCFG_REG(idxd, cntr) \ 9962306a36Sopenharmony_ci (PERFMON_REG_OFFSET(idxd, IDXD_CNTRCFG_OFFSET) + ((cntr) * 8)) 10062306a36Sopenharmony_ci#define CNTRDATA_REG(idxd, cntr) \ 10162306a36Sopenharmony_ci (PERFMON_REG_OFFSET(idxd, IDXD_CNTRDATA_OFFSET) + ((cntr) * 8)) 10262306a36Sopenharmony_ci#define CNTRCAP_REG(idxd, cntr) \ 10362306a36Sopenharmony_ci (PERFMON_REG_OFFSET(idxd, IDXD_CNTRCAP_OFFSET) + ((cntr) * 8)) 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define EVNTCAP_REG(idxd, category) \ 10662306a36Sopenharmony_ci (PERFMON_REG_OFFSET(idxd, IDXD_EVNTCAP_OFFSET) + ((category) * 8)) 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#define DEFINE_PERFMON_FORMAT_ATTR(_name, _format) \ 10962306a36Sopenharmony_cistatic ssize_t __perfmon_idxd_##_name##_show(struct kobject *kobj, \ 11062306a36Sopenharmony_ci struct kobj_attribute *attr, \ 11162306a36Sopenharmony_ci char *page) \ 11262306a36Sopenharmony_ci{ \ 11362306a36Sopenharmony_ci BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \ 11462306a36Sopenharmony_ci return sprintf(page, _format "\n"); \ 11562306a36Sopenharmony_ci} \ 11662306a36Sopenharmony_cistatic struct kobj_attribute format_attr_idxd_##_name = \ 11762306a36Sopenharmony_ci __ATTR(_name, 0444, __perfmon_idxd_##_name##_show, NULL) 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#endif 120