[igt-dev] [PATCH i-g-t 1/5] i915/pmu: Add helpers to convert ticks to ns

Umesh Nerlige Ramappa umesh.nerlige.ramappa at intel.com
Fri Sep 22 21:52:29 UTC 2023


MTL is introducing a 2 new counters to read busyness in ticks rather
than nanoseconds:

(1) A counter that returns engine busyness in ticks (xxxx-busy-ticks)
(2) A counter that returns gt active time in ticks (total-active-ticks)

Busyness % = (delta-xxxx-busy-ticks * 100) / delta-total-active-ticks

At the same time it is deprecating the old busyness counter that would
require the kernel to convert the ticks to ns.

Current IGT modifications are not using total-active-ticks since that is
a larger change and more thought needs to go into incorporating that
into the tests. That will be part of a follow up series. For now, add
some helpers to the IGT tests to convert the ticks to ns.

Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
---
 tests/intel/perf_pmu.c | 69 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/tests/intel/perf_pmu.c b/tests/intel/perf_pmu.c
index c6e6a8b77..87078ad38 100644
--- a/tests/intel/perf_pmu.c
+++ b/tests/intel/perf_pmu.c
@@ -255,6 +255,72 @@ IGT_TEST_DESCRIPTION("Test the i915 pmu perf interface");
 
 const double tolerance = 0.05f;
 const unsigned long batch_duration_ns = 500e6;
+static bool busy_ticks_only;
+static uint32_t cs_ts_freq;
+
+static bool strendswith(const char *str, const char *endswith)
+{
+	unsigned int endlen = strlen(endswith);
+	unsigned int str_len = strlen(str);
+
+	if (str_len < endlen)
+		return false;
+
+	return strcmp(str + (str_len - endlen), endswith) == 0;
+}
+
+static bool pmu_supports_event(int i915, const char *event_end)
+{
+	struct dirent *dent;
+	bool found = false;
+	int pmu_fd;
+	DIR *d;
+
+	pmu_fd = igt_perf_events_dir(i915);
+	igt_require(pmu_fd >= 0);
+
+	d = fdopendir(dup(pmu_fd));
+	igt_assert(d);
+	rewinddir(d);
+
+	while ((dent = readdir(d)) != NULL) {
+		if (dent->d_type != DT_REG)
+			continue;
+
+		if (strendswith(dent->d_name, event_end)) {
+			found = true;
+			break;
+		}
+	}
+
+	closedir(d);
+	close(pmu_fd);
+
+	return found;
+}
+
+static bool pmu_supports_only_busy_ticks(int i915)
+{
+	return pmu_supports_event(i915, "-busy-ticks") &&
+	       !pmu_supports_event(i915, "-busy");
+}
+
+static uint32_t
+cs_timestamp_frequency(int fd)
+{
+	struct drm_i915_getparam gp = {};
+	static uint32_t value;
+
+	if (value)
+		return value;
+
+	gp.param = I915_PARAM_CS_TIMESTAMP_FREQUENCY;
+	gp.value = (int *)(&value);
+
+	igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp), 0);
+
+	return value;
+}
 
 char *drpc;
 const char *no_debug_data = "\0";
@@ -2482,6 +2548,9 @@ igt_main
 
 		i915_for_each_gt(fd, tmp, gt)
 			num_gt++;
+
+		busy_ticks_only = pmu_supports_only_busy_ticks(fd);
+		cs_ts_freq = cs_timestamp_frequency(fd);
 	}
 
 	igt_describe("Verify i915 pmu dir exists and read all events");
-- 
2.38.1



More information about the igt-dev mailing list