Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ddd66c51 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Unify request submission



Move request submission from emit_request into its own common vfunc
from i915_add_request().

v2: Convert I915_DISPATCH_flags to BIT(x) whilst passing
v3: Rename a few functions to match.
v4: Reenable execlists submission after disabling guc.
v5: Be aware that everyone calls i915_guc_submission_disable()!

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1469432687-22756-23-git-send-email-chris@chris-wilson.co.uk


Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1470174640-18242-14-git-send-email-chris@chris-wilson.co.uk
parent 8f942018
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -466,12 +466,9 @@ void __i915_add_request(struct drm_i915_gem_request *request,
	 */
	request->postfix = ring->tail;

	if (i915.enable_execlists)
		ret = engine->emit_request(request);
	else
		ret = engine->add_request(request);
	/* Not allowed to fail! */
	WARN(ret, "emit|add_request failed: %d!\n", ret);
	ret = engine->emit_request(request);
	WARN(ret, "(%s)->emit_request failed: %d!\n", engine->name, ret);

	/* Sanity check that the reserved size was large enough. */
	ret = ring->tail - request_start;
@@ -483,6 +480,7 @@ void __i915_add_request(struct drm_i915_gem_request *request,
		  reserved_tail, ret);

	i915_gem_mark_busy(engine);
	engine->submit_request(request);
}

static unsigned long local_clock_us(unsigned int *cpu)
+12 −3
Original line number Diff line number Diff line
@@ -585,7 +585,7 @@ static int guc_ring_doorbell(struct i915_guc_client *gc)
 * The only error here arises if the doorbell hardware isn't functioning
 * as expected, which really shouln't happen.
 */
int i915_guc_submit(struct drm_i915_gem_request *rq)
static void i915_guc_submit(struct drm_i915_gem_request *rq)
{
	unsigned int engine_id = rq->engine->id;
	struct intel_guc *guc = &rq->i915->guc;
@@ -602,8 +602,6 @@ int i915_guc_submit(struct drm_i915_gem_request *rq)

	guc->submissions[engine_id] += 1;
	guc->last_seqno[engine_id] = rq->fence.seqno;

	return b_ret;
}

/*
@@ -992,6 +990,7 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
{
	struct intel_guc *guc = &dev_priv->guc;
	struct i915_guc_client *client;
	struct intel_engine_cs *engine;

	/* client for execbuf submission */
	client = guc_client_alloc(dev_priv,
@@ -1006,6 +1005,10 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
	host2guc_sample_forcewake(guc, client);
	guc_init_doorbell_hw(guc);

	/* Take over from manual control of ELSP (execlists) */
	for_each_engine(engine, dev_priv)
		engine->submit_request = i915_guc_submit;

	return 0;
}

@@ -1013,8 +1016,14 @@ void i915_guc_submission_disable(struct drm_i915_private *dev_priv)
{
	struct intel_guc *guc = &dev_priv->guc;

	if (!guc->execbuf_client)
		return;

	guc_client_free(dev_priv, guc->execbuf_client);
	guc->execbuf_client = NULL;

	/* Revert back to manual ELSP submission */
	intel_execlists_enable_submission(dev_priv);
}

void i915_guc_submission_fini(struct drm_i915_private *dev_priv)
+0 −1
Original line number Diff line number Diff line
@@ -160,7 +160,6 @@ extern int intel_guc_resume(struct drm_device *dev);
int i915_guc_submission_init(struct drm_i915_private *dev_priv);
int i915_guc_submission_enable(struct drm_i915_private *dev_priv);
int i915_guc_wq_check_space(struct drm_i915_gem_request *rq);
int i915_guc_submit(struct drm_i915_gem_request *rq);
void i915_guc_submission_disable(struct drm_i915_private *dev_priv);
void i915_guc_submission_fini(struct drm_i915_private *dev_priv);

+15 −11
Original line number Diff line number Diff line
@@ -738,7 +738,7 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request
}

/*
 * intel_logical_ring_advance_and_submit() - advance the tail and submit the workload
 * intel_logical_ring_advance() - advance the tail and prepare for submission
 * @request: Request to advance the logical ringbuffer of.
 *
 * The tail is updated in our logical ringbuffer struct, not in the actual context. What
@@ -747,7 +747,7 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request
 * point, the tail *inside* the context is updated and the ELSP written to.
 */
static int
intel_logical_ring_advance_and_submit(struct drm_i915_gem_request *request)
intel_logical_ring_advance(struct drm_i915_gem_request *request)
{
	struct intel_ring *ring = request->ring;
	struct intel_engine_cs *engine = request->engine;
@@ -773,12 +773,6 @@ intel_logical_ring_advance_and_submit(struct drm_i915_gem_request *request)
	 */
	request->previous_context = engine->last_context;
	engine->last_context = request->ctx;

	if (i915.enable_guc_submission)
		i915_guc_submit(request);
	else
		execlists_context_queue(request);

	return 0;
}

@@ -1768,7 +1762,7 @@ static int gen8_emit_request(struct drm_i915_gem_request *request)
	intel_ring_emit(ring, request->fence.seqno);
	intel_ring_emit(ring, MI_USER_INTERRUPT);
	intel_ring_emit(ring, MI_NOOP);
	return intel_logical_ring_advance_and_submit(request);
	return intel_logical_ring_advance(request);
}

static int gen8_emit_request_render(struct drm_i915_gem_request *request)
@@ -1799,7 +1793,7 @@ static int gen8_emit_request_render(struct drm_i915_gem_request *request)
	intel_ring_emit(ring, 0);
	intel_ring_emit(ring, MI_USER_INTERRUPT);
	intel_ring_emit(ring, MI_NOOP);
	return intel_logical_ring_advance_and_submit(request);
	return intel_logical_ring_advance(request);
}

static int intel_lr_context_render_state_init(struct drm_i915_gem_request *req)
@@ -1900,13 +1894,23 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *engine)
	engine->i915 = NULL;
}

void intel_execlists_enable_submission(struct drm_i915_private *dev_priv)
{
	struct intel_engine_cs *engine;

	for_each_engine(engine, dev_priv)
		engine->submit_request = execlists_context_queue;
}

static void
logical_ring_default_vfuncs(struct intel_engine_cs *engine)
{
	/* Default vfuncs which can be overriden by each engine. */
	engine->init_hw = gen8_init_common_ring;
	engine->emit_request = gen8_emit_request;
	engine->emit_flush = gen8_emit_flush;
	engine->emit_request = gen8_emit_request;
	engine->submit_request = execlists_context_queue;

	engine->irq_enable = gen8_logical_ring_enable_irq;
	engine->irq_disable = gen8_logical_ring_disable_irq;
	engine->emit_bb_start = gen8_emit_bb_start;
+2 −0
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ uint64_t intel_lr_context_descriptor(struct i915_gem_context *ctx,
/* Execlists */
int intel_sanitize_enable_execlists(struct drm_i915_private *dev_priv,
				    int enable_execlists);
void intel_execlists_enable_submission(struct drm_i915_private *dev_priv);

struct i915_execbuffer_params;
int intel_execlists_submission(struct i915_execbuffer_params *params,
			       struct drm_i915_gem_execbuffer2 *args,
Loading