diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-08-05 05:14:12 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-08-05 05:54:37 -0400 |
commit | 307dc25bf64fb54575d60cf700c7b5b39f183b88 (patch) | |
tree | 1f1ae458d6704765364268b806f734083b70ce2b /drivers/gpu/drm/i915/i915_gem_gtt.c | |
parent | dcff85c8443e7ad6abda897678d2fd5a950a64ad (diff) |
drm/i915: Simplify do_idling() (Ironlake vt-d w/a)
Now that we pass along the expected interruptible nature for the
wait-for-idle, we do not need to modify the global
i915->mm.interruptible for this single call. (Only the immediate call to
i915_gem_wait_for_idle() takes the interruptible status as the other
action, dma_map_sg(), is independent of i915.ko)
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1470388464-28458-7-git-send-email-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_gtt.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index c1d79978f409..8b4f2f35019c 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -2241,31 +2241,6 @@ static bool needs_idle_maps(struct drm_i915_private *dev_priv) | |||
2241 | return false; | 2241 | return false; |
2242 | } | 2242 | } |
2243 | 2243 | ||
2244 | static bool do_idling(struct drm_i915_private *dev_priv) | ||
2245 | { | ||
2246 | struct i915_ggtt *ggtt = &dev_priv->ggtt; | ||
2247 | bool ret = dev_priv->mm.interruptible; | ||
2248 | |||
2249 | if (unlikely(ggtt->do_idle_maps)) { | ||
2250 | dev_priv->mm.interruptible = false; | ||
2251 | if (i915_gem_wait_for_idle(dev_priv, false)) { | ||
2252 | DRM_ERROR("Failed to wait for idle; VT'd may hang.\n"); | ||
2253 | /* Wait a bit, in hopes it avoids the hang */ | ||
2254 | udelay(10); | ||
2255 | } | ||
2256 | } | ||
2257 | |||
2258 | return ret; | ||
2259 | } | ||
2260 | |||
2261 | static void undo_idling(struct drm_i915_private *dev_priv, bool interruptible) | ||
2262 | { | ||
2263 | struct i915_ggtt *ggtt = &dev_priv->ggtt; | ||
2264 | |||
2265 | if (unlikely(ggtt->do_idle_maps)) | ||
2266 | dev_priv->mm.interruptible = interruptible; | ||
2267 | } | ||
2268 | |||
2269 | void i915_check_and_clear_faults(struct drm_i915_private *dev_priv) | 2244 | void i915_check_and_clear_faults(struct drm_i915_private *dev_priv) |
2270 | { | 2245 | { |
2271 | struct intel_engine_cs *engine; | 2246 | struct intel_engine_cs *engine; |
@@ -2713,14 +2688,18 @@ void i915_gem_gtt_finish_object(struct drm_i915_gem_object *obj) | |||
2713 | { | 2688 | { |
2714 | struct drm_device *dev = obj->base.dev; | 2689 | struct drm_device *dev = obj->base.dev; |
2715 | struct drm_i915_private *dev_priv = to_i915(dev); | 2690 | struct drm_i915_private *dev_priv = to_i915(dev); |
2716 | bool interruptible; | 2691 | struct i915_ggtt *ggtt = &dev_priv->ggtt; |
2717 | 2692 | ||
2718 | interruptible = do_idling(dev_priv); | 2693 | if (unlikely(ggtt->do_idle_maps)) { |
2694 | if (i915_gem_wait_for_idle(dev_priv, false)) { | ||
2695 | DRM_ERROR("Failed to wait for idle; VT'd may hang.\n"); | ||
2696 | /* Wait a bit, in hopes it avoids the hang */ | ||
2697 | udelay(10); | ||
2698 | } | ||
2699 | } | ||
2719 | 2700 | ||
2720 | dma_unmap_sg(&dev->pdev->dev, obj->pages->sgl, obj->pages->nents, | 2701 | dma_unmap_sg(&dev->pdev->dev, obj->pages->sgl, obj->pages->nents, |
2721 | PCI_DMA_BIDIRECTIONAL); | 2702 | PCI_DMA_BIDIRECTIONAL); |
2722 | |||
2723 | undo_idling(dev_priv, interruptible); | ||
2724 | } | 2703 | } |
2725 | 2704 | ||
2726 | static void i915_gtt_color_adjust(struct drm_mm_node *node, | 2705 | static void i915_gtt_color_adjust(struct drm_mm_node *node, |