162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/*
462306a36Sopenharmony_ci * PERFCFGOFF_REG, PERFFRZOFF_REG
562306a36Sopenharmony_ci * PERFOVFOFF_REG, PERFCNTROFF_REG
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#define IOMMU_PMU_NUM_OFF_REGS			4
862306a36Sopenharmony_ci#define IOMMU_PMU_OFF_REGS_STEP			4
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define IOMMU_PMU_FILTER_REQUESTER_ID		0x01
1162306a36Sopenharmony_ci#define IOMMU_PMU_FILTER_DOMAIN			0x02
1262306a36Sopenharmony_ci#define IOMMU_PMU_FILTER_PASID			0x04
1362306a36Sopenharmony_ci#define IOMMU_PMU_FILTER_ATS			0x08
1462306a36Sopenharmony_ci#define IOMMU_PMU_FILTER_PAGE_TABLE		0x10
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define IOMMU_PMU_FILTER_EN			BIT(31)
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define IOMMU_PMU_CFG_OFFSET			0x100
1962306a36Sopenharmony_ci#define IOMMU_PMU_CFG_CNTRCAP_OFFSET		0x80
2062306a36Sopenharmony_ci#define IOMMU_PMU_CFG_CNTREVCAP_OFFSET		0x84
2162306a36Sopenharmony_ci#define IOMMU_PMU_CFG_SIZE			0x8
2262306a36Sopenharmony_ci#define IOMMU_PMU_CFG_FILTERS_OFFSET		0x4
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define IOMMU_PMU_CAP_REGS_STEP			8
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define iommu_cntrcap_pcc(p)			((p) & 0x1)
2762306a36Sopenharmony_ci#define iommu_cntrcap_cw(p)			(((p) >> 8) & 0xff)
2862306a36Sopenharmony_ci#define iommu_cntrcap_ios(p)			(((p) >> 16) & 0x1)
2962306a36Sopenharmony_ci#define iommu_cntrcap_egcnt(p)			(((p) >> 28) & 0xf)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define IOMMU_EVENT_CFG_EGI_SHIFT		8
3262306a36Sopenharmony_ci#define IOMMU_EVENT_CFG_ES_SHIFT		32
3362306a36Sopenharmony_ci#define IOMMU_EVENT_CFG_INT			BIT_ULL(1)
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define iommu_event_select(p)			((p) & 0xfffffff)
3662306a36Sopenharmony_ci#define iommu_event_group(p)			(((p) >> 28) & 0xf)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#ifdef CONFIG_INTEL_IOMMU_PERF_EVENTS
3962306a36Sopenharmony_ciint alloc_iommu_pmu(struct intel_iommu *iommu);
4062306a36Sopenharmony_civoid free_iommu_pmu(struct intel_iommu *iommu);
4162306a36Sopenharmony_civoid iommu_pmu_register(struct intel_iommu *iommu);
4262306a36Sopenharmony_civoid iommu_pmu_unregister(struct intel_iommu *iommu);
4362306a36Sopenharmony_ci#else
4462306a36Sopenharmony_cistatic inline int
4562306a36Sopenharmony_cialloc_iommu_pmu(struct intel_iommu *iommu)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	return 0;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic inline void
5162306a36Sopenharmony_cifree_iommu_pmu(struct intel_iommu *iommu)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic inline void
5662306a36Sopenharmony_ciiommu_pmu_register(struct intel_iommu *iommu)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic inline void
6162306a36Sopenharmony_ciiommu_pmu_unregister(struct intel_iommu *iommu)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci#endif /* CONFIG_INTEL_IOMMU_PERF_EVENTS */
65