[i-g-t,for,CI] tests/kms_vblank: Add test to ensure DRM_CAP_CRTC_IN_VBLANK_EVENT works correctly
diff mbox

Message ID 20171207094935.21445-1-maarten.lankhorst@linux.intel.com
State New
Headers show

Commit Message

Maarten Lankhorst Dec. 7, 2017, 9:49 a.m. UTC
This was implemented correctly only on the atomic ioctl before, but
it should really be working on all 3 ioctl's involved, so ensure we
always set crtc_id correctly with a testcase.

The following events are tested:
- Pageflip with event.
- Atomic commit with event.
- wait_vblank ioctl with event.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
 tests/kms_vblank.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 56 insertions(+), 4 deletions(-)

Patch
diff mbox

diff --git a/tests/kms_vblank.c b/tests/kms_vblank.c
index b7d570cc96fd..97ccacc4aab9 100644
--- a/tests/kms_vblank.c
+++ b/tests/kms_vblank.c
@@ -120,7 +120,6 @@  static void run_test(data_t *data, int fd, void (*testfunc)(data_t *, int, int))
 	igt_display_t *display = &data->display;
 	igt_output_t *output;
 	enum pipe p;
-	unsigned int valid_tests = 0;
 
 	for_each_pipe_with_valid_output(display, p, output) {
 		data->pipe = p;
@@ -161,11 +160,60 @@  static void run_test(data_t *data, int fd, void (*testfunc)(data_t *, int, int))
 
 		/* cleanup what prepare_crtc() has done */
 		cleanup_crtc(data, fd, output);
-		valid_tests++;
 	}
+}
+
+static void crtc_id_subtest(data_t *data, int fd)
+{
+	igt_display_t *display = &data->display;
+	igt_output_t *output;
+	enum pipe p;
+
+	for_each_pipe_with_valid_output(display, p, output) {
+		struct drm_event_vblank buf;
+		const uint32_t pipe_id_flag = kmstest_get_vbl_flag(p);
+		unsigned crtc_id, expected_crtc_id;
+		uint64_t val;
+		union drm_wait_vblank vbl;
+
+		crtc_id = display->pipes[p].crtc_id;
+		if (drmGetCap(display->drm_fd, DRM_CAP_CRTC_IN_VBLANK_EVENT, &val) == 0)
+			expected_crtc_id = crtc_id;
+		else
+			expected_crtc_id = 0;
+
+		data->pipe = p;
+		prepare_crtc(data, fd, output);
+
+		memset(&vbl, 0, sizeof(vbl));
+		vbl.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT;
+		vbl.request.type |= pipe_id_flag;
+		vbl.request.sequence = 1;
+		igt_assert_eq(wait_vblank(fd, &vbl), 0);
+
+		igt_assert_eq(read(fd, &buf, sizeof(buf)), sizeof(buf));
+		igt_assert_eq(buf.crtc_id, expected_crtc_id);
+
+		do_or_die(drmModePageFlip(fd, crtc_id,
+					  data->primary_fb.fb_id,
+					  DRM_MODE_PAGE_FLIP_EVENT, NULL));
+
+		igt_assert_eq(read(fd, &buf, sizeof(buf)), sizeof(buf));
+		igt_assert_eq(buf.crtc_id, expected_crtc_id);
+
+		if (display->is_atomic) {
+			igt_plane_t *primary = igt_output_get_plane(output, 0);
+
+			igt_plane_set_fb(primary, &data->primary_fb);
+			igt_display_commit_atomic(display, DRM_MODE_PAGE_FLIP_EVENT, NULL);
 
-	igt_require_f(valid_tests,
-		      "no valid crtc/connector combinations found\n");
+			igt_assert_eq(read(fd, &buf, sizeof(buf)), sizeof(buf));
+			igt_assert_eq(buf.crtc_id, expected_crtc_id);
+		}
+
+		cleanup_crtc(data, fd, output);
+		return;
+	}
 }
 
 static void accuracy(data_t *data, int fd, int nchildren)
@@ -298,8 +346,12 @@  igt_main
 		fd = drm_open_driver(DRIVER_ANY);
 		kmstest_set_vt_graphics_mode();
 		igt_display_init(&data.display, fd);
+		igt_display_require_output(&data.display);
 	}
 
+	igt_subtest("crtc-id")
+		crtc_id_subtest(&data, fd);
+
 	for (f = funcs; f->name; f++) {
 		for (m = modes; m->name; m++) {
 			if (m->flags & ~f->valid)