diff --git a/msm/sde/sde_connector.h b/msm/sde/sde_connector.h index f18e2584e8..238c5e982c 100644 --- a/msm/sde/sde_connector.h +++ b/msm/sde/sde_connector.h @@ -1215,6 +1215,24 @@ static inline int sde_connector_state_get_compression_info( return 0; } +static inline bool sde_connector_is_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_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)) + return true; + + return false; +} + /** * 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 b3173755b9..37b241b2e2 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -1402,6 +1402,13 @@ static int _sde_crtc_check_rois(struct drm_crtc *crtc, return -EINVAL; } + if (sde_connector_is_3d_merge_enabled(conn) && (mixer_width % 2)) { + SDE_ERROR( + "%s: invalid width w/ 3d-merge - mixer_w:%d, crtc_w:%d, num_mixers:%d\n", + sde_crtc->name, crtc_width, mixer_width, sde_crtc->num_mixers); + return -EINVAL; + } + if (!mode_info.roi_caps.enabled) continue;