drm/i915: track objects in the gtt
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 5 Nov 2010 19:24:53 +0000 (20:24 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 23 Nov 2010 20:14:45 +0000 (20:14 +0000)
This is required to restore gtt mappings on resume when agp is gone.

The right way to do this would be to make sturct drm_mm_node embeddable
and use the allocation list maintained by the drm memory manager. But
that's a bigger project. Getting rid of the per bo agp_mem will save
more memory than this wastes, anyway.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c

index b62ff5d6fa7e92272d50f68b8708d265e47c4a58..67ec046aeb905ba0a7edb073bb3078d021f8429f 100644 (file)
@@ -547,6 +547,9 @@ typedef struct drm_i915_private {
                struct drm_mm stolen;
                /** Memory allocator for GTT */
                struct drm_mm gtt_space;
+               /** List of all objects in gtt_space. Used to restore gtt
+                * mappings on resume */
+               struct list_head gtt_list;
                /** End of mappable part of GTT */
                unsigned long gtt_mappable_end;
 
@@ -714,6 +717,7 @@ struct drm_i915_gem_object {
 
        /** Current space allocated to this object in the GTT, if any. */
        struct drm_mm_node *gtt_space;
+       struct list_head gtt_list;
 
        /** This object's place on the active/flushing/inactive lists */
        struct list_head ring_list;
index b663d2da1db38f1380661a51422fe8973c1246f0..07e1b25f4a8a1ce60156e2efa2113f4b335c2c9a 100644 (file)
@@ -95,6 +95,7 @@ static void i915_gem_info_add_gtt(struct drm_i915_private *dev_priv,
                        min_t(size_t, obj->gtt_space->size,
                              dev_priv->mm.gtt_mappable_end - obj->gtt_offset);
        }
+       list_add_tail(&obj->gtt_list, &dev_priv->mm.gtt_list);
 }
 
 static void i915_gem_info_remove_gtt(struct drm_i915_private *dev_priv,
@@ -107,6 +108,7 @@ static void i915_gem_info_remove_gtt(struct drm_i915_private *dev_priv,
                        min_t(size_t, obj->gtt_space->size,
                              dev_priv->mm.gtt_mappable_end - obj->gtt_offset);
        }
+       list_del_init(&obj->gtt_list);
 }
 
 /**
@@ -4604,6 +4606,7 @@ struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev,
        obj->base.driver_private = NULL;
        obj->fence_reg = I915_FENCE_REG_NONE;
        INIT_LIST_HEAD(&obj->mm_list);
+       INIT_LIST_HEAD(&obj->gtt_list);
        INIT_LIST_HEAD(&obj->ring_list);
        INIT_LIST_HEAD(&obj->gpu_write_list);
        obj->madv = I915_MADV_WILLNEED;
@@ -4916,6 +4919,7 @@ i915_gem_load(struct drm_device *dev)
        INIT_LIST_HEAD(&dev_priv->mm.pinned_list);
        INIT_LIST_HEAD(&dev_priv->mm.fence_list);
        INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list);
+       INIT_LIST_HEAD(&dev_priv->mm.gtt_list);
        init_ring_lists(&dev_priv->render_ring);
        init_ring_lists(&dev_priv->bsd_ring);
        init_ring_lists(&dev_priv->blt_ring);