@@ -461,6 +461,8 @@ struct i915_hw_context {
struct drm_i915_file_private *file_priv;
struct intel_ring_buffer *ring;
struct drm_i915_gem_object *obj;
+
+ struct i915_hw_ppgtt ppgtt;
};
enum no_fbc_reason {
@@ -4070,17 +4070,19 @@ int i915_gem_init(struct drm_device *dev)
if (intel_enable_ppgtt(dev) && HAS_ALIASING_PPGTT(dev)) {
struct i915_hw_ppgtt *ppgtt;
- ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL);
- if (!ppgtt)
- goto ggtt_only;
-
i915_gem_setup_global_gtt(dev, 0, dev_priv->gtt.mappable_end,
dev_priv->gtt.total, false);
i915_gem_context_init(dev);
+ if (dev_priv->hw_contexts_disabled) {
+ drm_mm_takedown(&dev_priv->mm.gtt_space);
+ goto ggtt_only;
+ }
+
+ ppgtt = &dev_priv->ring[RCS].default_context->ppgtt;
+
ret = i915_gem_ppgtt_init(dev, ppgtt);
- if (ret) {
- kfree(ppgtt);
+ if (ret) {
drm_mm_takedown(&dev_priv->mm.gtt_space);
goto ggtt_only;
}
@@ -232,7 +232,6 @@ static void gen6_ppgtt_cleanup(struct i915_hw_ppgtt *ppgtt)
for (i = 0; i < ppgtt->num_pd_entries; i++)
__free_page(ppgtt->pt_pages[i]);
kfree(ppgtt->pt_pages);
- kfree(ppgtt);
}
static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
The aliasing ppgtt is just the ppgtt for the default context. The obvious downside is until we actually do ppgtt switches, this wastes a bit of memory. ie. by the end of the series, it's a don't care. The other downside is PPGTT can't work without contexts, which *should* have already been the case except for debugging scenarios. (Note the does break the potential to easily use contexts an GEN5) Signed-off-by: Ben Widawsky <ben@bwidawsk.net> --- drivers/gpu/drm/i915/i915_drv.h | 2 ++ drivers/gpu/drm/i915/i915_gem.c | 14 ++++++++------ drivers/gpu/drm/i915/i915_gem_gtt.c | 1 - 3 files changed, 10 insertions(+), 7 deletions(-)