Răsfoiți Sursa

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 ani în urmă
părinte
comite
b7117d4b07
1 a modificat fișierele cu 95 adăugiri și 51 ștergeri
  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;