1*a6a5006dSKan Liang /* SPDX-License-Identifier: GPL-2.0 */ 2*a6a5006dSKan Liang 3*a6a5006dSKan Liang /* 4*a6a5006dSKan Liang * PERFCFGOFF_REG, PERFFRZOFF_REG 5*a6a5006dSKan Liang * PERFOVFOFF_REG, PERFCNTROFF_REG 6*a6a5006dSKan Liang */ 7*a6a5006dSKan Liang #define IOMMU_PMU_NUM_OFF_REGS 4 8*a6a5006dSKan Liang #define IOMMU_PMU_OFF_REGS_STEP 4 9*a6a5006dSKan Liang 10*a6a5006dSKan Liang #define IOMMU_PMU_CFG_OFFSET 0x100 11*a6a5006dSKan Liang #define IOMMU_PMU_CFG_CNTRCAP_OFFSET 0x80 12*a6a5006dSKan Liang #define IOMMU_PMU_CFG_CNTREVCAP_OFFSET 0x84 13*a6a5006dSKan Liang #define IOMMU_PMU_CFG_SIZE 0x8 14*a6a5006dSKan Liang #define IOMMU_PMU_CFG_FILTERS_OFFSET 0x4 15*a6a5006dSKan Liang 16*a6a5006dSKan Liang #define IOMMU_PMU_CAP_REGS_STEP 8 17*a6a5006dSKan Liang 18*a6a5006dSKan Liang #define iommu_cntrcap_pcc(p) ((p) & 0x1) 19*a6a5006dSKan Liang #define iommu_cntrcap_cw(p) (((p) >> 8) & 0xff) 20*a6a5006dSKan Liang #define iommu_cntrcap_ios(p) (((p) >> 16) & 0x1) 21*a6a5006dSKan Liang #define iommu_cntrcap_egcnt(p) (((p) >> 28) & 0xf) 22*a6a5006dSKan Liang 23*a6a5006dSKan Liang #define iommu_event_select(p) ((p) & 0xfffffff) 24*a6a5006dSKan Liang #define iommu_event_group(p) (((p) >> 28) & 0xf) 25*a6a5006dSKan Liang 26*a6a5006dSKan Liang #ifdef CONFIG_INTEL_IOMMU_PERF_EVENTS 27*a6a5006dSKan Liang int alloc_iommu_pmu(struct intel_iommu *iommu); 28*a6a5006dSKan Liang void free_iommu_pmu(struct intel_iommu *iommu); 29*a6a5006dSKan Liang #else 30*a6a5006dSKan Liang static inline int 31*a6a5006dSKan Liang alloc_iommu_pmu(struct intel_iommu *iommu) 32*a6a5006dSKan Liang { 33*a6a5006dSKan Liang return 0; 34*a6a5006dSKan Liang } 35*a6a5006dSKan Liang 36*a6a5006dSKan Liang static inline void 37*a6a5006dSKan Liang free_iommu_pmu(struct intel_iommu *iommu) 38*a6a5006dSKan Liang { 39*a6a5006dSKan Liang } 40*a6a5006dSKan Liang #endif /* CONFIG_INTEL_IOMMU_PERF_EVENTS */ 41