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