[PATCH 03/10] drm/gma500: Reimplement psb_gem_create()
Patrik Jakobsson
patrik.r.jakobsson at gmail.com
Sat Oct 2 22:13:32 UTC 2021
On Tue, Sep 28, 2021 at 10:44 AM Thomas Zimmermann <tzimmermann at suse.de> wrote:
>
> Implement psb_gem_create() for general use. Create the GEM handle in
> psb_gem_create_dumb(). Allows to use psb_gem_create() for creating all
> of the GEM objects.
>
> While at it, clean-up drm_gem_dumb_create() to make it more readable.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
Acked-by: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
> ---
> drivers/gpu/drm/gma500/gem.c | 93 ++++++++++++++++++++++--------------
> drivers/gpu/drm/gma500/gem.h | 4 +-
> 2 files changed, 59 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/gpu/drm/gma500/gem.c b/drivers/gpu/drm/gma500/gem.c
> index ff2c1d64689e..8f4bcf9cf912 100644
> --- a/drivers/gpu/drm/gma500/gem.c
> +++ b/drivers/gpu/drm/gma500/gem.c
> @@ -164,45 +164,36 @@ struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len,
> return NULL;
> }
>
> -int psb_gem_create(struct drm_file *file, struct drm_device *dev, u64 size,
> - u32 *handlep, int stolen, u32 align)
> +struct gtt_range *
> +psb_gem_create(struct drm_device *dev, u64 size, const char *name, bool stolen, u32 align)
> {
> - struct gtt_range *r;
> + struct gtt_range *gt;
> + struct drm_gem_object *obj;
> int ret;
> - u32 handle;
>
> size = roundup(size, PAGE_SIZE);
>
> - /* Allocate our object - for now a direct gtt range which is not
> - stolen memory backed */
> - r = psb_gtt_alloc_range(dev, size, "gem", 0, PAGE_SIZE);
> - if (r == NULL) {
> + gt = psb_gtt_alloc_range(dev, size, name, stolen, align);
> + if (!gt) {
> dev_err(dev->dev, "no memory for %lld byte GEM object\n", size);
> - return -ENOSPC;
> + return ERR_PTR(-ENOSPC);
> }
> - r->gem.funcs = &psb_gem_object_funcs;
> - /* Initialize the extra goodies GEM needs to do all the hard work */
> - if (drm_gem_object_init(dev, &r->gem, size) != 0) {
> - psb_gtt_free_range(dev, r);
> - /* GEM doesn't give an error code so use -ENOMEM */
> - dev_err(dev->dev, "GEM init failed for %lld\n", size);
> - return -ENOMEM;
> - }
> - /* Limit the object to 32bit mappings */
> - mapping_set_gfp_mask(r->gem.filp->f_mapping, GFP_KERNEL | __GFP_DMA32);
> - /* Give the object a handle so we can carry it more easily */
> - ret = drm_gem_handle_create(file, &r->gem, &handle);
> - if (ret) {
> - dev_err(dev->dev, "GEM handle failed for %p, %lld\n",
> - &r->gem, size);
> - drm_gem_object_release(&r->gem);
> - psb_gtt_free_range(dev, r);
> - return ret;
> - }
> - /* We have the initial and handle reference but need only one now */
> - drm_gem_object_put(&r->gem);
> - *handlep = handle;
> - return 0;
> + obj = >->gem;
> +
> + obj->funcs = &psb_gem_object_funcs;
> +
> + ret = drm_gem_object_init(dev, obj, size);
> + if (ret)
> + goto err_psb_gtt_free_range;
> +
> + /* Limit the object to 32-bit mappings */
> + mapping_set_gfp_mask(obj->filp->f_mapping, GFP_KERNEL | __GFP_DMA32);
> +
> + return gt;
> +
> +err_psb_gtt_free_range:
> + psb_gtt_free_range(dev, gt);
> + return ERR_PTR(ret);
> }
>
> /**
> @@ -218,10 +209,40 @@ int psb_gem_create(struct drm_file *file, struct drm_device *dev, u64 size,
> int psb_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
> struct drm_mode_create_dumb *args)
> {
> - args->pitch = ALIGN(args->width * ((args->bpp + 7) / 8), 64);
> - args->size = args->pitch * args->height;
> - return psb_gem_create(file, dev, args->size, &args->handle, 0,
> - PAGE_SIZE);
> + size_t pitch, size;
> + struct gtt_range *gt;
> + struct drm_gem_object *obj;
> + u32 handle;
> + int ret;
> +
> + pitch = args->width * DIV_ROUND_UP(args->bpp, 8);
> + pitch = ALIGN(pitch, 64);
> +
> + size = pitch * args->height;
> + size = roundup(size, PAGE_SIZE);
> + if (!size)
> + return -EINVAL;
> +
> + gt = psb_gem_create(dev, size, "gem", false, PAGE_SIZE);
> + if (IS_ERR(gt))
> + return PTR_ERR(gt);
> + obj = >->gem;
> +
> + ret = drm_gem_handle_create(file, obj, &handle);
> + if (ret)
> + goto err_drm_gem_object_put;
> +
> + drm_gem_object_put(obj);
> +
> + args->pitch = pitch;
> + args->size = size;
> + args->handle = handle;
> +
> + return 0;
> +
> +err_drm_gem_object_put:
> + drm_gem_object_put(obj);
> + return ret;
> }
>
> /**
> diff --git a/drivers/gpu/drm/gma500/gem.h b/drivers/gpu/drm/gma500/gem.h
> index 275494aedd4c..ad76127dc719 100644
> --- a/drivers/gpu/drm/gma500/gem.h
> +++ b/drivers/gpu/drm/gma500/gem.h
> @@ -14,8 +14,8 @@ struct drm_device;
>
> extern const struct drm_gem_object_funcs psb_gem_object_funcs;
>
> -extern int psb_gem_create(struct drm_file *file, struct drm_device *dev,
> - u64 size, u32 *handlep, int stolen, u32 align);
> +struct gtt_range *
> +psb_gem_create(struct drm_device *dev, u64 size, const char *name, bool stolen, u32 align);
>
> struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len, const char *name,
> int backed, u32 align);
> --
> 2.33.0
>
More information about the dri-devel
mailing list