[PATCH i-g-t v1 2/2] tests/kms_cursor_legacy: Improve timing accuracy in legacy cursor test

Naladala Ramanaidu ramanaidu.naladala at intel.com
Mon Aug 18 21:44:31 UTC 2025


This measured time is then used to estimate the number of frames
delayed, which is factored into the validation of expected display
behavior. The adjustment accounts for timing tolerances and helps
reduce false negatives in simulation environments.

Signed-off-by: Naladala Ramanaidu <ramanaidu.naladala at intel.com>
---
 tests/kms_cursor_legacy.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/tests/kms_cursor_legacy.c b/tests/kms_cursor_legacy.c
index 9f6e644e1..7fda490ea 100644
--- a/tests/kms_cursor_legacy.c
+++ b/tests/kms_cursor_legacy.c
@@ -238,6 +238,7 @@
 IGT_TEST_DESCRIPTION("Stress legacy cursor ioctl");
 
 igt_pipe_crc_t *pipe_crc;
+uint32_t vblank_tolerance;
 
 static int try_commit(igt_display_t *display)
 {
@@ -1587,6 +1588,10 @@ static void flip_vs_cursor_crc(igt_display_t *display, bool atomic)
 	igt_crc_t crcs[3];
 	igt_output_t *output;
 	igt_plane_t *cursor;
+	struct timespec start, end;
+	double frame_time;
+	double elapsed_time_ms;
+	int delay_frames;
 
 	if (atomic)
 		igt_require(display->is_atomic);
@@ -1594,6 +1599,9 @@ static void flip_vs_cursor_crc(igt_display_t *display, bool atomic)
 	pipe = find_connected_pipe(display, false, &output);
 	igt_require(output);
 
+	vblank_tolerance = get_vblank_seq_diff(display->drm_fd, pipe);
+	frame_time = (1.0 / (double)igt_output_get_mode(output)->vrefresh) * 1000;
+
 	igt_info("Using pipe %s & %s\n",
 		 kmstest_pipe_name(pipe), igt_output_name(output));
 
@@ -1628,10 +1636,18 @@ static void flip_vs_cursor_crc(igt_display_t *display, bool atomic)
 		igt_assert_eq(kmstest_get_vblank(display->drm_fd, pipe, 0), vblank_start);
 
 		igt_set_timeout(1, "Stuck page flip");
+		clock_gettime(CLOCK_MONOTONIC, &start);
 		igt_ignore_warn(read(display->drm_fd, &vbl, sizeof(vbl)));
+		clock_gettime(CLOCK_MONOTONIC, &end);
 		igt_reset_timeout();
 
-		igt_assert_eq(kmstest_get_vblank(display->drm_fd, pipe, 0), vblank_start + 1);
+		elapsed_time_ms = ((end.tv_sec - start.tv_sec) * 1e3) +
+				   ((end.tv_nsec - start.tv_nsec) / 1e6);
+		delay_frames = (elapsed_time_ms / frame_time) - 1;
+
+		igt_assert_eq(kmstest_get_vblank(display->drm_fd, pipe, 0),
+			      vblank_start + (1 * vblank_tolerance) +
+			      (delay_frames * vblank_tolerance));
 
 		igt_pipe_crc_collect_crc(pipe_crc, &crcs[2]);
 
-- 
2.43.0



More information about the igt-dev mailing list