aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_request.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index b836721d3b13..20c7c77b3768 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -799,6 +799,21 @@ err_unreserve:
799} 799}
800 800
801static int 801static int
802i915_request_await_start(struct i915_request *rq, struct i915_request *signal)
803{
804 if (list_is_first(&signal->ring_link, &signal->ring->request_list))
805 return 0;
806
807 signal = list_prev_entry(signal, ring_link);
808 if (i915_timeline_sync_is_later(rq->timeline, &signal->fence))
809 return 0;
810
811 return i915_sw_fence_await_dma_fence(&rq->submit,
812 &signal->fence, 0,
813 I915_FENCE_GFP);
814}
815
816static int
802emit_semaphore_wait(struct i915_request *to, 817emit_semaphore_wait(struct i915_request *to,
803 struct i915_request *from, 818 struct i915_request *from,
804 gfp_t gfp) 819 gfp_t gfp)
@@ -816,6 +831,10 @@ emit_semaphore_wait(struct i915_request *to,
816 &from->fence, 0, 831 &from->fence, 0,
817 I915_FENCE_GFP); 832 I915_FENCE_GFP);
818 833
834 err = i915_request_await_start(to, from);
835 if (err < 0)
836 return err;
837
819 err = i915_sw_fence_await_dma_fence(&to->semaphore, 838 err = i915_sw_fence_await_dma_fence(&to->semaphore,
820 &from->fence, 0, 839 &from->fence, 0,
821 I915_FENCE_GFP); 840 I915_FENCE_GFP);