[Intel-gfx] [IGT PATCH] tests/kms_setmode: Add tests when not stealing encoders on same crtc.

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Tue Feb 23 15:23:26 UTC 2016


Excercise connector stealing harder. There is a border case in atomic currently where
encoder stealing is not prevented on the same crtc when the encoder is not reassigned.

The following testcase excercises that path and causes a OOPS on my system with nightly.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
The patches from drm/atomic: Fix encoder stealing fixes it, but I'll resend those soon,
I came up with another approach that's cleaner.

diff --git a/tests/kms_setmode.c b/tests/kms_setmode.c
index 531ce8391fa7..6afe00c126fe 100644
--- a/tests/kms_setmode.c
+++ b/tests/kms_setmode.c
@@ -70,6 +70,7 @@ enum test_flags {
 	TEST_CLONE			= 0x02,
 	TEST_SINGLE_CRTC_CLONE		= 0x04,
 	TEST_EXCLUSIVE_CRTC_CLONE	= 0x08,
+	TEST_STEALING			= 0x10,
 };
 
 struct test_config {
@@ -380,6 +381,34 @@ static uint32_t *get_connector_ids(struct crtc_config *crtc)
 	return ids;
 }
 
+static int test_stealing(int drm_fd, const struct crtc_config *crtc, uint32_t *ids)
+{
+	int i, ret = 0;
+
+	if (!crtc->connector_count)
+		return drmModeSetCrtc(drm_fd, crtc->crtc_id,
+				     crtc->fb_info.fb_id, 0, 0,
+				     ids, crtc->connector_count, &crtc->mode);
+
+	for (i = 0; i < crtc->connector_count; ++i) {
+		ret = drmModeSetCrtc(drm_fd, crtc->crtc_id,
+				     crtc->fb_info.fb_id, 0, 0,
+				     &ids[i], 1, &crtc->mode);
+
+		igt_assert_eq(ret, 0);
+
+		ret = drmModeSetCrtc(drm_fd, crtc->crtc_id,
+				     crtc->fb_info.fb_id, 0, 0,
+				     ids, crtc->connector_count, &crtc->mode);
+
+		/* This should fail with -EINVAL */
+		if (!ret)
+			return 0;
+	}
+
+	return ret;
+}
+
 static void test_crtc_config(const struct test_config *tconf,
 			     struct crtc_config *crtcs, int crtc_count)
 {
@@ -422,9 +451,13 @@ static void test_crtc_config(const struct test_config *tconf,
 		paint_fb(&crtc->fb_info, tconf->name, crtc_strs, crtc_count, i);
 
 		ids = get_connector_ids(crtc);
-		ret = drmModeSetCrtc(drm_fd, crtc->crtc_id,
-				     crtc->fb_info.fb_id, 0, 0, ids,
-				     crtc->connector_count, &crtc->mode);
+		if (tconf->flags & TEST_STEALING)
+			ret = test_stealing(drm_fd, crtc, ids);
+		else
+			ret = drmModeSetCrtc(drm_fd, crtc->crtc_id,
+					     crtc->fb_info.fb_id, 0, 0, ids,
+					     crtc->connector_count, &crtc->mode);
+
 		free(ids);
 
 		if (ret < 0) {
@@ -623,6 +656,9 @@ static void test_combinations(const struct test_config *tconf,
 	struct connector_config *cconfs;
 	int i;
 
+	if (connector_count > 2 && (tconf->flags & TEST_STEALING))
+		return;
+
 	get_combinations(tconf->resources->count_connectors, connector_count,
 			 false, &connector_combs);
 	get_combinations(tconf->resources->count_crtcs, connector_count,
@@ -700,6 +736,8 @@ int main(int argc, char **argv)
 					"invalid-clone-exclusive-crtc" },
 		{ TEST_CLONE | TEST_EXCLUSIVE_CRTC_CLONE,
 					"clone-exclusive-crtc" },
+		{ TEST_INVALID | TEST_CLONE | TEST_SINGLE_CRTC_CLONE | TEST_STEALING,
+					"invalid-clone-single-crtc-stealing" }
 	};
 	const char *help_str =
 	       "  -d\t\tDon't run any test, only print what would be done. (still needs DRM access)\n"



More information about the Intel-gfx mailing list