1a6a5006dSKan Liang /* SPDX-License-Identifier: GPL-2.0 */ 2a6a5006dSKan Liang 3a6a5006dSKan Liang /* 4a6a5006dSKan Liang * PERFCFGOFF_REG, PERFFRZOFF_REG 5a6a5006dSKan Liang * PERFOVFOFF_REG, PERFCNTROFF_REG 6a6a5006dSKan Liang */ 7a6a5006dSKan Liang #define IOMMU_PMU_NUM_OFF_REGS 4 8a6a5006dSKan Liang #define IOMMU_PMU_OFF_REGS_STEP 4 9a6a5006dSKan Liang 10*7232ab8bSKan Liang #define IOMMU_PMU_FILTER_REQUESTER_ID 0x01 11*7232ab8bSKan Liang #define IOMMU_PMU_FILTER_DOMAIN 0x02 12*7232ab8bSKan Liang #define IOMMU_PMU_FILTER_PASID 0x04 13*7232ab8bSKan Liang #define IOMMU_PMU_FILTER_ATS 0x08 14*7232ab8bSKan Liang #define IOMMU_PMU_FILTER_PAGE_TABLE 0x10 15*7232ab8bSKan Liang 16*7232ab8bSKan Liang #define IOMMU_PMU_FILTER_EN BIT(31) 17*7232ab8bSKan Liang 18a6a5006dSKan Liang #define IOMMU_PMU_CFG_OFFSET 0x100 19a6a5006dSKan Liang #define IOMMU_PMU_CFG_CNTRCAP_OFFSET 0x80 20a6a5006dSKan Liang #define IOMMU_PMU_CFG_CNTREVCAP_OFFSET 0x84 21a6a5006dSKan Liang #define IOMMU_PMU_CFG_SIZE 0x8 22a6a5006dSKan Liang #define IOMMU_PMU_CFG_FILTERS_OFFSET 0x4 23a6a5006dSKan Liang 24a6a5006dSKan Liang #define IOMMU_PMU_CAP_REGS_STEP 8 25a6a5006dSKan Liang 26a6a5006dSKan Liang #define iommu_cntrcap_pcc(p) ((p) & 0x1) 27a6a5006dSKan Liang #define iommu_cntrcap_cw(p) (((p) >> 8) & 0xff) 28a6a5006dSKan Liang #define iommu_cntrcap_ios(p) (((p) >> 16) & 0x1) 29a6a5006dSKan Liang #define iommu_cntrcap_egcnt(p) (((p) >> 28) & 0xf) 30a6a5006dSKan Liang 31*7232ab8bSKan Liang #define IOMMU_EVENT_CFG_EGI_SHIFT 8 32*7232ab8bSKan Liang #define IOMMU_EVENT_CFG_ES_SHIFT 32 33*7232ab8bSKan Liang #define IOMMU_EVENT_CFG_INT BIT_ULL(1) 34*7232ab8bSKan Liang 35a6a5006dSKan Liang #define iommu_event_select(p) ((p) & 0xfffffff) 36a6a5006dSKan Liang #define iommu_event_group(p) (((p) >> 28) & 0xf) 37a6a5006dSKan Liang 38a6a5006dSKan Liang #ifdef CONFIG_INTEL_IOMMU_PERF_EVENTS 39a6a5006dSKan Liang int alloc_iommu_pmu(struct intel_iommu *iommu); 40a6a5006dSKan Liang void free_iommu_pmu(struct intel_iommu *iommu); 41*7232ab8bSKan Liang void iommu_pmu_register(struct intel_iommu *iommu); 42*7232ab8bSKan Liang void iommu_pmu_unregister(struct intel_iommu *iommu); 43a6a5006dSKan Liang #else 44a6a5006dSKan Liang static inline int alloc_iommu_pmu(struct intel_iommu * iommu)45a6a5006dSKan Liangalloc_iommu_pmu(struct intel_iommu *iommu) 46a6a5006dSKan Liang { 47a6a5006dSKan Liang return 0; 48a6a5006dSKan Liang } 49a6a5006dSKan Liang 50a6a5006dSKan Liang static inline void free_iommu_pmu(struct intel_iommu * iommu)51a6a5006dSKan Liangfree_iommu_pmu(struct intel_iommu *iommu) 52a6a5006dSKan Liang { 53a6a5006dSKan Liang } 54*7232ab8bSKan Liang 55*7232ab8bSKan Liang static inline void iommu_pmu_register(struct intel_iommu * iommu)56*7232ab8bSKan Liangiommu_pmu_register(struct intel_iommu *iommu) 57*7232ab8bSKan Liang { 58*7232ab8bSKan Liang } 59*7232ab8bSKan Liang 60*7232ab8bSKan Liang static inline void iommu_pmu_unregister(struct intel_iommu * iommu)61*7232ab8bSKan Liangiommu_pmu_unregister(struct intel_iommu *iommu) 62*7232ab8bSKan Liang { 63*7232ab8bSKan Liang } 64a6a5006dSKan Liang #endif /* CONFIG_INTEL_IOMMU_PERF_EVENTS */ 65