[Intel-xe] [RFC PATCH 2/3] drm/i915/display: Move fence completion wait away from display code

Jouni Högander jouni.hogander at intel.com
Wed Sep 27 07:31:24 UTC 2023


We are preparing for Xe which will have differing implementation
for sw fence and GPU reset. Due to thise move waiting fence completion
and GPU reset wait awary from the display code.

Signed-off-by: Jouni Högander <jouni.hogander at intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c | 27 +------------------
 drivers/gpu/drm/i915/i915_sw_fence.c         | 28 ++++++++++++++++++++
 drivers/gpu/drm/i915/i915_sw_fence.h         |  4 +++
 3 files changed, 33 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 505ca587b504..c92f5f3629be 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -6865,33 +6865,8 @@ void intel_atomic_helper_free_state_worker(struct work_struct *work)
 	intel_atomic_helper_free_state(dev_priv);
 }
 
-static void intel_atomic_commit_fence_wait(struct intel_atomic_state *intel_state)
-{
-	struct wait_queue_entry wait_fence, wait_reset;
-	struct drm_i915_private *dev_priv = to_i915(intel_state->base.dev);
-
-	init_wait_entry(&wait_fence, 0);
-	init_wait_entry(&wait_reset, 0);
-	for (;;) {
-		prepare_to_wait(&intel_state->commit_ready.wait,
-				&wait_fence, TASK_UNINTERRUPTIBLE);
-		prepare_to_wait(bit_waitqueue(&to_gt(dev_priv)->reset.flags,
-					      I915_RESET_MODESET),
-				&wait_reset, TASK_UNINTERRUPTIBLE);
 
 
-		if (i915_sw_fence_done(&intel_state->commit_ready) ||
-		    test_bit(I915_RESET_MODESET, &to_gt(dev_priv)->reset.flags))
-			break;
-
-		schedule();
-	}
-	finish_wait(&intel_state->commit_ready.wait, &wait_fence);
-	finish_wait(bit_waitqueue(&to_gt(dev_priv)->reset.flags,
-				  I915_RESET_MODESET),
-		    &wait_reset);
-}
-
 static void intel_atomic_cleanup_work(struct work_struct *work)
 {
 	struct intel_atomic_state *state =
@@ -6997,7 +6972,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
 	intel_wakeref_t wakeref = 0;
 	int i;
 
-	intel_atomic_commit_fence_wait(state);
+	i915_sw_fence_wait_completion(dev_priv, &state->commit_ready);
 
 	drm_atomic_helper_wait_for_dependencies(&state->base);
 	drm_dp_mst_atomic_wait_for_dependencies(&state->base);
diff --git a/drivers/gpu/drm/i915/i915_sw_fence.c b/drivers/gpu/drm/i915/i915_sw_fence.c
index 8a9aad523eec..f2e0c5138cb2 100644
--- a/drivers/gpu/drm/i915/i915_sw_fence.c
+++ b/drivers/gpu/drm/i915/i915_sw_fence.c
@@ -9,6 +9,7 @@
 #include <linux/irq_work.h>
 #include <linux/dma-resv.h>
 
+#include "i915_drv.h"
 #include "i915_sw_fence.h"
 #include "i915_selftest.h"
 
@@ -597,6 +598,33 @@ int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
 	return ret;
 }
 
+void i915_sw_fence_wait_completion(struct drm_i915_private *i915,
+				   struct i915_sw_fence *fence)
+{
+	struct wait_queue_entry wait_fence, wait_reset;
+
+	init_wait_entry(&wait_fence, 0);
+	init_wait_entry(&wait_reset, 0);
+	for (;;) {
+		prepare_to_wait(&fence->wait,
+				&wait_fence, TASK_UNINTERRUPTIBLE);
+		prepare_to_wait(bit_waitqueue(&to_gt(i915)->reset.flags,
+					      I915_RESET_MODESET),
+				&wait_reset, TASK_UNINTERRUPTIBLE);
+
+
+		if (i915_sw_fence_done(fence) ||
+		    test_bit(I915_RESET_MODESET, &to_gt(i915)->reset.flags))
+			break;
+
+		schedule();
+	}
+	finish_wait(&fence->wait, &wait_fence);
+	finish_wait(bit_waitqueue(&to_gt(i915)->reset.flags,
+				  I915_RESET_MODESET),
+		    &wait_reset);
+}
+
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
 #include "selftests/lib_sw_fence.c"
 #include "selftests/i915_sw_fence.c"
diff --git a/drivers/gpu/drm/i915/i915_sw_fence.h b/drivers/gpu/drm/i915/i915_sw_fence.h
index f752bfc7c6e1..a48d017de59d 100644
--- a/drivers/gpu/drm/i915/i915_sw_fence.h
+++ b/drivers/gpu/drm/i915/i915_sw_fence.h
@@ -15,6 +15,7 @@
 #include <linux/notifier.h> /* for NOTIFY_DONE */
 #include <linux/wait.h>
 
+struct drm_i915_private;
 struct completion;
 struct dma_resv;
 struct i915_sw_fence;
@@ -98,6 +99,9 @@ int i915_sw_fence_await_reservation(struct i915_sw_fence *fence,
 bool i915_sw_fence_await(struct i915_sw_fence *fence);
 void i915_sw_fence_complete(struct i915_sw_fence *fence);
 
+void i915_sw_fence_wait_completion(struct drm_i915_private *i915,
+				   struct i915_sw_fence *fence);
+
 static inline bool i915_sw_fence_signaled(const struct i915_sw_fence *fence)
 {
 	return atomic_read(&fence->pending) <= 0;
-- 
2.34.1



More information about the Intel-xe mailing list