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

drm/i915/gt: Provide a local intel_context.vm



Track the currently bound address space used by the HW context. Minor
conversions to use the local intel_context.vm are made, leaving behind
some more surgery required to make intel_context the primary through the
selftests.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190730143209.4549-2-chris@chris-wilson.co.uk
parent c082afac
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -250,13 +250,11 @@ int i915_gem_schedule_fill_pages_blt(struct drm_i915_gem_object *obj,
				     u32 value)
{
	struct drm_i915_private *i915 = to_i915(obj->base.dev);
	struct i915_gem_context *ctx = ce->gem_context;
	struct i915_address_space *vm = ctx->vm ?: &i915->ggtt.vm;
	struct clear_pages_work *work;
	struct i915_sleeve *sleeve;
	int err;

	sleeve = create_sleeve(vm, obj, pages, page_sizes);
	sleeve = create_sleeve(ce->vm, obj, pages, page_sizes);
	if (IS_ERR(sleeve))
		return PTR_ERR(sleeve);

+11 −4
Original line number Diff line number Diff line
@@ -475,10 +475,18 @@ static struct i915_address_space *
__set_ppgtt(struct i915_gem_context *ctx, struct i915_address_space *vm)
{
	struct i915_address_space *old = ctx->vm;
	struct i915_gem_engines_iter it;
	struct intel_context *ce;

	ctx->vm = i915_vm_get(vm);
	ctx->desc_template = default_desc_template(ctx->i915, vm);

	for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
		i915_vm_put(ce->vm);
		ce->vm = i915_vm_get(vm);
	}
	i915_gem_context_unlock_engines(ctx);

	return old;
}

@@ -1004,7 +1012,7 @@ static void set_ppgtt_barrier(void *data)

static int emit_ppgtt_update(struct i915_request *rq, void *data)
{
	struct i915_address_space *vm = rq->gem_context->vm;
	struct i915_address_space *vm = rq->hw_context->vm;
	struct intel_engine_cs *engine = rq->engine;
	u32 base = engine->mmio_base;
	u32 *cs;
@@ -1113,9 +1121,8 @@ static int set_ppgtt(struct drm_i915_file_private *file_priv,
				   set_ppgtt_barrier,
				   old);
	if (err) {
		ctx->vm = old;
		ctx->desc_template = default_desc_template(ctx->i915, old);
		i915_vm_put(vm);
		i915_vm_put(__set_ppgtt(ctx, old));
		i915_vm_put(old);
	}

unlock:
+3 −8
Original line number Diff line number Diff line
@@ -223,7 +223,6 @@ struct i915_execbuffer {
	struct intel_engine_cs *engine; /** engine to queue the request to */
	struct intel_context *context; /* logical state for the request */
	struct i915_gem_context *gem_context; /** caller's context */
	struct i915_address_space *vm; /** GTT and vma for the request */

	struct i915_request *request; /** our request to build */
	struct i915_vma *batch; /** identity of the batch obj/vma */
@@ -697,7 +696,7 @@ static int eb_reserve(struct i915_execbuffer *eb)

		case 1:
			/* Too fragmented, unbind everything and retry */
			err = i915_gem_evict_vm(eb->vm);
			err = i915_gem_evict_vm(eb->context->vm);
			if (err)
				return err;
			break;
@@ -725,12 +724,8 @@ static int eb_select_context(struct i915_execbuffer *eb)
		return -ENOENT;

	eb->gem_context = ctx;
	if (ctx->vm) {
		eb->vm = ctx->vm;
	if (ctx->vm)
		eb->invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
	} else {
		eb->vm = &eb->i915->ggtt.vm;
	}

	eb->context_flags = 0;
	if (test_bit(UCONTEXT_NO_ZEROMAP, &ctx->user_flags))
@@ -832,7 +827,7 @@ static int eb_lookup_vmas(struct i915_execbuffer *eb)
			goto err_vma;
		}

		vma = i915_vma_instance(obj, eb->vm, NULL);
		vma = i915_vma_instance(obj, eb->context->vm, NULL);
		if (IS_ERR(vma)) {
			err = PTR_ERR(vma);
			goto err_obj;
+1 −5
Original line number Diff line number Diff line
@@ -47,15 +47,11 @@ int i915_gem_object_fill_blt(struct drm_i915_gem_object *obj,
			     struct intel_context *ce,
			     u32 value)
{
	struct drm_i915_private *i915 = to_i915(obj->base.dev);
	struct i915_gem_context *ctx = ce->gem_context;
	struct i915_address_space *vm = ctx->vm ?: &i915->ggtt.vm;
	struct i915_request *rq;
	struct i915_vma *vma;
	int err;

	/* XXX: ce->vm please */
	vma = i915_vma_instance(obj, vm, NULL);
	vma = i915_vma_instance(obj, ce->vm, NULL);
	if (IS_ERR(vma))
		return PTR_ERR(vma);

+1 −1
Original line number Diff line number Diff line
@@ -747,7 +747,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,

	GEM_BUG_ON(!intel_engine_can_store_dword(ce->engine));

	vma = i915_vma_instance(obj, ce->gem_context->vm, NULL);
	vma = i915_vma_instance(obj, ce->vm, NULL);
	if (IS_ERR(vma))
		return PTR_ERR(vma);

Loading