Re: [PATCH 03/10] drm/gma500: Reimplement psb_gem_create()

2021-10-02 Thread Patrik Jakobsson
On Tue, Sep 28, 2021 at 10:44 AM Thomas Zimmermann  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 

Acked-by: Patrik Jakobsson 


> ---
>  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
> ++

[PATCH 03/10] drm/gma500: Reimplement psb_gem_create()

2021-09-28 Thread Thomas Zimmermann
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 
---
 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, con