From 9c9159afdb6b52611ad39e6eb9f17cf31e95575a Mon Sep 17 00:00:00 2001 From: Abhijit Kulkarni Date: Fri, 7 Aug 2020 12:58:19 -0700 Subject: [PATCH] disp: msm: sde: disable border color on empty blendstage This change disables the border color on the layer mixer, based on the caller's request. This is required to totally disconnect the layer mixer hardware when it is not participating in blending the pixels. Having empty blendstage but border color enabled, allows Layer mixer hw to produce border pixels even when blend stage is empty. Change-Id: I8e84aeedffbd42ad793a167a6cc5a3a653864c1a Signed-off-by: Abhijit Kulkarni --- msm/sde/sde_crtc.c | 5 +++-- msm/sde/sde_encoder.c | 2 +- msm/sde/sde_hw_ctl.c | 8 +++++--- msm/sde/sde_hw_ctl.h | 10 ++++++---- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 736adc121c..f87342fed8 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -1686,10 +1686,11 @@ static void _sde_crtc_blend_setup(struct drm_crtc *crtc, sde_crtc->name, lm->idx - LM_0, ctl->idx - CTL_0); ctl->ops.setup_blendstage(ctl, mixer[i].hw_lm->idx, - NULL); + NULL, true); } else { ctl->ops.setup_blendstage(ctl, mixer[i].hw_lm->idx, - &sde_crtc->stage_cfg[lm_layout]); + &sde_crtc->stage_cfg[lm_layout], + false); } } diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 15993aa272..1b5da27f6f 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -4171,7 +4171,7 @@ int sde_encoder_helper_reset_mixers(struct sde_encoder_phys *phys_enc, /* only enable border color on LM */ if (phys_enc->hw_ctl->ops.setup_blendstage) phys_enc->hw_ctl->ops.setup_blendstage( - phys_enc->hw_ctl, hw_lm->idx, NULL); + phys_enc->hw_ctl, hw_lm->idx, NULL, false); } if (!lm_valid) { diff --git a/msm/sde/sde_hw_ctl.c b/msm/sde/sde_hw_ctl.c index 73e70f62bc..4558a5d66e 100644 --- a/msm/sde/sde_hw_ctl.c +++ b/msm/sde/sde_hw_ctl.c @@ -946,7 +946,8 @@ static void _sde_hw_ctl_get_mixer_cfg(struct sde_hw_ctl *ctx, } static void sde_hw_ctl_setup_blendstage(struct sde_hw_ctl *ctx, - enum sde_lm lm, struct sde_hw_stage_cfg *stage_cfg) + enum sde_lm lm, struct sde_hw_stage_cfg *stage_cfg, + bool disable_border) { struct sde_hw_blk_reg_map *c; struct sde_ctl_mixer_cfg cfg = { 0 }; @@ -964,8 +965,9 @@ static void sde_hw_ctl_setup_blendstage(struct sde_hw_ctl *ctx, if (stage_cfg) _sde_hw_ctl_get_mixer_cfg(ctx, stage_cfg, stages, &cfg); - if ((!cfg.cfg && !cfg.ext && !cfg.ext2 && !cfg.ext3) || - (stage_cfg && !stage_cfg->stage[0][0])) + if (!disable_border && + ((!cfg.cfg && !cfg.ext && !cfg.ext2 && !cfg.ext3) || + (stage_cfg && !stage_cfg->stage[0][0]))) cfg.cfg |= CTL_MIXER_BORDER_OUT; SDE_REG_WRITE(c, CTL_LAYER(lm), cfg.cfg); diff --git a/msm/sde/sde_hw_ctl.h b/msm/sde/sde_hw_ctl.h index 78522cde33..1ea29dad48 100644 --- a/msm/sde/sde_hw_ctl.h +++ b/msm/sde/sde_hw_ctl.h @@ -423,12 +423,14 @@ struct sde_hw_ctl_ops { /** * Configure layer mixer to pipe configuration - * @ctx : ctl path ctx pointer - * @lm : layer mixer enumeration - * @cfg : blend stage configuration + * @ctx : ctl path ctx pointer + * @lm : layer mixer enumeration + * @cfg : blend stage configuration + * @disable_border: if true disable border, else enable border out */ void (*setup_blendstage)(struct sde_hw_ctl *ctx, - enum sde_lm lm, struct sde_hw_stage_cfg *cfg); + enum sde_lm lm, struct sde_hw_stage_cfg *cfg, + bool disable_border); /** * Get all the sspp staged on a layer mixer