mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.1 KiB
119 lines
3.1 KiB
/* 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
|
|
|