summaryrefslogtreecommitdiff
path: root/lib/igt_kms.c
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-06-30 07:10:18 +0200
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2016-07-26 14:49:53 +0200
commit7d5449d65e05dd2542cdf2401a6264124dd81765 (patch)
treedbbf2f6159abeefe0f65d488a1c3650d78e17e02 /lib/igt_kms.c
parentd23aa709f71f7788e36b4820ffc5533fbef0e342 (diff)
igt_kms: Find optimal encoder only after selecting pipe
This will allow us to find a matching encoder based on a pipe only. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Ander Conselvan de Oliveira <conselvan2@gmail.com>
Diffstat (limited to 'lib/igt_kms.c')
-rw-r--r--lib/igt_kms.c97
1 files changed, 61 insertions, 36 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index ad3c464a..1ef16d8e 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: