drm/i915/uapi: implement object placement extension
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gem / selftests / i915_gem_mman.c
index d429c76..05a3b29 100644 (file)
@@ -322,7 +322,7 @@ static int igt_partial_tiling(void *arg)
        if (IS_ERR(obj))
                return PTR_ERR(obj);
 
-       err = i915_gem_object_pin_pages(obj);
+       err = i915_gem_object_pin_pages_unlocked(obj);
        if (err) {
                pr_err("Failed to allocate %u pages (%lu total), err=%d\n",
                       nreal, obj->base.size / PAGE_SIZE, err);
@@ -459,7 +459,7 @@ static int igt_smoke_tiling(void *arg)
        if (IS_ERR(obj))
                return PTR_ERR(obj);
 
-       err = i915_gem_object_pin_pages(obj);
+       err = i915_gem_object_pin_pages_unlocked(obj);
        if (err) {
                pr_err("Failed to allocate %u pages (%lu total), err=%d\n",
                       nreal, obj->base.size / PAGE_SIZE, err);
@@ -798,7 +798,7 @@ static int wc_set(struct drm_i915_gem_object *obj)
 {
        void *vaddr;
 
-       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WC);
+       vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
        if (IS_ERR(vaddr))
                return PTR_ERR(vaddr);
 
@@ -814,7 +814,7 @@ static int wc_check(struct drm_i915_gem_object *obj)
        void *vaddr;
        int err = 0;
 
-       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WC);
+       vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
        if (IS_ERR(vaddr))
                return PTR_ERR(vaddr);
 
@@ -835,14 +835,31 @@ static bool can_mmap(struct drm_i915_gem_object *obj, enum i915_mmap_type type)
                return false;
 
        if (type != I915_MMAP_TYPE_GTT &&
-           !i915_gem_object_type_has(obj,
-                                     I915_GEM_OBJECT_HAS_STRUCT_PAGE |
-                                     I915_GEM_OBJECT_HAS_IOMEM))
+           !i915_gem_object_has_struct_page(obj) &&
+           !i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_IOMEM))
                return false;
 
        return true;
 }
 
+static void object_set_placements(struct drm_i915_gem_object *obj,
+                                 struct intel_memory_region **placements,
+                                 unsigned int n_placements)
+{
+       GEM_BUG_ON(!n_placements);
+
+       if (n_placements == 1) {
+               struct drm_i915_private *i915 = to_i915(obj->base.dev);
+               struct intel_memory_region *mr = placements[0];
+
+               obj->mm.placements = &i915->mm.regions[mr->id];
+               obj->mm.n_placements = 1;
+       } else {
+               obj->mm.placements = placements;
+               obj->mm.n_placements = n_placements;
+       }
+}
+
 #define expand32(x) (((x) << 0) | ((x) << 8) | ((x) << 16) | ((x) << 24))
 static int __igt_mmap(struct drm_i915_private *i915,
                      struct drm_i915_gem_object *obj,
@@ -951,6 +968,8 @@ static int igt_mmap(void *arg)
                        if (IS_ERR(obj))
                                return PTR_ERR(obj);
 
+                       object_set_placements(obj, &mr, 1);
+
                        err = __igt_mmap(i915, obj, I915_MMAP_TYPE_GTT);
                        if (err == 0)
                                err = __igt_mmap(i915, obj, I915_MMAP_TYPE_WC);
@@ -977,10 +996,8 @@ static const char *repr_mmap_type(enum i915_mmap_type type)
 
 static bool can_access(const struct drm_i915_gem_object *obj)
 {
-       unsigned int flags =
-               I915_GEM_OBJECT_HAS_STRUCT_PAGE | I915_GEM_OBJECT_HAS_IOMEM;
-
-       return i915_gem_object_type_has(obj, flags);
+       return i915_gem_object_has_struct_page(obj) ||
+              i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_IOMEM);
 }
 
 static int __igt_mmap_access(struct drm_i915_private *i915,
@@ -1071,6 +1088,8 @@ static int igt_mmap_access(void *arg)
                if (IS_ERR(obj))
                        return PTR_ERR(obj);
 
+               object_set_placements(obj, &mr, 1);
+
                err = __igt_mmap_access(i915, obj, I915_MMAP_TYPE_GTT);
                if (err == 0)
                        err = __igt_mmap_access(i915, obj, I915_MMAP_TYPE_WB);
@@ -1214,6 +1233,8 @@ static int igt_mmap_gpu(void *arg)
                if (IS_ERR(obj))
                        return PTR_ERR(obj);
 
+               object_set_placements(obj, &mr, 1);
+
                err = __igt_mmap_gpu(i915, obj, I915_MMAP_TYPE_GTT);
                if (err == 0)
                        err = __igt_mmap_gpu(i915, obj, I915_MMAP_TYPE_WC);
@@ -1319,7 +1340,9 @@ static int __igt_mmap_revoke(struct drm_i915_private *i915,
        }
 
        if (type != I915_MMAP_TYPE_GTT) {
+               i915_gem_object_lock(obj, NULL);
                __i915_gem_object_put_pages(obj);
+               i915_gem_object_unlock(obj);
                if (i915_gem_object_has_pages(obj)) {
                        pr_err("Failed to put-pages object!\n");
                        err = -EINVAL;
@@ -1355,6 +1378,8 @@ static int igt_mmap_revoke(void *arg)
                if (IS_ERR(obj))
                        return PTR_ERR(obj);
 
+               object_set_placements(obj, &mr, 1);
+
                err = __igt_mmap_revoke(i915, obj, I915_MMAP_TYPE_GTT);
                if (err == 0)
                        err = __igt_mmap_revoke(i915, obj, I915_MMAP_TYPE_WC);