drm/i915/stolen: make the object creation interface consistent
authorCQ Tang <cq.tang@intel.com>
Fri, 4 Oct 2019 17:04:32 +0000 (18:04 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 4 Oct 2019 18:27:41 +0000 (19:27 +0100)
Our other backends return an actual error value upon failure. Do the
same for stolen objects, which currently just return NULL on failure.

Signed-off-by: CQ Tang <cq.tang@intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20191004170452.15410-2-matthew.auld@intel.com
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_fbdev.c
drivers/gpu/drm/i915/display/intel_overlay.c
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
drivers/gpu/drm/i915/gt/intel_gt.c
drivers/gpu/drm/i915/gt/intel_rc6.c
drivers/gpu/drm/i915/gt/intel_ringbuffer.c

index 5acc39f32d0c9c6ad358f0e3659c455ad682dd25..c15975a410bc23cce3599c720e1a27d00ba6527e 100644 (file)
@@ -3066,7 +3066,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
                                                             base_aligned,
                                                             base_aligned,
                                                             size_aligned);
-       if (!obj)
+       if (IS_ERR(obj))
                return false;
 
        switch (plane_config->tiling) {
index 97cde017670a134d34b2d40441ebbbdd7a98c3fa..3d1061470e761365c69a2acf2de4cef38b672b60 100644 (file)
@@ -141,10 +141,10 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
        /* If the FB is too big, just don't use it since fbdev is not very
         * important and we should probably use that space with FBC or other
         * features. */
-       obj = NULL;
+       obj = ERR_PTR(-ENODEV);
        if (size * 2 < dev_priv->stolen_usable_size)
                obj = i915_gem_object_create_stolen(dev_priv, size);
-       if (obj == NULL)
+       if (IS_ERR(obj))
                obj = i915_gem_object_create_shmem(dev_priv, size);
        if (IS_ERR(obj)) {
                DRM_ERROR("failed to allocate framebuffer\n");
index daea112cbb870b7f1bd211c4fb5bc3129d2628b0..2360f19f96945f79952f5d59b9361d4245273745 100644 (file)
@@ -1291,7 +1291,7 @@ static int get_registers(struct intel_overlay *overlay, bool use_phys)
        int err;
 
        obj = i915_gem_object_create_stolen(i915, PAGE_SIZE);
-       if (obj == NULL)
+       if (IS_ERR(obj))
                obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
        if (IS_ERR(obj))
                return PTR_ERR(obj);
index fad98a921cde8788e4cd23afda43d112b223c06a..c76260ce13e3911369fac7f1a770008c7c98bce0 100644 (file)
@@ -553,10 +553,11 @@ _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
 {
        struct drm_i915_gem_object *obj;
        unsigned int cache_level;
+       int err = -ENOMEM;
 
        obj = i915_gem_object_alloc();
-       if (obj == NULL)
-               return NULL;
+       if (!obj)
+               goto err;
 
        drm_gem_private_object_init(&dev_priv->drm, &obj->base, stolen->size);
        i915_gem_object_init(obj, &i915_gem_object_stolen_ops);
@@ -566,14 +567,16 @@ _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
        cache_level = HAS_LLC(dev_priv) ? I915_CACHE_LLC : I915_CACHE_NONE;
        i915_gem_object_set_cache_coherency(obj, cache_level);
 
-       if (i915_gem_object_pin_pages(obj))
+       err = i915_gem_object_pin_pages(obj);
+       if (err)
                goto cleanup;
 
        return obj;
 
 cleanup:
        i915_gem_object_free(obj);
-       return NULL;
+err:
+       return ERR_PTR(err);
 }
 
 struct drm_i915_gem_object *
@@ -585,28 +588,32 @@ i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
        int ret;
 
        if (!drm_mm_initialized(&dev_priv->mm.stolen))
-               return NULL;
+               return ERR_PTR(-ENODEV);
 
        if (size == 0)
-               return NULL;
+               return ERR_PTR(-EINVAL);
 
        stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
        if (!stolen)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        ret = i915_gem_stolen_insert_node(dev_priv, stolen, size, 4096);
        if (ret) {
-               kfree(stolen);
-               return NULL;
+               obj = ERR_PTR(ret);
+               goto err_free;
        }
 
        obj = _i915_gem_object_create_stolen(dev_priv, stolen);
-       if (obj)
-               return obj;
+       if (IS_ERR(obj))
+               goto err_remove;
 
+       return obj;
+
+err_remove:
        i915_gem_stolen_remove_node(dev_priv, stolen);
+err_free:
        kfree(stolen);
-       return NULL;
+       return obj;
 }
 
 struct drm_i915_gem_object *
@@ -622,7 +629,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
        int ret;
 
        if (!drm_mm_initialized(&dev_priv->mm.stolen))
-               return NULL;
+               return ERR_PTR(-ENODEV);
 
        DRM_DEBUG_DRIVER("creating preallocated stolen object: stolen_offset=%pa, gtt_offset=%pa, size=%pa\n",
                         &stolen_offset, &gtt_offset, &size);
@@ -631,11 +638,11 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
        if (WARN_ON(size == 0) ||
            WARN_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE)) ||
            WARN_ON(!IS_ALIGNED(stolen_offset, I915_GTT_MIN_ALIGNMENT)))
