xref: /openbmc/linux/drivers/iommu/intel/perfmon.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
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 Liang alloc_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 Liang free_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 Liang iommu_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 Liang iommu_pmu_unregister(struct intel_iommu *iommu)
62*7232ab8bSKan Liang {
63*7232ab8bSKan Liang }
64a6a5006dSKan Liang #endif /* CONFIG_INTEL_IOMMU_PERF_EVENTS */
65