From b7117d4b0748c47f6c961ad1b8047b687f0180dc Mon Sep 17 00:00:00 2001 From: Amine Najahi Date: Wed, 22 Jul 2020 15:51:42 -0400 Subject: [PATCH] disp: msm: sde: fix RC single region use case Fix rounded corner single region use case where input parameters are valid only for the region to be programmed. Consequently, the other region must be disabled and atomic check requirements can be relaxed. Change-Id: I84f213f2c34f7cceb10c54bbba68fa7b0e16caf2 Signed-off-by: Amine Najahi --- msm/sde/sde_hw_rc.c | 146 ++++++++++++++++++++++++++++---------------- 1 file changed, 95 insertions(+), 51 deletions(-) diff --git a/msm/sde/sde_hw_rc.c b/msm/sde/sde_hw_rc.c index 8957eef8fa..85beea4887 100644 --- a/msm/sde/sde_hw_rc.c +++ b/msm/sde/sde_hw_rc.c @@ -543,92 +543,136 @@ static int sde_hw_rc_check_mask_cfg( int rc = 0; u32 i = 0; u32 half_panel_width; + u64 flags; + u32 cfg_param_01, cfg_param_02, cfg_param_03; + u32 cfg_param_07, cfg_param_08; + u32 *cfg_param_04, *cfg_param_05, *cfg_param_06; + bool r1_enable, r2_enable; if (!hw_dspp || !hw_cfg || !rc_mask_cfg) { SDE_ERROR("invalid arguments\n"); return -EINVAL; } - if (!rc_mask_cfg->cfg_param_08 || - rc_mask_cfg->cfg_param_08 > RC_DATA_SIZE_MAX) { - SDE_ERROR("invalid cfg_param_08:%d\n", - rc_mask_cfg->cfg_param_08); + flags = rc_mask_cfg->flags; + cfg_param_01 = rc_mask_cfg->cfg_param_01; + cfg_param_02 = rc_mask_cfg->cfg_param_02; + cfg_param_03 = rc_mask_cfg->cfg_param_03; + cfg_param_04 = rc_mask_cfg->cfg_param_04; + cfg_param_05 = rc_mask_cfg->cfg_param_05; + cfg_param_06 = rc_mask_cfg->cfg_param_06; + cfg_param_07 = rc_mask_cfg->cfg_param_07; + cfg_param_08 = rc_mask_cfg->cfg_param_08; + r1_enable = ((flags & SDE_HW_RC_DISABLE_R1) == SDE_HW_RC_DISABLE_R1) ? + false : true; + r2_enable = ((flags & SDE_HW_RC_DISABLE_R2) == SDE_HW_RC_DISABLE_R2) ? + false : true; + + if (cfg_param_07 > hw_dspp->cap->sblk->rc.mem_total_size) { + SDE_ERROR("invalid cfg_param_07:%d\n", cfg_param_07); return -EINVAL; } - if (rc_mask_cfg->cfg_param_07 + rc_mask_cfg->cfg_param_08 > + if (cfg_param_08 > RC_DATA_SIZE_MAX) { + SDE_ERROR("invalid cfg_param_08:%d\n", cfg_param_08); + return -EINVAL; + } + + if ((cfg_param_07 + cfg_param_08) > hw_dspp->cap->sblk->rc.mem_total_size) { SDE_ERROR("invalid cfg_param_08:%d, cfg_param_07:%d, max:%u\n", - rc_mask_cfg->cfg_param_08, - rc_mask_cfg->cfg_param_07, + cfg_param_08, cfg_param_07, hw_dspp->cap->sblk->rc.mem_total_size); return -EINVAL; } - if (!rc_mask_cfg->cfg_param_03 || - (rc_mask_cfg->cfg_param_03 != RC_PARAM_A1 && - rc_mask_cfg->cfg_param_03 != RC_PARAM_A0)) { - SDE_ERROR("invalid cfg_param_03:%d\n", - rc_mask_cfg->cfg_param_03); + if (!(cfg_param_03 == RC_PARAM_A1 || cfg_param_03 == RC_PARAM_A0)) { + SDE_ERROR("invalid cfg_param_03:%d\n", cfg_param_03); return -EINVAL; } - if ((rc_mask_cfg->cfg_param_01 < 1) || - ((hw_cfg->displayv - rc_mask_cfg->cfg_param_02) < 1)) { - SDE_ERROR("invalid min cfg_param_01:%d or cfg_param_02:%d\n", - rc_mask_cfg->cfg_param_01, - rc_mask_cfg->cfg_param_02); - return -EINVAL; - } - - if (rc_mask_cfg->cfg_param_01 > rc_mask_cfg->cfg_param_02) { - SDE_ERROR("invalid cfg_param_01:%d or cfg_param_02:%d\n", - rc_mask_cfg->cfg_param_01, - rc_mask_cfg->cfg_param_02); - return -EINVAL; - } - - for (i = 0; i < rc_mask_cfg->cfg_param_03; i++) { - if (rc_mask_cfg->cfg_param_04[i] < 4) { + for (i = 0; i < cfg_param_03; i++) { + if (cfg_param_04[i] < 4) { SDE_ERROR("invalid cfg_param_04[%d]:%d\n", i, - rc_mask_cfg->cfg_param_04[i]); + cfg_param_04[i]); return -EINVAL; } } - half_panel_width = hw_cfg->displayh / rc_mask_cfg->cfg_param_03 * 2; - for (i = 0; i < rc_mask_cfg->cfg_param_03; i += 2) { - if (rc_mask_cfg->cfg_param_04[i] + - rc_mask_cfg->cfg_param_04[i+1] != - half_panel_width) { + half_panel_width = hw_cfg->displayh / cfg_param_03 * 2; + for (i = 0; i < cfg_param_03; i += 2) { + if (cfg_param_04[i] + cfg_param_04[i+1] != half_panel_width) { SDE_ERROR("invalid ratio [%d]:%d, [%d]:%d, %d\n", - i, - rc_mask_cfg->cfg_param_04[i], - i+1, - rc_mask_cfg->cfg_param_04[i+1], - half_panel_width); + i, cfg_param_04[i], i+1, + cfg_param_04[i+1], half_panel_width); return -EINVAL; } } - for (i = 0; i < rc_mask_cfg->cfg_param_03 - 1; i++) { - if (rc_mask_cfg->cfg_param_05[i] >= - rc_mask_cfg->cfg_param_05[i+1]) { - SDE_ERROR("invalid cfg_param_05 overlap %d, %d\n", - rc_mask_cfg->cfg_param_05[i], - rc_mask_cfg->cfg_param_05[i+1]); + if (r1_enable && r2_enable) { + if (cfg_param_01 > cfg_param_02) { + SDE_ERROR("invalid cfg_param_01:%d, cfg_param_02:%d\n", + cfg_param_01, cfg_param_02); return -EINVAL; } + } else { + SDE_DEBUG("R1 or R2 disabled, skip overlap check"); } - for (i = 0; i < rc_mask_cfg->cfg_param_03; i++) { - if (rc_mask_cfg->cfg_param_05[i] > - RC_DATA_SIZE_MAX) { - SDE_ERROR("invalid cfg_param_05[%d]:%d\n", i, - rc_mask_cfg->cfg_param_05[i]); + if (r1_enable) { + if (cfg_param_01 < 1) { + SDE_ERROR("invalid min cfg_param_01:%d\n", + cfg_param_01); return -EINVAL; } + for (i = 0; i < cfg_param_03 - 1; i++) { + if (cfg_param_05[i] >= cfg_param_05[i+1]) { + SDE_ERROR("invalid cfg_param_05 %d, %d\n", + cfg_param_05[i], + cfg_param_05[i+1]); + return -EINVAL; + } + } + + for (i = 0; i < cfg_param_03; i++) { + if (cfg_param_05[i] > RC_DATA_SIZE_MAX) { + SDE_ERROR("invalid cfg_param_05[%d]:%d\n", i, + cfg_param_05[i]); + return -EINVAL; + } + + } + } else { + SDE_DEBUG("R1 is disabled, skip parameter checks\n"); + } + + if (r2_enable) { + if ((hw_cfg->displayv - cfg_param_02) < 1) { + SDE_ERROR("invalid max cfg_param_02:%d\n", + cfg_param_02); + return -EINVAL; + } + + for (i = 0; i < cfg_param_03 - 1; i++) { + if (cfg_param_06[i] >= cfg_param_06[i+1]) { + SDE_ERROR("invalid cfg_param_06 %d, %d\n", + cfg_param_06[i], + cfg_param_06[i+1]); + return -EINVAL; + } + } + + for (i = 0; i < cfg_param_03; i++) { + if (cfg_param_06[i] > RC_DATA_SIZE_MAX) { + SDE_ERROR("invalid cfg_param_06[%d]:%d\n", i, + cfg_param_06[i]); + return -EINVAL; + } + + } + } else { + SDE_DEBUG("R2 is disabled, skip parameter checks\n"); } return rc;