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>
This commit is contained in:
Thomas Wood
2014-05-16 17:22:46 +01:00
parent 9b6ae3cb6f
commit 37ffb22d3c
4 changed files with 163 additions and 0 deletions
+57
View File
@@ -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);
+16
View File
@@ -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);