diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_request.c | 19 |
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 | ||
| 801 | static int | 801 | static int |
| 802 | i915_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 | |||
| 816 | static int | ||
| 802 | emit_semaphore_wait(struct i915_request *to, | 817 | emit_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); |
