Commit 6258fbe2 authored by John Harrison's avatar John Harrison Committed by Daniel Vetter

drm/i915: Update queue_flip() to take a request structure

Updated the display page flip code to do explicit request creation and
submission rather than relying on the OLR and just hoping that the request
actually gets submitted at some random point.

The sequence is now to create a request, queue the work to the ring, assign the
known request to the flip queue work item then actually submit the work and post
the request.

Note that every single flip function used to finish with
'__intel_ring_advance(ring);'. However, immediately after they return there is
now an add request call which will do the advance anyway. Thus the many
duplicate advance calls have been removed.

v2: Updated commit message with comment about advance removal.

v3: The request can now be allocated by the _sync() code earlier on. Thus the
page flip path does not necessarily need to allocate a new request, it may be
able to re-use one.

For: VIZ-5115
Signed-off-by: default avatarJohn Harrison <John.C.Harrison@Intel.com>
Reviewed-by: default avatarTomas Elf <tomas.elf@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent dad540ce
...@@ -640,7 +640,7 @@ struct drm_i915_display_funcs { ...@@ -640,7 +640,7 @@ struct drm_i915_display_funcs {
int (*queue_flip)(struct drm_device *dev, struct drm_crtc *crtc, int (*queue_flip)(struct drm_device *dev, struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
struct intel_engine_cs *ring, struct drm_i915_gem_request *req,
uint32_t flags); uint32_t flags);
void (*update_primary_plane)(struct drm_crtc *crtc, void (*update_primary_plane)(struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
......
...@@ -10868,9 +10868,10 @@ static int intel_gen2_queue_flip(struct drm_device *dev, ...@@ -10868,9 +10868,10 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
struct drm_crtc *crtc, struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
struct intel_engine_cs *ring, struct drm_i915_gem_request *req,
uint32_t flags) uint32_t flags)
{ {
struct intel_engine_cs *ring = req->ring;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc); struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
u32 flip_mask; u32 flip_mask;
int ret; int ret;
...@@ -10895,7 +10896,6 @@ static int intel_gen2_queue_flip(struct drm_device *dev, ...@@ -10895,7 +10896,6 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
intel_ring_emit(ring, 0); /* aux display base address, unused */ intel_ring_emit(ring, 0); /* aux display base address, unused */
intel_mark_page_flip_active(intel_crtc); intel_mark_page_flip_active(intel_crtc);
__intel_ring_advance(ring);
return 0; return 0;
} }
...@@ -10903,9 +10903,10 @@ static int intel_gen3_queue_flip(struct drm_device *dev, ...@@ -10903,9 +10903,10 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
struct drm_crtc *crtc, struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
struct intel_engine_cs *ring, struct drm_i915_gem_request *req,
uint32_t flags) uint32_t flags)
{ {
struct intel_engine_cs *ring = req->ring;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc); struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
u32 flip_mask; u32 flip_mask;
int ret; int ret;
...@@ -10927,7 +10928,6 @@ static int intel_gen3_queue_flip(struct drm_device *dev, ...@@ -10927,7 +10928,6 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
intel_ring_emit(ring, MI_NOOP); intel_ring_emit(ring, MI_NOOP);
intel_mark_page_flip_active(intel_crtc); intel_mark_page_flip_active(intel_crtc);
__intel_ring_advance(ring);
return 0; return 0;
} }
...@@ -10935,9 +10935,10 @@ static int intel_gen4_queue_flip(struct drm_device *dev, ...@@ -10935,9 +10935,10 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
struct drm_crtc *crtc, struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
struct intel_engine_cs *ring, struct drm_i915_gem_request *req,
uint32_t flags) uint32_t flags)
{ {
struct intel_engine_cs *ring = req->ring;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc); struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
uint32_t pf, pipesrc; uint32_t pf, pipesrc;
...@@ -10966,7 +10967,6 @@ static int intel_gen4_queue_flip(struct drm_device *dev, ...@@ -10966,7 +10967,6 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
intel_ring_emit(ring, pf | pipesrc); intel_ring_emit(ring, pf | pipesrc);
intel_mark_page_flip_active(intel_crtc); intel_mark_page_flip_active(intel_crtc);
__intel_ring_advance(ring);
return 0; return 0;
} }
...@@ -10974,9 +10974,10 @@ static int intel_gen6_queue_flip(struct drm_device *dev, ...@@ -10974,9 +10974,10 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
struct drm_crtc *crtc, struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
struct intel_engine_cs *ring, struct drm_i915_gem_request *req,
uint32_t flags) uint32_t flags)
{ {
struct intel_engine_cs *ring = req->ring;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc); struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
uint32_t pf, pipesrc; uint32_t pf, pipesrc;
...@@ -11002,7 +11003,6 @@ static int intel_gen6_queue_flip(struct drm_device *dev, ...@@ -11002,7 +11003,6 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
intel_ring_emit(ring, pf | pipesrc); intel_ring_emit(ring, pf | pipesrc);
intel_mark_page_flip_active(intel_crtc); intel_mark_page_flip_active(intel_crtc);
__intel_ring_advance(ring);
return 0; return 0;
} }
...@@ -11010,9 +11010,10 @@ static int intel_gen7_queue_flip(struct drm_device *dev, ...@@ -11010,9 +11010,10 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
struct drm_crtc *crtc, struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
struct intel_engine_cs *ring, struct drm_i915_gem_request *req,
uint32_t flags) uint32_t flags)
{ {
struct intel_engine_cs *ring = req->ring;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc); struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
uint32_t plane_bit = 0; uint32_t plane_bit = 0;
int len, ret; int len, ret;
...@@ -11097,7 +11098,6 @@ static int intel_gen7_queue_flip(struct drm_device *dev, ...@@ -11097,7 +11098,6 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
intel_ring_emit(ring, (MI_NOOP)); intel_ring_emit(ring, (MI_NOOP));
intel_mark_page_flip_active(intel_crtc); intel_mark_page_flip_active(intel_crtc);
__intel_ring_advance(ring);
return 0; return 0;
} }
...@@ -11267,7 +11267,7 @@ static int intel_default_queue_flip(struct drm_device *dev, ...@@ -11267,7 +11267,7 @@ static int intel_default_queue_flip(struct drm_device *dev,
struct drm_crtc *crtc, struct drm_crtc *crtc,
struct drm_framebuffer *fb, struct drm_framebuffer *fb,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
struct intel_engine_cs *ring, struct drm_i915_gem_request *req,
uint32_t flags) uint32_t flags)
{ {
return -ENODEV; return -ENODEV;
...@@ -11482,13 +11482,18 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, ...@@ -11482,13 +11482,18 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
goto cleanup_unpin; goto cleanup_unpin;
} }
ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, ring, if (!request) {
ret = i915_gem_request_alloc(ring, ring->default_context, &request);
if (ret)
goto cleanup_unpin;
}
ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, request,
page_flip_flags); page_flip_flags);
if (ret) if (ret)
goto cleanup_unpin; goto cleanup_unpin;
i915_gem_request_assign(&work->flip_queued_req, i915_gem_request_assign(&work->flip_queued_req, request);
intel_ring_get_request(ring));
} }
if (request) if (request)
......
...@@ -81,7 +81,7 @@ bool intel_ring_stopped(struct intel_engine_cs *ring) ...@@ -81,7 +81,7 @@ bool intel_ring_stopped(struct intel_engine_cs *ring)
return dev_priv->gpu_error.stop_rings & intel_ring_flag(ring); return dev_priv->gpu_error.stop_rings & intel_ring_flag(ring);
} }
void __intel_ring_advance(struct intel_engine_cs *ring) static void __intel_ring_advance(struct intel_engine_cs *ring)
{ {
struct intel_ringbuffer *ringbuf = ring->buffer; struct intel_ringbuffer *ringbuf = ring->buffer;
ringbuf->tail &= ringbuf->size - 1; ringbuf->tail &= ringbuf->size - 1;
......
...@@ -442,7 +442,6 @@ int __intel_ring_space(int head, int tail, int size); ...@@ -442,7 +442,6 @@ int __intel_ring_space(int head, int tail, int size);
void intel_ring_update_space(struct intel_ringbuffer *ringbuf); void intel_ring_update_space(struct intel_ringbuffer *ringbuf);
int intel_ring_space(struct intel_ringbuffer *ringbuf); int intel_ring_space(struct intel_ringbuffer *ringbuf);
bool intel_ring_stopped(struct intel_engine_cs *ring); bool intel_ring_stopped(struct intel_engine_cs *ring);
void __intel_ring_advance(struct intel_engine_cs *ring);
int __must_check intel_ring_idle(struct intel_engine_cs *ring); int __must_check intel_ring_idle(struct intel_engine_cs *ring);
void intel_ring_init_seqno(struct intel_engine_cs *ring, u32 seqno); void intel_ring_init_seqno(struct intel_engine_cs *ring, u32 seqno);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment