Jelajahi Sumber

disp: msm: sde: use new state when checking conn-crtc association

Currently during CRTC atomic check phase, driver is counting
the number of connectors attached to the CRTC by iterating over
all the connectors available and checking if they are attached
to the CRTC. The current implementation uses the old connector
state, which has an invalid state for the first commit. This
causes the number of attached connectors to always be 0 for the
first commit.

This change extracts the new connector state from the atomic state
and ensures the calculation is done before checking crtc features.

Change-Id: I58d641086f18e8624cbc2d432443323a6a44792e
Signed-off-by: Amine Najahi <[email protected]>
Amine Najahi 5 tahun lalu
induk
melakukan
1ec61a0b66
1 mengubah file dengan 14 tambahan dan 11 penghapusan
  1. 14 11
      msm/sde/sde_crtc.c

+ 14 - 11
msm/sde/sde_crtc.c

@@ -4857,6 +4857,7 @@ static int sde_crtc_atomic_check(struct drm_crtc *crtc,
 	struct sde_multirect_plane_states *multirect_plane = NULL;
 	struct drm_connector *conn;
 	struct drm_connector_list_iter conn_iter;
+	struct drm_connector_state *conn_state;
 
 	if (!crtc) {
 		SDE_ERROR("invalid crtc\n");
@@ -4892,6 +4893,19 @@ static int sde_crtc_atomic_check(struct drm_crtc *crtc,
 	if (state->active_changed)
 		state->mode_changed = true;
 
+	/* identify connectors attached to this crtc */
+	cstate->num_connectors = 0;
+	drm_connector_list_iter_begin(dev, &conn_iter);
+	drm_for_each_connector_iter(conn, &conn_iter) {
+		conn_state = drm_atomic_get_connector_state(state->state, conn);
+
+		if (conn_state && conn_state->crtc == crtc &&
+				cstate->num_connectors < MAX_CONNECTORS) {
+			cstate->connectors[cstate->num_connectors++] = conn;
+		}
+	}
+	drm_connector_list_iter_end(&conn_iter);
+
 	rc = _sde_crtc_check_dest_scaler_data(crtc, state);
 	if (rc) {
 		SDE_ERROR("crtc%d failed dest scaler check %d\n",
@@ -4906,17 +4920,6 @@ static int sde_crtc_atomic_check(struct drm_crtc *crtc,
 		goto end;
 	}
 
-	/* identify connectors attached to this crtc */
-	cstate->num_connectors = 0;
-
-	drm_connector_list_iter_begin(dev, &conn_iter);
-	drm_for_each_connector_iter(conn, &conn_iter)
-		if (conn->state && conn->state->crtc == crtc &&
-				cstate->num_connectors < MAX_CONNECTORS) {
-			cstate->connectors[cstate->num_connectors++] = conn;
-		}
-	drm_connector_list_iter_end(&conn_iter);
-
 	_sde_crtc_setup_is_ppsplit(state);
 	_sde_crtc_setup_lm_bounds(crtc, state);