162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * perf.h - performance monitor header
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2021 Intel Corporation
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Lu Baolu <baolu.lu@linux.intel.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cienum latency_type {
1162306a36Sopenharmony_ci	DMAR_LATENCY_INV_IOTLB = 0,
1262306a36Sopenharmony_ci	DMAR_LATENCY_INV_DEVTLB,
1362306a36Sopenharmony_ci	DMAR_LATENCY_INV_IEC,
1462306a36Sopenharmony_ci	DMAR_LATENCY_PRQ,
1562306a36Sopenharmony_ci	DMAR_LATENCY_NUM
1662306a36Sopenharmony_ci};
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cienum latency_count {
1962306a36Sopenharmony_ci	COUNTS_10e2 = 0,	/* < 0.1us	*/
2062306a36Sopenharmony_ci	COUNTS_10e3,		/* 0.1us ~ 1us	*/
2162306a36Sopenharmony_ci	COUNTS_10e4,		/* 1us ~ 10us	*/
2262306a36Sopenharmony_ci	COUNTS_10e5,		/* 10us ~ 100us	*/
2362306a36Sopenharmony_ci	COUNTS_10e6,		/* 100us ~ 1ms	*/
2462306a36Sopenharmony_ci	COUNTS_10e7,		/* 1ms ~ 10ms	*/
2562306a36Sopenharmony_ci	COUNTS_10e8_plus,	/* 10ms and plus*/
2662306a36Sopenharmony_ci	COUNTS_MIN,
2762306a36Sopenharmony_ci	COUNTS_MAX,
2862306a36Sopenharmony_ci	COUNTS_SUM,
2962306a36Sopenharmony_ci	COUNTS_NUM
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistruct latency_statistic {
3362306a36Sopenharmony_ci	bool enabled;
3462306a36Sopenharmony_ci	u64 counter[COUNTS_NUM];
3562306a36Sopenharmony_ci	u64 samples;
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#ifdef CONFIG_DMAR_PERF
3962306a36Sopenharmony_ciint dmar_latency_enable(struct intel_iommu *iommu, enum latency_type type);
4062306a36Sopenharmony_civoid dmar_latency_disable(struct intel_iommu *iommu, enum latency_type type);
4162306a36Sopenharmony_cibool dmar_latency_enabled(struct intel_iommu *iommu, enum latency_type type);
4262306a36Sopenharmony_civoid dmar_latency_update(struct intel_iommu *iommu, enum latency_type type,
4362306a36Sopenharmony_ci			 u64 latency);
4462306a36Sopenharmony_ciint dmar_latency_snapshot(struct intel_iommu *iommu, char *str, size_t size);
4562306a36Sopenharmony_ci#else
4662306a36Sopenharmony_cistatic inline int
4762306a36Sopenharmony_cidmar_latency_enable(struct intel_iommu *iommu, enum latency_type type)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	return -EINVAL;
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic inline void
5362306a36Sopenharmony_cidmar_latency_disable(struct intel_iommu *iommu, enum latency_type type)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic inline bool
5862306a36Sopenharmony_cidmar_latency_enabled(struct intel_iommu *iommu, enum latency_type type)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	return false;
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic inline void
6462306a36Sopenharmony_cidmar_latency_update(struct intel_iommu *iommu, enum latency_type type, u64 latency)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistatic inline int
6962306a36Sopenharmony_cidmar_latency_snapshot(struct intel_iommu *iommu, char *str, size_t size)
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	return 0;
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci#endif /* CONFIG_DMAR_PERF */
74