diff --git a/msm/dp/dp_drm.c b/msm/dp/dp_drm.c index 275f104459..4a65073152 100644 --- a/msm/dp/dp_drm.c +++ b/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; diff --git a/msm/sde/sde_rm.c b/msm/sde/sde_rm.c index 125c3a032c..8f8a4c575a 100644 --- a/msm/sde/sde_rm.c +++ b/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);