drm/i915: Remove the vm open count
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / i915_gem.c
index 915bf43..dd84eba 100644 (file)
@@ -25,7 +25,6 @@
  *
  */
 
-#include <drm/drm_vma_manager.h>
 #include <linux/dma-fence-array.h>
 #include <linux/kthread.h>
 #include <linux/dma-resv.h>
@@ -37,6 +36,9 @@
 #include <linux/dma-buf.h>
 #include <linux/mman.h>
 
+#include <drm/drm_cache.h>
+#include <drm/drm_vma_manager.h>
+
 #include "display/intel_display.h"
 #include "display/intel_frontbuffer.h"
 
 #include "gem/i915_gem_context.h"
 #include "gem/i915_gem_ioctls.h"
 #include "gem/i915_gem_mman.h"
+#include "gem/i915_gem_pm.h"
 #include "gem/i915_gem_region.h"
+#include "gem/i915_gem_userptr.h"
 #include "gt/intel_engine_user.h"
 #include "gt/intel_gt.h"
 #include "gt/intel_gt_pm.h"
 #include "gt/intel_workarounds.h"
 
 #include "i915_drv.h"
+#include "i915_file_private.h"
 #include "i915_trace.h"
 #include "i915_vgpu.h"
-
 #include "intel_pm.h"
 
 static int
@@ -88,7 +92,8 @@ int
 i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
                            struct drm_file *file)
 {
-       struct i915_ggtt *ggtt = &to_i915(dev)->ggtt;
+       struct drm_i915_private *i915 = to_i915(dev);
+       struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
        struct drm_i915_gem_get_aperture *args = data;
        struct i915_vma *vma;
        u64 pinned;
@@ -118,6 +123,8 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj,
        struct i915_vma *vma;
        int ret;
 
+       assert_object_held(obj);
+
        if (list_empty(&obj->vma.list))
                return 0;
 
@@ -135,8 +142,6 @@ try_again:
        while (!ret && (vma = list_first_entry_or_null(&obj->vma.list,
                                                       struct i915_vma,
                                                       obj_link))) {
-               struct i915_address_space *vm = vma->vm;
-
                list_move_tail(&vma->obj_link, &still_in_list);
                if (!i915_vma_is_bound(vma, I915_VMA_BIND_MASK))
                        continue;
@@ -147,7 +152,7 @@ try_again:
                }
 
                ret = -EAGAIN;
-               if (!i915_vm_tryopen(vm))
+               if (!i915_vm_tryget(vma->vm))
                        break;
 
                /* Prevent vma being freed by i915_vma_parked as we unbind */
@@ -155,10 +160,16 @@ try_again:
                spin_unlock(&obj->vma.lock);
 
                if (vma) {
+                       bool vm_trylock = !!(flags & I915_GEM_OBJECT_UNBIND_VM_TRYLOCK);
                        ret = -EBUSY;
-                       if (flags & I915_GEM_OBJECT_UNBIND_ACTIVE ||
-                           !i915_vma_is_active(vma)) {
-                               if (flags & I915_GEM_OBJECT_UNBIND_VM_TRYLOCK) {
+                       if (flags & I915_GEM_OBJECT_UNBIND_ASYNC) {
+                               assert_object_held(vma->obj);
+                               ret = i915_vma_unbind_async(vma, vm_trylock);
+                       }
+
+                       if (ret == -EBUSY && (flags & I915_GEM_OBJECT_UNBIND_ACTIVE ||
+                                             !i915_vma_is_active(vma))) {
+                               if (vm_trylock) {
                                        if (mutex_trylock(&vma->vm->mutex)) {
                                                ret = __i915_vma_unbind(vma);
                                                mutex_unlock(&vma->vm->mutex);
@@ -173,7 +184,7 @@ try_again:
                        __i915_vma_put(vma);
                }
 
-               i915_vm_close(vm);
+               i915_vm_put(vma->vm);
                spin_lock(&obj->vma.lock);
        }
        list_splice_init(&still_in_list, &obj->vma.list);
@@ -289,7 +300,7 @@ static struct i915_vma *i915_gem_gtt_prepare(struct drm_i915_gem_object *obj,
                                             bool write)
 {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
-       struct i915_ggtt *ggtt = &i915->ggtt;
+       struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
        struct i915_vma *vma;
        struct i915_gem_ww_ctx ww;
        int ret;
@@ -350,7 +361,7 @@ static void i915_gem_gtt_cleanup(struct drm_i915_gem_object *obj,
                                 struct i915_vma *vma)
 {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
-       struct i915_ggtt *ggtt = &i915->ggtt;
+       struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
 
        i915_gem_object_unpin_pages(obj);
        if (drm_mm_node_allocated(node)) {
@@ -366,7 +377,7 @@ i915_gem_gtt_pread(struct drm_i915_gem_object *obj,
                   const struct drm_i915_gem_pread *args)
 {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
-       struct i915_ggtt *ggtt = &i915->ggtt;
+       struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
        intel_wakeref_t wakeref;
        struct drm_mm_node node;
        void __user *user_data;
@@ -522,7 +533,7 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
                         const struct drm_i915_gem_pwrite *args)
 {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
-       struct i915_ggtt *ggtt = &i915->ggtt;
+       struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
        struct intel_runtime_pm *rpm = &i915->runtime_pm;
        intel_wakeref_t wakeref;
        struct drm_mm_node node;
@@ -823,7 +834,7 @@ void i915_gem_runtime_suspend(struct drm_i915_private *i915)
         */
 
        list_for_each_entry_safe(obj, on,
-                                &i915->ggtt.userfault_list, userfault_link)
+                                &to_gt(i915)->ggtt->userfault_list, userfault_link)
                __i915_gem_object_release_mmap_gtt(obj);
 
        /*
@@ -831,8 +842,8 @@ void i915_gem_runtime_suspend(struct drm_i915_private *i915)
         * in use by hardware (i.e. they are pinned), we should not be powering
         * down! All other fences will be reacquired by the user upon waking.
         */
-       for (i = 0; i < i915->ggtt.num_fences; i++) {
-               struct i915_fence_reg *reg = &i915->ggtt.fence_regs[i];
+       for (i = 0; i < to_gt(i915)->ggtt->num_fences; i++) {
+               struct i915_fence_reg *reg = &to_gt(i915)->ggtt->fence_regs[i];
 
                /*
                 * Ideally we want to assert that the fence register is not
@@ -873,7 +884,7 @@ i915_gem_object_ggtt_pin_ww(struct drm_i915_gem_object *obj,
                            u64 size, u64 alignment, u64 flags)
 {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
-       struct i915_ggtt *ggtt = &i915->ggtt;
+       struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
        struct i915_vma *vma;
        int ret;
 
@@ -1123,7 +1134,7 @@ err_unlock:
 
                /* Minimal basic recovery for KMS */
                ret = i915_ggtt_enable_hw(dev_priv);
-               i915_ggtt_resume(&dev_priv->ggtt);
+               i915_ggtt_resume(to_gt(dev_priv)->ggtt);
                intel_init_clock_gating(dev_priv);
        }
 
@@ -1146,7 +1157,7 @@ void i915_gem_driver_unregister(struct drm_i915_private *i915)
 
 void i915_gem_driver_remove(struct drm_i915_private *dev_priv)
 {
-       intel_wakeref_auto_fini(&dev_priv->ggtt.userfault_wakeref);
+       intel_wakeref_auto_fini(&to_gt(dev_priv)->ggtt->userfault_wakeref);
 
        i915_gem_suspend_late(dev_priv);
        intel_gt_driver_remove(to_gt(dev_priv));