53,8 → 53,29 |
} |
} |
|
static bool do_idling(struct drm_i915_private *dev_priv) |
{ |
bool ret = dev_priv->mm.interruptible; |
|
if (unlikely(dev_priv->mm.gtt->do_idle_maps)) { |
dev_priv->mm.interruptible = false; |
if (i915_gpu_idle(dev_priv->dev)) { |
DRM_ERROR("Couldn't idle GPU\n"); |
/* Wait a bit, in hopes it avoids the hang */ |
udelay(10); |
} |
} |
|
return ret; |
} |
|
static void undo_idling(struct drm_i915_private *dev_priv, bool interruptible) |
{ |
if (unlikely(dev_priv->mm.gtt->do_idle_maps)) |
dev_priv->mm.interruptible = interruptible; |
} |
|
#if 0 |
|
void i915_gem_restore_gtt_mappings(struct drm_device *dev) |
{ |
struct drm_i915_private *dev_priv = dev->dev_private; |
123,15 → 144,23 |
agp_type); |
} |
|
#endif |
|
void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj) |
{ |
struct drm_device *dev = obj->base.dev; |
struct drm_i915_private *dev_priv = dev->dev_private; |
bool interruptible; |
|
interruptible = do_idling(dev_priv); |
|
intel_gtt_clear_range(obj->gtt_space->start >> PAGE_SHIFT, |
obj->base.size >> PAGE_SHIFT); |
|
if (obj->sg_list) { |
intel_gtt_unmap_memory(obj->sg_list, obj->num_sg); |
// intel_gtt_unmap_memory(obj->sg_list, obj->num_sg); |
obj->sg_list = NULL; |
} |
|
undo_idling(dev_priv, interruptible); |
} |
|
#endif |