diff options
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 9daa2883ac18..dcc6a88c560e 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -2546,6 +2546,8 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev) | |||
| 2546 | struct drm_i915_private *dev_priv = dev->dev_private; | 2546 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 2547 | struct drm_i915_gem_object *obj; | 2547 | struct drm_i915_gem_object *obj; |
| 2548 | struct i915_address_space *vm; | 2548 | struct i915_address_space *vm; |
| 2549 | struct i915_vma *vma; | ||
| 2550 | bool flush; | ||
| 2549 | 2551 | ||
| 2550 | i915_check_and_clear_faults(dev); | 2552 | i915_check_and_clear_faults(dev); |
| 2551 | 2553 | ||
| @@ -2555,16 +2557,23 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev) | |||
| 2555 | dev_priv->gtt.base.total, | 2557 | dev_priv->gtt.base.total, |
| 2556 | true); | 2558 | true); |
| 2557 | 2559 | ||
| 2560 | /* Cache flush objects bound into GGTT and rebind them. */ | ||
| 2561 | vm = &dev_priv->gtt.base; | ||
| 2558 | list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { | 2562 | list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { |
| 2559 | struct i915_vma *vma = i915_gem_obj_to_vma(obj, | 2563 | flush = false; |
| 2560 | &dev_priv->gtt.base); | 2564 | list_for_each_entry(vma, &obj->vma_list, vma_link) { |
| 2561 | if (!vma) | 2565 | if (vma->vm != vm) |
| 2562 | continue; | 2566 | continue; |
| 2563 | 2567 | ||
| 2564 | i915_gem_clflush_object(obj, obj->pin_display); | 2568 | WARN_ON(i915_vma_bind(vma, obj->cache_level, |
| 2565 | WARN_ON(i915_vma_bind(vma, obj->cache_level, PIN_UPDATE)); | 2569 | PIN_UPDATE)); |
| 2566 | } | ||
| 2567 | 2570 | ||
| 2571 | flush = true; | ||
| 2572 | } | ||
| 2573 | |||
| 2574 | if (flush) | ||
| 2575 | i915_gem_clflush_object(obj, obj->pin_display); | ||
| 2576 | } | ||
| 2568 | 2577 | ||
| 2569 | if (INTEL_INFO(dev)->gen >= 8) { | 2578 | if (INTEL_INFO(dev)->gen >= 8) { |
| 2570 | if (IS_CHERRYVIEW(dev) || IS_BROXTON(dev)) | 2579 | if (IS_CHERRYVIEW(dev) || IS_BROXTON(dev)) |
