diff mbox

[i-g-t,3/4] lib: add igt_enable_connectors and igt_reset_connectors

Message ID 1403099053-31243-4-git-send-email-thomas.wood@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Thomas Wood June 18, 2014, 1:44 p.m. UTC
igt_enable_connectors forces connectors to be enabled where doing so is
known to work well. igt_reset_connectors resets the force state on all
connectors.
---
 lib/igt_kms.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_kms.h |  3 +++
 2 files changed, 73 insertions(+)
diff mbox

Patch

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 86dec51..3fcb0da 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -1148,3 +1148,73 @@  void igt_wait_for_vblank(int drm_fd, enum pipe pipe)
 
 	igt_assert(drmWaitVBlank(drm_fd, &wait_vbl) == 0);
 }
+
+static void reset_connectors_at_exit(int sig)
+{
+	igt_reset_connectors();
+}
+
+/**
+ * igt_enable_connectors:
+ *
+ * Force connectors to be enabled where this is known to work well. Use
+ * #igt_reset_connectors to revert the changes.
+ *
+ * An exit handler is installed to ensure connectors are reset when the test
+ * exits.
+ */
+void igt_enable_connectors(void)
+{
+	drmModeRes *res;
+	drmModeConnector *c;
+	int drm_fd;
+
+	drm_fd = drm_open_any();
+
+	res = drmModeGetResources(drm_fd);
+
+	for (int i = 0; i < res->count_connectors; i++) {
+
+		c = drmModeGetConnector(drm_fd, res->connectors[i]);
+
+		/* don't attempt to force connectors that are already connected
+		 */
+		if (c->connection == DRM_MODE_CONNECTED)
+			continue;
+
+		/* just enable VGA for now */
+		if (c->connector_type == DRM_MODE_CONNECTOR_VGA)
+			kmstest_force_connector(drm_fd, c, FORCE_CONNECTOR_ON);
+
+		drmModeFreeConnector(c);
+	}
+	close(drm_fd);
+
+	igt_install_exit_handler(reset_connectors_at_exit);
+}
+
+/**
+ * igt_reset_connectors:
+ *
+ * Remove any forced state from the connectors.
+ */
+void igt_reset_connectors(void)
+{
+	drmModeRes *res;
+	drmModeConnector *c;
+	int drm_fd;
+
+	drm_fd = drm_open_any();
+	res = drmModeGetResources(drm_fd);
+
+	for (int i = 0; i < res->count_connectors; i++) {
+
+		c = drmModeGetConnector(drm_fd, res->connectors[i]);
+
+		kmstest_force_connector(drm_fd, c, FORCE_CONNECTOR_UNSPECIFIED);
+
+		drmModeFreeConnector(c);
+	}
+
+	close(drm_fd);
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 4cf74e8..d9b2c64 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -217,5 +217,8 @@  void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
 
 #define IGT_FIXED(i,f)	((i) << 16 | (f))
 
+void igt_enable_connectors(void);
+void igt_reset_connectors(void);
+
 #endif /* __IGT_KMS_H__ */