Commit 0e5493ca authored by CQ Tang's avatar CQ Tang Committed by Chris Wilson
Browse files

drm/i915/stolen: make the object creation interface consistent



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: default avatarCQ Tang <cq.tang@intel.com>
Signed-off-by: default avatarMatthew Auld <matthew.auld@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20191004170452.15410-2-matthew.auld@intel.com
parent 7d423af9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+2 −2
Original line number Diff line number Diff line
@@ -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");
+1 −1
Original line number Diff line number Diff line
@@ -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);
+26 −19
Original line number Diff line number Diff line
@@ -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)
	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);
}
+1 −1
Original line number Diff line number Diff line
@@ -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");
Loading