drm/i915: Extract aliasing ppgtt setup
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 13 Feb 2017 17:15:50 +0000 (17:15 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 13 Feb 2017 20:46:45 +0000 (20:46 +0000)
In order to force testing of the aliasing ppgtt, extract its
initialisation function.

v2: Also extract the cleanup function for symmetry.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170213171558.20942-39-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_gtt.h

index f8ac69380a0fd6dd95c15dd308fcb6b30f0ff277..eebbffdb9a0b5e48ae4e95294ca359409a661057 100644 (file)
@@ -2738,6 +2738,59 @@ static void i915_gtt_color_adjust(const struct drm_mm_node *node,
                *end -= I915_GTT_PAGE_SIZE;
 }
 
+int i915_gem_init_aliasing_ppgtt(struct drm_i915_private *i915)
+{
+       struct i915_ggtt *ggtt = &i915->ggtt;
+       struct i915_hw_ppgtt *ppgtt;
+       int err;
+
+       ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
+       if (!ppgtt)
+               return -ENOMEM;
+
+       err = __hw_ppgtt_init(ppgtt, i915);
+       if (err)
+               goto err_ppgtt;
+
+       if (ppgtt->base.allocate_va_range) {
+               err = ppgtt->base.allocate_va_range(&ppgtt->base,
+                                                   0, ppgtt->base.total);
+               if (err)
+                       goto err_ppgtt_cleanup;
+       }
+
+       ppgtt->base.clear_range(&ppgtt->base,
+                               ppgtt->base.start,
+                               ppgtt->base.total);
+
+       i915->mm.aliasing_ppgtt = ppgtt;
+       WARN_ON(ggtt->base.bind_vma != ggtt_bind_vma);
+       ggtt->base.bind_vma = aliasing_gtt_bind_vma;
+
+       return 0;
+
+err_ppgtt_cleanup:
+       ppgtt->base.cleanup(&ppgtt->base);
+err_ppgtt:
+       kfree(ppgtt);
+       return err;
+}
+
+void i915_gem_fini_aliasing_ppgtt(struct drm_i915_private *i915)
+{
+       struct i915_ggtt *ggtt = &i915->ggtt;
+       struct i915_hw_ppgtt *ppgtt;
+
+       ppgtt = fetch_and_zero(&i915->mm.aliasing_ppgtt);
+       if (!ppgtt)
+               return;
+
+       ppgtt->base.cleanup(&ppgtt->base);
+       kfree(ppgtt);
+
+       ggtt->base.bind_vma = ggtt_bind_vma;
+}
+
 int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
 {
        /* Let GEM Manage all of the aperture.
@@ -2751,7 +2804,6 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
         */
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        unsigned long hole_start, hole_end;
-       struct i915_hw_ppgtt *ppgtt;
        struct drm_mm_node *entry;
        int ret;
 
@@ -2780,38 +2832,13 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
                               ggtt->base.total - PAGE_SIZE, PAGE_SIZE);
 
        if (USES_PPGTT(dev_priv) && !USES_FULL_PPGTT(dev_priv)) {
-               ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
-               if (!ppgtt) {
-                       ret = -ENOMEM;
-                       goto err;
-               }
-
-               ret = __hw_ppgtt_init(ppgtt, dev_priv);
+               ret = i915_gem_init_aliasing_ppgtt(dev_priv);
                if (ret)
-                       goto err_ppgtt;
-
-               if (ppgtt->base.allocate_va_range) {
-                       ret = ppgtt->base.allocate_va_range(&ppgtt->base, 0,
-                                                           ppgtt->base.total);
-                       if (ret)
-                               goto err_ppgtt_cleanup;
-               }
-
-               ppgtt->base.clear_range(&ppgtt->base,
-                                       ppgtt->base.start,
-                                       ppgtt->base.total);
-
-               dev_priv->mm.aliasing_ppgtt = ppgtt;
-               WARN_ON(ggtt->base.bind_vma != ggtt_bind_vma);
-               ggtt->base.bind_vma = aliasing_gtt_bind_vma;
+                       goto err;
        }
 
        return 0;
 
-err_ppgtt_cleanup:
-       ppgtt->base.cleanup(&ppgtt->base);
-err_ppgtt:
-       kfree(ppgtt);
 err:
        drm_mm_remove_node(&ggtt->error_capture);
        return ret;
@@ -2834,12 +2861,7 @@ void i915_ggtt_cleanup_hw(struct drm_i915_private *dev_priv)
                WARN_ON(i915_vma_unbind(vma));
        mutex_unlock(&dev_priv->drm.struct_mutex);
 
-       if (dev_priv->mm.aliasing_ppgtt) {
-               struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
-               ppgtt->base.cleanup(&ppgtt->base);
-               kfree(ppgtt);
-       }
-
+       i915_gem_fini_aliasing_ppgtt(dev_priv);
        i915_gem_cleanup_stolen(&dev_priv->drm);
 
        if (drm_mm_node_allocated(&ggtt->error_capture))
index 7e678ce5a9c7f443f9ba931c76494eeeef5ea6ce..fe922059a412acaecf470b788e255f153537933f 100644 (file)
@@ -531,6 +531,9 @@ i915_vm_is_48bit(const struct i915_address_space *vm)
        return (vm->total - 1) >> 32;
 }
 
+int i915_gem_init_aliasing_ppgtt(struct drm_i915_private *i915);
+void i915_gem_fini_aliasing_ppgtt(struct drm_i915_private *i915);
+
 int i915_ggtt_probe_hw(struct drm_i915_private *dev_priv);
 int i915_ggtt_init_hw(struct drm_i915_private *dev_priv);
 int i915_ggtt_enable_hw(struct drm_i915_private *dev_priv);