Commit 2d12955a authored by Nick Hoath's avatar Nick Hoath Committed by Daniel Vetter

drm/i915: execlist request keeps ptr/ref to gem_request

Add a reference and pointer from the execlist queue item to the associated
gem request. For execlist requests that don't have a request, create one
as a placeholder.

Issue: VIZ-4274
v1: Rebase after upstream of "Replace seqno values with request structures" patchset.
Signed-off-by: default avatarNick Hoath <nicholas.hoath@intel.com>
Reviewed-by: default avatarThomas Daniel <thomas.daniel@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 16f3f658
...@@ -534,7 +534,8 @@ void intel_lrc_irq_handler(struct intel_engine_cs *ring) ...@@ -534,7 +534,8 @@ void intel_lrc_irq_handler(struct intel_engine_cs *ring)
static int execlists_context_queue(struct intel_engine_cs *ring, static int execlists_context_queue(struct intel_engine_cs *ring,
struct intel_context *to, struct intel_context *to,
u32 tail) u32 tail,
struct drm_i915_gem_request *request)
{ {
struct intel_ctx_submit_request *req = NULL, *cursor; struct intel_ctx_submit_request *req = NULL, *cursor;
struct drm_i915_private *dev_priv = ring->dev->dev_private; struct drm_i915_private *dev_priv = ring->dev->dev_private;
...@@ -553,6 +554,21 @@ static int execlists_context_queue(struct intel_engine_cs *ring, ...@@ -553,6 +554,21 @@ static int execlists_context_queue(struct intel_engine_cs *ring,
req->ring = ring; req->ring = ring;
req->tail = tail; req->tail = tail;
if (!request) {
/*
* If there isn't a request associated with this submission,
* create one as a temporary holder.
*/
WARN(1, "execlist context submission without request");
request = kzalloc(sizeof(*request), GFP_KERNEL);
if (request == NULL)
return -ENOMEM;
request->ctx = to;
request->ring = ring;
}
req->request = request;
i915_gem_request_reference(request);
intel_runtime_pm_get(dev_priv); intel_runtime_pm_get(dev_priv);
spin_lock_irqsave(&ring->execlist_lock, flags); spin_lock_irqsave(&ring->execlist_lock, flags);
...@@ -766,6 +782,7 @@ void intel_execlists_retire_requests(struct intel_engine_cs *ring) ...@@ -766,6 +782,7 @@ void intel_execlists_retire_requests(struct intel_engine_cs *ring)
intel_lr_context_unpin(ring, ctx); intel_lr_context_unpin(ring, ctx);
intel_runtime_pm_put(dev_priv); intel_runtime_pm_put(dev_priv);
i915_gem_context_unreference(req->ctx); i915_gem_context_unreference(req->ctx);
i915_gem_request_unreference(req->request);
list_del(&req->execlist_link); list_del(&req->execlist_link);
kfree(req); kfree(req);
} }
...@@ -818,7 +835,8 @@ int logical_ring_flush_all_caches(struct intel_ringbuffer *ringbuf) ...@@ -818,7 +835,8 @@ int logical_ring_flush_all_caches(struct intel_ringbuffer *ringbuf)
* on a queue waiting for the ELSP to be ready to accept a new context submission. At that * on a queue waiting for the ELSP to be ready to accept a new context submission. At that
* point, the tail *inside* the context is updated and the ELSP written to. * point, the tail *inside* the context is updated and the ELSP written to.
*/ */
void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf) void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf,
struct drm_i915_gem_request *request)
{ {
struct intel_engine_cs *ring = ringbuf->ring; struct intel_engine_cs *ring = ringbuf->ring;
struct intel_context *ctx = ringbuf->FIXME_lrc_ctx; struct intel_context *ctx = ringbuf->FIXME_lrc_ctx;
...@@ -828,7 +846,7 @@ void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf) ...@@ -828,7 +846,7 @@ void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf)
if (intel_ring_stopped(ring)) if (intel_ring_stopped(ring))
return; return;
execlists_context_queue(ring, ctx, ringbuf->tail); execlists_context_queue(ring, ctx, ringbuf->tail, request);
} }
static int intel_lr_context_pin(struct intel_engine_cs *ring, static int intel_lr_context_pin(struct intel_engine_cs *ring,
...@@ -972,7 +990,7 @@ static int logical_ring_wait_for_space(struct intel_ringbuffer *ringbuf, ...@@ -972,7 +990,7 @@ static int logical_ring_wait_for_space(struct intel_ringbuffer *ringbuf,
return ret; return ret;
/* Force the context submission in case we have been skipping it */ /* Force the context submission in case we have been skipping it */
intel_logical_ring_advance_and_submit(ringbuf); intel_logical_ring_advance_and_submit(ringbuf, NULL);
/* With GEM the hangcheck timer should kick us out of the loop, /* With GEM the hangcheck timer should kick us out of the loop,
* leaving it early runs the risk of corrupting GEM state (due * leaving it early runs the risk of corrupting GEM state (due
...@@ -1311,7 +1329,8 @@ static void gen8_set_seqno(struct intel_engine_cs *ring, u32 seqno) ...@@ -1311,7 +1329,8 @@ static void gen8_set_seqno(struct intel_engine_cs *ring, u32 seqno)
intel_write_status_page(ring, I915_GEM_HWS_INDEX, seqno); intel_write_status_page(ring, I915_GEM_HWS_INDEX, seqno);
} }
static int gen8_emit_request(struct intel_ringbuffer *ringbuf) static int gen8_emit_request(struct intel_ringbuffer *ringbuf,
struct drm_i915_gem_request *request)
{ {
struct intel_engine_cs *ring = ringbuf->ring; struct intel_engine_cs *ring = ringbuf->ring;
u32 cmd; u32 cmd;
...@@ -1333,7 +1352,7 @@ static int gen8_emit_request(struct intel_ringbuffer *ringbuf) ...@@ -1333,7 +1352,7 @@ static int gen8_emit_request(struct intel_ringbuffer *ringbuf)
i915_gem_request_get_seqno(ring->outstanding_lazy_request)); i915_gem_request_get_seqno(ring->outstanding_lazy_request));
intel_logical_ring_emit(ringbuf, MI_USER_INTERRUPT); intel_logical_ring_emit(ringbuf, MI_USER_INTERRUPT);
intel_logical_ring_emit(ringbuf, MI_NOOP); intel_logical_ring_emit(ringbuf, MI_NOOP);
intel_logical_ring_advance_and_submit(ringbuf); intel_logical_ring_advance_and_submit(ringbuf, request);
return 0; return 0;
} }
......
...@@ -39,7 +39,9 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *ring); ...@@ -39,7 +39,9 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *ring);
int intel_logical_rings_init(struct drm_device *dev); int intel_logical_rings_init(struct drm_device *dev);
int logical_ring_flush_all_caches(struct intel_ringbuffer *ringbuf); int logical_ring_flush_all_caches(struct intel_ringbuffer *ringbuf);
void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf); void intel_logical_ring_advance_and_submit(
struct intel_ringbuffer *ringbuf,
struct drm_i915_gem_request *request);
/** /**
* intel_logical_ring_advance() - advance the ringbuffer tail * intel_logical_ring_advance() - advance the ringbuffer tail
* @ringbuf: Ringbuffer to advance. * @ringbuf: Ringbuffer to advance.
...@@ -110,6 +112,8 @@ struct intel_ctx_submit_request { ...@@ -110,6 +112,8 @@ struct intel_ctx_submit_request {
struct list_head execlist_link; struct list_head execlist_link;
int elsp_submitted; int elsp_submitted;
struct drm_i915_gem_request *request;
}; };
void intel_lrc_irq_handler(struct intel_engine_cs *ring); void intel_lrc_irq_handler(struct intel_engine_cs *ring);
......
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