drm/i915: Move allocate_va_range to GTT
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 15 Feb 2017 08:43:42 +0000 (08:43 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 15 Feb 2017 10:07:21 +0000 (10:07 +0000)
In the future, we need to call allocate_va_range on the aliasing-ppgtt
which means moving the call down from the vma into the vm (which is
more appropriate for calling the vm function).

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170215084357.19977-8-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_vma.c

index 8ac62cabf4cc13efa106d6f5a47a7cd8854d353b..8a24bf006a822bf19fbb9c3666f6e07253cdd157 100644 (file)
@@ -190,11 +190,18 @@ static int ppgtt_bind_vma(struct i915_vma *vma,
                          enum i915_cache_level cache_level,
                          u32 unused)
 {
-       u32 pte_flags = 0;
+       u32 pte_flags;
+       int ret;
+
+       trace_i915_va_alloc(vma);
+       ret = vma->vm->allocate_va_range(vma->vm, vma->node.start, vma->size);
+       if (ret)
+               return ret;
 
        vma->pages = vma->obj->mm.pages;
 
        /* Currently applicable only to VLV */
+       pte_flags = 0;
        if (vma->obj->gt_ro)
                pte_flags |= PTE_READ_ONLY;
 
@@ -206,9 +213,7 @@ static int ppgtt_bind_vma(struct i915_vma *vma,
 
 static void ppgtt_unbind_vma(struct i915_vma *vma)
 {
-       vma->vm->clear_range(vma->vm,
-                            vma->node.start,
-                            vma->size);
+       vma->vm->clear_range(vma->vm, vma->node.start, vma->size);
 }
 
 static gen8_pte_t gen8_pte_encode(dma_addr_t addr,
@@ -2650,9 +2655,10 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
 {
        struct drm_i915_private *i915 = vma->vm->i915;
        u32 pte_flags;
+       int ret;
 
        if (unlikely(!vma->pages)) {
-               int ret = i915_get_ggtt_vma_pages(vma);
+               ret = i915_get_ggtt_vma_pages(vma);
                if (ret)
                        return ret;
        }
@@ -2662,6 +2668,22 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
        if (vma->obj->gt_ro)
                pte_flags |= PTE_READ_ONLY;
 
+       if (flags & I915_VMA_LOCAL_BIND) {
+               struct i915_hw_ppgtt *appgtt = i915->mm.aliasing_ppgtt;
+
+               if (appgtt->base.allocate_va_range) {
+                       ret = appgtt->base.allocate_va_range(&appgtt->base,
+                                                            vma->node.start,
+                                                            vma->node.size);
+                       if (ret)
+                               return ret;
+               }
+
+               appgtt->base.insert_entries(&appgtt->base,
+                                           vma->pages, vma->node.start,
+                                           cache_level, pte_flags);
+       }
+
        if (flags & I915_VMA_GLOBAL_BIND) {
                intel_runtime_pm_get(i915);
                vma->vm->insert_entries(vma->vm,
@@ -2670,13 +2692,6 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
                intel_runtime_pm_put(i915);
        }
 
-       if (flags & I915_VMA_LOCAL_BIND) {
-               struct i915_hw_ppgtt *appgtt = i915->mm.aliasing_ppgtt;
-               appgtt->base.insert_entries(&appgtt->base,
-                                           vma->pages, vma->node.start,
-                                           cache_level, pte_flags);
-       }
-
        return 0;
 }
 
index 0dc994b7692452a3dce2776918e912abd2d494be..c1abfe7b48ea06b658e75b20d45a46d68f9f3fa5 100644 (file)
@@ -263,15 +263,6 @@ int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
                                        vma->vm->total)))
                return -ENODEV;
 
-       if (vma_flags == 0 && vma->vm->allocate_va_range) {
-               trace_i915_va_alloc(vma);
-               ret = vma->vm->allocate_va_range(vma->vm,
-                                                vma->node.start,
-                                                vma->node.size);
-               if (ret)
-                       return ret;
-       }
-
        trace_i915_vma_bind(vma, bind_flags);
        ret = vma->vm->bind_vma(vma, cache_level, bind_flags);
        if (ret)