---
 drivers/gpu/drm/i915/gem/i915_gem_domain.c    | 16 ++++++--
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    |  9 ++---
 drivers/gpu/drm/i915/i915_gem.c               | 38 ++++++++-----------
 drivers/gpu/drm/i915/i915_gem_fence_reg.c     | 16 ++------
 drivers/gpu/drm/i915/i915_vma.c               |  4 +-
 drivers/gpu/drm/i915/i915_vma.h               |  4 +-
 drivers/gpu/drm/i915/intel_overlay.c          |  4 --
 7 files changed, 40 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_domain.c 
b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
index 7e6ed767348c..a62f7f0e2947 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_domain.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
@@ -220,6 +220,8 @@ int i915_gem_object_set_cache_level(struct 
drm_i915_gem_object *obj,
         * state and so involves less work.
         */
        if (atomic_read(&obj->bind_count)) {
+               struct drm_i915_private *i915 = to_i915(obj->base.dev);
+
                /* Before we change the PTE, the GPU must not be accessing it.
                 * If we wait upon the object, we know that all the bound
                 * VMA are no longer active.
@@ -231,8 +233,7 @@ int i915_gem_object_set_cache_level(struct 
drm_i915_gem_object *obj,
                if (ret)
                        return ret;
 
-               if (!HAS_LLC(to_i915(obj->base.dev)) &&
-                   cache_level != I915_CACHE_NONE) {
+               if (!HAS_LLC(i915) && cache_level != I915_CACHE_NONE) {
                        /* Access to snoopable pages through the GTT is
                         * incoherent and on some machines causes a hard
                         * lockup. Relinquish the CPU mmaping to force
@@ -240,6 +241,10 @@ int i915_gem_object_set_cache_level(struct 
drm_i915_gem_object *obj,
                         * then double check if the GTT mapping is still
                         * valid for that pointer access.
                         */
+                       ret = mutex_lock_interruptible(&i915->ggtt.vm.mutex);
+                       if (ret)
+                               return ret;
+
                        i915_gem_object_release_mmap(obj);
 
                        /* As we no longer need a fence for GTT access,
@@ -250,10 +255,13 @@ int i915_gem_object_set_cache_level(struct 
drm_i915_gem_object *obj,
                         * supposed to be linear.
                         */
                        for_each_ggtt_vma(vma, obj) {
-                               ret = i915_vma_put_fence(vma);
+                               ret = i915_vma_revoke_fence(vma);
                                if (ret)
-                                       return ret;
+                                       break;
                        }
+                       mutex_unlock(&i915->ggtt.vm.mutex);
+                       if (ret)
+                               return ret;
                } else {
                        /* We either have incoherent backing store and
                         * so no GTT access or the architecture is fully
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 6905fd14361b..f12dc0f521c9 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -1091,6 +1091,9 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj,
                struct i915_vma *vma;
                int err;
 
+               if (i915_gem_object_is_tiled(obj))
+                       return ERR_PTR(-EINVAL);
+
                if (use_cpu_reloc(cache, obj))
                        return NULL;
 
@@ -1114,12 +1117,6 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj,
                        if (err) /* no inactive aperture space, use cpu reloc */
                                return NULL;
                } else {
-                       err = i915_vma_put_fence(vma);
-                       if (err) {
-                               i915_vma_unpin(vma);
-                               return ERR_PTR(err);
-                       }
-
                        cache->node.start = vma->node.start;
                        cache->node.mm = (void *)vma;
                }
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index fcbca8a06f41..fd448afae492 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -380,20 +380,17 @@ i915_gem_gtt_pread(struct drm_i915_gem_object *obj,
                return ret;
 
        wakeref = intel_runtime_pm_get(i915);
-       vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
-                                      PIN_MAPPABLE |
-                                      PIN_NONFAULT |
-                                      PIN_NONBLOCK);
+       vma = ERR_PTR(-ENODEV);
+       if (!i915_gem_object_is_tiled(obj)) {
+               vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
+                                              PIN_MAPPABLE |
+                                              PIN_NONFAULT |
+                                              PIN_NONBLOCK);
+       }
        if (!IS_ERR(vma)) {
                node.start = i915_ggtt_offset(vma);
                node.allocated = false;
-               ret = i915_vma_put_fence(vma);
-               if (ret) {
-                       i915_vma_unpin(vma);
-                       vma = ERR_PTR(ret);
-               }
-       }
-       if (IS_ERR(vma)) {
+       } else {
                ret = insert_mappable_node(ggtt, &node, PAGE_SIZE);
                if (ret)
                        goto out_unlock;
@@ -596,20 +593,17 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
                wakeref = intel_runtime_pm_get(i915);
        }
 
