i915_gem_object_do_bit_17_swizzle(obj, st);
if (i915_gem_object_is_tiled(obj) &&
- dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
+ dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
__i915_gem_object_pin_pages(obj);
+ obj->mm.quirked = true;
+ }
return st;
if (obj->mm.pages &&
i915_gem_object_is_tiled(obj) &&
dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
- if (obj->mm.madv == I915_MADV_WILLNEED)
+ if (obj->mm.madv == I915_MADV_WILLNEED) {
+ GEM_BUG_ON(!obj->mm.quirked);
__i915_gem_object_unpin_pages(obj);
- if (args->madv == I915_MADV_WILLNEED)
+ obj->mm.quirked = false;
+ }
+ if (args->madv == I915_MADV_WILLNEED) {
__i915_gem_object_pin_pages(obj);
+ obj->mm.quirked = true;
+ }
}
if (obj->mm.madv != __I915_MADV_PURGED)
{
struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
+ if (obj->mm.quirked)
+ __i915_gem_object_unpin_pages(obj);
+
if (discard_backing_storage(obj))
obj->mm.madv = I915_MADV_DONTNEED;
- if (obj->mm.pages && obj->mm.madv == I915_MADV_WILLNEED &&
- to_i915(obj->base.dev)->quirks & QUIRK_PIN_SWIZZLED_PAGES &&
- i915_gem_object_is_tiled(obj))
- __i915_gem_object_unpin_pages(obj);
-
/* Before we free the object, make sure any pure RCU-only
* read-side critical sections are complete, e.g.
* i915_gem_busy_ioctl(). For the corresponding synchronized