drm/i915/gt: Provide a local intel_context.vm
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 30 Jul 2019 14:32:09 +0000 (15:32 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 30 Jul 2019 15:09:35 +0000 (16:09 +0100)
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: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190730143209.4549-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/i915_gem_client_blt.c
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
drivers/gpu/drm/i915/gem/i915_gem_object_blt.c
drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
drivers/gpu/drm/i915/gt/intel_context.c
drivers/gpu/drm/i915/gt/intel_context_types.h
drivers/gpu/drm/i915/gt/intel_lrc.c
drivers/gpu/drm/i915/gt/intel_ringbuffer.c
drivers/gpu/drm/i915/gvt/scheduler.c

index 6f537e8e4dea6d39f0178d8cba9d78ef6a9a896e..2312a0c6af89c6137580b93035d34b10bc3b1cac 100644 (file)
@@ -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);
 
index 0f6b0678f5487e75b233c288c1542066afbd3ab8..b28c7ca681a80450f61f4ee88ed779fa75aa7c76 100644 (file)
@@ -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:
index 8a2047c4e7c313074495a7bd266b1a8f10bcda69..cbd7c6e3a1f87b53fbe49c0e0bcd39a17debcfbb 100644 (file)
@@ -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;
index cb42e3a312e2a6732f9a7f1bb58998c3c90b0017..685064af32d15909324252695662f826bb90b1aa 100644 (file)
@@ -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);
 
index bbd17d4b8ffd3bb130c76abfaa224da1065cd792..7f9f6701b32c5c6f5825401f0e68a8bb30b83716 100644 (file)
@@ -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);
 
index d64b45f7ec6d1158687395b0170eff14bb10d3e9..f30441a140f8fb969c7ec1a9441eea1be24c6545 100644 (file)
@@ -191,6 +191,8 @@ intel_context_init(struct intel_context *ce,
        kref_init(&ce->ref);
 
        ce->gem_context = ctx;
+       ce->vm = i915_vm_get(ctx->vm ?: &engine->gt->ggtt->vm);
+
        ce->engine = engine;
        ce->ops = engine->cops;
        ce->sseu = engine->sseu;
@@ -206,6 +208,8 @@ intel_context_init(struct intel_context *ce,
 
 void intel_context_fini(struct intel_context *ce)
 {
+       i915_vm_put(ce->vm);
+
        mutex_destroy(&ce->pin_mutex);
        i915_active_fini(&ce->active);
 }
index 4c0e211c715d14b0133dbdae097a93aa3df4ed3c..68a7e979b1a950c4ef6b1c3936aec2651e5b44a6 100644 (file)
@@ -36,7 +36,6 @@ struct intel_context_ops {
 struct intel_context {
        struct kref ref;
 
-       struct i915_gem_context *gem_context;
        struct intel_engine_cs *engine;
        struct intel_engine_cs *inflight;
 #define intel_context_inflight(ce) ptr_mask_bits((ce)->inflight, 2)
@@ -44,6 +43,9 @@ struct intel_context {
 #define intel_context_inflight_inc(ce) ptr_count_inc(&(ce)->inflight)
 #define intel_context_inflight_dec(ce) ptr_count_dec(&(ce)->inflight)
 
+       struct i915_address_space *vm;
+       struct i915_gem_context *gem_context;
+
        struct list_head signal_link;
        struct list_head signals;
 
index 4d7c4d0dbf75e01735f6ba47109e7eaf18cb8a72..d9061d9348cb9bcf46c7f28050b6eb0349c7c86a 100644 (file)
@@ -1605,8 +1605,6 @@ __execlists_context_pin(struct intel_context *ce,
        void *vaddr;
        int ret;
 
-       GEM_BUG_ON(!ce->gem_context->vm);
-
        ret = execlists_context_deferred_alloc(ce, engine);
        if (ret)
                goto err;
@@ -1716,8 +1714,7 @@ static int gen8_emit_init_breadcrumb(struct i915_request *rq)
 static int emit_pdps(struct i915_request *rq)
 {
        const struct intel_engine_cs * const engine = rq->engine;
-       struct i915_ppgtt * const ppgtt =
-               i915_vm_to_ppgtt(rq->gem_context->vm);
+       struct i915_ppgtt * const ppgtt = i915_vm_to_ppgtt(rq->hw_context->vm);
        int err, i;
        u32 *cs;
 
@@ -1790,7 +1787,7 @@ static int execlists_request_alloc(struct i915_request *request)
         */
 
        /* Unconditionally invalidate GPU caches and TLBs. */
-       if (i915_vm_is_4lvl(request->gem_context->vm))
+       if (i915_vm_is_4lvl(request->hw_context->vm))
                ret = request->engine->emit_flush(request, EMIT_INVALIDATE);
        else
                ret = emit_pdps(request);
@@ -2920,7 +2917,7 @@ static void execlists_init_reg_state(u32 *regs,
                                     struct intel_engine_cs *engine,
                                     struct intel_ring *ring)
 {
-       struct i915_ppgtt *ppgtt = i915_vm_to_ppgtt(ce->gem_context->vm);
+       struct i915_ppgtt *ppgtt = i915_vm_to_ppgtt(ce->vm);
        bool rcs = engine->class == RENDER_CLASS;
        u32 base = engine->mmio_base;
 
index 11afe64cc256bad99bfa7c141410006658b55e65..8d24a49e5139460c61a2992ebbb61e6b2a8faa00 100644 (file)
@@ -1380,9 +1380,9 @@ static struct i915_address_space *vm_alias(struct intel_context *ce)
 {
        struct i915_address_space *vm;
 
-       vm = ce->gem_context->vm;
-       if (!vm)
-               vm = &ce->engine->gt->ggtt->alias->vm;
+       vm = ce->vm;
+       if (i915_is_ggtt(vm))
+               vm = &i915_vm_to_ggtt(vm)->alias->vm;
 
        return vm;
 }
index 2144fb46d0e1ce5f45c125cf3286694e78ff8708..f68798ab1e7c37259628960ebf975bf6413a775c 100644 (file)
@@ -1156,7 +1156,7 @@ void intel_vgpu_clean_submission(struct intel_vgpu *vgpu)
 
        intel_vgpu_select_submission_ops(vgpu, ALL_ENGINES, 0);
 
-       i915_context_ppgtt_root_restore(s, i915_vm_to_ppgtt(s->shadow[0]->gem_context->vm));
+       i915_context_ppgtt_root_restore(s, i915_vm_to_ppgtt(s->shadow[0]->vm));
        for_each_engine(engine, vgpu->gvt->dev_priv, id)
                intel_context_unpin(s->shadow[id]);