Commit 4ff22f48 authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

drm: Return error codes from struct drm_driver.gem_create_object



GEM helper libraries use struct drm_driver.gem_create_object to let
drivers override GEM object allocation. On failure, the call returns
NULL.

Change the semantics to make the calls return a pointer-encoded error.
This aligns the callback with its callers. Fixes the ingenic driver,
which already returns an error pointer.

Also update the callers to handle the involved types more strictly.

Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarSteven Price <steven.price@arm.com>
Acked-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20211130095255.26710-1-tzimmermann@suse.de
parent 2696f901
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -67,18 +67,21 @@ __drm_gem_cma_create(struct drm_device *drm, size_t size, bool private)
	struct drm_gem_object *gem_obj;
	int ret = 0;

	if (drm->driver->gem_create_object)
	if (drm->driver->gem_create_object) {
		gem_obj = drm->driver->gem_create_object(drm, size);
	else
		gem_obj = kzalloc(sizeof(*cma_obj), GFP_KERNEL);
	if (!gem_obj)
		if (IS_ERR(gem_obj))
			return ERR_CAST(gem_obj);
		cma_obj = to_drm_gem_cma_obj(gem_obj);
	} else {
		cma_obj = kzalloc(sizeof(*cma_obj), GFP_KERNEL);
		if (!cma_obj)
			return ERR_PTR(-ENOMEM);
		gem_obj = &cma_obj->base;
	}

	if (!gem_obj->funcs)
		gem_obj->funcs = &drm_gem_cma_default_funcs;

	cma_obj = container_of(gem_obj, struct drm_gem_cma_object, base);

	if (private) {
		drm_gem_private_object_init(drm, gem_obj, size);

+10 −7
Original line number Diff line number Diff line
@@ -56,14 +56,17 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)

	size = PAGE_ALIGN(size);

	if (dev->driver->gem_create_object)
	if (dev->driver->gem_create_object) {
		obj = dev->driver->gem_create_object(dev, size);
	else
		obj = kzalloc(sizeof(*shmem), GFP_KERNEL);
	if (!obj)
		return ERR_PTR(-ENOMEM);

		if (IS_ERR(obj))
			return ERR_CAST(obj);
		shmem = to_drm_gem_shmem_obj(obj);
	} else {
		shmem = kzalloc(sizeof(*shmem), GFP_KERNEL);
		if (!shmem)
			return ERR_PTR(-ENOMEM);
		obj = &shmem->base;
	}

	if (!obj->funcs)
		obj->funcs = &drm_gem_shmem_funcs;
+2 −2
Original line number Diff line number Diff line
@@ -197,8 +197,8 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,

	if (dev->driver->gem_create_object) {
		gem = dev->driver->gem_create_object(dev, size);
		if (!gem)
			return ERR_PTR(-ENOMEM);
		if (IS_ERR(gem))
			return ERR_CAST(gem);
		gbo = drm_gem_vram_of_gem(gem);
	} else {
		gbo = kzalloc(sizeof(*gbo), GFP_KERNEL);
+1 −1
Original line number Diff line number Diff line
@@ -221,7 +221,7 @@ struct drm_gem_object *lima_gem_create_object(struct drm_device *dev, size_t siz

	bo = kzalloc(sizeof(*bo), GFP_KERNEL);
	if (!bo)
		return NULL;
		return ERR_PTR(-ENOMEM);

	mutex_init(&bo->lock);
	INIT_LIST_HEAD(&bo->va);
+1 −1
Original line number Diff line number Diff line
@@ -223,7 +223,7 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t

	obj = kzalloc(sizeof(*obj), GFP_KERNEL);
	if (!obj)
		return NULL;
		return ERR_PTR(-ENOMEM);

	INIT_LIST_HEAD(&obj->mappings.list);
	mutex_init(&obj->mappings.lock);
Loading