@@ -531,6 +531,8 @@ struct i915_hw_context {
struct intel_ring_buffer *ring;
struct drm_i915_gem_object *obj;
struct i915_ctx_hang_stats hang_stats;
+
+ struct i915_hw_ppgtt ppgtt;
};
enum no_fbc_reason {
@@ -4222,17 +4222,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, 0);
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;
}
@@ -260,7 +260,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)
My long term vision is for contexts to have a 1:1 relationship with a PPGTT. Sharing objects between address spaces would work similarly to the flink/dmabuf model if needed. The only current code to convert is the aliasing 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 on GEN5 since I believe our odds of running PPGTT on GEN5 are fairly close to 0) 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(-)