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 <anajahi@codeaurora.org>
这个提交包含在:
@@ -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;
|
||||
|
在新工单中引用
屏蔽一个用户