浏览代码

Merge "disp: msm: sde: fix RC single region use case"

qctecmdr 5 年之前
父节点
当前提交
3bae91f587
共有 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;