From 2eb768b851dee3ead2563829c8f798ed89258d19 Mon Sep 17 00:00:00 2001 From: Daniel Vetter Date: Thu, 28 Feb 2019 15:19:13 +0100 Subject: tests/kms_lease: test implicit primary plane usage in page_flip ioctl We need to make sure that legacy ioctls don't operate on a lease if the lesse doesn't have access to the implicitly used primary plane. Current kernels fail this. Cc: Keith Packard Reviewed-by: Boris Brezillon Signed-off-by: Daniel Vetter --- tests/kms_lease.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'tests/kms_lease.c') diff --git a/tests/kms_lease.c b/tests/kms_lease.c index 659d6549..74228589 100644 --- a/tests/kms_lease.c +++ b/tests/kms_lease.c @@ -312,6 +312,67 @@ static void simple_lease(data_t *data) terminate_lease(&lease); } +static void page_flip_implicit_plane(data_t *data) +{ + uint32_t object_ids[3]; + struct local_drm_mode_create_lease mcl; + drmModePlaneRes *plane_resources; + uint32_t wrong_plane_id = 0; + int i; + + /* find a plane which isn't the primary one for us */ + plane_resources = drmModeGetPlaneResources(data->master.fd); + for (i = 0; i < plane_resources->count_planes; i++) { + if (plane_resources->planes[i] != data->plane_id) { + wrong_plane_id = plane_resources->planes[i]; + break; + } + } + drmModeFreePlaneResources(plane_resources); + igt_require(wrong_plane_id); + + mcl.object_ids = (uint64_t) (uintptr_t) &object_ids[0]; + mcl.object_count = 0; + mcl.flags = 0; + + object_ids[mcl.object_count++] = data->connector_id; + object_ids[mcl.object_count++] = data->crtc_id; + + drmSetClientCap(data->master.fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0); + do_or_die(create_lease(data->master.fd, &mcl)); + drmSetClientCap(data->master.fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); + + /* Set a mode on the leased output */ + igt_assert_eq(0, prepare_crtc(&data->master, data->connector_id, data->crtc_id)); + + /* sanity check */ + do_or_die(drmModePageFlip(data->master.fd, data->crtc_id, + data->master.primary_fb.fb_id, + 0, NULL)); + igt_wait_for_vblank_count(data->master.fd, + crtc_id_to_pipe(&data->master.display, data->crtc_id), + 1); + do_or_die(drmModePageFlip(mcl.fd, data->crtc_id, + data->master.primary_fb.fb_id, + 0, NULL)); + close(mcl.fd); + + object_ids[mcl.object_count++] = wrong_plane_id; + do_or_die(create_lease(data->master.fd, &mcl)); + + igt_wait_for_vblank_count(data->master.fd, + crtc_id_to_pipe(&data->master.display, data->crtc_id), + 1); + igt_assert_eq(drmModePageFlip(mcl.fd, data->crtc_id, + data->master.primary_fb.fb_id, + 0, NULL), + -EACCES); + close(mcl.fd); + + cleanup_crtc(&data->master, + connector_id_to_output(&data->master.display, data->connector_id)); +} + /* Test listing lessees */ static void lessee_list(data_t *data) { @@ -1025,6 +1086,7 @@ igt_main { "lease_invalid_connector", lease_invalid_connector }, { "lease_invalid_crtc", lease_invalid_crtc }, { "lease_invalid_plane", lease_invalid_plane }, + { "page_flip_implicit_plane", page_flip_implicit_plane }, { } }, *f; -- cgit v1.2.3