[igt-dev] [PATCH] tests/kms_flip: Do not check for timestamp or sequences on Mediatek

Mark Yacoub markyacoub at chromium.org
Fri Dec 3 19:58:24 UTC 2021


From: Mark Yacoub <markyacoub at google.com>

[Why]
Mediatek devices have a HW issue with sending their vblank IRQ at the same time interval
everytime. The drift can be below or above the expected frame time, causing the
timestamp to drift with a relatively larger standard deviation over a large sample.

[How]
Filter out the flags TEST_CHECK_TS and TEST_VBLANK_EXPIRED_SEQ from the
tests flags, and restrict sequence and ts checks.

Tested on Jacuzzi (MT8183)

Signed-off-by: Mark Yacoub <markyacoub at chromium.org>
---
 lib/drmtest.c    |  5 +++++
 lib/drmtest.h    |  1 +
 tests/kms_flip.c | 44 ++++++++++++++++++++++++++++++++------------
 3 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 29cb3f4c..09a9a229 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -114,6 +114,11 @@ bool is_i915_device(int fd)
 	return __is_device(fd, "i915");
 }
 
+bool is_mtk_device(int fd)
+{
+	return __is_device(fd, "mediatek");
+}
+
 bool is_msm_device(int fd)
 {
 	return __is_device(fd, "msm");
diff --git a/lib/drmtest.h b/lib/drmtest.h
index a6eb60c3..b5debd44 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -103,6 +103,7 @@ void igt_require_vc4(int fd);
 
 bool is_amdgpu_device(int fd);
 bool is_i915_device(int fd);
+bool is_mtk_device(int fd);
 bool is_msm_device(int fd);
 bool is_nouveau_device(int fd);
 bool is_vc4_device(int fd);
diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index ccb085da..56addab8 100755
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -129,6 +129,15 @@ struct event_state {
 	int seq_step;
 };
 
+static bool should_skip_ts_checks() {
+	/* Mediatek devices have a HW issue with sending their vblank IRQ at the same time interval
+	 * everytime. The drift can be below or above the expected frame time, causing the
+	 * timestamp to drift with a relatively larger standard deviation over a large sample.
+	 * As it's a known issue, skip any Timestamp or Sequence checks for MTK drivers.
+	 */
+	return is_mtk_device(drm_fd);
+}
+
 static bool vblank_dependence(int flags)
 {
 	int vblank_flags = TEST_VBLANK | TEST_VBLANK_BLOCK |
@@ -761,16 +770,19 @@ static bool run_test_step(struct test_output *o, unsigned int *events)
 		start = gettime_us();
 		igt_assert(__wait_for_vblank(TEST_VBLANK_BLOCK, o->pipe, 2, 0, &reply) == 0);
 		end = gettime_us();
-		/*
-		 * we waited for two vblanks, so verify that
-		 * we were blocked for ~1-2 frames. And due
-		 * to scheduling latencies we give it an extra
-		 * half a frame or so.
-		 */
-		igt_assert_f(end - start > 0.9 * actual_frame_time(o) &&
-			     end - start < 2.6 * actual_frame_time(o),
-			     "wait for two vblanks took %lu usec (frame time %f usec)\n",
-			     end - start, mode_frame_time(o));
+
+		if (!should_skip_ts_checks()) {
+			/*
+			 * we waited for two vblanks, so verify that
+			 * we were blocked for ~1-2 frames. And due
+			 * to scheduling latencies we give it an extra
+			 * half a frame or so.
+			 */
+			igt_assert_f(end - start > 0.9 * actual_frame_time(o) &&
+							 end - start < 2.6 * actual_frame_time(o),
+						 "wait for two vblanks took %lu usec (frame time %f usec)\n",
+						 end - start, mode_frame_time(o));
+		}
 		join_vblank_wait_thread();
 	}
 
@@ -1228,8 +1240,10 @@ static bool calibrate_ts(struct test_output *o, int crtc_idx)
 
 	igt_info("Expected frametime: %.0fus; measured %.1fus +- %.3fus accuracy %.2f%%\n",
 		 expected, mean, stddev, 100 * 3 * stddev / mean);
-	/* 99.7% samples within 0.5% of the mean */
-	igt_assert(3 * stddev / mean < 0.005);
+	if (!should_skip_ts_checks())
+		/* 99.7% samples within 0.5% of the mean */
+		igt_assert(3 * stddev / mean < 0.005);
+
 	/* 84% samples within 0.5% of the expected value.
 	 * See comments in check_timings() in kms_setmode.c
 	 */
@@ -1723,6 +1737,12 @@ igt_main_args("e", NULL, help_str, opt_handler, NULL)
 		if (is_i915_device(drm_fd)) {
 			bops = buf_ops_create(drm_fd);
 		}
+
+		if (should_skip_ts_checks()) {
+			igt_info("Skipping timestamp checks\n");
+			for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+				tests[i].flags &= ~(TEST_CHECK_TS | TEST_VBLANK_EXPIRED_SEQ);
+		}
 	}
 
 	igt_describe("Tests that nonblocking reading fails correctly");
-- 
2.34.1.400.ga245620fadb-goog



More information about the igt-dev mailing list