]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/gtt: Preallocate Braswell top-level page directory
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 23 Aug 2019 14:14:21 +0000 (15:14 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 23 Aug 2019 18:44:21 +0000 (19:44 +0100)
In order for the Braswell top-level PD to remain the same from the time
of request construction to its submission onto HW, as we may be
asynchronously rewriting the page tables (thus changing the expected
register state after having already stored the old addresses in the
request), the top level PD must be preallocated.

So wave goodbye to our lazy allocation of those 4x2 pages.

v2: A little bit of write-flushing required (presumably it always has
been required, but now we are more susceptible and it is showing up!)

v3: Put back the forced-PD-reload on every batch, we can't survive
without it and explicitly marking the context for PD reload makes
Braswell turn nasty.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190823141421.2398-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/i915_gem_gtt.c

index 1cdfe05514c3f6597b78455978030307a5d10b73..1f735ca9b1736dcc3d2096924acf4d10e3ca5581 100644 (file)
@@ -1003,12 +1003,18 @@ static int emit_ppgtt_update(struct i915_request *rq, void *data)
                intel_ring_advance(rq, cs);
        } else if (HAS_LOGICAL_RING_CONTEXTS(engine->i915)) {
                struct i915_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
+               int err;
+
+               /* Magic required to prevent forcewake errors! */
+               err = engine->emit_flush(rq, EMIT_INVALIDATE);
+               if (err)
+                       return err;
 
                cs = intel_ring_begin(rq, 4 * GEN8_3LVL_PDPES + 2);
                if (IS_ERR(cs))
                        return PTR_ERR(cs);
 
-               *cs++ = MI_LOAD_REGISTER_IMM(2 * GEN8_3LVL_PDPES);
+               *cs++ = MI_LOAD_REGISTER_IMM(2 * GEN8_3LVL_PDPES) | MI_LRI_FORCE_POSTED;
                for (i = GEN8_3LVL_PDPES; i--; ) {
                        const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i);
 
index 2a425db1cfd89280654fb429dd4fbe0a82b8ead4..e0e9b9b52544db498b266a9813827eadf7ddff4e 100644 (file)
@@ -168,6 +168,7 @@ static int ppgtt_bind_vma(struct i915_vma *vma,
                pte_flags |= PTE_READ_ONLY;
 
        vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
+       wmb();
 
        return 0;
 }
@@ -1426,6 +1427,7 @@ static int gen8_preallocate_top_level_pdp(struct i915_ppgtt *ppgtt)
                set_pd_entry(pd, idx, pde);
                atomic_inc(px_used(pde)); /* keep pinned */
        }
+       wmb();
 
        return 0;
 }
@@ -1513,11 +1515,9 @@ static struct i915_ppgtt *gen8_ppgtt_create(struct drm_i915_private *i915)
        }
 
        if (!i915_vm_is_4lvl(&ppgtt->vm)) {
-               if (intel_vgpu_active(i915)) {
-                       err = gen8_preallocate_top_level_pdp(ppgtt);
-                       if (err)
-                               goto err_free_pd;
-               }
+               err = gen8_preallocate_top_level_pdp(ppgtt);
+               if (err)
+                       goto err_free_pd;
        }
 
        ppgtt->vm.insert_entries = gen8_ppgtt_insert;