From deae97dd0d99abcfdb3808a0f184e9fa1f078ace Mon Sep 17 00:00:00 2001 From: Amine Najahi Date: Sun, 16 Aug 2020 13:56:43 -0400 Subject: [PATCH] disp: msm: sde: Allow for overriding CP features flush mechanism Allow for overriding color processing features that normally uses DSPP flush to use LM flush instead. This is required on targets where some of the DSPP features have been tied to LM flush bits. This changes adds a field in color processing node to track if the override is needed and enables LM flush override for rounded corner on target requiring it. Change-Id: I584bd7b20dfc9fc7795b1b3b10e2f17a82945ce4 Signed-off-by: Amine Najahi --- msm/sde/sde_color_processing.c | 25 ++++++++++++++++++++++++- msm/sde/sde_hw_catalog.c | 1 + msm/sde/sde_hw_catalog.h | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/msm/sde/sde_color_processing.c b/msm/sde/sde_color_processing.c index 94a13cea..8f9ebb99 100644 --- a/msm/sde/sde_color_processing.c +++ b/msm/sde/sde_color_processing.c @@ -30,6 +30,7 @@ struct sde_cp_node { struct list_head active_list; struct list_head dirty_list; bool is_dspp_feature; + bool lm_flush_override; u32 prop_blob_sz; struct sde_irq_callback *irq; }; @@ -1974,7 +1975,8 @@ void sde_cp_crtc_apply_properties(struct drm_crtc *crtc) dirty_list) { sde_cp_crtc_setfeature(prop_node, sde_crtc); sde_cp_dspp_flush_helper(sde_crtc, prop_node->feature); - if (prop_node->is_dspp_feature) + if (prop_node->is_dspp_feature && + !prop_node->lm_flush_override) set_dspp_flush = true; else set_lm_flush = true; @@ -2636,6 +2638,8 @@ static void dspp_rc_install_property(struct drm_crtc *crtc) char feature_name[256]; struct sde_kms *kms = NULL; struct sde_mdss_cfg *catalog = NULL; + struct sde_cp_node *prop_node = NULL; + struct sde_crtc *sde_crtc = NULL; u32 version; if (!crtc) { @@ -2643,6 +2647,12 @@ static void dspp_rc_install_property(struct drm_crtc *crtc) return; } + sde_crtc = to_sde_crtc(crtc); + if (!sde_crtc) { + DRM_ERROR("invalid sde_crtc %pK\n", sde_crtc); + return; + } + kms = get_kms(crtc); catalog = kms->catalog; version = catalog->dspp[0].sblk->rc.version >> 16; @@ -2654,6 +2664,19 @@ static void dspp_rc_install_property(struct drm_crtc *crtc) SDE_CP_CRTC_DSPP_RC_MASK, sizeof(struct drm_msm_rc_mask_cfg)); + /* Override flush mechanism to use layer mixer flush bits */ + if (!catalog->rc_lm_flush_override) + break; + + DRM_DEBUG("rc using lm flush override\n"); + list_for_each_entry(prop_node, &sde_crtc->feature_list, + feature_list) { + if (prop_node->feature == SDE_CP_CRTC_DSPP_RC_MASK) { + prop_node->lm_flush_override = true; + break; + } + } + break; default: DRM_ERROR("version %d not supported\n", version); diff --git a/msm/sde/sde_hw_catalog.c b/msm/sde/sde_hw_catalog.c index 4a941c9b..fcd3a056 100644 --- a/msm/sde/sde_hw_catalog.c +++ b/msm/sde/sde_hw_catalog.c @@ -4751,6 +4751,7 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->has_sui_blendstage = true; sde_cfg->vbif_disable_inner_outer_shareable = true; sde_cfg->mdss_hw_block_size = 0x158; + sde_cfg->rc_lm_flush_override = true; } else if (IS_SHIMA_TARGET(hw_rev)) { sde_cfg->has_cwb_support = true; sde_cfg->has_wb_ubwc = true; diff --git a/msm/sde/sde_hw_catalog.h b/msm/sde/sde_hw_catalog.h index 77827c82..7ad625df 100644 --- a/msm/sde/sde_hw_catalog.h +++ b/msm/sde/sde_hw_catalog.h @@ -1416,6 +1416,7 @@ struct sde_perf_cfg { * @has_3d_merge_reset Supports 3D merge reset * @has_decimation Supports decimation * @has_trusted_vm_support Supported HW sharing with trusted VM + * @rc_lm_flush_override Support Rounded Corner using layer mixer flush * @has_mixer_combined_alpha Mixer has single register for FG & BG alpha * @vbif_disable_inner_outer_shareable VBIF requires disabling shareables * @inline_disable_const_clr Disable constant color during inline rotate @@ -1494,6 +1495,7 @@ struct sde_mdss_cfg { bool has_base_layer; bool has_demura; bool has_trusted_vm_support; + bool rc_lm_flush_override; u32 demura_supported[SSPP_MAX][2]; u32 qseed_sw_lib_rev; u32 qseed_hw_version;