disp: msm: sde: reserve primary CTL and LM for primary connector

In dual display cases when secondary display is resumed first,
primary CTL and LM is selected for secondary path which leads to
invalid configuration. Changes are made to correct the reservation
to select primary CTL and LM for primary connector and secondary
LM to secondary connector.

Change-Id: I6b2a8bedaf46f18bdb28b45ac765f32b26207304
Signed-off-by: Jayaprakash <jmadiset@codeaurora.org>
This commit is contained in:
Jayaprakash
2019-09-16 15:13:36 +05:30
orang tua 8babba1d11
melakukan c2c470efa9
2 mengubah file dengan 20 tambahan dan 13 penghapusan

Melihat File

@@ -929,19 +929,24 @@ static bool _sde_rm_check_lm_and_get_connected_blks(
{
const struct sde_lm_cfg *lm_cfg = to_sde_hw_mixer(lm->hw)->cap;
const struct sde_pingpong_cfg *pp_cfg;
bool ret;
u32 display_pref, cwb_pref;
bool ret, is_conn_primary, is_conn_secondary;
u32 lm_primary_pref, lm_secondary_pref, cwb_pref;
*dspp = NULL;
*ds = NULL;
*pp = NULL;
display_pref = lm_cfg->features & BIT(SDE_DISP_PRIMARY_PREF) ||
lm_cfg->features & BIT(SDE_DISP_SECONDARY_PREF);
cwb_pref = lm_cfg->features & BIT(SDE_DISP_CWB_PREF);
SDE_DEBUG("check lm %d: dspp %d ds %d pp %d disp_pref: %d cwb_pref%d\n",
lm_cfg->id, lm_cfg->dspp, lm_cfg->ds,
lm_cfg->pingpong, display_pref, cwb_pref);
lm_primary_pref = lm_cfg->features & BIT(SDE_DISP_PRIMARY_PREF);
lm_secondary_pref = lm_cfg->features & BIT(SDE_DISP_SECONDARY_PREF);
cwb_pref = lm_cfg->features & BIT(SDE_DISP_CWB_PREF);
is_conn_primary = (reqs->hw_res.display_type ==
SDE_CONNECTOR_PRIMARY) ? true : false;
is_conn_secondary = (reqs->hw_res.display_type ==
SDE_CONNECTOR_SECONDARY) ? true : false;
SDE_DEBUG("check lm %d: dspp %d ds %d pp %d features %d disp type %d\n",
lm_cfg->id, lm_cfg->dspp, lm_cfg->ds, lm_cfg->pingpong,
lm_cfg->features, (int)reqs->hw_res.display_type);
/* Check if this layer mixer is a peer of the proposed primary LM */
if (primary_lm) {
@@ -956,7 +961,7 @@ static bool _sde_rm_check_lm_and_get_connected_blks(
}
/* bypass rest of the checks if LM for primary display is found */
if (!display_pref) {
if (!lm_primary_pref && !lm_secondary_pref) {
/* Check lm for valid requirements */
ret = _sde_rm_check_lm(rm, rsvp, reqs, lm_cfg, lm,
dspp, ds, pp);
@@ -971,10 +976,11 @@ static bool _sde_rm_check_lm_and_get_connected_blks(
SDE_DEBUG("fail: cwb supported lm not allocated\n");
return false;
}
} else if (!(reqs->hw_res.display_type && display_pref)) {
} else if ((!is_conn_primary && lm_primary_pref) ||
(!is_conn_secondary && lm_secondary_pref)) {
SDE_DEBUG(
"display preference is not met. display_type: %d display_pref: %d\n",
(int)reqs->hw_res.display_type, (int)display_pref);
"display preference is not met. display_type: %d lm_features: %x\n",
(int)reqs->hw_res.display_type, lm_cfg->features);
return false;
}