OSDN Git Service

drm/i915: Generalize PPGTT init
authorBen Widawsky <benjamin.widawsky@intel.com>
Fri, 6 Dec 2013 22:11:13 +0000 (14:11 -0800)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 18 Dec 2013 14:29:24 +0000 (15:29 +0100)
Rearrange the initialization code to try to special case the aliasing
PPGTT less, and provide usable interfaces for the general case later.

Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem_gtt.c

index 0218e34..fdeed68 100644 (file)
@@ -888,15 +888,11 @@ err_pt_alloc:
        return ret;
 }
 
-static int i915_gem_init_aliasing_ppgtt(struct drm_device *dev)
+static int i915_gem_init_ppgtt(struct drm_device *dev,
+                              struct i915_hw_ppgtt *ppgtt)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct i915_hw_ppgtt *ppgtt;
-       int ret;
-
-       ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
-       if (!ppgtt)
-               return -ENOMEM;
+       int ret = 0;
 
        ppgtt->base.dev = dev;
 
@@ -907,13 +903,9 @@ static int i915_gem_init_aliasing_ppgtt(struct drm_device *dev)
        else
                BUG();
 
-       if (ret)
-               kfree(ppgtt);
-       else {
-               dev_priv->mm.aliasing_ppgtt = ppgtt;
+       if (!ret)
                drm_mm_init(&ppgtt->base.mm, ppgtt->base.start,
                            ppgtt->base.total);
-       }
 
        return ret;
 }
@@ -1430,11 +1422,23 @@ void i915_gem_init_global_gtt(struct drm_device *dev)
 
        i915_gem_setup_global_gtt(dev, 0, mappable_size, gtt_size);
        if (intel_enable_ppgtt(dev) && HAS_ALIASING_PPGTT(dev)) {
+               struct i915_hw_ppgtt *ppgtt;
                int ret;
 
-               ret = i915_gem_init_aliasing_ppgtt(dev);
-               if (ret)
-                       DRM_ERROR("Aliased PPGTT setup failed %d\n", ret);
+               ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
+               if (!ppgtt) {
+                       DRM_ERROR("Aliased PPGTT setup failed -ENOMEM\n");
+                       return;
+               }
+
+               ret = i915_gem_init_ppgtt(dev, ppgtt);
+               if (!ret) {
+                       dev_priv->mm.aliasing_ppgtt = ppgtt;
+                       return;
+               }
+
+               kfree(ppgtt);
+               DRM_ERROR("Aliased PPGTT setup failed %d\n", ret);
        }
 }