diff options
author | Thomas Wood <thomas.wood@intel.com> | 2014-05-16 17:22:46 +0100 |
---|---|---|
committer | Thomas Wood <thomas.wood@intel.com> | 2014-07-11 11:47:46 +0100 |
commit | 37ffb22d3cf684a6443d68698716dbd8428f495a (patch) | |
tree | 548d0aab6802455cb69d4259e6bf4efd766e8d8f /lib | |
parent | 9b6ae3cb6f7894b7c3e9eb89da5d89fef7f9ba91 (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.c | 57 | ||||
-rw-r--r-- | lib/igt_kms.h | 16 |
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); |