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

Merge "disp: msm: sde: set connector lm_mask for dp display"

qctecmdr 2 жил өмнө
parent
commit
4f29acc9bc
2 өөрчлөгдсөн 37 нэмэгдсэн , 1 устгасан
  1. 6 0
      msm/dp/dp_drm.c
  2. 31 1
      msm/sde/sde_rm.c

+ 6 - 0
msm/dp/dp_drm.c

@@ -1,5 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
  */
 
@@ -419,6 +420,11 @@ int dp_connector_get_mode_info(struct drm_connector *connector,
 		DP_ERR("error getting mixer count. rc:%d\n", rc);
 		return rc;
 	}
+	/* reset dp connector lm_mask for every connection event and
+	 * this will get re-populated in resource manager based on
+	 * resolution and topology of dp display.
+	 */
+	sde_conn->lm_mask = 0;
 
 	topology->num_enc = no_enc;
 	topology->num_intf = single_intf;

+ 31 - 1
msm/sde/sde_rm.c

@@ -1215,7 +1215,7 @@ static bool _sde_rm_check_lm_and_get_connected_blks(
 		} else if (!RM_RQ_DCWB(reqs) && dcwb_pref) {
 			SDE_DEBUG("fail: dcwb supported dummy lm incorrectly allocated\n");
 			return false;
-		} else if (RM_RQ_DCWB(reqs) && dcwb_pref &&
+		} else if (RM_RQ_DCWB(reqs) && dcwb_pref && conn_lm_mask &&
 				((ffs(conn_lm_mask) % 2) ==  ((lm_cfg->id + 1) % 2))) {
 			SDE_DEBUG("fail: dcwb:%d trying to match lm:%d\n",
 					lm_cfg->id, ffs(conn_lm_mask));
@@ -2685,6 +2685,35 @@ static void _sde_rm_commit_rsvp(struct sde_rm *rm, struct sde_rm_rsvp *rsvp,
 	SDE_EVT32(rsvp->enc_id, rsvp->topology);
 }
 
+static void _sde_rm_populate_dp_lm_mask(struct sde_rm *rm,
+		struct drm_connector *conn)
+{
+	struct sde_connector *c_conn = NULL;
+	struct sde_rm_hw_blk *blk;
+
+	if (!rm || !conn) {
+		SDE_ERROR("invalid arguments\n");
+		return;
+	}
+	if (conn->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
+		return;
+
+	c_conn =  to_sde_connector(conn);
+	if (!c_conn || !c_conn->encoder)
+		return;
+
+	list_for_each_entry(blk, &rm->hw_blks[SDE_HW_BLK_LM], list) {
+		if (!blk->rsvp)
+			continue;
+		if (blk->rsvp->enc_id == c_conn->encoder->base.id)
+			c_conn->lm_mask |= BIT(blk->id - 1);
+	}
+
+	SDE_DEBUG("conn lm_mask %d for conn %d enc %d\n", c_conn->lm_mask,
+			conn->base.id, c_conn->encoder->base.id);
+	SDE_EVT32(c_conn->encoder->base.id, conn->base.id, c_conn->lm_mask);
+}
+
 /* call this only after rm_mutex held */
 struct sde_rm_rsvp *_sde_rm_poll_get_rsvp_nxt_locked(struct sde_rm *rm,
 		struct drm_encoder *enc)
@@ -2851,6 +2880,7 @@ int sde_rm_reserve(
 commit_rsvp:
 	_sde_rm_release_rsvp(rm, rsvp_cur, conn_state->connector);
 	_sde_rm_commit_rsvp(rm, rsvp_nxt, conn_state);
+	_sde_rm_populate_dp_lm_mask(rm, conn_state->connector);
 
 end:
 	kfree(comp_info);