-               return NULL;
+               return ERR_PTR(-EINVAL);
 
        stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
        if (!stolen)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        stolen->start = stolen_offset;
        stolen->size = size;
@@ -645,15 +652,15 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
        if (ret) {
                DRM_DEBUG_DRIVER("failed to allocate stolen space\n");
                kfree(stolen);
-               return NULL;
+               return ERR_PTR(ret);
        }
 
        obj = _i915_gem_object_create_stolen(dev_priv, stolen);
-       if (obj == NULL) {
+       if (IS_ERR(obj)) {
                DRM_DEBUG_DRIVER("failed to allocate stolen object\n");
                i915_gem_stolen_remove_node(dev_priv, stolen);
                kfree(stolen);
-               return NULL;
+               return obj;
        }
 
        /* Some objects just need physical mem from stolen space */
@@ -706,5 +713,5 @@ err_pages:
        i915_gem_object_unpin_pages(obj);
 err:
        i915_gem_object_put(obj);
-       return NULL;
+       return ERR_PTR(ret);
 }
index 53220741e49e2992c6b6ce530308f84b734892d0..8f44cf8c79b2a832ccb64666ee9090850204c869 100644 (file)
@@ -334,7 +334,7 @@ static int intel_gt_init_scratch(struct intel_gt *gt, unsigned int size)
        int ret;
 
        obj = i915_gem_object_create_stolen(i915, size);
-       if (!obj)
+       if (IS_ERR(obj))
                obj = i915_gem_object_create_internal(i915, size);
        if (IS_ERR(obj)) {
                DRM_ERROR("Failed to allocate scratch page\n");
index d6167dd592e984505fe2433377c39a1327b0880b..71184aa7289612e10b48301864dfb4a7d552403d 100644 (file)
@@ -299,8 +299,8 @@ static int vlv_rc6_init(struct intel_rc6 *rc6)
                                                                      pcbr_offset,
                                                                      I915_GTT_OFFSET_NONE,
                                                                      pctx_size);
-               if (!pctx)
-                       return -ENOMEM;
+               if (IS_ERR(pctx))
+                       return PTR_ERR(pctx);
 
                goto out;
        }
@@ -316,9 +316,9 @@ static int vlv_rc6_init(struct intel_rc6 *rc6)
         * memory, or any other relevant ranges.
         */
        pctx = i915_gem_object_create_stolen(i915, pctx_size);
-       if (!pctx) {
+       if (IS_ERR(pctx)) {
                DRM_DEBUG("not enough stolen space for PCTX, disabling\n");
-               return -ENOMEM;
+               return PTR_ERR(pctx);
        }
 
        GEM_BUG_ON(range_overflows_t(u64,
index ec32996254c095065b092b8ff63f3eed4853d626..311fdc0a21bc26d8287d36e2ebc2ca82ec6955ad 100644 (file)
@@ -1274,7 +1274,7 @@ static struct i915_vma *create_ring_vma(struct i915_ggtt *ggtt, int size)
        struct i915_vma *vma;
 
        obj = i915_gem_object_create_stolen(i915, size);
-       if (!obj)
+       if (IS_ERR(obj))
                obj = i915_gem_object_create_internal(i915, size);
        if (IS_ERR(obj))
                return ERR_CAST(obj);