summaryrefslogtreecommitdiff
path: root/tests/kms_atomic.c
diff options
context:
space:
mode:
authorMika Kahola <mika.kahola@intel.com>2017-03-08 16:59:19 +0200
committerMika Kahola <mika.kahola@intel.com>2017-03-20 12:35:16 +0200
commit5ae60a48d18f273b7c7d1a5dfca80eb4d61a0cce (patch)
treedb5ee5345eee98f95ca68e041746b9887f610234 /tests/kms_atomic.c
parent0aef486061ff33742087f2432314d5008002b1f2 (diff)
tests/kms_atomic: test that TEST_ONLY does not clobber state
We need to make sure that TEST_ONLY really only touches the free-standing state objects and nothing else. Test approach here is the following: - Create a config and submit it with TEST_ONLY. - do dpms off/on cycle with the current config to reconfigure hw - read back all legacy state to make sure none of that is clobbered v2: use ATOMIC_RELAX_NONE instead of CRTC_RELAX_MODE when checking crtc or plane state (Maarten) rename subtest and function that executes this test (Maarten) Signed-off-by: Mika Kahola <mika.kahola@intel.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'tests/kms_atomic.c')
-rw-r--r--tests/kms_atomic.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/tests/kms_atomic.c b/tests/kms_atomic.c
index d6273f4f..6375fede 100644
--- a/tests/kms_atomic.c
+++ b/tests/kms_atomic.c
@@ -831,6 +831,25 @@ static uint32_t plane_get_igt_format(struct kms_atomic_plane_state *plane)
return ret;
}
+static void
+set_dpms(int fd, int mode)
+{
+ int i;
+ drmModeConnector *connector;
+ uint32_t id;
+ drmModeRes *resources = drmModeGetResources(fd);
+
+ for (i = 0; i < resources->count_connectors; i++) {
+ id = resources->connectors[i];
+
+ connector = drmModeGetConnectorCurrent(fd, id);
+
+ kmstest_set_connector_dpms(fd, connector, mode);
+
+ drmModeFreeConnector(connector);
+ }
+}
+
static void plane_overlay(struct kms_atomic_crtc_state *crtc,
struct kms_atomic_plane_state *plane_old)
{
@@ -930,6 +949,57 @@ static void plane_primary(struct kms_atomic_crtc_state *crtc,
drmModeAtomicFree(req);
}
+/* test to ensure that DRM_MODE_ATOMIC_TEST_ONLY really only touches the
+ * free-standing state objects and nothing else.
+ */
+static void test_only(struct kms_atomic_crtc_state *crtc,
+ struct kms_atomic_plane_state *plane_old)
+{
+ struct drm_mode_modeinfo *mode = crtc->mode.data;
+ struct kms_atomic_plane_state plane = *plane_old;
+ uint32_t format = plane_get_igt_format(&plane);
+ drmModeAtomicReq *req = drmModeAtomicAlloc();
+ struct igt_fb fb;
+ int ret;
+
+ igt_require(format != 0);
+
+ plane.src_x = 0;
+ plane.src_y = 0;
+ plane.src_w = mode->hdisplay << 16;
+ plane.src_h = mode->vdisplay << 16;
+ plane.crtc_x = 0;
+ plane.crtc_y = 0;
+ plane.crtc_w = mode->hdisplay;
+ plane.crtc_h = mode->vdisplay;
+ plane.crtc_id = crtc->obj;
+ plane.fb_id = igt_create_pattern_fb(plane.state->desc->fd,
+ plane.crtc_w, plane.crtc_h,
+ format, I915_TILING_NONE, &fb);
+
+ drmModeAtomicSetCursor(req, 0);
+ crtc_populate_req(crtc, req);
+ plane_populate_req(&plane, req);
+ ret = drmModeAtomicCommit(crtc->state->desc->fd, req,
+ DRM_MODE_ATOMIC_TEST_ONLY, NULL);
+
+ igt_assert_eq(ret, 0);
+
+ /* go through dpms off/on cycle */
+ set_dpms(crtc->state->desc->fd, DRM_MODE_DPMS_OFF);
+ set_dpms(crtc->state->desc->fd, DRM_MODE_DPMS_ON);
+
+ /* check the state */
+ crtc_check_current_state(crtc, plane_old, ATOMIC_RELAX_NONE);
+ plane_check_current_state(plane_old, ATOMIC_RELAX_NONE);
+
+ /* Re-enable the plane through the legacy CRTC/primary-plane API, and
+ * verify through atomic. */
+ crtc_commit_legacy(crtc, plane_old, CRTC_RELAX_MODE);
+
+ drmModeAtomicFree(req);
+}
+
static void plane_cursor(struct kms_atomic_crtc_state *crtc,
struct kms_atomic_plane_state *plane_old)
{
@@ -1427,6 +1497,18 @@ igt_main
atomic_state_free(scratch);
}
+ igt_subtest("test_only") {
+ struct kms_atomic_state *scratch = atomic_state_dup(current);
+ struct kms_atomic_crtc_state *crtc = find_crtc(scratch, true);
+ struct kms_atomic_plane_state *plane =
+ find_plane(scratch, PLANE_TYPE_PRIMARY, crtc);
+
+ igt_require(crtc);
+ igt_require(plane);
+ test_only(crtc, plane);
+ atomic_state_free(scratch);
+ }
+
igt_subtest("plane_cursor_legacy") {
struct kms_atomic_state *scratch = atomic_state_dup(current);
struct kms_atomic_crtc_state *crtc = find_crtc(scratch, true);