summaryrefslogtreecommitdiff
path: root/tests/i915/perf.c
diff options
context:
space:
mode:
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>2020-11-25 13:00:29 +0200
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>2020-11-26 13:14:06 +0200
commitff519fd84618558c550bec07e7cc4b2c682f86ff (patch)
tree3198955fdf48fd3c540d545f1d08aab559ae810f /tests/i915/perf.c
parent95dfacba85e57a049048561bb2690a13b1f847d7 (diff)
tests/i915/perf: deal with 0 delta reports
More thorough testing shows that it is possible to get a timer report followed by a context-switch report with the same timestamp. v2: Add reason helper (Lionel) Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Diffstat (limited to 'tests/i915/perf.c')
-rw-r--r--tests/i915/perf.c116
1 files changed, 67 insertions, 49 deletions
diff --git a/tests/i915/perf.c b/tests/i915/perf.c
index 2fbea0f0..51960b43 100644
--- a/tests/i915/perf.c
+++ b/tests/i915/perf.c
@@ -384,11 +384,17 @@ gen8_read_report_clock_ratios(const uint32_t *report,
*unslice_freq_mhz = (unslice_freq * 16666) / 1000;
}
+static uint32_t
+gen8_report_reason(const uint32_t *report)
+{
+ return ((report[0] >> OAREPORT_REASON_SHIFT) &
+ OAREPORT_REASON_MASK);
+}
+
static const char *
gen8_read_report_reason(const uint32_t *report)
{
- uint32_t reason = ((report[0] >> OAREPORT_REASON_SHIFT) &
- OAREPORT_REASON_MASK);
+ uint32_t reason = gen8_report_reason(report);
if (reason & (1<<0))
return "timer";
@@ -467,8 +473,7 @@ oa_report_is_periodic(uint32_t oa_exponent, const uint32_t *report)
if ((report[1] & oa_exponent_mask) == (1 << oa_exponent))
return true;
} else {
- if ((report[0] >> OAREPORT_REASON_SHIFT) &
- OAREPORT_REASON_TIMER)
+ if (gen8_report_reason(report) & OAREPORT_REASON_TIMER)
return true;
}
@@ -775,17 +780,24 @@ gen8_sanity_check_test_oa_reports(const uint32_t *oa_report0,
format.b_off);
uint32_t *rpt1_b = (uint32_t *)(((uint8_t *)oa_report1) +
format.b_off);
+ uint32_t report_reason0, report_reason1;
uint32_t b;
uint32_t ref;
+ igt_debug("report type: %s->%s\n",
+ gen8_read_report_reason(oa_report0),
+ gen8_read_report_reason(oa_report1));
- igt_assert_neq(time_delta, 0);
- igt_assert_neq(clock_delta, 0);
-
- freq = ((uint64_t)clock_delta * 1000) / time_delta;
+ freq = time_delta ? ((uint64_t)clock_delta * 1000) / time_delta : 0;
igt_debug("freq = %"PRIu64"\n", freq);
- igt_assert(freq <= gt_max_freq_mhz);
+ /* Either we have 2 reports back to back with the same
+ * timestamp and those should have different reason, or we
+ * were able to compute a frequency because the timestamps are
+ * different.
+ */
+ igt_assert(freq || (gen8_report_reason(oa_report0) !=
+ gen8_report_reason(oa_report1)));
igt_debug("clock delta = %"PRIu32"\n", clock_delta);
@@ -823,42 +835,50 @@ gen8_sanity_check_test_oa_reports(const uint32_t *oa_report0,
* multiple of the gpu clock
*/
if (format.n_b) {
- b = rpt1_b[0] - rpt0_b[0];
- igt_debug("B0: delta = %"PRIu32"\n", b);
- igt_assert_eq(b, 0);
-
- b = rpt1_b[1] - rpt0_b[1];
- igt_debug("B1: delta = %"PRIu32"\n", b);
- igt_assert_eq(b, clock_delta);
-
- b = rpt1_b[2] - rpt0_b[2];
- igt_debug("B2: delta = %"PRIu32"\n", b);
- igt_assert_eq(b, clock_delta);
-
- b = rpt1_b[3] - rpt0_b[3];
- ref = clock_delta / 2;
- igt_debug("B3: delta = %"PRIu32"\n", b);
- igt_assert(b >= ref - 1 && b <= ref + 1);
-
- b = rpt1_b[4] - rpt0_b[4];
- ref = clock_delta / 3;
- igt_debug("B4: delta = %"PRIu32"\n", b);
- igt_assert(b >= ref - 1 && b <= ref + 1);
-
- b = rpt1_b[5] - rpt0_b[5];
- ref = clock_delta / 3;
- igt_debug("B5: delta = %"PRIu32"\n", b);
- igt_assert(b >= ref - 1 && b <= ref + 1);
-
- b = rpt1_b[6] - rpt0_b[6];
- ref = clock_delta / 6;
- igt_debug("B6: delta = %"PRIu32"\n", b);
- igt_assert(b >= ref - 1 && b <= ref + 1);
-
- b = rpt1_b[7] - rpt0_b[7];
- ref = clock_delta * 2 / 3;
- igt_debug("B7: delta = %"PRIu32"\n", b);
- igt_assert(b >= ref - 1 && b <= ref + 1);
+ if (clock_delta > 0) {
+ b = rpt1_b[0] - rpt0_b[0];
+ igt_debug("B0: delta = %"PRIu32"\n", b);
+ igt_assert_eq(b, 0);
+
+ b = rpt1_b[1] - rpt0_b[1];
+ igt_debug("B1: delta = %"PRIu32"\n", b);
+ igt_assert_eq(b, clock_delta);
+
+ b = rpt1_b[2] - rpt0_b[2];
+ igt_debug("B2: delta = %"PRIu32"\n", b);
+ igt_assert_eq(b, clock_delta);
+
+ b = rpt1_b[3] - rpt0_b[3];
+ ref = clock_delta / 2;
+ igt_debug("B3: delta = %"PRIu32"\n", b);
+ igt_assert(b >= ref - 1 && b <= ref + 1);
+
+ b = rpt1_b[4] - rpt0_b[4];
+ ref = clock_delta / 3;
+ igt_debug("B4: delta = %"PRIu32"\n", b);
+ igt_assert(b >= ref - 1 && b <= ref + 1);
+
+ b = rpt1_b[5] - rpt0_b[5];
+ ref = clock_delta / 3;
+ igt_debug("B5: delta = %"PRIu32"\n", b);
+ igt_assert(b >= ref - 1 && b <= ref + 1);
+
+ b = rpt1_b[6] - rpt0_b[6];
+ ref = clock_delta / 6;
+ igt_debug("B6: delta = %"PRIu32"\n", b);
+ igt_assert(b >= ref - 1 && b <= ref + 1);
+
+ b = rpt1_b[7] - rpt0_b[7];
+ ref = clock_delta * 2 / 3;
+ igt_debug("B7: delta = %"PRIu32"\n", b);
+ igt_assert(b >= ref - 1 && b <= ref + 1);
+ } else {
+ for (int j = 0; j < format.n_b; j++) {
+ b = rpt1_b[j] - rpt0_b[j];
+ igt_debug("B%i: delta = %"PRIu32"\n", j, b);
+ igt_assert_eq(b, 0);
+ }
+ }
}
for (int j = 0; j < format.n_c; j++) {
@@ -2344,8 +2364,7 @@ num_valid_reports_captured(struct drm_i915_perf_open_param *param,
if (header->type == DRM_I915_PERF_RECORD_SAMPLE) {
uint32_t *report = (void *)(header + 1);
- if ((report[0] >> OAREPORT_REASON_SHIFT) &
- OAREPORT_REASON_TIMER)
+ if (gen8_report_reason(report) & OAREPORT_REASON_TIMER)
num_reports++;
}
}
@@ -3610,8 +3629,7 @@ gen8_test_single_ctx_render_target_writes_a_counter(void)
lprev = report;
/* Print out reason for the report. */
- reason = ((report[0] >> OAREPORT_REASON_SHIFT) &
- OAREPORT_REASON_MASK);
+ reason = gen8_report_reason(report);
if (reason & OAREPORT_REASON_CTX_SWITCH) {
report_reason = "ctx-load";