Эх сурвалжийг харах

disp: msm: sde: remove vblank cache logic

Userspace is not supposed to request vblank until crtc is enabled,
because drm framework rejects the request if crtc is not enabled.
Any vblank request prior to that need to be cached in the userspace.
Hence removing the cache logic from the downstream driver.

Change-Id: I5383e39075377e3e49b8d335598ddfa48ab54666
Signed-off-by: Lakshmi Narayana Kalavala <[email protected]>
Lakshmi Narayana Kalavala 6 жил өмнө
parent
commit
e6754ef40a
2 өөрчлөгдсөн 11 нэмэгдсэн , 44 устгасан
  1. 11 42
      msm/sde/sde_crtc.c
  2. 0 2
      msm/sde/sde_crtc.h

+ 11 - 42
msm/sde/sde_crtc.c

@@ -3649,7 +3649,6 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc,
 static int _sde_crtc_vblank_enable_no_lock(
 		struct sde_crtc *sde_crtc, bool enable)
 {
-	struct drm_device *dev;
 	struct drm_crtc *crtc;
 	struct drm_encoder *enc;
 
@@ -3659,7 +3658,6 @@ static int _sde_crtc_vblank_enable_no_lock(
 	}
 
 	crtc = &sde_crtc->base;
-	dev = crtc->dev;
 
 	if (enable) {
 		int ret;
@@ -3671,27 +3669,27 @@ static int _sde_crtc_vblank_enable_no_lock(
 		if (ret)
 			return ret;
 
-		list_for_each_entry(enc, &dev->mode_config.encoder_list, head) {
+		drm_for_each_encoder_mask(enc, crtc->dev,
+			crtc->state->encoder_mask) {
 			if (enc->crtc != crtc)
 				continue;
 
 			SDE_EVT32(DRMID(&sde_crtc->base), DRMID(enc), enable,
 					sde_crtc->enabled,
-					sde_crtc->suspend,
-					sde_crtc->vblank_requested);
+					sde_crtc->suspend);
 
 			sde_encoder_register_vblank_callback(enc,
 					sde_crtc_vblank_cb, (void *)crtc);
 		}
 	} else {
-		list_for_each_entry(enc, &dev->mode_config.encoder_list, head) {
+		drm_for_each_encoder_mask(enc, crtc->dev,
+			crtc->state->encoder_mask) {
 			if (enc->crtc != crtc)
 				continue;
 
 			SDE_EVT32(DRMID(&sde_crtc->base), DRMID(enc), enable,
 					sde_crtc->enabled,
-					sde_crtc->suspend,
-					sde_crtc->vblank_requested);
+					sde_crtc->suspend);
 
 			sde_encoder_register_vblank_callback(enc, NULL, NULL);
 		}
@@ -3715,7 +3713,6 @@ static void _sde_crtc_set_suspend(struct drm_crtc *crtc, bool enable)
 	struct sde_crtc *sde_crtc;
 	struct msm_drm_private *priv;
 	struct sde_kms *sde_kms;
-	int ret = 0;
 
 	if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
 		SDE_ERROR("invalid crtc\n");
@@ -3740,16 +3737,10 @@ static void _sde_crtc_set_suspend(struct drm_crtc *crtc, bool enable)
 	 * and take it back during resume (if it is still enabled).
 	 */
 	SDE_EVT32(DRMID(&sde_crtc->base), enable, sde_crtc->enabled,
-			sde_crtc->suspend, sde_crtc->vblank_requested);
+			sde_crtc->suspend);
 	if (sde_crtc->suspend == enable)
 		SDE_DEBUG("crtc%d suspend already set to %d, ignoring update\n",
 				crtc->base.id, enable);
-	else if (sde_crtc->enabled && sde_crtc->vblank_requested) {
-		ret = _sde_crtc_vblank_enable_no_lock(sde_crtc, !enable);
-		if (ret)
-			SDE_ERROR("%s vblank enable failed: %d\n",
-					sde_crtc->name, ret);
-	}
 
 	sde_crtc->suspend = enable;
 	mutex_unlock(&sde_crtc->crtc_lock);
@@ -3809,14 +3800,11 @@ static void sde_crtc_reset(struct drm_crtc *crtc)
 	}
 
 	/* revert suspend actions, if necessary */
-	if (sde_kms_is_suspend_state(crtc->dev)) {
-		_sde_crtc_set_suspend(crtc, false);
-
-		if (!sde_crtc_is_reset_required(crtc)) {
+	if (sde_kms_is_suspend_state(crtc->dev) &&
+		 !sde_crtc_is_reset_required(crtc)) {
 			SDE_DEBUG("avoiding reset for crtc:%d\n",
 					crtc->base.id);
 			return;
-		}
 	}
 
 	/* remove previous state, if present */
@@ -4025,15 +4013,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
 	_sde_crtc_flush_event_thread(crtc);
 
 	SDE_EVT32(DRMID(crtc), sde_crtc->enabled, sde_crtc->suspend,
-			sde_crtc->vblank_requested,
 			crtc->state->active, crtc->state->enable);
-	if (sde_crtc->enabled && !sde_crtc->suspend &&
-			sde_crtc->vblank_requested) {
-		ret = _sde_crtc_vblank_enable_no_lock(sde_crtc, false);
-		if (ret)
-			SDE_ERROR("%s vblank enable failed: %d\n",
-					sde_crtc->name, ret);
-	}
 	sde_crtc->enabled = false;
 
 	/* Try to disable uidle */
@@ -4145,8 +4125,7 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
 	drm_crtc_vblank_on(crtc);
 
 	mutex_lock(&sde_crtc->crtc_lock);
-	SDE_EVT32(DRMID(crtc), sde_crtc->enabled, sde_crtc->suspend,
-			sde_crtc->vblank_requested);
+	SDE_EVT32(DRMID(crtc), sde_crtc->enabled, sde_crtc->suspend);
 
 	/*
 	 * Try to enable uidle (if possible), we do this before the call
@@ -4173,13 +4152,6 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
 				sde_crtc_frame_event_cb, crtc);
 	}
 
-	if (!sde_crtc->enabled && !sde_crtc->suspend &&
-			sde_crtc->vblank_requested) {
-		ret = _sde_crtc_vblank_enable_no_lock(sde_crtc, true);
-		if (ret)
-			SDE_ERROR("%s vblank enable failed: %d\n",
-					sde_crtc->name, ret);
-	}
 	sde_crtc->enabled = true;
 
 	/* update color processing on resume */
@@ -4772,14 +4744,13 @@ int sde_crtc_vblank(struct drm_crtc *crtc, bool en)
 
 	mutex_lock(&sde_crtc->crtc_lock);
 	SDE_EVT32(DRMID(&sde_crtc->base), en, sde_crtc->enabled,
-			sde_crtc->suspend, sde_crtc->vblank_requested);
+			sde_crtc->suspend);
 	if (sde_crtc->enabled && !sde_crtc->suspend) {
 		ret = _sde_crtc_vblank_enable_no_lock(sde_crtc, en);
 		if (ret)
 			SDE_ERROR("%s vblank enable failed: %d\n",
 					sde_crtc->name, ret);
 	}
-	sde_crtc->vblank_requested = en;
 	mutex_unlock(&sde_crtc->crtc_lock);
 
 	return 0;
@@ -5492,8 +5463,6 @@ static int _sde_debugfs_status_show(struct seq_file *s, void *data)
 		sde_crtc->vblank_cb_time = ktime_set(0, 0);
 	}
 
-	seq_printf(s, "vblank_enable:%d\n", sde_crtc->vblank_requested);
-
 	mutex_unlock(&sde_crtc->crtc_lock);
 
 	return 0;

+ 0 - 2
msm/sde/sde_crtc.h

@@ -224,7 +224,6 @@ struct sde_crtc_misr_info {
  * @vblank_last_cb_time  : ktime at last vblank notification
  * @sysfs_dev  : sysfs device node for crtc
  * @vsync_event_sf : vsync event notifier sysfs device
- * @vblank_requested : whether the user has requested vblank events
  * @suspend         : whether or not a suspend operation is in progress
  * @enabled       : whether the SDE CRTC is currently enabled. updated in the
  *                  commit-thread, not state-swap time which is earlier, so
@@ -294,7 +293,6 @@ struct sde_crtc {
 	struct sde_crtc_fps_info fps_info;
 	struct device *sysfs_dev;
 	struct kernfs_node *vsync_event_sf;
-	bool vblank_requested;
 	bool suspend;
 	bool enabled;