-       vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
-                                      PIN_MAPPABLE |
-                                      PIN_NONFAULT |
-                                      PIN_NONBLOCK);
+       vma = ERR_PTR(-ENODEV);
+       if (i915_gem_object_is_tiled(obj)) {
+               vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
+                                              PIN_MAPPABLE |
+                                              PIN_NONFAULT |
+                                              PIN_NONBLOCK);
+       }
        if (!IS_ERR(vma)) {
                node.start = i915_ggtt_offset(vma);
                node.allocated = false;
-               ret = i915_vma_put_fence(vma);
-               if (ret) {
-                       i915_vma_unpin(vma);
-                       vma = ERR_PTR(ret);
-               }
-       }
-       if (IS_ERR(vma)) {
+       } else {
                ret = insert_mappable_node(ggtt, &node, PAGE_SIZE);
                if (ret)
                        goto out_rpm;
diff --git a/drivers/gpu/drm/i915/i915_gem_fence_reg.c 
b/drivers/gpu/drm/i915/i915_gem_fence_reg.c
index f24b626bf0f8..e596dd5ae1e2 100644
--- a/drivers/gpu/drm/i915/i915_gem_fence_reg.c
+++ b/drivers/gpu/drm/i915/i915_gem_fence_reg.c
@@ -287,7 +287,7 @@ static int fence_update(struct i915_fence_reg *fence,
 }
 
 /**
- * i915_vma_put_fence - force-remove fence for a VMA
+ * i915_vma_revoke_fence - force-remove fence for a VMA
  * @vma: vma to map linearly (not through a fence reg)
  *
  * This function force-removes any fence from the given object, which is useful
@@ -297,26 +297,18 @@ static int fence_update(struct i915_fence_reg *fence,
  *
  * 0 on success, negative error code on failure.
  */
-int i915_vma_put_fence(struct i915_vma *vma)
+int i915_vma_revoke_fence(struct i915_vma *vma)
 {
-       struct i915_ggtt *ggtt = i915_vm_to_ggtt(vma->vm);
        struct i915_fence_reg *fence = vma->fence;
-       int err;
 
+       lockdep_assert_held(&vma->vm->mutex);
        if (!fence)
                return 0;
 
        if (atomic_read(&fence->pin_count))
                return -EBUSY;
 
-       err = mutex_lock_interruptible(&ggtt->vm.mutex);
-       if (err)
-               return err;
-
-       err = fence_update(fence, NULL);
-       mutex_unlock(&ggtt->vm.mutex);
-
-       return err;
+       return fence_update(fence, NULL);
 }
 
 static struct i915_fence_reg *fence_find(struct drm_i915_private *i915)
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index 33c6460eae8a..b5875db6f2c0 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -1065,7 +1065,9 @@ int i915_vma_unbind(struct i915_vma *vma)
                GEM_BUG_ON(i915_vma_has_ggtt_write(vma));
 
                /* release the fence reg _after_ flushing */
-               ret = i915_vma_put_fence(vma);
+               mutex_lock(&vma->vm->mutex);
+               ret = i915_vma_revoke_fence(vma);
+               mutex_unlock(&vma->vm->mutex);
                if (ret)
                        return ret;
 
diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
index e54ed0b380a3..f9f4cbb99e62 100644
--- a/drivers/gpu/drm/i915/i915_vma.h
+++ b/drivers/gpu/drm/i915/i915_vma.h
@@ -431,8 +431,8 @@ static inline struct page *i915_vma_first_page(struct 
i915_vma *vma)
  *
  * True if the vma has a fence, false otherwise.
  */
-int i915_vma_pin_fence(struct i915_vma *vma);
-int __must_check i915_vma_put_fence(struct i915_vma *vma);
+int __must_check i915_vma_pin_fence(struct i915_vma *vma);
+int __must_check i915_vma_revoke_fence(struct i915_vma *vma);
 
 static inline void __i915_vma_unpin_fence(struct i915_vma *vma)
 {
diff --git a/drivers/gpu/drm/i915/intel_overlay.c 
b/drivers/gpu/drm/i915/intel_overlay.c
index 009cddc09367..cdc028220848 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -771,10 +771,6 @@ static int intel_overlay_do_put_image(struct intel_overlay 
*overlay,
        }
        intel_frontbuffer_flush(new_bo->frontbuffer, ORIGIN_DIRTYFB);
 
-       ret = i915_vma_put_fence(vma);
-       if (ret)
-               goto out_unpin;
-
        if (!overlay->active) {
                u32 oconfig;
 
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to