Commit 4919d1fd authored by Maarten Lankhorst's avatar Maarten Lankhorst

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: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Daniel Vetter's avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 562fab7e
......@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment