提交 f06cc1b9 编写于 作者: J John Harrison 提交者: Daniel Vetter

drm/i915: Convert 'flip_queued_seqno' into 'flip_queued_request'

Converted the flip_queued_seqno value to be a request structure as part of the
on going seqno to request changes. This includes reference counting the request
being saved away to ensure it can not be retired and freed while the flip code
is still waiting on it.

For: VIZ-4377
Signed-off-by: NJohn Harrison <John.C.Harrison@Intel.com>
Reviewed-by: NThomas Daniel <Thomas.Daniel@intel.com>
[danvet: Again get rid of the _irq request unref by simply moving that
into the unpin worker. Doesn't matter when we hang onto the request
for a bit longer, and in the unpin worker we already grab the
dev->struct_mutex anyway.]
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 9400ae5c
...@@ -544,11 +544,11 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) ...@@ -544,11 +544,11 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
if (work->flip_queued_ring) { if (work->flip_queued_ring) {
seq_printf(m, "Flip queued on %s at seqno %u, next seqno %u [current breadcrumb %u], completed? %d\n", 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_ring->name,
work->flip_queued_seqno, i915_gem_request_get_seqno(work->flip_queued_req),
dev_priv->next_seqno, dev_priv->next_seqno,
work->flip_queued_ring->get_seqno(work->flip_queued_ring, true), 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), 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 } else
seq_printf(m, "Flip not associated with any ring\n"); 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", seq_printf(m, "Flip queued on frame %d, (was ready on frame %d), now %d\n",
......
...@@ -9128,6 +9128,11 @@ static void intel_unpin_work_fn(struct work_struct *__work) ...@@ -9128,6 +9128,11 @@ static void intel_unpin_work_fn(struct work_struct *__work)
drm_gem_object_unreference(&work->old_fb_obj->base); drm_gem_object_unreference(&work->old_fb_obj->base);
intel_update_fbc(dev); intel_update_fbc(dev);
if (work->flip_queued_req)
i915_gem_request_unreference(work->flip_queued_req);
work->flip_queued_req = NULL;
work->flip_queued_ring = NULL;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
intel_frontbuffer_flip_complete(dev, INTEL_FRONTBUFFER_PRIMARY(pipe)); intel_frontbuffer_flip_complete(dev, INTEL_FRONTBUFFER_PRIMARY(pipe));
...@@ -9736,10 +9741,14 @@ static bool __intel_pageflip_stall_check(struct drm_device *dev, ...@@ -9736,10 +9741,14 @@ static bool __intel_pageflip_stall_check(struct drm_device *dev,
return false; return false;
if (work->flip_ready_vblank == 0) { if (work->flip_ready_vblank == 0) {
if (work->flip_queued_ring && if (work->flip_queued_ring) {
!i915_seqno_passed(work->flip_queued_ring->get_seqno(work->flip_queued_ring, true), uint32_t s1 = work->flip_queued_ring->get_seqno(
work->flip_queued_seqno)) work->flip_queued_ring, true);
return false; uint32_t s2 = i915_gem_request_get_seqno(
work->flip_queued_req);
if (!i915_seqno_passed(s1, s2))
return false;
}
work->flip_ready_vblank = drm_vblank_count(dev, intel_crtc->pipe); work->flip_ready_vblank = drm_vblank_count(dev, intel_crtc->pipe);
} }
...@@ -9903,8 +9912,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, ...@@ -9903,8 +9912,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
if (ret) if (ret)
goto cleanup_unpin; goto cleanup_unpin;
work->flip_queued_seqno = i915_gem_request_assign(&work->flip_queued_req,
i915_gem_request_get_seqno(obj->last_write_req); obj->last_write_req);
work->flip_queued_ring = obj->ring; work->flip_queued_ring = obj->ring;
} else { } else {
ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, ring, ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, ring,
...@@ -9912,8 +9921,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, ...@@ -9912,8 +9921,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
if (ret) if (ret)
goto cleanup_unpin; goto cleanup_unpin;
work->flip_queued_seqno = i915_gem_request_assign(&work->flip_queued_req,
i915_gem_request_get_seqno(intel_ring_get_request(ring)); intel_ring_get_request(ring));
work->flip_queued_ring = ring; work->flip_queued_ring = ring;
} }
......
...@@ -708,7 +708,7 @@ struct intel_unpin_work { ...@@ -708,7 +708,7 @@ struct intel_unpin_work {
u32 flip_count; u32 flip_count;
u32 gtt_offset; u32 gtt_offset;
struct intel_engine_cs *flip_queued_ring; 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_queued_vblank;
int flip_ready_vblank; int flip_ready_vblank;
bool enable_stall_check; bool enable_stall_check;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册