diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 38 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 13 |
2 files changed, 32 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 5b205863b659..27ea6bdebce7 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -2737,24 +2737,11 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring) | |||
| 2737 | 2737 | ||
| 2738 | WARN_ON(i915_verify_lists(ring->dev)); | 2738 | WARN_ON(i915_verify_lists(ring->dev)); |
| 2739 | 2739 | ||
| 2740 | /* Move any buffers on the active list that are no longer referenced | 2740 | /* Retire requests first as we use it above for the early return. |
| 2741 | * by the ringbuffer to the flushing/inactive lists as appropriate, | 2741 | * If we retire requests last, we may use a later seqno and so clear |
| 2742 | * before we free the context associated with the requests. | 2742 | * the requests lists without clearing the active list, leading to |
| 2743 | * confusion. | ||
| 2743 | */ | 2744 | */ |
| 2744 | while (!list_empty(&ring->active_list)) { | ||
| 2745 | struct drm_i915_gem_object *obj; | ||
| 2746 | |||
| 2747 | obj = list_first_entry(&ring->active_list, | ||
| 2748 | struct drm_i915_gem_object, | ||
| 2749 | ring_list); | ||
| 2750 | |||
| 2751 | if (!i915_gem_request_completed(obj->last_read_req, true)) | ||
| 2752 | break; | ||
| 2753 | |||
| 2754 | i915_gem_object_move_to_inactive(obj); | ||
| 2755 | } | ||
| 2756 | |||
| 2757 | |||
| 2758 | while (!list_empty(&ring->request_list)) { | 2745 | while (!list_empty(&ring->request_list)) { |
| 2759 | struct drm_i915_gem_request *request; | 2746 | struct drm_i915_gem_request *request; |
| 2760 | struct intel_ringbuffer *ringbuf; | 2747 | struct intel_ringbuffer *ringbuf; |
| @@ -2789,6 +2776,23 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring) | |||
| 2789 | i915_gem_free_request(request); | 2776 | i915_gem_free_request(request); |
| 2790 | } | 2777 | } |
| 2791 | 2778 | ||
| 2779 | /* Move any buffers on the active list that are no longer referenced | ||
| 2780 | * by the ringbuffer to the flushing/inactive lists as appropriate, | ||
| 2781 | * before we free the context associated with the requests. | ||
| 2782 | */ | ||
| 2783 | while (!list_empty(&ring->active_list)) { | ||
| 2784 | struct drm_i915_gem_object *obj; | ||
| 2785 | |||
| 2786 | obj = list_first_entry(&ring->active_list, | ||
| 2787 | struct drm_i915_gem_object, | ||
| 2788 | ring_list); | ||
| 2789 | |||
| 2790 | if (!i915_gem_request_completed(obj->last_read_req, true)) | ||
| 2791 | break; | ||
| 2792 | |||
| 2793 | i915_gem_object_move_to_inactive(obj); | ||
| 2794 | } | ||
| 2795 | |||
| 2792 | if (unlikely(ring->trace_irq_req && | 2796 | if (unlikely(ring->trace_irq_req && |
| 2793 | i915_gem_request_completed(ring->trace_irq_req, true))) { | 2797 | i915_gem_request_completed(ring->trace_irq_req, true))) { |
| 2794 | ring->irq_put(ring); | 2798 | ring->irq_put(ring); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 1c12262029fb..f75173c20f47 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -2439,7 +2439,12 @@ intel_find_plane_obj(struct intel_crtc *intel_crtc, | |||
| 2439 | return; | 2439 | return; |
| 2440 | 2440 | ||
| 2441 | if (intel_alloc_plane_obj(intel_crtc, plane_config)) { | 2441 | if (intel_alloc_plane_obj(intel_crtc, plane_config)) { |
| 2442 | update_state_fb(intel_crtc->base.primary); | 2442 | struct drm_plane *primary = intel_crtc->base.primary; |
| 2443 | |||
| 2444 | primary->state->crtc = &intel_crtc->base; | ||
| 2445 | primary->crtc = &intel_crtc->base; | ||
| 2446 | update_state_fb(primary); | ||
| 2447 | |||
| 2443 | return; | 2448 | return; |
| 2444 | } | 2449 | } |
| 2445 | 2450 | ||
| @@ -2464,11 +2469,15 @@ intel_find_plane_obj(struct intel_crtc *intel_crtc, | |||
| 2464 | continue; | 2469 | continue; |
| 2465 | 2470 | ||
| 2466 | if (i915_gem_obj_ggtt_offset(obj) == plane_config->base) { | 2471 | if (i915_gem_obj_ggtt_offset(obj) == plane_config->base) { |
| 2472 | struct drm_plane *primary = intel_crtc->base.primary; | ||
| 2473 | |||
| 2467 | if (obj->tiling_mode != I915_TILING_NONE) | 2474 | if (obj->tiling_mode != I915_TILING_NONE) |
| 2468 | dev_priv->preserve_bios_swizzle = true; | 2475 | dev_priv->preserve_bios_swizzle = true; |
| 2469 | 2476 | ||
| 2470 | drm_framebuffer_reference(c->primary->fb); | 2477 | drm_framebuffer_reference(c->primary->fb); |
| 2471 | intel_crtc->base.primary->fb = c->primary->fb; | 2478 | primary->fb = c->primary->fb; |
| 2479 | primary->state->crtc = &intel_crtc->base; | ||
| 2480 | primary->crtc = &intel_crtc->base; | ||
| 2472 | obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe); | 2481 | obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe); |
| 2473 | break; | 2482 | break; |
| 2474 | } | 2483 | } |
