linux/drivers/dma/idxd/perfmon.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright(c) 2020 Intel Corporation. All rights rsvd. */
   3
   4#ifndef _PERFMON_H_
   5#define _PERFMON_H_
   6
   7#include <linux/slab.h>
   8#include <linux/pci.h>
   9#include <linux/sbitmap.h>
  10#include <linux/dmaengine.h>
  11#include <linux/percpu-rwsem.h>
  12#include <linux/wait.h>
  13#include <linux/cdev.h>
  14#include <linux/uuid.h>
  15#include <linux/idxd.h>
  16#include <linux/perf_event.h>
  17#include "registers.h"
  18
  19static inline struct idxd_pmu *event_to_pmu(struct perf_event *event)
  20{
  21        struct idxd_pmu *idxd_pmu;
  22        struct pmu *pmu;
  23
  24        pmu = event->pmu;
  25        idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
  26
  27        return idxd_pmu;
  28}
  29
  30static inline struct idxd_device *event_to_idxd(struct perf_event *event)
  31{
  32        struct idxd_pmu *idxd_pmu;
  33        struct pmu *pmu;
  34
  35        pmu = event->pmu;
  36        idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
  37
  38        return idxd_pmu->idxd;
  39}
  40
  41static inline struct idxd_device *pmu_to_idxd(struct pmu *pmu)
  42{
  43        struct idxd_pmu *idxd_pmu;
  44
  45        idxd_pmu = container_of(pmu, struct idxd_pmu, pmu);
  46
  47        return idxd_pmu->idxd;
  48}
  49
  50enum dsa_perf_events {
  51        DSA_PERF_EVENT_WQ = 0,
  52        DSA_PERF_EVENT_ENGINE,
  53        DSA_PERF_EVENT_ADDR_TRANS,
  54        DSA_PERF_EVENT_OP,
  55        DSA_PERF_EVENT_COMPL,
  56        DSA_PERF_EVENT_MAX,
  57};
  58
  59enum filter_enc {
  60        FLT_WQ = 0,
  61        FLT_TC,
  62        FLT_PG_SZ,
  63        FLT_XFER_SZ,
  64        FLT_ENG,
  65        FLT_MAX,
  66};
  67
  68#define CONFIG_RESET            0x0000000000000001
  69#define CNTR_RESET              0x0000000000000002
  70#define CNTR_ENABLE             0x0000000000000001
  71#define INTR_OVFL               0x0000000000000002
  72
  73#define COUNTER_FREEZE          0x00000000FFFFFFFF
  74#define COUNTER_UNFREEZE        0x0000000000000000
  75#define OVERFLOW_SIZE           32
  76
  77#define CNTRCFG_ENABLE          BIT(0)
  78#define CNTRCFG_IRQ_OVERFLOW    BIT(1)
  79#define CNTRCFG_CATEGORY_SHIFT  8
  80#define CNTRCFG_EVENT_SHIFT     32
  81
  82#define PERFMON_TABLE_OFFSET(_idxd)                             \
  83({                                                              \
  84        typeof(_idxd) __idxd = (_idxd);                         \
  85        ((__idxd)->reg_base + (__idxd)->perfmon_offset);        \
  86})
  87#define PERFMON_REG_OFFSET(idxd, offset)                        \
  88        (PERFMON_TABLE_OFFSET(idxd) + (offset))
  89
  90#define PERFCAP_REG(idxd)       (PERFMON_REG_OFFSET(idxd, IDXD_PERFCAP_OFFSET))
  91#define PERFRST_REG(idxd)       (PERFMON_REG_OFFSET(idxd, IDXD_PERFRST_OFFSET))
  92#define OVFSTATUS_REG(idxd)     (PERFMON_REG_OFFSET(idxd, IDXD_OVFSTATUS_OFFSET))
  93#define PERFFRZ_REG(idxd)       (PERFMON_REG_OFFSET(idxd, IDXD_PERFFRZ_OFFSET))
  94
  95#define FLTCFG_REG(idxd, cntr, flt)                             \
  96        (PERFMON_REG_OFFSET(idxd, IDXD_FLTCFG_OFFSET) + ((cntr) * 32) + ((flt) * 4))
  97
  98#define CNTRCFG_REG(idxd, cntr)                                 \
  99        (PERFMON_REG_OFFSET(idxd, IDXD_CNTRCFG_OFFSET) + ((cntr) * 8))
 100#define CNTRDATA_REG(idxd, cntr)                                        \
 101        (PERFMON_REG_OFFSET(idxd, IDXD_CNTRDATA_OFFSET) + ((cntr) * 8))
 102#define CNTRCAP_REG(idxd, cntr)                                 \
 103        (PERFMON_REG_OFFSET(idxd, IDXD_CNTRCAP_OFFSET) + ((cntr) * 8))
 104
 105#define EVNTCAP_REG(idxd, category) \
 106        (PERFMON_REG_OFFSET(idxd, IDXD_EVNTCAP_OFFSET) + ((category) * 8))
 107
 108#define DEFINE_PERFMON_FORMAT_ATTR(_name, _format)                      \
 109static ssize_t __perfmon_idxd_##_name##_show(struct kobject *kobj,      \
 110                                struct kobj_attribute *attr,            \
 111                                char *page)                             \
 112{                                                                       \
 113        BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE);                     \
 114        return sprintf(page, _format "\n");                             \
 115}                                                                       \
 116static struct kobj_attribute format_attr_idxd_##_name =                 \
 117        __ATTR(_name, 0444, __perfmon_idxd_##_name##_show, NULL)
 118
 119#endif
 120