浏览代码

Merge "disp: msm: sde: add snapshot of SDE from 4.14 to 4.19"

qctecmdr 6 年之前
父节点
当前提交
13a11e75b0
共有 5 个文件被更改,包括 41 次插入10 次删除
  1. 6 3
      msm/sde/sde_core_irq.c
  2. 23 1
      msm/sde/sde_crtc.c
  3. 8 4
      msm/sde/sde_encoder.c
  4. 2 1
      msm/sde/sde_hw_reg_dma_v1_color_proc.c
  5. 2 1
      msm/sde/sde_hw_sspp.c

+ 6 - 3
msm/sde/sde_core_irq.c

@@ -475,9 +475,12 @@ void sde_core_irq_preinstall(struct sde_kms *sde_kms)
 		return;
 
 	for (i = 0; i < sde_kms->irq_obj.total_irqs; i++) {
-		INIT_LIST_HEAD(&sde_kms->irq_obj.irq_cb_tbl[i]);
-		atomic_set(&sde_kms->irq_obj.enable_counts[i], 0);
-		atomic_set(&sde_kms->irq_obj.irq_counts[i], 0);
+		if (sde_kms->irq_obj.irq_cb_tbl)
+			INIT_LIST_HEAD(&sde_kms->irq_obj.irq_cb_tbl[i]);
+		if (sde_kms->irq_obj.enable_counts)
+			atomic_set(&sde_kms->irq_obj.enable_counts[i], 0);
+		if (sde_kms->irq_obj.irq_counts)
+			atomic_set(&sde_kms->irq_obj.irq_counts[i], 0);
 	}
 }
 

+ 23 - 1
msm/sde/sde_crtc.c

@@ -4562,8 +4562,10 @@ static int sde_crtc_atomic_check(struct drm_crtc *crtc,
 	struct sde_crtc *sde_crtc;
 	struct plane_state *pstates = NULL;
 	struct sde_crtc_state *cstate;
+	const struct drm_plane_state *pstate;
+	struct drm_plane *plane;
 	struct drm_display_mode *mode;
-	int rc = 0;
+	int mixer_height, mixer_width, rc = 0;
 	struct sde_multirect_plane_states *multirect_plane = NULL;
 	struct drm_connector *conn;
 	struct drm_connector_list_iter conn_iter;
@@ -4620,6 +4622,26 @@ static int sde_crtc_atomic_check(struct drm_crtc *crtc,
 		}
 	drm_connector_list_iter_end(&conn_iter);
 
+	mixer_width = sde_crtc_get_mixer_width(sde_crtc, cstate, mode);
+	mixer_height = sde_crtc_get_mixer_height(sde_crtc, cstate, mode);
+
+	if (cstate->num_ds_enabled) {
+		if (!state->state)
+			goto end;
+
+		drm_atomic_crtc_state_for_each_plane_state(plane,
+							pstate, state) {
+			if ((pstate->crtc_h > mixer_height) ||
+					(pstate->crtc_w > mixer_width)) {
+				SDE_ERROR("plane w/h:%x*%x > mixer w/h:%x*%x\n",
+					pstate->crtc_w, pstate->crtc_h,
+					mixer_width, mixer_height);
+				return -E2BIG;
+				goto end;
+			}
+		}
+	}
+
 	_sde_crtc_setup_is_ppsplit(state);
 	_sde_crtc_setup_lm_bounds(crtc, state);
 

+ 8 - 4
msm/sde/sde_encoder.c

@@ -3099,9 +3099,13 @@ void sde_encoder_virt_restore(struct drm_encoder *drm_enc)
 
 	sde_enc = to_sde_encoder_virt(drm_enc);
 
-	if (sde_enc->cur_master)
-		memset(&sde_enc->cur_master->intf_cfg_v1, 0,
-				sizeof(sde_enc->cur_master->intf_cfg_v1));
+	if (!sde_enc->cur_master) {
+		SDE_ERROR("virt encoder has no master\n");
+		return;
+	}
+
+	memset(&sde_enc->cur_master->intf_cfg_v1, 0,
+			sizeof(sde_enc->cur_master->intf_cfg_v1));
 	sde_enc->idle_pc_restore = true;
 
 	for (i = 0; i < sde_enc->num_phys_encs; i++) {
@@ -3117,7 +3121,7 @@ void sde_encoder_virt_restore(struct drm_encoder *drm_enc)
 			phys->ops.restore(phys);
 	}
 
-	if (sde_enc->cur_master && sde_enc->cur_master->ops.restore)
+	if (sde_enc->cur_master->ops.restore)
 		sde_enc->cur_master->ops.restore(sde_enc->cur_master);
 
 	_sde_encoder_virt_enable_helper(drm_enc);

+ 2 - 1
msm/sde/sde_hw_reg_dma_v1_color_proc.c

@@ -2764,13 +2764,14 @@ void reg_dmav1_setup_scaler3_lut(struct sde_reg_dma_setup_ops_cfg *buf,
 				+ off_tbl[filter][i][1];
 			lut_len = off_tbl[filter][i][0] << 2;
 			REG_DMA_SETUP_OPS(*buf, lut_addr,
-				&lut[filter][0], lut_len * sizeof(u32),
+				&lut[filter][lut_offset], lut_len * sizeof(u32),
 				REG_BLK_WRITE_SINGLE, 0, 0, 0);
 			rc = dma_ops->setup_payload(buf);
 			if (rc) {
 				DRM_ERROR("lut write failed ret %d\n", rc);
 				return;
 			}
+			lut_offset += lut_len;
 		}
 	}
 

+ 2 - 1
msm/sde/sde_hw_sspp.c

@@ -158,11 +158,12 @@ static inline int _sspp_subblk_offset(struct sde_hw_pipe *ctx,
 		u32 *idx)
 {
 	int rc = 0;
-	const struct sde_sspp_sub_blks *sblk = ctx->cap->sblk;
+	const struct sde_sspp_sub_blks *sblk;
 
 	if (!ctx)
 		return -EINVAL;
 
+	sblk = ctx->cap->sblk;
 	switch (s_id) {
 	case SDE_SSPP_SRC:
 		*idx = sblk->src_blk.base;