diff options
author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-06-30 07:10:18 +0200 |
---|---|---|
committer | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-07-26 14:49:53 +0200 |
commit | 7d5449d65e05dd2542cdf2401a6264124dd81765 (patch) | |
tree | dbbf2f6159abeefe0f65d488a1c3650d78e17e02 /lib/igt_kms.c | |
parent | d23aa709f71f7788e36b4820ffc5533fbef0e342 (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.c | 97 |
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: |