From 3550ca8f9f11f2ca00e822b3ff3bc70f0e7ad79e Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Tue, 16 Aug 2022 12:13:40 -0700 Subject: [PATCH] disp: msm: sde: add crtc width restriction when 3d-merge is enabled Add validation during crtc_atomic_check to have crtc width as multiple of 4 when dualpipe 3d-mux is enabled and multiple of 8 when quadpipe 3d-mux is enabled. This ensures each layer mixer is having an even width. Change-Id: I5dc173c1b0349430a8e12a7b1c9440c7854e7ecd Signed-off-by: Veera Sundaram Sankaran --- msm/sde/sde_connector.h | 27 +++++++++++++++++++++++---- msm/sde/sde_crtc.c | 19 +++++++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/msm/sde/sde_connector.h b/msm/sde/sde_connector.h index 786f946484..d5d8c91cda 100644 --- a/msm/sde/sde_connector.h +++ b/msm/sde/sde_connector.h @@ -1217,7 +1217,22 @@ static inline int sde_connector_state_get_compression_info( return 0; } -static inline bool sde_connector_is_3d_merge_enabled(struct drm_connector *conn) +static inline bool sde_connector_is_quadpipe_3d_merge_enabled(struct drm_connector *conn) +{ + enum sde_rm_topology_name topology; + + if (!conn) + return false; + + topology = sde_connector_get_topology_name(conn); + if ((topology == SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE) + || (topology == SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC)) + return true; + + return false; +} + +static inline bool sde_connector_is_dualpipe_3d_merge_enabled(struct drm_connector *conn) { enum sde_rm_topology_name topology; @@ -1227,14 +1242,18 @@ static inline bool sde_connector_is_3d_merge_enabled(struct drm_connector *conn) topology = sde_connector_get_topology_name(conn); if ((topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE) || (topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC) - || (topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_VDC) - || (topology == SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE) - || (topology == SDE_RM_TOPOLOGY_QUADPIPE_3DMERGE_DSC)) + || (topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_VDC)) return true; return false; } +static inline bool sde_connector_is_3d_merge_enabled(struct drm_connector *conn) +{ + return sde_connector_is_dualpipe_3d_merge_enabled(conn) + || sde_connector_is_quadpipe_3d_merge_enabled(conn); +} + /** * sde_connector_set_msm_mode - set msm_mode for connector state * @conn_state: Pointer to drm connector state structure diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index e66204767c..d476bd4b8b 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -1364,6 +1364,8 @@ static int _sde_crtc_check_rois(struct drm_crtc *crtc, u32 crtc_width, crtc_height, mixer_width, mixer_height; struct drm_display_mode *adj_mode; int rc = 0, lm_idx, i; + struct drm_connector *conn; + struct drm_connector_state *conn_state; if (!crtc || !state) return -EINVAL; @@ -1379,14 +1381,27 @@ static int _sde_crtc_check_rois(struct drm_crtc *crtc, sde_crtc_get_resolution(crtc, state, adj_mode, &crtc_width, &crtc_height); sde_crtc_get_mixer_resolution(crtc, state, adj_mode, &mixer_width, &mixer_height); /* check cumulative mixer w/h is equal full crtc w/h */ - if (sde_crtc->num_mixers - && (((mixer_width * sde_crtc->num_mixers) != crtc_width) + if (sde_crtc->num_mixers && (((mixer_width * sde_crtc->num_mixers) != crtc_width) || (mixer_height != crtc_height))) { SDE_ERROR("%s: invalid w/h crtc:%d,%d, mixer:%d,%d, num_mixers:%d\n", sde_crtc->name, crtc_width, crtc_height, mixer_width, mixer_height, sde_crtc->num_mixers); rc = -EINVAL; goto end; + } else if (state->state) { + for_each_new_connector_in_state(state->state, conn, conn_state, i) { + if (conn_state && (conn_state->crtc == crtc) + && ((sde_connector_is_dualpipe_3d_merge_enabled(conn) + && (crtc_width % 4)) + || (sde_connector_is_quadpipe_3d_merge_enabled(conn) + && (crtc_width % 8)))) { + SDE_ERROR( + "%s: invalid 3d-merge_w - mixer_w:%d, crtc_w:%d, num_mixers:%d\n", + sde_crtc->name, mixer_width, + crtc_width, sde_crtc->num_mixers); + return -EINVAL; + } + } } /*