This will allow us to find a matching encoder based on a pipe only.

Signed-off-by: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
---
 lib/igt_kms.c | 97 +++++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 61 insertions(+), 36 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index c16e40ea273b..ce8aa2455348 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -761,6 +761,59 @@ bool kmstest_get_connector_default_mode(int drm_fd, 
drmModeConnector *connector,
        return true;
 }
 
+static void
+_kmstest_connector_config_crtc_mask(int drm_fd,
+                                   drmModeConnector *connector,
+                                   struct kmstest_connector_config *config)
+{
+       int i;
+
+       config->valid_crtc_idx_mask = 0;
+
+       /* Now get a compatible encoder */
+       for (i = 0; i < connector->count_encoders; i++) {
+               drmModeEncoder *encoder = drmModeGetEncoder(drm_fd,
+                                                           
connector->encoders[i]);
+
+               if (!encoder) {
+                       igt_warn("could not get encoder %d: %s\n",
+                                connector->encoders[i],
+                                strerror(errno));
+
+                       continue;
+               }
+
+               config->valid_crtc_idx_mask |= encoder->possible_crtcs;
+               drmModeFreeEncoder(encoder);
+       }
+}
+
+static drmModeEncoder *
+_kmstest_connector_config_find_encoder(int drm_fd, drmModeConnector 
*connector, enum pipe pipe)
+{
+       int i;
+
+       for (i = 0; i < connector->count_encoders; i++) {
+               drmModeEncoder *encoder = drmModeGetEncoder(drm_fd, 
connector->encoders[i]);
+
+               if (!encoder) {
+                       igt_warn("could not get encoder %d: %s\n",
+                                connector->encoders[i],
+                                strerror(errno));
+
+                       continue;
+               }
+
+               if (encoder->possible_crtcs & (1 << pipe))
+                       return encoder;
+
+               drmModeFreeEncoder(encoder);
+       }
+
+       igt_assert(false);
+       return NULL;
+}
+
 /**
  * _kmstest_connector_config:
  * @drm_fd: DRM fd
@@ -779,8 +832,6 @@ static bool _kmstest_connector_config(int drm_fd, uint32_t 
connector_id,
 {
        drmModeRes *resources;
        drmModeConnector *connector;
-       drmModeEncoder *encoder, *found = NULL;
-       int i, j, pipe;
 
        resources = drmModeGetResources(drm_fd);
        if (!resources) {
@@ -816,51 +867,25 @@ static bool _kmstest_connector_config(int drm_fd, 
uint32_t connector_id,
         * In both cases find the first compatible encoder and skip the CRTC
         * if there is non such.
         */
-       config->valid_crtc_idx_mask = 0;
-       for (i = 0; i < resources->count_crtcs; i++) {
-               if (!resources->crtcs[i])
-                       continue;
+       _kmstest_connector_config_crtc_mask(drm_fd, connector, config);
 
-               /* Now get a compatible encoder */
-               for (j = 0; j < connector->count_encoders; j++) {
-                       encoder = drmModeGetEncoder(drm_fd,
-                                                   connector->encoders[j]);
-
-                       if (!encoder) {
-                               igt_warn("could not get encoder %d: %s\n",
-                                        resources->encoders[j],
-                                        strerror(errno));
-
-                               continue;
-                       }
-
-                       config->valid_crtc_idx_mask |= encoder->possible_crtcs;
-
-                       if (!found && (crtc_idx_mask & encoder->possible_crtcs 
& (1 << i))) {
-                               found = encoder;
-                               pipe = i;
-                       } else
-                               drmModeFreeEncoder(encoder);
-               }
-       }
-
-       if (!found)
+       crtc_idx_mask &= config->valid_crtc_idx_mask;
+       if (!crtc_idx_mask)
                goto err3;
 
+       config->pipe = ffs(crtc_idx_mask) - 1;
+
        if (!kmstest_get_connector_default_mode(drm_fd, connector,
                                                &config->default_mode))
-               goto err4;
+               goto err3;
 
+       config->encoder = _kmstest_connector_config_find_encoder(drm_fd, 
connector, config->pipe);
        config->connector = connector;
-       config->encoder = found;
-       config->crtc = drmModeGetCrtc(drm_fd, resources->crtcs[pipe]);
-       config->pipe = pipe;
+       config->crtc = drmModeGetCrtc(drm_fd, resources->crtcs[config->pipe]);
 
        drmModeFreeResources(resources);
 
        return true;
-err4:
-       drmModeFreeEncoder(found);
 err3:
        drmModeFreeConnector(connector);
 err2:
-- 
2.5.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to