[PATCH 42/46] identify-rq-start
Chris Wilson
chris at chris-wilson.co.uk
Fri Dec 28 15:37:17 UTC 2018
---
drivers/gpu/drm/i915/i915_request.c | 8 +++----
drivers/gpu/drm/i915/intel_lrc.c | 21 +++++++++++++++++++
drivers/gpu/drm/i915/intel_ringbuffer.c | 28 +++++++++++++++++++++++++
3 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index ec4dbc67ef9e..6ab72679c44c 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -597,7 +597,7 @@ i915_request_alloc(struct intel_engine_cs *engine, struct i915_gem_context *ctx)
&i915_fence_ops,
&rq->lock,
rq->timeline->fence_context,
- timeline_get_seqno(rq->timeline));
+ 2 * timeline_get_seqno(rq->timeline));
/* We bump the ref for the fence chain */
i915_sw_fence_init(&i915_request_get(rq)->submit, submit_notify);
@@ -645,7 +645,7 @@ i915_request_alloc(struct intel_engine_cs *engine, struct i915_gem_context *ctx)
rq->infix = rq->ring->emit; /* end of header; start of user payload */
/* Check that we didn't interrupt ourselves with a new request */
- GEM_BUG_ON(rq->timeline->seqno != rq->fence.seqno);
+ GEM_BUG_ON(2 * rq->timeline->seqno != rq->fence.seqno);
return rq;
err_unwind:
@@ -860,7 +860,7 @@ void i915_request_add(struct i915_request *request)
* our i915_request_alloc() and called __i915_request_add() before
* us, the timeline will hold its seqno which is later than ours.
*/
- GEM_BUG_ON(timeline->seqno != request->fence.seqno);
+ GEM_BUG_ON(2 * timeline->seqno != request->fence.seqno);
/*
* To ensure that this call will not fail, space for its emissions
@@ -903,7 +903,7 @@ void i915_request_add(struct i915_request *request)
list_add_tail(&request->link, &timeline->requests);
spin_unlock_irq(&timeline->lock);
- GEM_BUG_ON(timeline->seqno != request->fence.seqno);
+ GEM_BUG_ON(2 * timeline->seqno != request->fence.seqno);
i915_gem_active_set(&timeline->last_request, request);
list_add_tail(&request->ring_link, &ring->request_list);
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index a76def36d964..1aa26b87592e 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1259,6 +1259,23 @@ execlists_context_pin(struct intel_engine_cs *engine,
return __execlists_context_pin(engine, ctx, ce);
}
+static int emit_initial_breadcrumb(struct i915_request *rq)
+{
+ u32 *cs;
+
+ cs = intel_ring_begin(rq, 4);
+ if (IS_ERR(cs))
+ return PTR_ERR(cs);
+
+ *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
+ *cs++ = i915_timeline_seqno_address(rq->timeline);
+ *cs++ = 0;
+ *cs++ = rq->fence.seqno - 1;
+
+ intel_ring_advance(rq, cs);
+ return 0;
+}
+
static int emit_pdps(struct i915_request *rq)
{
const struct intel_engine_cs * const engine = rq->engine;
@@ -1333,6 +1350,10 @@ static int execlists_request_alloc(struct i915_request *request)
* to cancel/unwind this request now.
*/
+ ret = emit_initial_breadcrumb(request);
+ if (ret)
+ return ret;
+
/* Unconditionally invalidate GPU caches and TLBs. */
if (i915_vm_is_48bit(&request->gem_context->ppgtt->vm))
ret = request->engine->emit_flush(request, EMIT_INVALIDATE);
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index e965be811e27..c5c53544126f 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -1914,6 +1914,30 @@ static int switch_context(struct i915_request *rq)
return ret;
}
+static int emit_initial_breadcrumb(struct i915_request *rq)
+{
+ u32 *cs;
+
+ cs = intel_ring_begin(rq, 4);
+ if (IS_ERR(cs))
+ return PTR_ERR(cs);
+
+ if (INTEL_GEN(rq->i915) >= 4) {
+ *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
+ *cs++ = 0;
+ *cs++ = i915_timeline_seqno_address(rq->timeline);
+ *cs++ = rq->fence.seqno - 1;
+ } else {
+ *cs++ = MI_STORE_DWORD_IMM | MI_USE_GGTT;
+ *cs++ = i915_timeline_seqno_address(rq->timeline);
+ *cs++ = rq->fence.seqno - 1;
+ *cs++ = MI_NOOP;
+ }
+
+ intel_ring_advance(rq, cs);
+ return 0;
+}
+
static int ring_request_alloc(struct i915_request *request)
{
int ret;
@@ -1927,6 +1951,10 @@ static int ring_request_alloc(struct i915_request *request)
*/
request->reserved_space += LEGACY_REQUEST_SIZE;
+ ret = emit_initial_breadcrumb(request);
+ if (ret)
+ return ret;
+
ret = switch_context(request);
if (ret)
return ret;
--
2.20.1
More information about the Intel-gfx-trybot
mailing list