[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