|
@@ -543,92 +543,136 @@ static int sde_hw_rc_check_mask_cfg(
|
|
int rc = 0;
|
|
int rc = 0;
|
|
u32 i = 0;
|
|
u32 i = 0;
|
|
u32 half_panel_width;
|
|
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) {
|
|
if (!hw_dspp || !hw_cfg || !rc_mask_cfg) {
|
|
SDE_ERROR("invalid arguments\n");
|
|
SDE_ERROR("invalid arguments\n");
|
|
return -EINVAL;
|
|
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);
|
|
|
|
- return -EINVAL;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (rc_mask_cfg->cfg_param_07 + rc_mask_cfg->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,
|
|
|
|
- hw_dspp->cap->sblk->rc.mem_total_size);
|
|
|
|
|
|
+ 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;
|
|
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_08 > RC_DATA_SIZE_MAX) {
|
|
|
|
+ SDE_ERROR("invalid cfg_param_08:%d\n", cfg_param_08);
|
|
return -EINVAL;
|
|
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);
|
|
|
|
|
|
+ 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",
|
|
|
|
+ cfg_param_08, cfg_param_07,
|
|
|
|
+ hw_dspp->cap->sblk->rc.mem_total_size);
|
|
return -EINVAL;
|
|
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);
|
|
|
|
|
|
+ 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;
|
|
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,
|
|
SDE_ERROR("invalid cfg_param_04[%d]:%d\n", i,
|
|
- rc_mask_cfg->cfg_param_04[i]);
|
|
|
|
|
|
+ cfg_param_04[i]);
|
|
return -EINVAL;
|
|
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",
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
return rc;
|