diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_gtt.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 30 |
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 | ||
52 | static 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 | |||
68 | static 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 | |||
52 | void i915_gem_restore_gtt_mappings(struct drm_device *dev) | 74 | void 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 | ||
118 | void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj) | 140 | void 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 | } |