diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2019-12-03 16:42:22 +0200 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2019-12-04 19:01:26 +0200 |
commit | ed6539ced33e546c25fc34f406b24d3be7c42684 (patch) | |
tree | 21c87106f2ec9670059dcc598ec5a2f820e2734d /lib/igt_kms.c | |
parent | 9bb52ff1bc170897dbc8948282e076017ea3dfd2 (diff) |
lib/igt_kms: Rework forced connector handling
Let's use igt_connector_sysfs_open() for connector forcing.
Since we're getting rid of the allcoated connector 'path' we'll
change the tracking to use the connector type and type_id,
and we'll chop things up a bit to make the code easier to follow.
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Diffstat (limited to 'lib/igt_kms.c')
-rw-r--r-- | lib/igt_kms.c | 150 |
1 files changed, 96 insertions, 54 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 00373a6c..d20daaad 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -84,8 +84,12 @@ /* list of connectors that need resetting on exit */ #define MAX_CONNECTORS 32 -static char *forced_connectors[MAX_CONNECTORS + 1]; -static int forced_connectors_device[MAX_CONNECTORS + 1]; +static struct { + uint32_t connector_type; + uint32_t connector_type_id; + int idx; + int dir; +} forced_connectors[MAX_CONNECTORS + 1]; /** * igt_kms_get_base_edid: @@ -999,6 +1003,92 @@ int igt_connector_sysfs_open(int drm_fd, return conn_dir; } +static bool connector_is_forced(int idx, drmModeConnector *connector) +{ + igt_assert(connector->connector_type != 0); + + for (int i = 0; forced_connectors[i].connector_type; i++) { + if (forced_connectors[i].idx == idx && + forced_connectors[i].connector_type == connector->connector_type && + forced_connectors[i].connector_type_id == connector->connector_type_id) + return true; + } + + return false; +} + +static int forced_connector_free_index(void) +{ + int i; + + for (i = 0; forced_connectors[i].connector_type; i++) + ; + + return i < ARRAY_SIZE(forced_connectors) ? i : -1; +} + +static bool force_connector(int drm_fd, + drmModeConnector *connector, + const char *value) +{ + char name[80]; + int i, idx, dir; + + idx = igt_device_get_card_index(drm_fd); + if (idx < 0 || idx > 63) + return false; + + kmstest_connector_dirname(idx, connector->connector_type, + connector->connector_type_id, + name, sizeof(name)); + + dir = igt_connector_sysfs_open(drm_fd, connector); + if (dir < 0) + return false; + + if (!igt_sysfs_set(dir, "status", value)) { + close(dir); + return false; + } + + igt_debug("Connector %s is now forced %s\n", name, value); + + /* already tracked? */ + if (connector_is_forced(idx, connector)) { + close(dir); + return true; + } + + i = forced_connector_free_index(); + if (i < 0) { + igt_warn("Connector limit reached, %s will not be reset\n", name); + close(dir); + return true; + } + + forced_connectors[i].idx = idx; + forced_connectors[i].connector_type = connector->connector_type; + forced_connectors[i].connector_type_id = connector->connector_type_id; + forced_connectors[i].dir = dir; + + return true; +} + +static void dump_forced_connectors(void) +{ + char name[80]; + + igt_debug("Current forced connectors:\n"); + + for (int i = 0; forced_connectors[i].connector_type; i++) { + kmstest_connector_dirname(forced_connectors[i].idx, + forced_connectors[i].connector_type, + forced_connectors[i].connector_type_id, + name, sizeof(name)); + igt_debug("\t%s\n", name); + } +} + /** * kmstest_force_connector: * @fd: drm file descriptor @@ -1012,10 +1102,8 @@ int igt_connector_sysfs_open(int drm_fd, bool kmstest_force_connector(int drm_fd, drmModeConnector *connector, enum kmstest_force_connector_state state) { - char *path, **tmp; const char *value; drmModeConnector *temp; - int len, dir, idx; /* * Forcing DP connectors doesn't currently work, so @@ -1042,54 +1130,10 @@ bool kmstest_force_connector(int drm_fd, drmModeConnector *connector, break; } - dir = igt_sysfs_open(drm_fd); - if (dir < 0) - return false; - - idx = igt_device_get_card_index(drm_fd); - if (idx < 0 || idx > 63) - return false; - - if (asprintf(&path, "card%d-%s-%d/status", - idx, - kmstest_connector_type_str(connector->connector_type), - connector->connector_type_id) < 0) { - close(dir); - return false; - } - - if (!igt_sysfs_set(dir, path, value)) { - close(dir); + if (!force_connector(drm_fd, connector, value)) return false; - } - for (len = 0, tmp = forced_connectors; *tmp; tmp++) { - /* check the connector is not already present */ - if (strcmp(*tmp, path) == 0) { - len = -1; - break; - } - len++; - } - - if (len != -1 && len < MAX_CONNECTORS) { - forced_connectors[len] = path; - forced_connectors_device[len] = dir; - } else { - close(dir); - } - - if (len >= MAX_CONNECTORS) - igt_warn("Connector limit reached, %s will not be reset\n", - path); - - igt_debug("Connector %s is now forced %s\n", path, value); - igt_debug("Current forced connectors:\n"); - tmp = forced_connectors; - while (*tmp) { - igt_debug("\t%s\n", *tmp); - tmp++; - } + dump_forced_connectors(); igt_install_exit_handler(reset_connectors_at_exit); @@ -4069,10 +4113,8 @@ void igt_reset_connectors(void) { /* reset the connectors stored in forced_connectors, avoiding any * functions that are not safe to call in signal handlers */ - for (int i = 0; forced_connectors[i]; i++) - igt_sysfs_set(forced_connectors_device[i], - forced_connectors[i], - "detect"); + for (int i = 0; i < forced_connectors[i].connector_type; i++) + igt_sysfs_set(forced_connectors[i].dir, "status", "detect"); } /** |