[PATCH 04/10] drm/gma500: Allocate GTT ranges in stolen memory with psb_gem_create()

Patrik Jakobsson patrik.r.jakobsson at gmail.com
Sat Oct 2 22:13:46 UTC 2021


On Tue, Sep 28, 2021 at 10:44 AM Thomas Zimmermann <tzimmermann at suse.de> wrote:
>
> Support private objects for stolen memory in psb_gem_create() and
> convert users to psb_gem_create(). For stolen memory, psb_gem_create()
> now initializes the GEM object via drm_gem_private_object_init().
>
> In the fbdev setup, replace the open-coded initialization of struct
> gtt_range with a call to psb_gem_create(). Use drm_gem_object_put()
> for release.
>
> In the cursor setup, use psb_gem_create() and get a real GEM object.
> Previously the allocated instance of struct gtt_range was only partially
> initialized. Release the cursor GEM object in gma_crtc_destroy(). The
> release was missing from the original code.
>
> With the conversion of all callers to psb_gem_create(), the extern
> declarations of psb_gtt_alloc_range, psb_gtt_free_range and
> psb_gem_object_func are not required any longer. Declare them as
> static inline.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>

Acked-by: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>


> ---
>  drivers/gpu/drm/gma500/framebuffer.c       | 44 ++++++----------------
>  drivers/gpu/drm/gma500/gem.c               | 22 ++++++-----
>  drivers/gpu/drm/gma500/gem.h               |  5 ---
>  drivers/gpu/drm/gma500/gma_display.c       |  3 ++
>  drivers/gpu/drm/gma500/psb_intel_display.c |  5 +--
>  5 files changed, 29 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
> index ce92d11bd20f..3ea6679ccd38 100644
> --- a/drivers/gpu/drm/gma500/framebuffer.c
> +++ b/drivers/gpu/drm/gma500/framebuffer.c
> @@ -224,31 +224,6 @@ static struct drm_framebuffer *psb_framebuffer_create
>         return fb;
>  }
>
> -/**
> - *     psbfb_alloc             -       allocate frame buffer memory
> - *     @dev: the DRM device
> - *     @aligned_size: space needed
> - *
> - *     Allocate the frame buffer. In the usual case we get a GTT range that
> - *     is stolen memory backed and life is simple. If there isn't sufficient
> - *     we fail as we don't have the virtual mapping space to really vmap it
> - *     and the kernel console code can't handle non linear framebuffers.
> - *
> - *     Re-address this as and if the framebuffer layer grows this ability.
> - */
> -static struct gtt_range *psbfb_alloc(struct drm_device *dev, int aligned_size)
> -{
> -       struct gtt_range *backing;
> -       /* Begin by trying to use stolen memory backing */
> -       backing = psb_gtt_alloc_range(dev, aligned_size, "fb", 1, PAGE_SIZE);
> -       if (backing) {
> -               backing->gem.funcs = &psb_gem_object_funcs;
> -               drm_gem_private_object_init(dev, &backing->gem, aligned_size);
> -               return backing;
> -       }
> -       return NULL;
> -}
> -
>  /**
>   *     psbfb_create            -       create a framebuffer
>   *     @fb_helper: the framebuffer helper
> @@ -268,6 +243,7 @@ static int psbfb_create(struct drm_fb_helper *fb_helper,
>         int size;
>         int ret;
>         struct gtt_range *backing;
> +       struct drm_gem_object *obj;
>         u32 bpp, depth;
>
>         mode_cmd.width = sizes->surface_width;
> @@ -285,24 +261,25 @@ static int psbfb_create(struct drm_fb_helper *fb_helper,
>         size = ALIGN(size, PAGE_SIZE);
>
>         /* Allocate the framebuffer in the GTT with stolen page backing */
> -       backing = psbfb_alloc(dev, size);
> -       if (backing == NULL)
> -               return -ENOMEM;
> +       backing = psb_gem_create(dev, size, "fb", true, PAGE_SIZE);
> +       if (IS_ERR(backing))
> +               return PTR_ERR(backing);
> +       obj = &backing->gem;
>
>         memset(dev_priv->vram_addr + backing->offset, 0, size);
>
>         info = drm_fb_helper_alloc_fbi(fb_helper);
>         if (IS_ERR(info)) {
>                 ret = PTR_ERR(info);
> -               goto out;
> +               goto err_drm_gem_object_put;
>         }
>
>         mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth);
>
> -       fb = psb_framebuffer_create(dev, &mode_cmd, &backing->gem);
> +       fb = psb_framebuffer_create(dev, &mode_cmd, obj);
>         if (IS_ERR(fb)) {
>                 ret = PTR_ERR(fb);
> -               goto out;
> +               goto err_drm_gem_object_put;
>         }
>
>         fb_helper->fb = fb;
> @@ -333,8 +310,9 @@ static int psbfb_create(struct drm_fb_helper *fb_helper,
>         dev_dbg(dev->dev, "allocated %dx%d fb\n", fb->width, fb->height);
>
>         return 0;
> -out:
> -       psb_gtt_free_range(dev, backing);
> +
> +err_drm_gem_object_put:
> +       drm_gem_object_put(obj);
>         return ret;
>  }
>
> diff --git a/drivers/gpu/drm/gma500/gem.c b/drivers/gpu/drm/gma500/gem.c
> index 8f4bcf9cf912..4acab39a583a 100644
> --- a/drivers/gpu/drm/gma500/gem.c
> +++ b/drivers/gpu/drm/gma500/gem.c
> @@ -90,7 +90,7 @@ void psb_gtt_unpin(struct gtt_range *gt)
>         mutex_unlock(&dev_priv->gtt_mutex);
>  }
>
> -void psb_gtt_free_range(struct drm_device *dev, struct gtt_range *gt)
> +static void psb_gtt_free_range(struct drm_device *dev, struct gtt_range *gt)
>  {
>         /* Undo the mmap pin if we are destroying the object */
>         if (gt->mmapping) {
> @@ -122,13 +122,13 @@ static const struct vm_operations_struct psb_gem_vm_ops = {
>         .close = drm_gem_vm_close,
>  };
>
> -const struct drm_gem_object_funcs psb_gem_object_funcs = {
> +static const struct drm_gem_object_funcs psb_gem_object_funcs = {
>         .free = psb_gem_free_object,
>         .vm_ops = &psb_gem_vm_ops,
>  };
>
> -struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len,
> -                                     const char *name, int backed, u32 align)
> +static struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len,
> +                                            const char *name, int backed, u32 align)
>  {
>         struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>         struct gtt_range *gt;
> @@ -182,12 +182,16 @@ psb_gem_create(struct drm_device *dev, u64 size, const char *name, bool stolen,
>
>         obj->funcs = &psb_gem_object_funcs;
>
> -       ret = drm_gem_object_init(dev, obj, size);
> -       if (ret)
> -               goto err_psb_gtt_free_range;
> +       if (stolen) {
> +               drm_gem_private_object_init(dev, obj, size);
> +       } else {
> +               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);
> +               /* Limit the object to 32-bit mappings */
> +               mapping_set_gfp_mask(obj->filp->f_mapping, GFP_KERNEL | __GFP_DMA32);
> +       }
>
>         return gt;
>
> diff --git a/drivers/gpu/drm/gma500/gem.h b/drivers/gpu/drm/gma500/gem.h
> index ad76127dc719..6b67c58cbed5 100644
> --- a/drivers/gpu/drm/gma500/gem.h
> +++ b/drivers/gpu/drm/gma500/gem.h
> @@ -12,14 +12,9 @@
>
>  struct drm_device;
>
> -extern const struct drm_gem_object_funcs psb_gem_object_funcs;
> -
>  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);
> -void psb_gtt_free_range(struct drm_device *dev, struct gtt_range *gt);
>  int psb_gtt_pin(struct gtt_range *gt);
>  void psb_gtt_unpin(struct gtt_range *gt);
>
> diff --git a/drivers/gpu/drm/gma500/gma_display.c b/drivers/gpu/drm/gma500/gma_display.c
> index 8285358fac01..8c95b50034a5 100644
> --- a/drivers/gpu/drm/gma500/gma_display.c
> +++ b/drivers/gpu/drm/gma500/gma_display.c
> @@ -498,6 +498,9 @@ void gma_crtc_destroy(struct drm_crtc *crtc)
>  {
>         struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
>
> +       if (gma_crtc->cursor_gt)
> +               drm_gem_object_put(&gma_crtc->cursor_gt->gem);
> +
>         kfree(gma_crtc->crtc_state);
>         drm_crtc_cleanup(crtc);
>         kfree(gma_crtc);
> diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c
> index 18d5f7e5889e..b5e9118c01a4 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_display.c
> +++ b/drivers/gpu/drm/gma500/psb_intel_display.c
> @@ -461,9 +461,8 @@ static void psb_intel_cursor_init(struct drm_device *dev,
>                 /* Allocate 4 pages of stolen mem for a hardware cursor. That
>                  * is enough for the 64 x 64 ARGB cursors we support.
>                  */
> -               cursor_gt = psb_gtt_alloc_range(dev, 4 * PAGE_SIZE, "cursor", 1,
> -                                               PAGE_SIZE);
> -               if (!cursor_gt) {
> +               cursor_gt = psb_gem_create(dev, 4 * PAGE_SIZE, "cursor", true, PAGE_SIZE);
> +               if (IS_ERR(cursor_gt)) {
>                         gma_crtc->cursor_gt = NULL;
>                         goto out;
>                 }
> --
> 2.33.0
>


More information about the dri-devel mailing list