Merge tag 'drm-misc-next-2021-07-16' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gem / selftests / i915_gem_mman.c
index 5575172..bc32622 100644 (file)
@@ -578,16 +578,17 @@ static bool assert_mmap_offset(struct drm_i915_private *i915,
                               int expected)
 {
        struct drm_i915_gem_object *obj;
-       struct i915_mmap_offset *mmo;
+       u64 offset;
+       int ret;
 
        obj = i915_gem_object_create_internal(i915, size);
        if (IS_ERR(obj))
-               return false;
+               return expected && expected == PTR_ERR(obj);
 
-       mmo = mmap_offset_attach(obj, I915_MMAP_OFFSET_GTT, NULL);
+       ret = __assign_mmap_offset(obj, I915_MMAP_TYPE_GTT, &offset, NULL);
        i915_gem_object_put(obj);
 
-       return PTR_ERR_OR_ZERO(mmo) == expected;
+       return ret == expected;
 }
 
 static void disable_retire_worker(struct drm_i915_private *i915)
@@ -622,8 +623,8 @@ static int igt_mmap_offset_exhaustion(void *arg)
        struct drm_mm *mm = &i915->drm.vma_offset_manager->vm_addr_space_mm;
        struct drm_i915_gem_object *obj;
        struct drm_mm_node *hole, *next;
-       struct i915_mmap_offset *mmo;
        int loop, err = 0;
+       u64 offset;
 
        /* Disable background reaper */
        disable_retire_worker(i915);
@@ -684,13 +685,13 @@ static int igt_mmap_offset_exhaustion(void *arg)
        obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
        if (IS_ERR(obj)) {
                err = PTR_ERR(obj);
+               pr_err("Unable to create object for reclaimed hole\n");
                goto out;
        }
 
-       mmo = mmap_offset_attach(obj, I915_MMAP_OFFSET_GTT, NULL);
-       if (IS_ERR(mmo)) {
+       err = __assign_mmap_offset(obj, I915_MMAP_TYPE_GTT, &offset, NULL);
+       if (err) {
                pr_err("Unable to insert object into reclaimed hole\n");
-               err = PTR_ERR(mmo);
                goto err_obj;
        }
 
@@ -865,10 +866,10 @@ static int __igt_mmap(struct drm_i915_private *i915,
                      struct drm_i915_gem_object *obj,
                      enum i915_mmap_type type)
 {
-       struct i915_mmap_offset *mmo;
        struct vm_area_struct *area;
        unsigned long addr;
        int err, i;
+       u64 offset;
 
        if (!can_mmap(obj, type))
                return 0;
@@ -879,11 +880,11 @@ static int __igt_mmap(struct drm_i915_private *i915,
        if (err)
                return err;
 
-       mmo = mmap_offset_attach(obj, type, NULL);
-       if (IS_ERR(mmo))
-               return PTR_ERR(mmo);
+       err = __assign_mmap_offset(obj, type, &offset, NULL);
+       if (err)
+               return err;
 
-       addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED);
+       addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED);
        if (IS_ERR_VALUE(addr))
                return addr;
 
@@ -897,13 +898,6 @@ static int __igt_mmap(struct drm_i915_private *i915,
                goto out_unmap;
        }
 
-       if (area->vm_private_data != mmo) {
-               pr_err("%s: vm_area_struct did not point back to our mmap_offset object!\n",
-                      obj->mm.region->name);
-               err = -EINVAL;
-               goto out_unmap;
-       }
-
        for (i = 0; i < obj->base.size / sizeof(u32); i++) {
                u32 __user *ux = u64_to_user_ptr((u64)(addr + i * sizeof(*ux)));
                u32 x;
@@ -961,7 +955,7 @@ static int igt_mmap(void *arg)
                        struct drm_i915_gem_object *obj;
                        int err;
 
-                       obj = i915_gem_object_create_region(mr, sizes[i], 0);
+                       obj = i915_gem_object_create_region(mr, sizes[i], I915_BO_ALLOC_USER);
                        if (obj == ERR_PTR(-ENODEV))
                                continue;
 
@@ -1004,12 +998,12 @@ static int __igt_mmap_access(struct drm_i915_private *i915,
                             struct drm_i915_gem_object *obj,
                             enum i915_mmap_type type)
 {
-       struct i915_mmap_offset *mmo;
        unsigned long __user *ptr;
        unsigned long A, B;
        unsigned long x, y;
        unsigned long addr;
        int err;
+       u64 offset;
 
        memset(&A, 0xAA, sizeof(A));
        memset(&B, 0xBB, sizeof(B));
@@ -1017,11 +1011,11 @@ static int __igt_mmap_access(struct drm_i915_private *i915,
        if (!can_mmap(obj, type) || !can_access(obj))
                return 0;
 
-       mmo = mmap_offset_attach(obj, type, NULL);
-       if (IS_ERR(mmo))
-               return PTR_ERR(mmo);
+       err = __assign_mmap_offset(obj, type, &offset, NULL);
+       if (err)
+               return err;
 
-       addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED);
+       addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED);
        if (IS_ERR_VALUE(addr))
                return addr;
        ptr = (unsigned long __user *)addr;
@@ -1081,7 +1075,7 @@ static int igt_mmap_access(void *arg)
                struct drm_i915_gem_object *obj;
                int err;
 
-               obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0);
+               obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER);
                if (obj == ERR_PTR(-ENODEV))
                        continue;
 
