Переглянути джерело

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 <[email protected]>
Amine Najahi 5 роки тому
батько
коміт
b7117d4b07
1 змінених файлів з 95 додано та 51 видалено
  1. 95 51
      msm/sde/sde_hw_rc.c

+ 95 - 51
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);
-		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;
 	}
 
-	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;
 	}
 
-	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;
 	}
 
-	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;
 	}
 
-	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;