drm/i915: Remove the vm open count
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / display / intel_dpt.c
index 8f67474..3af4930 100644 (file)
@@ -3,11 +3,13 @@
  * Copyright © 2021 Intel Corporation
  */
 
+#include "gem/i915_gem_domain.h"
+#include "gt/gen8_ppgtt.h"
+
 #include "i915_drv.h"
 #include "intel_display_types.h"
 #include "intel_dpt.h"
 #include "intel_fb.h"
-#include "gt/gen8_ppgtt.h"
 
 struct i915_dpt {
        struct i915_address_space vm;
@@ -48,7 +50,7 @@ static void dpt_insert_page(struct i915_address_space *vm,
 }
 
 static void dpt_insert_entries(struct i915_address_space *vm,
-                              struct i915_vma *vma,
+                              struct i915_vma_resource *vma_res,
                               enum i915_cache_level level,
                               u32 flags)
 {
@@ -64,8 +66,8 @@ static void dpt_insert_entries(struct i915_address_space *vm,
         * not to allow the user to override access to a read only page.
         */
 
-       i = vma->node.start / I915_GTT_PAGE_SIZE;
-       for_each_sgt_daddr(addr, sgt_iter, vma->pages)
+       i = vma_res->start / I915_GTT_PAGE_SIZE;
+       for_each_sgt_daddr(addr, sgt_iter, vma_res->bi.pages)
                gen8_set_pte(&base[i++], pte_encode | addr);
 }
 
@@ -76,35 +78,38 @@ static void dpt_clear_range(struct i915_address_space *vm,
 
 static void dpt_bind_vma(struct i915_address_space *vm,
                         struct i915_vm_pt_stash *stash,
-                        struct i915_vma *vma,
+                        struct i915_vma_resource *vma_res,
                         enum i915_cache_level cache_level,
                         u32 flags)
 {
-       struct drm_i915_gem_object *obj = vma->obj;
        u32 pte_flags;
 
+       if (vma_res->bound_flags)
+               return;
+
        /* Applicable to VLV (gen8+ do not support RO in the GGTT) */
        pte_flags = 0;
-       if (vma->vm->has_read_only && i915_gem_object_is_readonly(obj))
+       if (vm->has_read_only && vma_res->bi.readonly)
                pte_flags |= PTE_READ_ONLY;
-       if (i915_gem_object_is_lmem(obj))
+       if (vma_res->bi.lmem)
                pte_flags |= PTE_LM;
 
-       vma->vm->insert_entries(vma->vm, vma, cache_level, pte_flags);
+       vm->insert_entries(vm, vma_res, cache_level, pte_flags);
 
-       vma->page_sizes.gtt = I915_GTT_PAGE_SIZE;
+       vma_res->page_sizes_gtt = I915_GTT_PAGE_SIZE;
 
        /*
         * Without aliasing PPGTT there's no difference between
         * GLOBAL/LOCAL_BIND, it's all the same ptes. Hence unconditionally
         * upgrade to both bound if we bind either to avoid double-binding.
         */
-       atomic_or(I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND, &vma->flags);
+       vma_res->bound_flags = I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND;
 }
 
-static void dpt_unbind_vma(struct i915_address_space *vm, struct i915_vma *vma)
+static void dpt_unbind_vma(struct i915_address_space *vm,
+                          struct i915_vma_resource *vma_res)
 {
-       vm->clear_range(vm, vma->node.start, vma->size);
+       vm->clear_range(vm, vma_res->start, vma_res->vma_size);
 }
 
 static void dpt_cleanup(struct i915_address_space *vm)
@@ -250,7 +255,11 @@ intel_dpt_create(struct intel_framebuffer *fb)
        if (IS_ERR(dpt_obj))
                return ERR_CAST(dpt_obj);
 
-       ret = i915_gem_object_set_cache_level(dpt_obj, I915_CACHE_NONE);
+       ret = i915_gem_object_lock_interruptible(dpt_obj, NULL);
+       if (!ret) {
+               ret = i915_gem_object_set_cache_level(dpt_obj, I915_CACHE_NONE);
+               i915_gem_object_unlock(dpt_obj);
+       }
        if (ret) {
                i915_gem_object_put(dpt_obj);
                return ERR_PTR(ret);
@@ -291,5 +300,5 @@ void intel_dpt_destroy(struct i915_address_space *vm)
 {
        struct i915_dpt *dpt = i915_vm_to_dpt(vm);
 
-       i915_vm_close(&dpt->vm);
+       i915_vm_put(&dpt->vm);
 }