@@ -1111,11 +1105,11 @@ static int __igt_mmap_gpu(struct drm_i915_private *i915,
                          enum i915_mmap_type type)
 {
        struct intel_engine_cs *engine;
-       struct i915_mmap_offset *mmo;
        unsigned long addr;
        u32 __user *ux;
        u32 bbe;
        int err;
+       u64 offset;
 
        /*
         * Verify that the mmap access into the backing store aligns with
@@ -1132,11 +1126,11 @@ static int __igt_mmap_gpu(struct drm_i915_private *i915,
        if (err)
                return err;
 
-       mmo = mmap_offset_attach(obj, type, NULL);
-       if (IS_ERR(mmo))
-               return PTR_ERR(mmo);
+       err = __assign_mmap_offset(obj, type, &offset, NULL);
+       if (err)
+               return err;
 
-       addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED);
+       addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED);
        if (IS_ERR_VALUE(addr))
                return addr;
 
@@ -1226,7 +1220,7 @@ static int igt_mmap_gpu(void *arg)
                struct drm_i915_gem_object *obj;
                int err;
 
-               obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0);
+               obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER);
                if (obj == ERR_PTR(-ENODEV))
                        continue;
 
@@ -1303,18 +1297,18 @@ static int __igt_mmap_revoke(struct drm_i915_private *i915,
                             struct drm_i915_gem_object *obj,
                             enum i915_mmap_type type)
 {
-       struct i915_mmap_offset *mmo;
        unsigned long addr;
        int err;
+       u64 offset;
 
        if (!can_mmap(obj, type))
                return 0;
 
-       mmo = mmap_offset_attach(obj, type, NULL);
-       if (IS_ERR(mmo))
-               return PTR_ERR(mmo);
+       err = __assign_mmap_offset(obj, type, &offset, NULL);
+       if (err)
+               return err;
 
-       addr = igt_mmap_node(i915, &mmo->vma_node, 0, PROT_WRITE, MAP_SHARED);
+       addr = igt_mmap_offset(i915, offset, obj->base.size, PROT_WRITE, MAP_SHARED);
        if (IS_ERR_VALUE(addr))
                return addr;
 
@@ -1350,10 +1344,20 @@ static int __igt_mmap_revoke(struct drm_i915_private *i915,
                }
        }
 
-       err = check_absent(addr, obj->base.size);
-       if (err) {
-               pr_err("%s: was not absent\n", obj->mm.region->name);
-               goto out_unmap;
+       if (!obj->ops->mmap_ops) {
+               err = check_absent(addr, obj->base.size);
+               if (err) {
+                       pr_err("%s: was not absent\n", obj->mm.region->name);
+                       goto out_unmap;
+               }
+       } else {
+               /* ttm allows access to evicted regions by design */
+
+               err = check_present(addr, obj->base.size);
+               if (err) {
+                       pr_err("%s: was not present\n", obj->mm.region->name);
+                       goto out_unmap;
+               }
        }
 
 out_unmap:
@@ -1371,7 +1375,7 @@ static int igt_mmap_revoke(void *arg)
                struct drm_i915_gem_object *obj;
                int err;
 
-               obj = i915_gem_object_create_region(mr, PAGE_SIZE, 0);
+               obj = i915_gem_object_create_region(mr, PAGE_SIZE, I915_BO_ALLOC_USER);
                if (obj == ERR_PTR(-ENODEV))
                        continue;