summaryrefslogtreecommitdiff
path: root/tests/kms_vblank.c
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2017-11-22 14:10:54 +0100
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2017-12-08 11:02:48 +0100
commit4919d1fd78a7b70b18fc2175ead89ff3f09a71b7 (patch)
treee8603587ad426190a93dc084c02ae2e4dca8cc2e /tests/kms_vblank.c
parent562fab7edc56affd644f1adb747bb6f98b1145ec (diff)
tests/kms_vblank: Add test to ensure DRM_CAP_CRTC_IN_VBLANK_EVENT works correctly
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>
Diffstat (limited to 'tests/kms_vblank.c')
-rw-r--r--tests/kms_vblank.c60
1 files changed, 56 insertions, 4 deletions
diff --git a/tests/kms_vblank.c b/tests/kms_vblank.c
index b7d570cc..97ccacc4 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)