disp: msm: sde: fix dcwb idx selection for pp_dither and CTL blocks

When cwb is triggered on built-in display secondary display
with (1,1,1) topology, improper dcwb_idx value is passed
to pp_dither and CTL registers. This change populates proper
dcwb_idx during pp block dt parsing and passes the same for
programming.

Change-Id: I543eede6f5fd9c2c80799503e3639ea9e89058ca
Signed-off-by: Mahadevan <quic_mahap@quicinc.com>
This commit is contained in:
Mahadevan
2022-02-16 23:49:28 +05:30
parent 887b222de9
commit 6bb958c88b
5 changed files with 18 additions and 6 deletions

View File

@@ -551,6 +551,7 @@ static void _sde_encoder_phys_wb_setup_cwb(struct sde_encoder_phys *phys_enc, bo
struct sde_hw_pingpong *hw_pp = phys_enc->hw_pp; struct sde_hw_pingpong *hw_pp = phys_enc->hw_pp;
struct sde_hw_dnsc_blur *hw_dnsc_blur = phys_enc->hw_dnsc_blur; struct sde_hw_dnsc_blur *hw_dnsc_blur = phys_enc->hw_dnsc_blur;
bool need_merge = (crtc->num_mixers > 1); bool need_merge = (crtc->num_mixers > 1);
enum sde_dcwb;
int i = 0; int i = 0;
const int num_wb = 1; const int num_wb = 1;
@@ -575,10 +576,13 @@ static void _sde_encoder_phys_wb_setup_cwb(struct sde_encoder_phys *phys_enc, bo
intf_cfg.wb_count = num_wb; intf_cfg.wb_count = num_wb;
intf_cfg.wb[0] = hw_wb->idx; intf_cfg.wb[0] = hw_wb->idx;
for (i = 0; i < crtc->num_mixers; i++) for (i = 0; i < crtc->num_mixers; i++) {
intf_cfg.cwb[intf_cfg.cwb_count++] = (enum sde_cwb) if (test_bit(SDE_WB_DCWB_CTRL, &hw_wb->caps->features))
(test_bit(SDE_WB_DCWB_CTRL, &hw_wb->caps->features) ? intf_cfg.cwb[intf_cfg.cwb_count++] =
((hw_pp->idx % 2) + i) : (hw_pp->idx + i)); (enum sde_cwb)(hw_pp->dcwb_idx + i);
else
intf_cfg.cwb[intf_cfg.cwb_count++] = (enum sde_cwb)(hw_pp->idx + i);
}
if (hw_pp->merge_3d && (intf_cfg.merge_3d_count < if (hw_pp->merge_3d && (intf_cfg.merge_3d_count <
MAX_MERGE_3D_PER_CTL_V1) && need_merge) MAX_MERGE_3D_PER_CTL_V1) && need_merge)
@@ -1275,7 +1279,7 @@ static void _sde_encoder_phys_wb_update_cwb_flush(struct sde_encoder_phys *phys_
struct sde_hw_dnsc_blur *hw_dnsc_blur; struct sde_hw_dnsc_blur *hw_dnsc_blur;
struct sde_crtc *crtc; struct sde_crtc *crtc;
struct sde_crtc_state *crtc_state; struct sde_crtc_state *crtc_state;
int i = 0, cwb_capture_mode = 0; int cwb_capture_mode = 0;
enum sde_cwb cwb_idx = 0; enum sde_cwb cwb_idx = 0;
enum sde_dcwb dcwb_idx = 0; enum sde_dcwb dcwb_idx = 0;
enum sde_cwb src_pp_idx = 0; enum sde_cwb src_pp_idx = 0;
@@ -1312,7 +1316,7 @@ static void _sde_encoder_phys_wb_update_cwb_flush(struct sde_encoder_phys *phys_
need_merge = (crtc->num_mixers > 1) ? true : false; need_merge = (crtc->num_mixers > 1) ? true : false;
if (test_bit(SDE_WB_DCWB_CTRL, &hw_wb->caps->features)) { if (test_bit(SDE_WB_DCWB_CTRL, &hw_wb->caps->features)) {
dcwb_idx = (enum sde_dcwb) ((hw_pp->idx % 2) + i); dcwb_idx = hw_pp->dcwb_idx;
if ((dcwb_idx + crtc->num_mixers) > DCWB_MAX) { if ((dcwb_idx + crtc->num_mixers) > DCWB_MAX) {
SDE_ERROR("[enc:%d, wb:%d] invalid DCWB config; dcwb=%d, num_lm=%d\n", SDE_ERROR("[enc:%d, wb:%d] invalid DCWB config; dcwb=%d, num_lm=%d\n",
DRMID(phys_enc->parent), WBID(wb_enc), dcwb_idx, crtc->num_mixers); DRMID(phys_enc->parent), WBID(wb_enc), dcwb_idx, crtc->num_mixers);

View File

@@ -3885,6 +3885,7 @@ static int sde_pp_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg)
if (test_bit(SDE_FEATURE_DEDICATED_CWB, sde_cfg->features)) if (test_bit(SDE_FEATURE_DEDICATED_CWB, sde_cfg->features))
sde_cfg->dcwb_count++; sde_cfg->dcwb_count++;
} }
pp->dcwb_id = (sde_cfg->dcwb_count > 0) ? sde_cfg->dcwb_count : DCWB_MAX;
if (major_version < SDE_HW_MAJOR(SDE_HW_VER_700)) { if (major_version < SDE_HW_MAJOR(SDE_HW_VER_700)) {
sblk->dsc.base = PROP_VALUE_ACCESS(prop_value, sblk->dsc.base = PROP_VALUE_ACCESS(prop_value,

View File

@@ -1353,11 +1353,13 @@ struct sde_ds_cfg {
* @features bit mask identifying sub-blocks/features * @features bit mask identifying sub-blocks/features
* @sblk sub-blocks information * @sblk sub-blocks information
* @merge_3d_id merge_3d block id * @merge_3d_id merge_3d block id
* @dcwb: ID of DCWB, DCWB_MAX if invalid
*/ */
struct sde_pingpong_cfg { struct sde_pingpong_cfg {
SDE_HW_BLK_INFO; SDE_HW_BLK_INFO;
const struct sde_pingpong_sub_blks *sblk; const struct sde_pingpong_sub_blks *sblk;
int merge_3d_id; int merge_3d_id;
u32 dcwb_id;
}; };
/** /**

View File

@@ -515,6 +515,7 @@ struct sde_hw_blk_reg_map *sde_hw_pingpong_init(enum sde_pingpong idx,
c->idx = idx; c->idx = idx;
c->caps = cfg; c->caps = cfg;
c->dcwb_idx = cfg->dcwb_id;
if (test_bit(SDE_PINGPONG_MERGE_3D, &cfg->features)) { if (test_bit(SDE_PINGPONG_MERGE_3D, &cfg->features)) {
c->merge_3d = _sde_pp_merge_3d_init(cfg->merge_3d_id, addr, m); c->merge_3d = _sde_pp_merge_3d_init(cfg->merge_3d_id, addr, m);
if (IS_ERR(c->merge_3d)) { if (IS_ERR(c->merge_3d)) {

View File

@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
/* /*
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
*/ */
@@ -163,6 +164,9 @@ struct sde_hw_pingpong {
enum sde_pingpong idx; enum sde_pingpong idx;
const struct sde_pingpong_cfg *caps; const struct sde_pingpong_cfg *caps;
/* associated dcwb idx */
enum sde_dcwb dcwb_idx;
/* associated 3d_merge */ /* associated 3d_merge */
struct sde_hw_merge_3d *merge_3d; struct sde_hw_merge_3d *merge_3d;