From 3b303c57ded59effb9aadf2dbe4563da34c6775c Mon Sep 17 00:00:00 2001 From: Nilaan Gunabalachandran Date: Wed, 8 Sep 2021 09:45:53 -0400 Subject: [PATCH] disp: msm: sde: avoid mis-allocating dummy mixers Dummy mixers for dedicated concurrent writeback can be allocated as valid mixers. However, they should only be allocated for DCWB usecases. Allocating these virtual resources incorrectly can lead to underrun on external monitors. These dummy mixers should not be tracked as available resources and exposed to dp for mode validation. Change-Id: I04f583d5b722e0a384a5446e3a8a2313a338aa12 Signed-off-by: Nilaan Gunabalachandran --- msm/sde/sde_rm.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/msm/sde/sde_rm.c b/msm/sde/sde_rm.c index 6fba936feb..07dab42016 100644 --- a/msm/sde/sde_rm.c +++ b/msm/sde/sde_rm.c @@ -190,9 +190,14 @@ static void _sde_rm_inc_resource_info_lm(struct sde_rm *rm, struct sde_rm_hw_blk *blk2; const struct sde_lm_cfg *lm_cfg, *lm_cfg2; + lm_cfg = to_sde_hw_mixer(blk->hw)->cap; + + /* Do not track & expose dummy mixers */ + if (lm_cfg->dummy_mixer) + return; + avail_res->num_lm++; - lm_cfg = to_sde_hw_mixer(blk->hw)->cap; /* Check for 3d muxes by comparing paired lms */ list_for_each_entry(blk2, &rm->hw_blks[SDE_HW_BLK_LM], list) { lm_cfg2 = to_sde_hw_mixer(blk2->hw)->cap; @@ -215,9 +220,14 @@ static void _sde_rm_dec_resource_info_lm(struct sde_rm *rm, struct sde_rm_hw_blk *blk2; const struct sde_lm_cfg *lm_cfg, *lm_cfg2; + lm_cfg = to_sde_hw_mixer(blk->hw)->cap; + + /* Do not track & expose dummy mixers */ + if (lm_cfg->dummy_mixer) + return; + avail_res->num_lm--; - lm_cfg = to_sde_hw_mixer(blk->hw)->cap; /* Check for 3d muxes by comparing paired lms */ list_for_each_entry(blk2, &rm->hw_blks[SDE_HW_BLK_LM], list) { lm_cfg2 = to_sde_hw_mixer(blk2->hw)->cap; @@ -1098,6 +1108,9 @@ static bool _sde_rm_check_lm_and_get_connected_blks( (RM_RQ_DCWB(reqs) && !dcwb_pref)) { SDE_DEBUG("fail: cwb/dcwb supported lm not allocated\n"); return false; + } else if (!RM_RQ_DCWB(reqs) && dcwb_pref) { + SDE_DEBUG("fail: dcwb supported dummy lm incorrectly allocated\n"); + return false; } } else if ((!is_conn_primary && lm_primary_pref) || (!is_conn_secondary && lm_secondary_pref)) {