Merge drm/drm-next into drm-intel-next
[linux-block.git] / drivers / gpu / drm / i915 / gem / i915_gem_shmem.c
index 08c9c25f1109752d0c5051cf41cb7186c570a40d..680b370a8ef303443f5156b7f4573b6d5ce05796 100644 (file)
@@ -464,26 +464,21 @@ static int __create_shmem(struct drm_i915_private *i915,
        return 0;
 }
 
-static struct drm_i915_gem_object *
-create_shmem(struct intel_memory_region *mem,
-            resource_size_t size,
-            unsigned int flags)
+static int shmem_object_init(struct intel_memory_region *mem,
+                            struct drm_i915_gem_object *obj,
+                            resource_size_t size,
+                            unsigned int flags)
 {
        static struct lock_class_key lock_class;
        struct drm_i915_private *i915 = mem->i915;
-       struct drm_i915_gem_object *obj;
        struct address_space *mapping;
        unsigned int cache_level;
        gfp_t mask;
        int ret;
 
-       obj = i915_gem_object_alloc();
-       if (!obj)
-               return ERR_PTR(-ENOMEM);
-
        ret = __create_shmem(i915, &obj->base, size);
        if (ret)
-               goto fail;
+               return ret;
 
        mask = GFP_HIGHUSER | __GFP_RECLAIMABLE;
        if (IS_I965GM(i915) || IS_I965G(i915)) {
@@ -522,11 +517,7 @@ create_shmem(struct intel_memory_region *mem,
 
        i915_gem_object_init_memory_region(obj, mem, 0);
 
-       return obj;
-
-fail:
-       i915_gem_object_free(obj);
-       return ERR_PTR(ret);
+       return 0;
 }
 
 struct drm_i915_gem_object *
@@ -611,7 +602,7 @@ static void release_shmem(struct intel_memory_region *mem)
 static const struct intel_memory_region_ops shmem_region_ops = {
        .init = init_shmem,
        .release = release_shmem,
-       .create_object = create_shmem,
+       .init_object = shmem_object_init,
 };
 
 struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915)
@@ -621,3 +612,8 @@ struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915)
                                          PAGE_SIZE, 0,
                                          &shmem_region_ops);
 }
+
+bool i915_gem_object_is_shmem(const struct drm_i915_gem_object *obj)
+{
+       return obj->ops == &i915_gem_shmem_ops;
+}