[PATCH] allow 32bpp framebuffers for cirrus drm

Stéphane Marchesin stephane.marchesin at gmail.com
Fri Oct 24 18:31:49 PDT 2014


On Tue, Oct 7, 2014 at 12:49 PM, Zach Reizner <zachr at google.com> wrote:

> This patch allows framebuffers for cirrus to be created with
> 32bpp pixel formats provided that they do not violate certain
> restrictions of the cirrus hardware.
>
> Signed-off-by: Zach Reizner <zachr at google.com>
>

Reviewed-by: Stéphane Marchesin <marcheu at chromium.org>

Dave, Adam: are you ok with this patch?

Stéphane



> ---
>  drivers/gpu/drm/cirrus/cirrus_drv.h   |  2 ++
>  drivers/gpu/drm/cirrus/cirrus_fbdev.c |  4 +++-
>  drivers/gpu/drm/cirrus/cirrus_main.c  | 22 ++++++++++++++++++++--
>  3 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h
> b/drivers/gpu/drm/cirrus/cirrus_drv.h
> index 401c890..fac475c 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
> @@ -208,6 +208,8 @@ int cirrus_framebuffer_init(struct drm_device *dev,
>                             struct drm_mode_fb_cmd2 *mode_cmd,
>                             struct drm_gem_object *obj);
>
> +bool cirrus_check_framebuffer(int width, int height, int bpp, int pitch);
> +
>                                 /* cirrus_display.c */
>  int cirrus_modeset_init(struct cirrus_device *cdev);
>  void cirrus_modeset_fini(struct cirrus_device *cdev);
> diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> index 2a135f2..4a0756c 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> @@ -146,8 +146,10 @@ static int cirrusfb_create_object(struct cirrus_fbdev
> *afbdev,
>         int ret = 0;
>         drm_fb_get_bpp_depth(mode_cmd->pixel_format, &depth, &bpp);
>
> -       if (bpp > 24)
> +       if (!cirrus_check_framebuffer(mode_cmd->width, mode_cmd->height,
> bpp,
> +                                     mode_cmd->pitches[0]))
>                 return -EINVAL;
> +
>         size = mode_cmd->pitches[0] * mode_cmd->height;
>         ret = cirrus_gem_create(dev, size, true, &gobj);
>         if (ret)
> diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c
> b/drivers/gpu/drm/cirrus/cirrus_main.c
> index 99c1983..029f9e9 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_main.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_main.c
> @@ -55,8 +55,9 @@ cirrus_user_framebuffer_create(struct drm_device *dev,
>         u32 bpp, depth;
>
>         drm_fb_get_bpp_depth(mode_cmd->pixel_format, &depth, &bpp);
> -       /* cirrus can't handle > 24bpp framebuffers at all */
> -       if (bpp > 24)
> +
> +       if (!cirrus_check_framebuffer(mode_cmd->width, mode_cmd->height,
> +                                     bpp, mode_cmd->pitches[0]))
>                 return ERR_PTR(-EINVAL);
>
>         obj = drm_gem_object_lookup(dev, filp, mode_cmd->handles[0]);
> @@ -307,3 +308,20 @@ out_unlock:
>         return ret;
>
>  }
> +
> +bool cirrus_check_framebuffer(int width, int height, int bpp, int pitch)
> +{
> +       const int max_pitch = 0x1FF << 3; /* (4096 - 1) & ~111b bytes */
> +       const int max_size = 0x400000; /* 4MB */
> +
> +       if (bpp > 32)
> +               return false;
> +
> +       if (pitch > max_pitch)
> +               return false;
> +
> +       if (pitch * height > max_size)
> +               return false;
> +
> +       return true;
> +}
> --
> 2.1.0.rc2.206.gedb03e5
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20141024/38e2344c/attachment-0001.html>


More information about the dri-devel mailing list