Эх сурвалжийг харах

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 <[email protected]>
Narendra Muppalla 5 жил өмнө
parent
commit
d28ebf05f4
1 өөрчлөгдсөн 43 нэмэгдсэн , 43 устгасан
  1. 43 43
      msm/sde/sde_kms.c

+ 43 - 43
msm/sde/sde_kms.c

@@ -1319,102 +1319,102 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
 		SDE_ERROR("capping number of displays to %d", max_encoders);
 	}
 
-	/* dsi */
-	for (i = 0; i < sde_kms->dsi_display_count &&
+	/* wb */
+	for (i = 0; i < sde_kms->wb_display_count &&
 		priv->num_encoders < max_encoders; ++i) {
-		display = sde_kms->dsi_displays[i];
+		display = sde_kms->wb_displays[i];
 		encoder = NULL;
 
 		memset(&info, 0x0, sizeof(info));
-		rc = dsi_display_get_info(NULL, &info, display);
+		rc = sde_wb_get_info(NULL, &info, display);
 		if (rc) {
-			SDE_ERROR("dsi get_info %d failed\n", i);
+			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 dsi %d\n", i);
+			SDE_ERROR("encoder init failed for wb %d\n", i);
 			continue;
 		}
 
-		rc = dsi_display_drm_bridge_init(display, encoder);
+		rc = sde_wb_drm_init(display, encoder);
 		if (rc) {
-			SDE_ERROR("dsi bridge %d init failed, %d\n", i, rc);
+			SDE_ERROR("wb bridge %d init failed, %d\n", i, rc);
 			sde_encoder_destroy(encoder);
 			continue;
 		}
 
 		connector = sde_connector_init(dev,
-					encoder,
-					dsi_display_get_drm_panel(display),
-					display,
-					&dsi_ops,
-					DRM_CONNECTOR_POLL_HPD,
-					DRM_MODE_CONNECTOR_DSI);
+				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("dsi %d connector init failed\n", i);
-			dsi_display_drm_bridge_deinit(display);
-			sde_encoder_destroy(encoder);
-			continue;
-		}
-
-		rc = dsi_display_drm_ext_bridge_init(display,
-					encoder, connector);
-		if (rc) {
-			SDE_ERROR("dsi %d ext bridge init failed\n", rc);
-			dsi_display_drm_bridge_deinit(display);
-			sde_connector_destroy(connector);
+			SDE_ERROR("wb %d connector init failed\n", i);
+			sde_wb_drm_deinit(display);
 			sde_encoder_destroy(encoder);
 		}
 	}
 
-
-	/* wb */
-	for (i = 0; i < sde_kms->wb_display_count &&
+	/* dsi */
+	for (i = 0; i < sde_kms->dsi_display_count &&
 		priv->num_encoders < max_encoders; ++i) {
-		display = sde_kms->wb_displays[i];
+		display = sde_kms->dsi_displays[i];
 		encoder = NULL;
 
 		memset(&info, 0x0, sizeof(info));
-		rc = sde_wb_get_info(NULL, &info, display);
+		rc = dsi_display_get_info(NULL, &info, display);
 		if (rc) {
-			SDE_ERROR("wb get_info %d failed\n", i);
+			SDE_ERROR("dsi 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);
+			SDE_ERROR("encoder init failed for dsi %d\n", i);
 			continue;
 		}
 
-		rc = sde_wb_drm_init(display, encoder);
+		rc = dsi_display_drm_bridge_init(display, encoder);
 		if (rc) {
-			SDE_ERROR("wb bridge %d init failed, %d\n", i, rc);
+			SDE_ERROR("dsi 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);
+					encoder,
+					dsi_display_get_drm_panel(display),
+					display,
+					&dsi_ops,
+					DRM_CONNECTOR_POLL_HPD,
+					DRM_MODE_CONNECTOR_DSI);
 		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_ERROR("dsi %d connector init failed\n", i);
+			dsi_display_drm_bridge_deinit(display);
+			sde_encoder_destroy(encoder);
+			continue;
+		}
+
+		rc = dsi_display_drm_ext_bridge_init(display,
+					encoder, connector);
+		if (rc) {
+			SDE_ERROR("dsi %d ext bridge init failed\n", rc);
+			dsi_display_drm_bridge_deinit(display);
+			sde_connector_destroy(connector);
 			sde_encoder_destroy(encoder);
 		}
 	}
+
 	/* dp */
 	for (i = 0; i < sde_kms->dp_display_count &&
 			priv->num_encoders < max_encoders; ++i) {