@@ -546,11 +546,11 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
if (work->flip_queued_ring) {
seq_printf(m, "Flip queued on %s at seqno %u, next seqno %u [current breadcrumb %u], completed? %d\n",
work->flip_queued_ring->name,
- work->flip_queued_seqno,
+ i915_gem_request_get_seqno(work->flip_queued_req),
dev_priv->next_seqno,
work->flip_queued_ring->get_seqno(work->flip_queued_ring, true),
i915_seqno_passed(work->flip_queued_ring->get_seqno(work->flip_queued_ring, true),
- work->flip_queued_seqno));
+ i915_gem_request_get_seqno(work->flip_queued_req)));
} else
seq_printf(m, "Flip not associated with any ring\n");
seq_printf(m, "Flip queued on frame %d, (was ready on frame %d), now %d\n",
@@ -9484,10 +9484,18 @@ static bool __intel_pageflip_stall_check(struct drm_device *dev,
return false;
if (work->flip_ready_vblank == 0) {
- if (work->flip_queued_ring &&
- !i915_seqno_passed(work->flip_queued_ring->get_seqno(work->flip_queued_ring, true),
- work->flip_queued_seqno))
- return false;
+ if (work->flip_queued_ring) {
+ uint32_t s1 = work->flip_queued_ring->get_seqno(
+ work->flip_queued_ring, true);
+ uint32_t s2 = i915_gem_request_get_seqno(
+ work->flip_queued_req);
+ if (!i915_seqno_passed(s1, s2))
+ return false;
+
+ i915_gem_request_unreference_irq(work->flip_queued_req);
+ work->flip_queued_req = NULL;
+ work->flip_queued_ring = NULL;
+ }
work->flip_ready_vblank = drm_vblank_count(dev, intel_crtc->pipe);
}
@@ -9651,8 +9659,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
if (ret)
goto cleanup_unpin;
- work->flip_queued_seqno =
- i915_gem_request_get_seqno(obj->last_write_req);
+ i915_gem_request_assign(&work->flip_queued_req,
+ obj->last_write_req);
work->flip_queued_ring = obj->ring;
} else {
ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, ring,
@@ -9660,8 +9668,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
if (ret)
goto cleanup_unpin;
- work->flip_queued_seqno =
- i915_gem_request_get_seqno(intel_ring_get_request(ring));
+ i915_gem_request_assign(&work->flip_queued_req,
+ intel_ring_get_request(ring));
work->flip_queued_ring = ring;
}
@@ -705,7 +705,7 @@ struct intel_unpin_work {
u32 flip_count;
u32 gtt_offset;
struct intel_engine_cs *flip_queued_ring;
- u32 flip_queued_seqno;
+ struct drm_i915_gem_request *flip_queued_req;
int flip_queued_vblank;
int flip_ready_vblank;
bool enable_stall_check;