[PATCH 57/59] identify-rq-start

Chris Wilson chris at chris-wilson.co.uk
Sun Dec 23 09:29:27 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 657663a803db..adf60a50434b 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
@@ -909,7 +909,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 7256673f7fbc..ebbb1b06f9ab 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1430,6 +1430,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;
@@ -1504,6 +1521,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 74700130890f..18b643587e62 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -1874,6 +1874,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;
@@ -1887,6 +1911,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