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

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
...@@ -67,18 +67,21 @@ __drm_gem_cma_create(struct drm_device *drm, size_t size, bool private) ...@@ -67,18 +67,21 @@ __drm_gem_cma_create(struct drm_device *drm, size_t size, bool private)
struct drm_gem_object *gem_obj; struct drm_gem_object *gem_obj;
int ret = 0; int ret = 0;
if (drm->driver->gem_create_object) if (drm->driver->gem_create_object) {
gem_obj = drm->driver->gem_create_object(drm, size); gem_obj = drm->driver->gem_create_object(drm, size);
else if (IS_ERR(gem_obj))
gem_obj = kzalloc(sizeof(*cma_obj), GFP_KERNEL); return ERR_CAST(gem_obj);
if (!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); return ERR_PTR(-ENOMEM);
gem_obj = &cma_obj->base;
}
if (!gem_obj->funcs) if (!gem_obj->funcs)
gem_obj->funcs = &drm_gem_cma_default_funcs; gem_obj->funcs = &drm_gem_cma_default_funcs;
cma_obj = container_of(gem_obj, struct drm_gem_cma_object, base);
if (private) { if (private) {
drm_gem_private_object_init(drm, gem_obj, size); drm_gem_private_object_init(drm, gem_obj, size);
......
...@@ -56,14 +56,17 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private) ...@@ -56,14 +56,17 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
size = PAGE_ALIGN(size); size = PAGE_ALIGN(size);
if (dev->driver->gem_create_object) if (dev->driver->gem_create_object) {
obj = dev->driver->gem_create_object(dev, size); obj = dev->driver->gem_create_object(dev, size);
else if (IS_ERR(obj))
obj = kzalloc(sizeof(*shmem), GFP_KERNEL); return ERR_CAST(obj);
if (!obj)
return ERR_PTR(-ENOMEM);
shmem = to_drm_gem_shmem_obj(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) if (!obj->funcs)
obj->funcs = &drm_gem_shmem_funcs; obj->funcs = &drm_gem_shmem_funcs;
......
...@@ -197,8 +197,8 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev, ...@@ -197,8 +197,8 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
if (dev->driver->gem_create_object) { if (dev->driver->gem_create_object) {
gem = dev->driver->gem_create_object(dev, size); gem = dev->driver->gem_create_object(dev, size);
if (!gem) if (IS_ERR(gem))
return ERR_PTR(-ENOMEM); return ERR_CAST(gem);
gbo = drm_gem_vram_of_gem(gem); gbo = drm_gem_vram_of_gem(gem);
} else { } else {
gbo = kzalloc(sizeof(*gbo), GFP_KERNEL); gbo = kzalloc(sizeof(*gbo), GFP_KERNEL);
......
...@@ -221,7 +221,7 @@ struct drm_gem_object *lima_gem_create_object(struct drm_device *dev, size_t siz ...@@ -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); bo = kzalloc(sizeof(*bo), GFP_KERNEL);
if (!bo) if (!bo)
return NULL; return ERR_PTR(-ENOMEM);
mutex_init(&bo->lock); mutex_init(&bo->lock);
INIT_LIST_HEAD(&bo->va); INIT_LIST_HEAD(&bo->va);
......
...@@ -223,7 +223,7 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t ...@@ -223,7 +223,7 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t
obj = kzalloc(sizeof(*obj), GFP_KERNEL); obj = kzalloc(sizeof(*obj), GFP_KERNEL);
if (!obj) if (!obj)
return NULL; return ERR_PTR(-ENOMEM);
INIT_LIST_HEAD(&obj->mappings.list); INIT_LIST_HEAD(&obj->mappings.list);
mutex_init(&obj->mappings.lock); mutex_init(&obj->mappings.lock);
......
...@@ -70,11 +70,11 @@ struct drm_gem_object *v3d_create_object(struct drm_device *dev, size_t size) ...@@ -70,11 +70,11 @@ struct drm_gem_object *v3d_create_object(struct drm_device *dev, size_t size)
struct drm_gem_object *obj; struct drm_gem_object *obj;
if (size == 0) if (size == 0)
return NULL; return ERR_PTR(-EINVAL);
bo = kzalloc(sizeof(*bo), GFP_KERNEL); bo = kzalloc(sizeof(*bo), GFP_KERNEL);
if (!bo) if (!bo)
return NULL; return ERR_PTR(-ENOMEM);
obj = &bo->base.base; obj = &bo->base.base;
obj->funcs = &v3d_gem_funcs; obj->funcs = &v3d_gem_funcs;
......
...@@ -97,7 +97,7 @@ static struct drm_gem_object *vgem_gem_create_object(struct drm_device *dev, siz ...@@ -97,7 +97,7 @@ static struct drm_gem_object *vgem_gem_create_object(struct drm_device *dev, siz
obj = kzalloc(sizeof(*obj), GFP_KERNEL); obj = kzalloc(sizeof(*obj), GFP_KERNEL);
if (!obj) if (!obj)
return NULL; return ERR_PTR(-ENOMEM);
/* /*
* vgem doesn't have any begin/end cpu access ioctls, therefore must use * vgem doesn't have any begin/end cpu access ioctls, therefore must use
......
...@@ -139,7 +139,7 @@ struct drm_gem_object *virtio_gpu_create_object(struct drm_device *dev, ...@@ -139,7 +139,7 @@ struct drm_gem_object *virtio_gpu_create_object(struct drm_device *dev,
shmem = kzalloc(sizeof(*shmem), GFP_KERNEL); shmem = kzalloc(sizeof(*shmem), GFP_KERNEL);
if (!shmem) if (!shmem)
return NULL; return ERR_PTR(-ENOMEM);
dshmem = &shmem->base.base; dshmem = &shmem->base.base;
dshmem->base.funcs = &virtio_gpu_shmem_funcs; dshmem->base.funcs = &virtio_gpu_shmem_funcs;
......
...@@ -291,8 +291,9 @@ struct drm_driver { ...@@ -291,8 +291,9 @@ struct drm_driver {
/** /**
* @gem_create_object: constructor for gem objects * @gem_create_object: constructor for gem objects
* *
* Hook for allocating the GEM object struct, for use by the CMA and * Hook for allocating the GEM object struct, for use by the CMA
* SHMEM GEM helpers. * and SHMEM GEM helpers. Returns a GEM object on success, or an
* ERR_PTR()-encoded error code otherwise.
*/ */
struct drm_gem_object *(*gem_create_object)(struct drm_device *dev, struct drm_gem_object *(*gem_create_object)(struct drm_device *dev,
size_t size); size_t size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment