diff options
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index b0016bb6563..9be450e7c54 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -2462,10 +2462,29 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj) | |||
2462 | 2462 | ||
2463 | static int i915_ring_idle(struct intel_ring_buffer *ring) | 2463 | static int i915_ring_idle(struct intel_ring_buffer *ring) |
2464 | { | 2464 | { |
2465 | if (list_empty(&ring->active_list)) | 2465 | u32 seqno; |
2466 | int ret; | ||
2467 | |||
2468 | /* We need to add any requests required to flush the objects */ | ||
2469 | if (!list_empty(&ring->active_list)) { | ||
2470 | seqno = list_entry(ring->active_list.prev, | ||
2471 | struct drm_i915_gem_object, | ||
2472 | ring_list)->last_read_seqno; | ||
2473 | |||
2474 | ret = i915_gem_check_olr(ring, seqno); | ||
2475 | if (ret) | ||
2476 | return ret; | ||
2477 | } | ||
2478 | |||
2479 | /* Wait upon the last request to be completed */ | ||
2480 | if (list_empty(&ring->request_list)) | ||
2466 | return 0; | 2481 | return 0; |
2467 | 2482 | ||
2468 | return i915_wait_seqno(ring, i915_gem_next_request_seqno(ring)); | 2483 | seqno = list_entry(ring->request_list.prev, |
2484 | struct drm_i915_gem_request, | ||
2485 | list)->seqno; | ||
2486 | |||
2487 | return i915_wait_seqno(ring, seqno); | ||
2469 | } | 2488 | } |
2470 | 2489 | ||
2471 | int i915_gpu_idle(struct drm_device *dev) | 2490 | int i915_gpu_idle(struct drm_device *dev) |