diff options
-rw-r--r-- | lib/igt_chamelium.c | 87 | ||||
-rw-r--r-- | lib/igt_chamelium.h | 2 | ||||
-rw-r--r-- | lib/igt_kms.c | 2 |
3 files changed, 80 insertions, 11 deletions
diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c index 28be5248..ff4644f8 100644 --- a/lib/igt_chamelium.c +++ b/lib/igt_chamelium.c @@ -2532,17 +2532,6 @@ bool chamelium_plug_all(struct chamelium *chamelium) size_t port_count; int port_ids[CHAMELIUM_MAX_PORTS]; xmlrpc_value *v; - v = __chamelium_rpc(chamelium, NULL, "Reset", "()"); - - if (v != NULL) - xmlrpc_DECREF(v); - - if (chamelium->env.fault_occurred) { - igt_debug("Chamelium RPC call failed: %s\n", - chamelium->env.fault_string); - - return false; - } port_count = chamelium_get_video_ports(chamelium, port_ids); if (port_count <= 0) @@ -2565,6 +2554,82 @@ bool chamelium_plug_all(struct chamelium *chamelium) return true; } +bool chamelium_wait_all_configured_ports_connected(struct chamelium *chamelium, int drm_fd) +{ + drmModeRes *res; + drmModeConnector *connector; + char **group_list; + char *group; + bool ret = true; + + int connectors[CHAMELIUM_MAX_PORTS]; + int connectors_count = 0; + + res = drmModeGetResources(drm_fd); + + group_list = g_key_file_get_groups(igt_key_file, NULL); + + for (int i = 0; group_list[i] != NULL; i++) { + char *map_name; + group = group_list[i]; + + if (!strstr(group, "Chamelium:")) + continue; + + igt_assert(chamelium->port_count <= CHAMELIUM_MAX_PORTS); + + map_name = group + (sizeof("Chamelium:") - 1); + + for (int j = 0; + j < res->count_connectors; + j++) { + char name[50]; + + connector = drmModeGetConnectorCurrent( + drm_fd, res->connectors[j]); + + /* We have to generate the connector name on our own */ + snprintf(name, 50, "%s-%u", + kmstest_connector_type_str(connector->connector_type), + connector->connector_type_id); + + + if (strcmp(name, map_name) == 0) { + igt_assert(connectors_count < CHAMELIUM_MAX_PORTS); + connectors[connectors_count++] = connector->connector_id; + break; + } + + drmModeFreeConnector(connector); + } + } + + drmModeFreeResources(res); + + if (connectors_count == 0) { + igt_info("No chamelium port mappping, sleeping for %d seconds " + "for the hotplug to take effect\n", + CHAMELIUM_HOTPLUG_DETECTION_DELAY); + sleep(CHAMELIUM_HOTPLUG_DETECTION_DELAY); + return true; + } + + igt_until_timeout(CHAMELIUM_HOTPLUG_DETECTION_DELAY) { + ret = true; + for (int i = 0; i < connectors_count; ++i) { + connector = drmModeGetConnector(drm_fd, connectors[i]); + if (connector->connection != DRM_MODE_CONNECTED) + ret = false; + drmModeFreeConnector(connector); + } + + if (ret) + break; + } + + return ret; +} + igt_constructor { /* Frame dumps can be large, so we need to be able to handle very large * responses diff --git a/lib/igt_chamelium.h b/lib/igt_chamelium.h index c29741b4..359f4ab3 100644 --- a/lib/igt_chamelium.h +++ b/lib/igt_chamelium.h @@ -215,5 +215,7 @@ void chamelium_destroy_frame_dump(struct chamelium_frame_dump *dump); void chamelium_destroy_audio_file(struct chamelium_audio_file *audio_file); void chamelium_infoframe_destroy(struct chamelium_infoframe *infoframe); bool chamelium_plug_all(struct chamelium *chamelium); +bool chamelium_wait_all_configured_ports_connected(struct chamelium *chamelium, + int drm_fd); #endif /* IGT_CHAMELIUM_H */ diff --git a/lib/igt_kms.c b/lib/igt_kms.c index e9621e7e..d4cbc1c5 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -1899,6 +1899,8 @@ void igt_display_require(igt_display_t *display, int drm_fd) "cannot reach the configured chamelium!\n"); igt_abort_on_f(!chamelium_plug_all(chamelium), "failed to plug all the chamelium ports!\n"); + igt_abort_on_f(!chamelium_wait_all_configured_ports_connected(chamelium, drm_fd), + "not all configured chamelium ports are connected!\n"); chamelium_deinit_rpc_only(chamelium); } } |