summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Widawsky <benjamin.widawsky@intel.com>2013-10-24 17:02:02 -0700
committerBen Widawsky <benjamin.widawsky@intel.com>2013-12-06 10:55:30 -0800
commiteb8fda5b296c1f5e7c604edd8896ef617a119046 (patch)
tree619360ddc53046926bcc2d0298fd56391823c2aa
parent05e1f82bb939661941f3b306276ade00c79165b2 (diff)
drm/i915: Generalize PPGTT init
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>
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 4aca8b2ae781..89df963ff31a 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -890,15 +890,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;
@@ -909,13 +905,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;
}
@@ -1432,11 +1424,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);
}
}