Просмотр исходного кода

Merge "disp: msm: fix re-entry problem for msm_atomic_commit"

qctecmdr 5 лет назад
Родитель
Сommit
c0a6abefe7
2 измененных файлов с 8 добавлено и 1 удалено
  1. 7 1
      msm/msm_atomic.c
  2. 1 0
      msm/msm_drv.h

+ 7 - 1
msm/msm_atomic.c

@@ -28,6 +28,7 @@ struct msm_commit {
 	struct drm_device *dev;
 	struct drm_atomic_state *state;
 	uint32_t crtc_mask;
+	uint32_t plane_mask;
 	bool nonblock;
 	struct kthread_work commit_work;
 };
@@ -104,11 +105,13 @@ static void commit_destroy(struct msm_commit *c)
 {
 	struct msm_drm_private *priv = c->dev->dev_private;
 	uint32_t crtc_mask = c->crtc_mask;
+	uint32_t plane_mask = c->plane_mask;
 
 	/* End_atomic */
 	spin_lock(&priv->pending_crtcs_event.lock);
 	DBG("end: %08x", crtc_mask);
 	priv->pending_crtcs &= ~crtc_mask;
+	priv->pending_planes &= ~plane_mask;
 	wake_up_all_locked(&priv->pending_crtcs_event);
 	spin_unlock(&priv->pending_crtcs_event.lock);
 
@@ -715,6 +718,7 @@ int msm_atomic_commit(struct drm_device *dev,
 
 			drm_atomic_set_fence_for_plane(new_plane_state, fence);
 		}
+		c->plane_mask |= (1 << drm_plane_index(plane));
 	}
 
 	/*
@@ -725,10 +729,12 @@ int msm_atomic_commit(struct drm_device *dev,
 	/* Start Atomic */
 	spin_lock(&priv->pending_crtcs_event.lock);
 	ret = wait_event_interruptible_locked(priv->pending_crtcs_event,
-			!(priv->pending_crtcs & c->crtc_mask));
+			!(priv->pending_crtcs & c->crtc_mask) &&
+			!(priv->pending_planes & c->plane_mask));
 	if (ret == 0) {
 		DBG("start: %08x", c->crtc_mask);
 		priv->pending_crtcs |= c->crtc_mask;
+		priv->pending_planes |= c->plane_mask;
 	}
 	spin_unlock(&priv->pending_crtcs_event.lock);
 

+ 1 - 0
msm/msm_drv.h

@@ -631,6 +631,7 @@ struct msm_drm_private {
 
 	/* crtcs pending async atomic updates: */
 	uint32_t pending_crtcs;
+	uint32_t pending_planes;
 	wait_queue_head_t pending_crtcs_event;
 
 	unsigned int num_planes;