From 84d43e85967488ef6100de791791b54b5042065e Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Wed, 13 Jul 2022 13:34:38 -0700 Subject: [PATCH 1/2] disp: msm: sde: add check for layer-mixer width Add check in layer mixer to avoid odd values as HW does not support it. Change-Id: Ifddd2047c81a016b774712ee52cfceca83374e6d Signed-off-by: Veera Sundaram Sankaran --- msm/sde/sde_connector.h | 18 ++++++++++++++++++ msm/sde/sde_crtc.c | 7 +++++++ 2 files changed, 25 insertions(+) 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; From f1033619c55229c62e0d1d69fa7b09fd2e43e3a1 Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Mon, 27 Jun 2022 21:13:51 -0700 Subject: [PATCH 2/2] disp: msm: sde: add additional WB roi checks Add check to validate the writeback roi against mode width & height. When dnsc_blur, destination_scaler, cwb features are not enabled, the roi should match with mode width & height. Additionally, add error log for case where dnsc_blur is set without the HW block reservation. Change-Id: I9199d5b127eed892ea134f830ecd6f690cb70f77 Signed-off-by: Veera Sundaram Sankaran --- msm/sde/sde_encoder_phys_wb.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/msm/sde/sde_encoder_phys_wb.c b/msm/sde/sde_encoder_phys_wb.c index 4805ee9391..4278734d05 100644 --- a/msm/sde/sde_encoder_phys_wb.c +++ b/msm/sde/sde_encoder_phys_wb.c @@ -790,16 +790,20 @@ static int _sde_enc_phys_wb_validate_dnsc_blur_ds(struct drm_crtc_state *crtc_st struct sde_rect *wb_roi) { struct sde_crtc_state *cstate = to_sde_crtc_state(crtc_state); + const struct drm_display_mode *mode = &crtc_state->mode; struct sde_io_res ds_res = {0, }, dnsc_blur_res = {0, }; u32 ds_tap_pt = sde_crtc_get_property(cstate, CRTC_PROP_CAPTURE_OUTPUT); sde_crtc_get_ds_io_res(crtc_state, &ds_res); sde_connector_get_dnsc_blur_io_res(conn_state, &dnsc_blur_res); - if ((ds_res.enabled && (!ds_res.src_w || !ds_res.src_h - || !ds_res.dst_w || !ds_res.dst_h))) { - SDE_ERROR("invalid ds cfg src:%ux%u dst:%ux%u\n", - ds_res.src_w, ds_res.src_h, ds_res.dst_w, ds_res.dst_h); + /* wb_roi should match with mode w/h if none of these features are enabled */ + if ((!ds_res.enabled && !dnsc_blur_res.enabled && !cstate->cwb_enc_mask) + && ((wb_roi->w && (wb_roi->w != mode->hdisplay)) + || (wb_roi->h && (wb_roi->h != mode->vdisplay)))) { + SDE_ERROR("invalid wb-roi {%u,%u,%u,%u} mode:%ux%u\n", + wb_roi->x, wb_roi->y, wb_roi->w, wb_roi->h, + mode->hdisplay, mode->vdisplay); return -EINVAL; } @@ -1422,6 +1426,13 @@ static void _sde_encoder_phys_wb_setup_dnsc_blur(struct sde_encoder_phys *phys_e sde_conn = to_sde_connector(wb_dev->connector); sde_conn_state = to_sde_connector_state(wb_dev->connector->state); + if (sde_conn_state->dnsc_blur_count && !hw_dnsc_blur) { + SDE_ERROR("[enc:%d wb:%d] invalid config - dnsc_blur block not reserved\n", + DRMID(phys_enc->parent), WBID(wb_enc)); + sde_kms->catalog->dnsc_blur_count = 0; + return; + } + /* swap between 0 & 1 lut idx on each config change for gaussian lut */ sde_conn_state->dnsc_blur_lut = 1 - sde_conn_state->dnsc_blur_lut;