[Intel-gfx] [PATCH i-g-t 08/29] igt/perf: generalize reading gpu ticks from reports
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Tue Apr 25 22:32:40 UTC 2017
From: Robert Bragg <robert at sixbynine.org>
Signed-off-by: Robert Bragg <robert at sixbynine.org>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
tests/perf.c | 67 +++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 42 insertions(+), 25 deletions(-)
diff --git a/tests/perf.c b/tests/perf.c
index fe39f4dd..48e8750f 100644
--- a/tests/perf.c
+++ b/tests/perf.c
@@ -250,6 +250,8 @@ static enum drm_i915_oa_format test_oa_format;
static bool *undefined_a_counters;
static igt_render_copyfunc_t render_copy = NULL;
+static uint32_t (*read_report_ticks)(uint32_t *report,
+ enum drm_i915_oa_format format);
static int
__perf_open(int fd, struct drm_i915_perf_open_param *param)
@@ -393,6 +395,28 @@ read_debugfs_u64_record(int fd, const char *file, const char *key)
return val;
}
+/* XXX: For Haswell this utility is only applicable to the render basic
+ * metric set.
+ *
+ * C2 corresponds to a clock counter for the Haswell render basic metric set
+ * but it's not included in all of the formats.
+ */
+static uint32_t
+hsw_read_report_ticks(uint32_t *report, enum drm_i915_oa_format format)
+{
+ uint32_t *c = (uint32_t *)(((uint8_t *)report) + oa_formats[format].c_off);
+
+ igt_assert_neq(oa_formats[format].n_c, 0);
+
+ return c[2];
+}
+
+static uint32_t
+gen8_read_report_ticks(uint32_t *report, enum drm_i915_oa_format format)
+{
+ return report[3];
+}
+
static bool
init_sys_info(void)
{
@@ -413,10 +437,12 @@ init_sys_info(void)
test_set_uuid = "403d8832-1a27-4aa6-a64e-f5389ce7b212";
test_oa_format = I915_OA_FORMAT_A45_B8_C8;
undefined_a_counters = hsw_undefined_a_counters;
+ read_report_ticks = hsw_read_report_ticks;
} else {
test_set_name = "TestOa";
test_oa_format = I915_OA_FORMAT_A32u40_A4u32_B8_C8;
undefined_a_counters = gen8_undefined_a_counters;
+ read_report_ticks = gen8_read_report_ticks;
if (IS_BROADWELL(devid)) {
test_set_uuid = "d6de6f55-e526-4f79-a6a6-d7315c09044e";
@@ -945,30 +971,28 @@ test_oa_formats(void)
time_delta = timebase_scale(oa_report1[1] - oa_report0[1]);
igt_assert_neq(time_delta, 0);
- /* C2 corresponds to a clock counter for the Haswell render
- * basic metric set but it's not included in all of the
- * formats.
+ /* As a special case we have to consider that on Haswell we
+ * can't explicitly derive a clock delta for all OA report
+ * formats...
*/
- if (oa_formats[i].n_c) {
+ if (IS_HASWELL(devid) && oa_formats[i].n_c == 0) {
+ /* Assume running at max freq for sake of
+ * below sanity check on counters... */
+ clock_delta = (gt_max_freq_mhz *
+ (uint64_t)time_delta) / 1000;
+ } else {
+ uint32_t ticks0 = read_report_ticks(oa_report0, i);
+ uint32_t ticks1 = read_report_ticks(oa_report1, i);
uint64_t freq;
- /* The first report might have a clock count of zero
- * but we wouldn't expect that in the second report...
- */
- igt_assert_neq(c1[2], 0);
+ clock_delta = ticks1 - ticks0;
- clock_delta = c1[2] - c0[2];
igt_assert_neq(clock_delta, 0);
freq = ((uint64_t)clock_delta * 1000) / time_delta;
igt_debug("freq = %"PRIu64"\n", freq);
igt_assert(freq <= gt_max_freq_mhz);
- } else {
- /* Assume running at max freq for sake of
- * below sanity check on counters... */
- clock_delta = (gt_max_freq_mhz *
- (uint64_t)time_delta) / 1000;
}
igt_debug("clock delta = %"PRIu32"\n", clock_delta);
@@ -1035,7 +1059,6 @@ test_oa_exponents(int gt_freq_mhz)
uint32_t timestamp_delta;
uint32_t oa_report0[64];
uint32_t oa_report1[64];
- uint32_t *c0, *c1;
uint32_t time_delta;
uint32_t clock_delta;
uint32_t freq;
@@ -1051,7 +1074,7 @@ test_oa_exponents(int gt_freq_mhz)
for (int j = 0; n_tested < 10 && j < 100; j++) {
int gt_freq_mhz_0, gt_freq_mhz_1;
- int c_off;
+ uint32_t ticks0, ticks1;
gt_freq_mhz_0 = sysfs_read("gt_act_freq_mhz");
@@ -1087,15 +1110,9 @@ test_oa_exponents(int gt_freq_mhz)
igt_assert_eq(timestamp_delta, expected_timestamp_delta);
- /* NB: for the render basic metric set opened above by
- * open_and_read_2_oa_reports(), the C2 counter is
- * configured as the gpu clock counter...
- */
- c_off = oa_formats[test_oa_format].c_off;
- igt_assert(c_off);
- c0 = (uint32_t *)(((uint8_t *)oa_report0) + c_off);
- c1 = (uint32_t *)(((uint8_t *)oa_report1) + c_off);
- clock_delta = c1[2] - c0[2];
+ ticks0 = read_report_ticks(oa_report0, test_oa_format);
+ ticks1 = read_report_ticks(oa_report1, test_oa_format);
+ clock_delta = ticks1 - ticks0;
time_delta = timebase_scale(timestamp_delta);
--
2.11.0
More information about the Intel-gfx
mailing list