aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_gtt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_gtt.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 7a709cd8d543..6042c5e6d278 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -49,6 +49,28 @@ static unsigned int cache_level_to_agp_type(struct drm_device *dev,
49 } 49 }
50} 50}
51 51
52static bool do_idling(struct drm_i915_private *dev_priv)
53{
54 bool ret = dev_priv->mm.interruptible;
55
56 if (unlikely(dev_priv->mm.gtt->do_idle_maps)) {
57 dev_priv->mm.interruptible = false;
58 if (i915_gpu_idle(dev_priv->dev)) {
59 DRM_ERROR("Couldn't idle GPU\n");
60 /* Wait a bit, in hopes it avoids the hang */
61 udelay(10);
62 }
63 }
64
65 return ret;
66}
67
68static void undo_idling(struct drm_i915_private *dev_priv, bool interruptible)
69{
70 if (unlikely(dev_priv->mm.gtt->do_idle_maps))
71 dev_priv->mm.interruptible = interruptible;
72}
73
52void i915_gem_restore_gtt_mappings(struct drm_device *dev) 74void i915_gem_restore_gtt_mappings(struct drm_device *dev)
53{ 75{
54 struct drm_i915_private *dev_priv = dev->dev_private; 76 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -117,6 +139,12 @@ void i915_gem_gtt_rebind_object(struct drm_i915_gem_object *obj,
117 139
118void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj) 140void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj)
119{ 141{
142 struct drm_device *dev = obj->base.dev;
143 struct drm_i915_private *dev_priv = dev->dev_private;
144 bool interruptible;
145
146 interruptible = do_idling(dev_priv);
147
120 intel_gtt_clear_range(obj->gtt_space->start >> PAGE_SHIFT, 148 intel_gtt_clear_range(obj->gtt_space->start >> PAGE_SHIFT,
121 obj->base.size >> PAGE_SHIFT); 149 obj->base.size >> PAGE_SHIFT);
122 150
@@ -124,4 +152,6 @@ void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj)
124 intel_gtt_unmap_memory(obj->sg_list, obj->num_sg); 152 intel_gtt_unmap_memory(obj->sg_list, obj->num_sg);
125 obj->sg_list = NULL; 153 obj->sg_list = NULL;
126 } 154 }
155
156 undo_idling(dev_priv, interruptible);
127} 157}