|
@@ -2546,6 +2546,8 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev)
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
struct drm_i915_gem_object *obj;
|
|
|
struct i915_address_space *vm;
|
|
|
+ struct i915_vma *vma;
|
|
|
+ bool flush;
|
|
|
|
|
|
i915_check_and_clear_faults(dev);
|
|
|
|
|
@@ -2555,16 +2557,23 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev)
|
|
|
dev_priv->gtt.base.total,
|
|
|
true);
|
|
|
|
|
|
+ /* Cache flush objects bound into GGTT and rebind them. */
|
|
|
+ vm = &dev_priv->gtt.base;
|
|
|
list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
|
|
|
- struct i915_vma *vma = i915_gem_obj_to_vma(obj,
|
|
|
- &dev_priv->gtt.base);
|
|
|
- if (!vma)
|
|
|
- continue;
|
|
|
+ flush = false;
|
|
|
+ list_for_each_entry(vma, &obj->vma_list, vma_link) {
|
|
|
+ if (vma->vm != vm)
|
|
|
+ continue;
|
|
|
|
|
|
- i915_gem_clflush_object(obj, obj->pin_display);
|
|
|
- WARN_ON(i915_vma_bind(vma, obj->cache_level, PIN_UPDATE));
|
|
|
- }
|
|
|
+ WARN_ON(i915_vma_bind(vma, obj->cache_level,
|
|
|
+ PIN_UPDATE));
|
|
|
|
|
|
+ flush = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (flush)
|
|
|
+ i915_gem_clflush_object(obj, obj->pin_display);
|
|
|
+ }
|
|
|
|
|
|
if (INTEL_INFO(dev)->gen >= 8) {
|
|
|
if (IS_CHERRYVIEW(dev) || IS_BROXTON(dev))
|