Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ec61a0b authored by Amine Najahi's avatar Amine Najahi
Browse files

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: default avatarAmine Najahi <anajahi@codeaurora.org>
parent 1a943877
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -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);