Browse Source

disp: msm: sde: remove vblank support for writeback

Avoid drm vblank on/off for virtual displays to allow drm framework to
ignore the vblank requests. Vblanks are unnecessary for writeback as it
is triggered based on the frame-updates and not on any defined interval.
In addition, avoid vblank callback registration for concurrent writeback
encoder.

Change-Id: I205734e2e3076469dc7f775566cf5e104bac4082
Signed-off-by: Veera Sundaram Sankaran <[email protected]>
Veera Sundaram Sankaran 4 năm trước cách đây
mục cha
commit
30d5ac5184
3 tập tin đã thay đổi với 24 bổ sung21 xóa
  1. 22 14
      msm/sde/sde_crtc.c
  2. 2 6
      msm/sde/sde_encoder.c
  3. 0 1
      msm/sde/sde_encoder_phys_wb.c

+ 22 - 14
msm/sde/sde_crtc.c

@@ -4133,25 +4133,23 @@ static int _sde_crtc_vblank_enable(
 			return ret;
 
 		mutex_lock(&sde_crtc->crtc_lock);
-		drm_for_each_encoder_mask(enc, crtc->dev,
-				sde_crtc->cached_encoder_mask) {
-			SDE_EVT32(DRMID(crtc), DRMID(enc));
+		drm_for_each_encoder_mask(enc, crtc->dev, sde_crtc->cached_encoder_mask) {
+			if (sde_encoder_in_clone_mode(enc))
+				continue;
 
-			sde_encoder_register_vblank_callback(enc,
-					sde_crtc_vblank_cb, (void *)crtc);
+			sde_encoder_register_vblank_callback(enc, sde_crtc_vblank_cb, (void *)crtc);
 		}
-
 		mutex_unlock(&sde_crtc->crtc_lock);
 	} else {
 		mutex_lock(&sde_crtc->crtc_lock);
-		drm_for_each_encoder_mask(enc, crtc->dev,
-				sde_crtc->cached_encoder_mask) {
-			SDE_EVT32(DRMID(crtc), DRMID(enc));
+		drm_for_each_encoder_mask(enc, crtc->dev, sde_crtc->cached_encoder_mask) {
+			if (sde_encoder_in_clone_mode(enc))
+				continue;
 
 			sde_encoder_register_vblank_callback(enc, NULL, NULL);
 		}
-
 		mutex_unlock(&sde_crtc->crtc_lock);
+
 		pm_runtime_put_sync(crtc->dev->dev);
 	}
 
@@ -4478,6 +4476,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
 	u32 power_on;
 	bool in_cont_splash = false;
 	int ret, i;
+	enum sde_intf_mode intf_mode;
 
 	if (!crtc || !crtc->dev || !crtc->dev->dev_private || !crtc->state) {
 		SDE_ERROR("invalid crtc\n");
@@ -4501,7 +4500,10 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
 
 	SDE_DEBUG("crtc%d\n", crtc->base.id);
 
-	drm_crtc_vblank_off(crtc);
+	/* avoid vblank on/off for virtual display */
+	intf_mode = sde_crtc_get_intf_mode(crtc, crtc->state);
+	if ((intf_mode != INTF_MODE_WB_BLOCK) && (intf_mode != INTF_MODE_WB_LINE))
+		drm_crtc_vblank_off(crtc);
 
 	mutex_lock(&sde_crtc->crtc_lock);
 	SDE_EVT32_VERBOSE(DRMID(crtc));
@@ -4609,6 +4611,7 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
 	int ret, i;
 	struct sde_crtc_state *cstate;
 	struct msm_display_mode *msm_mode;
+	enum sde_intf_mode intf_mode;
 
 	if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
 		SDE_ERROR("invalid crtc\n");
@@ -4633,9 +4636,14 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
 	if (!sde_crtc->enabled) {
 		/* cache the encoder mask now for vblank work */
 		sde_crtc->cached_encoder_mask = crtc->state->encoder_mask;
-		/* max possible vsync_cnt(atomic_t) soft counter */
-		drm_crtc_set_max_vblank_count(crtc, INT_MAX);
-		drm_crtc_vblank_on(crtc);
+
+		/* avoid vblank on/off for virtual display */
+		intf_mode = sde_crtc_get_intf_mode(crtc, crtc->state);
+		if ((intf_mode != INTF_MODE_WB_BLOCK) && (intf_mode != INTF_MODE_WB_LINE)) {
+			/* max possible vsync_cnt(atomic_t) soft counter */
+			drm_crtc_set_max_vblank_count(crtc, INT_MAX);
+			drm_crtc_vblank_on(crtc);
+		}
 	}
 
 	mutex_lock(&sde_crtc->crtc_lock);

+ 2 - 6
msm/sde/sde_encoder.c

@@ -3417,13 +3417,9 @@ void sde_encoder_register_vblank_callback(struct drm_encoder *drm_enc,
 		SDE_ERROR("invalid encoder\n");
 		return;
 	}
-	SDE_DEBUG_ENC(sde_enc, "\n");
-	SDE_EVT32(DRMID(drm_enc), enable);
 
-	if (sde_encoder_in_clone_mode(drm_enc)) {
-		SDE_EVT32(DRMID(drm_enc), SDE_EVTLOG_ERROR);
-		return;
-	}
+	SDE_DEBUG_ENC(sde_enc, "enable:%d\n", enable);
+	SDE_EVT32(DRMID(drm_enc), enable);
 
 	spin_lock_irqsave(&sde_enc->enc_spinlock, lock_flags);
 	sde_enc->crtc_vblank_cb = vbl_cb;

+ 0 - 1
msm/sde/sde_encoder_phys_wb.c

@@ -2049,7 +2049,6 @@ struct sde_encoder_phys *sde_encoder_phys_wb_init(
 	phys_enc->intf_mode = INTF_MODE_WB_LINE;
 	phys_enc->intf_idx = p->intf_idx;
 	phys_enc->enc_spinlock = p->enc_spinlock;
-	phys_enc->vblank_ctl_lock = p->vblank_ctl_lock;
 	atomic_set(&phys_enc->pending_retire_fence_cnt, 0);
 	init_waitqueue_head(&phys_enc->pending_kickoff_wq);
 	wb_cfg = wb_enc->hw_wb->caps;