drm/i915: track objects in the gtt
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>
This commit is contained in:
parent
f050a8abbd
commit
93a37f20ea
2 changed files with 8 additions and 0 deletions
|
@ -547,6 +547,9 @@ typedef struct drm_i915_private {
|
||||||
struct drm_mm stolen;
|
struct drm_mm stolen;
|
||||||
/** Memory allocator for GTT */
|
/** Memory allocator for GTT */
|
||||||
struct drm_mm gtt_space;
|
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 */
|
/** End of mappable part of GTT */
|
||||||
unsigned long gtt_mappable_end;
|
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. */
|
/** Current space allocated to this object in the GTT, if any. */
|
||||||
struct drm_mm_node *gtt_space;
|
struct drm_mm_node *gtt_space;
|
||||||
|
struct list_head gtt_list;
|
||||||
|
|
||||||
/** This object's place on the active/flushing/inactive lists */
|
/** This object's place on the active/flushing/inactive lists */
|
||||||
struct list_head ring_list;
|
struct list_head ring_list;
|
||||||
|
|
|
@ -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,
|
min_t(size_t, obj->gtt_space->size,
|
||||||
dev_priv->mm.gtt_mappable_end - obj->gtt_offset);
|
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,
|
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,
|
min_t(size_t, obj->gtt_space->size,
|
||||||
dev_priv->mm.gtt_mappable_end - obj->gtt_offset);
|
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->base.driver_private = NULL;
|
||||||
obj->fence_reg = I915_FENCE_REG_NONE;
|
obj->fence_reg = I915_FENCE_REG_NONE;
|
||||||
INIT_LIST_HEAD(&obj->mm_list);
|
INIT_LIST_HEAD(&obj->mm_list);
|
||||||
|
INIT_LIST_HEAD(&obj->gtt_list);
|
||||||
INIT_LIST_HEAD(&obj->ring_list);
|
INIT_LIST_HEAD(&obj->ring_list);
|
||||||
INIT_LIST_HEAD(&obj->gpu_write_list);
|
INIT_LIST_HEAD(&obj->gpu_write_list);
|
||||||
obj->madv = I915_MADV_WILLNEED;
|
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.pinned_list);
|
||||||
INIT_LIST_HEAD(&dev_priv->mm.fence_list);
|
INIT_LIST_HEAD(&dev_priv->mm.fence_list);
|
||||||
INIT_LIST_HEAD(&dev_priv->mm.deferred_free_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->render_ring);
|
||||||
init_ring_lists(&dev_priv->bsd_ring);
|
init_ring_lists(&dev_priv->bsd_ring);
|
||||||
init_ring_lists(&dev_priv->blt_ring);
|
init_ring_lists(&dev_priv->blt_ring);
|
||||||
|
|
Loading…
Add table
Reference in a new issue