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

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

drm/i915: Treat kernel context as initialised

The kernel context exists simply as a placeholder and should never be
executed with a render context. It does not need the golden render
state, as that will always be applied to a user context. By skipping the
initialisation we can avoid issues in attempting to program the golden
render context when trying to make the hardware idle.

v2: Rebase

Testcase: igt/drm_module_reload_basic #byt
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95634


Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1466776558-21516-3-git-send-email-chris@chris-wilson.co.uk
parent 0cb26a8e
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -472,13 +472,17 @@ void i915_gem_context_lost(struct drm_i915_private *dev_priv)
			i915_gem_context_unpin(engine->last_context, engine);
			engine->last_context = NULL;
		}

		/* Force the GPU state to be reinitialised on enabling */
		dev_priv->kernel_context->engine[engine->id].initialised =
			engine->init_context == NULL;
	}

	/* Force the GPU state to be reinitialised on enabling */
	/* Force the GPU state to be restored on enabling */
	if (!i915.enable_execlists) {
		for_each_engine(engine, dev_priv) {
			struct intel_context *kce =
				&dev_priv->kernel_context->engine[engine->id];

			kce->initialised = true;
		}
	}
	dev_priv->kernel_context->remap_slice = ALL_L3_SLICES(dev_priv);
}

+10 −0
Original line number Diff line number Diff line
@@ -2338,6 +2338,16 @@ static int intel_ring_context_pin(struct i915_gem_context *ctx,
			goto error;
	}

	/* The kernel context is only used as a placeholder for flushing the
	 * active context. It is never used for submitting user rendering and
	 * as such never requires the golden render context, and so we can skip
	 * emitting it when we switch to the kernel context. This is required
	 * as during eviction we cannot allocate and pin the renderstate in
	 * order to initialise the context.
	 */
	if (ctx == ctx->i915->kernel_context)
		ce->initialised = true;

	i915_gem_context_reference(ctx);
	return 0;