summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorThomas Wood <thomas.wood@intel.com>2014-05-16 17:22:46 +0100
committerThomas Wood <thomas.wood@intel.com>2014-07-11 11:47:46 +0100
commit37ffb22d3cf684a6443d68698716dbd8428f495a (patch)
tree548d0aab6802455cb69d4259e6bf4efd766e8d8f /lib
parent9b6ae3cb6f7894b7c3e9eb89da5d89fef7f9ba91 (diff)
lib: add function to change connector states
Add an API function and a test program to force a particular state on a connector. v2: mask the correct part of the minor number to get the card number (Chris Wilson) Signed-off-by: Thomas Wood <thomas.wood@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/igt_kms.c57
-rw-r--r--lib/igt_kms.h16
2 files changed, 73 insertions, 0 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 4a8c394d..87dd6413 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -398,6 +398,63 @@ err1:
return -1;
}
+static int get_card_number(int fd)
+{
+ struct stat buf;
+
+ /* find the minor number of the device */
+ fstat(fd, &buf);
+
+ return minor(buf.st_rdev) & 0x3f;
+}
+
+/**
+ * kmstest_force_connector:
+ * @fd: drm file descriptor
+ * @connector: connector
+ * @state: state to force on @connector
+ *
+ * Force the specified state on the specified connector.
+ */
+void kmstest_force_connector(int drm_fd, drmModeConnector *connector, enum
+ kmstest_force_connector_state state)
+{
+ char *path;
+ const char *value;
+ int debugfs_fd, ret;
+
+ switch (state) {
+ case FORCE_CONNECTOR_ON:
+ value = "on";
+ break;
+ case FORCE_CONNECTOR_DIGITAL:
+ value = "digital";
+ break;
+ case FORCE_CONNECTOR_OFF:
+ value = "off";
+ break;
+
+ default:
+ case FORCE_CONNECTOR_UNSPECIFIED:
+ value = "unspecified";
+ break;
+ }
+
+ asprintf(&path, "/sys/kernel/debug/dri/%d/%s-%d/force",
+ get_card_number(drm_fd),
+ kmstest_connector_type_str(connector->connector_type),
+ connector->connector_type_id);
+ debugfs_fd = open(path, O_WRONLY | O_TRUNC);
+ free(path);
+
+ igt_assert(debugfs_fd != -1);
+
+ ret = write(debugfs_fd, value, strlen(value));
+ close(debugfs_fd);
+
+ igt_assert(ret != -1);
+}
+
void kmstest_free_connector_config(struct kmstest_connector_config *config)
{
drmModeFreeCrtc(config->crtc);
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index a079fc24..072e79e1 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -82,11 +82,27 @@ struct kmstest_connector_config {
int pipe;
};
+/**
+ * kmstest_force_connector_state:
+ * @FORCE_CONNECTOR_UNSPECIFIED: Unspecified
+ * @FORCE_CONNECTOR_ON: On
+ * @FORCE_CONNECTOR_DIGITAL: Digital
+ * @FORCE_CONNECTOR_OFF: Off
+ */
+enum kmstest_force_connector_state {
+ FORCE_CONNECTOR_UNSPECIFIED,
+ FORCE_CONNECTOR_ON,
+ FORCE_CONNECTOR_DIGITAL,
+ FORCE_CONNECTOR_OFF
+};
+
int kmstest_get_connector_default_mode(int drm_fd, drmModeConnector *connector,
drmModeModeInfo *mode);
int kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
unsigned long crtc_idx_mask,
struct kmstest_connector_config *config);
+void kmstest_force_connector(int fd, drmModeConnector *connector,
+ enum kmstest_force_connector_state state);
void kmstest_free_connector_config(struct kmstest_connector_config *config);
void kmstest_dump_mode(drmModeModeInfo *mode);