Commit 71b0846c authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915/guc: Remove preemption support for current fw



Preemption via GuC submission is not being supported with its current
legacy incarnation. The current FW does support a similar pre-emption
flow via H2G, but it is class-based instead of being instance-based,
which doesn't fit well with the i915 tracking. To fix this, the
firmware is being updated to better support our needs with a new flow,
so we can safely remove the old code.

v2 (Daniele): resurrect & rebase, reword commit message, remove
preempt_context as well

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: John Harrison <John.C.Harrison@Intel.com>
Acked-by: default avatarMatthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarMichał Winiarski <michal.winiarski@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190710005437.3496-2-daniele.ceraolospurio@intel.com
parent bf1315b8
Loading
Loading
Loading
Loading
+0 −17
Original line number Diff line number Diff line
@@ -644,18 +644,12 @@ static void init_contexts(struct drm_i915_private *i915)
	init_llist_head(&i915->contexts.free_list);
}

static bool needs_preempt_context(struct drm_i915_private *i915)
{
	return USES_GUC_SUBMISSION(i915);
}

int i915_gem_contexts_init(struct drm_i915_private *dev_priv)
{
	struct i915_gem_context *ctx;

	/* Reassure ourselves we are only called once */
	GEM_BUG_ON(dev_priv->kernel_context);
	GEM_BUG_ON(dev_priv->preempt_context);

	init_contexts(dev_priv);

@@ -676,15 +670,6 @@ int i915_gem_contexts_init(struct drm_i915_private *dev_priv)
	GEM_BUG_ON(!atomic_read(&ctx->hw_id_pin_count));
	dev_priv->kernel_context = ctx;

	/* highest priority; preempting task */
	if (needs_preempt_context(dev_priv)) {
		ctx = i915_gem_context_create_kernel(dev_priv, INT_MAX);
		if (!IS_ERR(ctx))
			dev_priv->preempt_context = ctx;
		else
			DRM_ERROR("Failed to create preempt context; disabling preemption\n");
	}

	DRM_DEBUG_DRIVER("%s context support initialized\n",
			 DRIVER_CAPS(dev_priv)->has_logical_contexts ?
			 "logical" : "fake");
@@ -695,8 +680,6 @@ void i915_gem_contexts_fini(struct drm_i915_private *i915)
{
	lockdep_assert_held(&i915->drm.struct_mutex);

	if (i915->preempt_context)
		destroy_kernel_context(&i915->preempt_context);
	destroy_kernel_context(&i915->kernel_context);

	/* Must free all deferred contexts (via flush_workqueue) first */
+0 −13
Original line number Diff line number Diff line
@@ -841,15 +841,6 @@ int intel_engine_init_common(struct intel_engine_cs *engine)
	if (ret)
		return ret;

	/*
	 * Similarly the preempt context must always be available so that
	 * we can interrupt the engine at any time. However, as preemption
	 * is optional, we allow it to fail.
	 */
	if (i915->preempt_context)
		pin_context(i915->preempt_context, engine,
			    &engine->preempt_context);

	ret = measure_breadcrumb_dw(engine);
	if (ret < 0)
		goto err_unpin;
@@ -861,8 +852,6 @@ int intel_engine_init_common(struct intel_engine_cs *engine)
	return 0;

err_unpin:
	if (engine->preempt_context)
		intel_context_unpin(engine->preempt_context);
	intel_context_unpin(engine->kernel_context);
	return ret;
}
@@ -887,8 +876,6 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine)
	if (engine->default_state)
		i915_gem_object_put(engine->default_state);

	if (engine->preempt_context)
		intel_context_unpin(engine->preempt_context);
	intel_context_unpin(engine->kernel_context);
	GEM_BUG_ON(!llist_empty(&engine->barrier_tasks));

+0 −1
Original line number Diff line number Diff line
@@ -288,7 +288,6 @@ struct intel_engine_cs {
	struct llist_head barrier_tasks;

	struct intel_context *kernel_context; /* pinned */
	struct intel_context *preempt_context; /* pinned; optional */

	intel_engine_mask_t saturated; /* submitting semaphores too late? */

+0 −4
Original line number Diff line number Diff line
@@ -145,10 +145,6 @@ int intel_gt_resume(struct intel_gt *gt)
		if (ce)
			ce->ops->reset(ce);

		ce = engine->preempt_context;
		if (ce)
			ce->ops->reset(ce);

		engine->serial++; /* kernel context lost */
		err = engine->resume(engine);

+0 −5
Original line number Diff line number Diff line
@@ -2010,11 +2010,6 @@ static int i915_guc_info(struct seq_file *m, void *data)

	seq_printf(m, "\nGuC execbuf client @ %p:\n", guc->execbuf_client);
	i915_guc_client_info(m, dev_priv, guc->execbuf_client);
	if (guc->preempt_client) {
		seq_printf(m, "\nGuC preempt client @ %p:\n",
			   guc->preempt_client);
		i915_guc_client_info(m, dev_priv, guc->preempt_client);
	}

	/* Add more as required ... */

Loading