disp: msm: sde: correct the available mixers count provided
On connecting Display port when primary is in suspend state, RM provides all the available mixers for DP mode validations. Mixers which are primary and secondary display configured are also provided for DP mode, which can cause commit failures on external DP. Add changes to provide the correct mixer count in such cases. Change-Id: I239feb60a5373545c0ab929a0c318c6c2ac66531 Signed-off-by: Jayaprakash <jmadiset@codeaurora.org>
This commit is contained in:
1 parent
0f6a05590d
commit
4877f0a5fb
3 files changed
+35
-5
No files matched your search
@@ -371,6 +371,7 @@ static void sde_connector_get_avail_res_info(struct drm_connector *conn,
|
||||
struct msm_drm_private *priv;
|
||||
struct sde_kms *sde_kms;
|
||||
struct drm_encoder *drm_enc = NULL;
|
||||
struct msm_display_info display_info;
|
||||
|
||||
if (!conn || !conn->dev || !conn->dev->dev_private)
|
||||
return;
|
||||
@@ -381,12 +382,17 @@ static void sde_connector_get_avail_res_info(struct drm_connector *conn,
|
||||
if (!sde_kms)
|
||||
return;
|
||||
|
||||
memset(&display_info, 0, sizeof(display_info));
|
||||
|
||||
if (conn->state && conn->state->best_encoder)
|
||||
drm_enc = conn->state->best_encoder;
|
||||
else
|
||||
drm_enc = conn->encoder;
|
||||
|
||||
sde_rm_get_resource_info(&sde_kms->rm, drm_enc, avail_res);
|
||||
sde_connector_get_info(conn, &display_info);
|
||||
|
||||
sde_rm_get_resource_info(&sde_kms->rm, drm_enc, avail_res,
|
||||
display_info.display_type);
|
||||
|
||||
avail_res->max_mixer_width = sde_kms->catalog->max_mixer_width;
|
||||
}
|
||||
|
||||
+24
-2
@@ -203,17 +203,36 @@ static void _sde_rm_dec_resource_info(struct sde_rm *rm,
|
||||
|
||||
void sde_rm_get_resource_info(struct sde_rm *rm,
|
||||
struct drm_encoder *drm_enc,
|
||||
struct msm_resource_caps_info *avail_res)
|
||||
struct msm_resource_caps_info *avail_res,
|
||||
int display_type)
|
||||
{
|
||||
struct sde_rm_hw_blk *blk;
|
||||
enum sde_hw_blk_type type;
|
||||
struct sde_rm_rsvp rsvp;
|
||||
const struct sde_lm_cfg *lm_cfg;
|
||||
|
||||
mutex_lock(&rm->rm_lock);
|
||||
memcpy(avail_res, &rm->avail_res,
|
||||
sizeof(rm->avail_res));
|
||||
|
||||
/**
|
||||
* Layer Mixers which are primary display, secondary
|
||||
* display preferred and are available must not be provided
|
||||
* for connectors which are neither primary nor secondary.
|
||||
*/
|
||||
if (display_type != SDE_CONNECTOR_PRIMARY &&
|
||||
display_type != SDE_CONNECTOR_SECONDARY) {
|
||||
list_for_each_entry(blk, &rm->hw_blks[SDE_HW_BLK_LM], list) {
|
||||
lm_cfg = to_sde_hw_mixer(blk->hw)->cap;
|
||||
if (!blk->rsvp && (lm_cfg->features &
|
||||
(BIT(SDE_DISP_PRIMARY_PREF)
|
||||
| BIT(SDE_DISP_SECONDARY_PREF))))
|
||||
avail_res->num_lm--;
|
||||
}
|
||||
}
|
||||
|
||||
if (!drm_enc)
|
||||
return;
|
||||
goto end;
|
||||
|
||||
rsvp.enc_id = drm_enc->base.id;
|
||||
|
||||
@@ -221,6 +240,9 @@ void sde_rm_get_resource_info(struct sde_rm *rm,
|
||||
list_for_each_entry(blk, &rm->hw_blks[type], list)
|
||||
if (blk->rsvp && blk->rsvp->enc_id == rsvp.enc_id)
|
||||
_sde_rm_inc_resource_info(rm, avail_res, blk);
|
||||
end:
|
||||
mutex_unlock(&rm->rm_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
static void _sde_rm_print_rsvps(
|
||||
|
||||
+4
-2
@@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef __SDE_RM_H__
|
||||
@@ -323,8 +323,10 @@ int sde_rm_ext_blk_destroy(struct sde_rm *rm,
|
||||
* @mr: sde rm object
|
||||
* @drm_enc: drm encoder object
|
||||
* @avail_res: out parameter, available resource object
|
||||
* @display_type: type of the display in usage
|
||||
*/
|
||||
void sde_rm_get_resource_info(struct sde_rm *rm,
|
||||
struct drm_encoder *drm_enc,
|
||||
struct msm_resource_caps_info *avail_res);
|
||||
struct msm_resource_caps_info *avail_res,
|
||||
int display_type);
|
||||
#endif /* __SDE_RM_H__ */
|
||||
Reference in new issue
Block a user