From d28ebf05f4aa989f9cab4e98f1eb444647084a82 Mon Sep 17 00:00:00 2001 From: Narendra Muppalla Date: Tue, 11 Feb 2020 11:54:54 -0800 Subject: [PATCH] disp: msm: sde: populate WB display encoder list before dsi This changes swaps the order of encode initialization between wb and dsi displays. This ensures that wb encoder is registered before DSI/DP encoder in mode_list and it allows single CRTC to loop through WB encoder before other encoder during mirror mode topology like CWB use case. With existing order of encoder list, CWB flush is happening after primary commit flush which is causing cwb failures when there is a cpu latency. Change-Id: I24d6b4f27271d46e9743d17a624ac7e0930f7474 Signed-off-by: Narendra Muppalla --- msm/sde/sde_kms.c | 86 +++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 1762421760..602f3bb275 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1319,6 +1319,49 @@ static int _sde_kms_setup_displays(struct drm_device *dev, SDE_ERROR("capping number of displays to %d", max_encoders); } + /* wb */ + for (i = 0; i < sde_kms->wb_display_count && + priv->num_encoders < max_encoders; ++i) { + display = sde_kms->wb_displays[i]; + encoder = NULL; + + memset(&info, 0x0, sizeof(info)); + rc = sde_wb_get_info(NULL, &info, display); + if (rc) { + SDE_ERROR("wb get_info %d failed\n", i); + continue; + } + + encoder = sde_encoder_init(dev, &info); + if (IS_ERR_OR_NULL(encoder)) { + SDE_ERROR("encoder init failed for wb %d\n", i); + continue; + } + + rc = sde_wb_drm_init(display, encoder); + if (rc) { + SDE_ERROR("wb bridge %d init failed, %d\n", i, rc); + sde_encoder_destroy(encoder); + continue; + } + + connector = sde_connector_init(dev, + encoder, + 0, + display, + &wb_ops, + DRM_CONNECTOR_POLL_HPD, + DRM_MODE_CONNECTOR_VIRTUAL); + if (connector) { + priv->encoders[priv->num_encoders++] = encoder; + priv->connectors[priv->num_connectors++] = connector; + } else { + SDE_ERROR("wb %d connector init failed\n", i); + sde_wb_drm_deinit(display); + sde_encoder_destroy(encoder); + } + } + /* dsi */ for (i = 0; i < sde_kms->dsi_display_count && priv->num_encoders < max_encoders; ++i) { @@ -1372,49 +1415,6 @@ static int _sde_kms_setup_displays(struct drm_device *dev, } } - - /* wb */ - for (i = 0; i < sde_kms->wb_display_count && - priv->num_encoders < max_encoders; ++i) { - display = sde_kms->wb_displays[i]; - encoder = NULL; - - memset(&info, 0x0, sizeof(info)); - rc = sde_wb_get_info(NULL, &info, display); - if (rc) { - SDE_ERROR("wb get_info %d failed\n", i); - continue; - } - - encoder = sde_encoder_init(dev, &info); - if (IS_ERR_OR_NULL(encoder)) { - SDE_ERROR("encoder init failed for wb %d\n", i); - continue; - } - - rc = sde_wb_drm_init(display, encoder); - if (rc) { - SDE_ERROR("wb bridge %d init failed, %d\n", i, rc); - sde_encoder_destroy(encoder); - continue; - } - - connector = sde_connector_init(dev, - encoder, - 0, - display, - &wb_ops, - DRM_CONNECTOR_POLL_HPD, - DRM_MODE_CONNECTOR_VIRTUAL); - if (connector) { - priv->encoders[priv->num_encoders++] = encoder; - priv->connectors[priv->num_connectors++] = connector; - } else { - SDE_ERROR("wb %d connector init failed\n", i); - sde_wb_drm_deinit(display); - sde_encoder_destroy(encoder); - } - } /* dp */ for (i = 0; i < sde_kms->dp_display_count && priv->num_encoders < max_encoders; ++i) {