diff mbox series

[SRU,I/raspi,04/10] Revert "drm: Introduce a drm_crtc_commit_wait helper"

Message ID 20211018155848.334053-5-juergh@canonical.com
State New
Headers show
Series HDMI output freezes under current/proposed impish kernels (LP: #1946368) | expand

Commit Message

Juerg Haefliger Oct. 18, 2021, 3:58 p.m. UTC
BugLink: https://bugs.launchpad.net/bugs/1946368

This reverts commit b99c2c95412c0b85accdafe9e32ba1e84d240f55.

Signed-off-by: Juerg Haefliger <juergh@canonical.com>
---
 drivers/gpu/drm/drm_atomic.c        | 39 ------------------
 drivers/gpu/drm/drm_atomic_helper.c | 61 ++++++++++++++++++++++++-----
 drivers/gpu/drm/vc4/vc4_kms.c       | 17 ++++++--
 include/drm/drm_atomic.h            |  4 --
 4 files changed, 65 insertions(+), 56 deletions(-)
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index dd9ed000ad4c..eb7d17332f64 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -52,45 +52,6 @@  void __drm_crtc_commit_free(struct kref *kref)
 }
 EXPORT_SYMBOL(__drm_crtc_commit_free);
 
-/**
- * drm_crtc_commit_wait - Waits for a commit to complete
- * @commit: &drm_crtc_commit to wait for
- *
- * Waits for a given &drm_crtc_commit to be programmed into the
- * hardware and flipped to.
- *
- * Returns:
- *
- * 0 on success, a negative error code otherwise.
- */
-int drm_crtc_commit_wait(struct drm_crtc_commit *commit)
-{
-	unsigned long timeout = 10 * HZ;
-	int ret;
-
-	if (!commit)
-		return 0;
-
-	ret = wait_for_completion_timeout(&commit->hw_done, timeout);
-	if (!ret) {
-		DRM_ERROR("hw_done timed out\n");
-		return -ETIMEDOUT;
-	}
-
-	/*
-	 * Currently no support for overwriting flips, hence
-	 * stall for previous one to execute completely.
-	 */
-	ret = wait_for_completion_timeout(&commit->flip_done, timeout);
-	if (!ret) {
-		DRM_ERROR("flip_done timed out\n");
-		return -ETIMEDOUT;
-	}
-
-	return 0;
-}
-EXPORT_SYMBOL(drm_crtc_commit_wait);
-
 /**
  * drm_atomic_state_default_release -
  * release memory initialized by drm_atomic_state_init
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index be6ce004277a..c98607ddbde6 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -2206,27 +2206,70 @@  void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *old_state)
 	struct drm_plane_state *old_plane_state;
 	struct drm_connector *conn;
 	struct drm_connector_state *old_conn_state;
+	struct drm_crtc_commit *commit;
 	int i;
 	long ret;
 
 	for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
-		ret = drm_crtc_commit_wait(old_crtc_state->commit);
-		if (ret)
-			DRM_ERROR("[CRTC:%d:%s] commit wait timed out\n",
+		commit = old_crtc_state->commit;
+
+		if (!commit)
+			continue;
+
+		ret = wait_for_completion_timeout(&commit->hw_done,
+						  10*HZ);
+		if (ret == 0)
+			DRM_ERROR("[CRTC:%d:%s] hw_done timed out\n",
+				  crtc->base.id, crtc->name);
+
+		/* Currently no support for overwriting flips, hence
+		 * stall for previous one to execute completely. */
+		ret = wait_for_completion_timeout(&commit->flip_done,
+						  10*HZ);
+		if (ret == 0)
+			DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
 				  crtc->base.id, crtc->name);
 	}
 
 	for_each_old_connector_in_state(old_state, conn, old_conn_state, i) {
-		ret = drm_crtc_commit_wait(old_conn_state->commit);
-		if (ret)
-			DRM_ERROR("[CONNECTOR:%d:%s] commit wait timed out\n",
+		commit = old_conn_state->commit;
+
+		if (!commit)
+			continue;
+
+		ret = wait_for_completion_timeout(&commit->hw_done,
+						  10*HZ);
+		if (ret == 0)
+			DRM_ERROR("[CONNECTOR:%d:%s] hw_done timed out\n",
+				  conn->base.id, conn->name);
+
+		/* Currently no support for overwriting flips, hence
+		 * stall for previous one to execute completely. */
+		ret = wait_for_completion_timeout(&commit->flip_done,
+						  10*HZ);
+		if (ret == 0)
+			DRM_ERROR("[CONNECTOR:%d:%s] flip_done timed out\n",
 				  conn->base.id, conn->name);
 	}
 
 	for_each_old_plane_in_state(old_state, plane, old_plane_state, i) {
-		ret = drm_crtc_commit_wait(old_plane_state->commit);
-		if (ret)
-			DRM_ERROR("[PLANE:%d:%s] commit wait timed out\n",
+		commit = old_plane_state->commit;
+
+		if (!commit)
+			continue;
+
+		ret = wait_for_completion_timeout(&commit->hw_done,
+						  10*HZ);
+		if (ret == 0)
+			DRM_ERROR("[PLANE:%d:%s] hw_done timed out\n",
+				  plane->base.id, plane->name);
+
+		/* Currently no support for overwriting flips, hence
+		 * stall for previous one to execute completely. */
+		ret = wait_for_completion_timeout(&commit->flip_done,
+						  10*HZ);
+		if (ret == 0)
+			DRM_ERROR("[PLANE:%d:%s] flip_done timed out\n",
 				  plane->base.id, plane->name);
 	}
 }
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index 919b2c2318b1..a3bdd1c34ef5 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -367,8 +367,9 @@  static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
 	for_each_old_crtc_in_state(state, crtc, old_crtc_state, i) {
 		struct vc4_crtc_state *vc4_crtc_state =
 			to_vc4_crtc_state(old_crtc_state);
+		struct drm_crtc_commit *commit;
 		unsigned int channel = vc4_crtc_state->assigned_channel;
-		int ret;
+		unsigned long done;
 
 		if (channel == VC4_HVS_CHANNEL_DISABLED)
 			continue;
@@ -376,9 +377,17 @@  static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
 		if (!old_hvs_state->fifo_state[channel].in_use)
 			continue;
 
-		ret = drm_crtc_commit_wait(old_hvs_state->fifo_state[i].pending_commit);
-		if (ret)
-			drm_err(dev, "Timed out waiting for commit\n");
+		commit = old_hvs_state->fifo_state[i].pending_commit;
+		if (!commit)
+			continue;
+
+		done = wait_for_completion_timeout(&commit->hw_done, 10 * HZ);
+		if (!done)
+			drm_err(dev, "Timed out waiting for hw_done\n");
+
+		done = wait_for_completion_timeout(&commit->flip_done, 10 * HZ);
+		if (!done)
+			drm_err(dev, "Timed out waiting for flip_done\n");
 	}
 
 	drm_atomic_helper_commit_modeset_disables(dev, state);
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index ac5a28eff2c8..ce7023e9115d 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -66,8 +66,6 @@ 
  *
  * For an implementation of how to use this look at
  * drm_atomic_helper_setup_commit() from the atomic helper library.
- *
- * See also drm_crtc_commit_wait().
  */
 struct drm_crtc_commit {
 	/**
@@ -438,8 +436,6 @@  static inline void drm_crtc_commit_put(struct drm_crtc_commit *commit)
 	kref_put(&commit->ref, __drm_crtc_commit_free);
 }
 
-int drm_crtc_commit_wait(struct drm_crtc_commit *commit);
-
 struct drm_atomic_state * __must_check
 drm_atomic_state_alloc(struct drm_device *dev);
 void drm_atomic_state_clear(struct drm_atomic_state *state);