Skip to content

Commit

Permalink
Merge tag 'drm-intel-fixes-2015-03-26' of git://anongit.freedesktop.o…
Browse files Browse the repository at this point in the history
…rg/drm-intel into drm-fixes

This should cover the final warnings in -rc5 with two more backports
from our development branch (drm-intel-next-queued). They're the ones
from Daniel and Damien, with references to the reports.

This is on top of drm-fixes because of the dependency on the two earlier
fixes not yet in Linus' tree.

There's an additional regression fix from Chris.

* tag 'drm-intel-fixes-2015-03-26' of git://anongit.freedesktop.org/drm-intel:
  drm/i915: Fixup legacy plane->crtc link for initial fb config
  drm/i915: Fix atomic state when reusing the firmware fb
  drm/i915: Keep ring->active_list and ring->requests_list consistent
  • Loading branch information
Dave Airlie committed Mar 26, 2015
2 parents 59a58cb + 5f40775 commit 9822393
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 19 deletions.
38 changes: 21 additions & 17 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -2737,24 +2737,11 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring)

WARN_ON(i915_verify_lists(ring->dev));

/* Move any buffers on the active list that are no longer referenced
* by the ringbuffer to the flushing/inactive lists as appropriate,
* before we free the context associated with the requests.
/* Retire requests first as we use it above for the early return.
* If we retire requests last, we may use a later seqno and so clear
* the requests lists without clearing the active list, leading to
* confusion.
*/
while (!list_empty(&ring->active_list)) {
struct drm_i915_gem_object *obj;

obj = list_first_entry(&ring->active_list,
struct drm_i915_gem_object,
ring_list);

if (!i915_gem_request_completed(obj->last_read_req, true))
break;

i915_gem_object_move_to_inactive(obj);
}


while (!list_empty(&ring->request_list)) {
struct drm_i915_gem_request *request;
struct intel_ringbuffer *ringbuf;
Expand Down Expand Up @@ -2789,6 +2776,23 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring)
i915_gem_free_request(request);
}

/* Move any buffers on the active list that are no longer referenced
* by the ringbuffer to the flushing/inactive lists as appropriate,
* before we free the context associated with the requests.
*/
while (!list_empty(&ring->active_list)) {
struct drm_i915_gem_object *obj;

obj = list_first_entry(&ring->active_list,
struct drm_i915_gem_object,
ring_list);

if (!i915_gem_request_completed(obj->last_read_req, true))
break;

i915_gem_object_move_to_inactive(obj);
}

if (unlikely(ring->trace_irq_req &&
i915_gem_request_completed(ring->trace_irq_req, true))) {
ring->irq_put(ring);
Expand Down
13 changes: 11 additions & 2 deletions drivers/gpu/drm/i915/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -2439,7 +2439,12 @@ intel_find_plane_obj(struct intel_crtc *intel_crtc,
return;

if (intel_alloc_plane_obj(intel_crtc, plane_config)) {
update_state_fb(intel_crtc->base.primary);
struct drm_plane *primary = intel_crtc->base.primary;

primary->state->crtc = &intel_crtc->base;
primary->crtc = &intel_crtc->base;
update_state_fb(primary);

return;
}

Expand All @@ -2464,11 +2469,15 @@ intel_find_plane_obj(struct intel_crtc *intel_crtc,
continue;

if (i915_gem_obj_ggtt_offset(obj) == plane_config->base) {
struct drm_plane *primary = intel_crtc->base.primary;

if (obj->tiling_mode != I915_TILING_NONE)
dev_priv->preserve_bios_swizzle = true;

drm_framebuffer_reference(c->primary->fb);
intel_crtc->base.primary->fb = c->primary->fb;
primary->fb = c->primary->fb;
primary->state->crtc = &intel_crtc->base;
primary->crtc = &intel_crtc->base;
obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
break;
}
Expand Down

0 comments on commit 9822393

Please sign in to comment.