From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
To: Brian Starkey <Brian.Starkey@arm.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"dri-devel@lists.freedesktop.org"
<dri-devel@lists.freedesktop.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
Maxime Ripard <maxime.ripard@bootlin.com>,
"linux-sunxi@googlegroups.com" <linux-sunxi@googlegroups.com>,
David Airlie <airlied@linux.ie>, Chen-Yu Tsai <wens@csie.org>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
Sean Paul <sean@poorly.run>, nd <nd@arm.com>
Subject: Re: [PATCH v2 31/43] drm/sun4i: Add a dedicated ioctl call for allocating tiled buffers
Date: Fri, 23 Nov 2018 13:52:14 +0100 [thread overview]
Message-ID: <c838df0a552cfc34de426dc2bc61bcff4a858e10.camel@bootlin.com> (raw)
In-Reply-To: <20181123113019.43vrzvj42l35el7z@DESKTOP-E1NTVVP.localdomain>
[-- Attachment #1: Type: text/plain, Size: 8004 bytes --]
Hi,
On Fri, 2018-11-23 at 11:30 +0000, Brian Starkey wrote:
> Hi Paul,
>
> On Fri, Nov 23, 2018 at 10:25:03AM +0100, Paul Kocialkowski wrote:
> > This introduces a dedicated ioctl for allocating buffers for the VPU
> > tiling mode. It allows setting up buffers that comply to the hardware
> > alignment requirements, by aligning the stride and height to 32 bytes.
> >
> > Only YUV semiplanar and planar formats are allowed by the ioctl, as the
> > hardware does not support the tiling mode for other formats.
>
> What's the general feeling about a more generic version of this ioctl?
> There doesn't seem to be anything Allwinner-specific in the ioctl
> arguments.
That's a great suggestion, I am totally in favour of making a generic
fashion of this!
It would also remove the need for a new header dedicated to the sun4i-
drm driver, which was really only motivated by the need for this ioctl.
> It effectively boils down to:
>
> size = driver->get_fb_size_with_modifier(...);
> cma_obj = drm_gem_cma_create(drm, size);
>
> It would look exactly the same for Mali-DP, and probably others too.
> Is it better to try and define something we can share instead of Arm
> adding another nearly identical ioctl() later?
>
> I think the minimal viable thing would be to just add modifiers to
> your structure (I put them first because padding):
>
> struct drm_gem_create_with_modifiers {
> __u64 modifiers[4];
> __u32 height;
> __u32 width;
> __u32 format;
> /* handle, offsets, pitches, size will be returned */
> __u32 handle;
> __u32 pitches[4];
> __u32 offsets[4];
> __u64 size;
> };
That would totally work for me and our usecase.
Cheers,
Paul
> Thanks,
> -Brian
>
> > Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
> > ---
> > drivers/gpu/drm/sun4i/sun4i_drv.c | 89 +++++++++++++++++++++++++++++++
> > include/uapi/drm/sun4i_drm.h | 42 +++++++++++++++
> > 2 files changed, 131 insertions(+)
> > create mode 100644 include/uapi/drm/sun4i_drm.h
> >
> > diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
> > index ccdeae6299eb..5ae32973cf34 100644
> > --- a/drivers/gpu/drm/sun4i/sun4i_drv.c
> > +++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
> > @@ -21,6 +21,7 @@
> > #include <drm/drm_gem_cma_helper.h>
> > #include <drm/drm_fb_helper.h>
> > #include <drm/drm_of.h>
> > +#include <drm/sun4i_drm.h>
> >
> > #include "sun4i_drv.h"
> > #include "sun4i_frontend.h"
> > @@ -28,6 +29,92 @@
> > #include "sun4i_tcon.h"
> > #include "sun8i_tcon_top.h"
> >
> > +int drm_sun4i_gem_create_tiled(struct drm_device *drm, void *data,
> > + struct drm_file *file_priv)
> > +{
> > + struct drm_sun4i_gem_create_tiled *args = data;
> > + struct drm_gem_cma_object *cma_obj;
> > + struct drm_gem_object *gem_obj;
> > + uint32_t luma_stride, chroma_stride;
> > + uint32_t luma_height, chroma_height;
> > + uint32_t chroma_width;
> > + const struct drm_format_info *info;
> > + int ret;
> > +
> > + info = drm_format_info(args->format);
> > + if (!info)
> > + return -EINVAL;
> > +
> > + /* The tiled output format only applies to non-packed YUV formats. */
> > + if (!info->is_yuv || info->num_planes == 1)
> > + return -EINVAL;
> > +
> > + memset(args->pitches, 0, sizeof(args->pitches));
> > + memset(args->offsets, 0, sizeof(args->offsets));
> > +
> > + /* Stride and height are aligned to 32 bytes for our tiled format. */
> > + luma_stride = ALIGN(args->width, 32);
> > + luma_height = ALIGN(args->height, 32);
> > +
> > + chroma_width = args->width;
> > +
> > + /* Semiplanar formats have both U and V data in their chroma plane. */
> > + if (drm_format_info_is_yuv_semiplanar(info))
> > + chroma_width *= 2;
> > +
> > + chroma_stride = ALIGN(DIV_ROUND_UP(chroma_width, info->hsub), 32);
> > + chroma_height = ALIGN(DIV_ROUND_UP(args->height, info->vsub), 32);
> > +
> > + if (drm_format_info_is_yuv_semiplanar(info)) {
> > + args->pitches[0] = luma_stride;
> > + args->pitches[1] = chroma_stride;
> > +
> > + args->offsets[0] = 0;
> > + args->offsets[1] = luma_stride * luma_height;
> > +
> > + args->size = luma_stride * luma_height +
> > + chroma_stride * chroma_height;
> > + } else if (drm_format_info_is_yuv_planar(info)) {
> > + args->pitches[0] = luma_stride;
> > + args->pitches[1] = chroma_stride;
> > + args->pitches[2] = chroma_stride;
> > +
> > + args->offsets[0] = 0;
> > + args->offsets[1] = luma_stride * luma_height;
> > + args->offsets[2] = luma_stride * luma_height +
> > + chroma_stride * chroma_height;
> > +
> > + args->size = luma_stride * luma_height +
> > + chroma_stride * chroma_height * 2;
> > + } else {
> > + /* No support for other formats in tiled mode. */
> > + return -EINVAL;
> > + }
> > +
> > + cma_obj = drm_gem_cma_create(drm, args->size);
> > + if (IS_ERR(cma_obj))
> > + return PTR_ERR(cma_obj);
> > +
> > + gem_obj = &cma_obj->base;
> > +
> > + /*
> > + * allocate a id of idr table where the obj is registered
> > + * and handle has the id what user can see.
> > + */
> > + ret = drm_gem_handle_create(file_priv, gem_obj, &args->handle);
> > + /* drop reference from allocate - handle holds it now. */
> > + drm_gem_object_put_unlocked(gem_obj);
> > + if (ret)
> > + return ret;
> > +
> > + return PTR_ERR_OR_ZERO(cma_obj);
> > +}
> > +
> > +static const struct drm_ioctl_desc sun4i_drv_ioctls[] = {
> > + DRM_IOCTL_DEF_DRV(SUN4I_GEM_CREATE_TILED, drm_sun4i_gem_create_tiled,
> > + DRM_UNLOCKED),
> > +};
> > +
> > static int drm_sun4i_gem_dumb_create(struct drm_file *file_priv,
> > struct drm_device *drm,
> > struct drm_mode_create_dumb *args)
> > @@ -44,6 +131,8 @@ static struct drm_driver sun4i_drv_driver = {
> > .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC,
> >
> > /* Generic Operations */
> > + .ioctls = sun4i_drv_ioctls,
> > + .num_ioctls = ARRAY_SIZE(sun4i_drv_ioctls),
> > .fops = &sun4i_drv_fops,
> > .name = "sun4i-drm",
> > .desc = "Allwinner sun4i Display Engine",
> > diff --git a/include/uapi/drm/sun4i_drm.h b/include/uapi/drm/sun4i_drm.h
> > new file mode 100644
> > index 000000000000..2c77584b057b
> > --- /dev/null
> > +++ b/include/uapi/drm/sun4i_drm.h
> > @@ -0,0 +1,42 @@
> > +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
> > +/* sun4i_drm.h
> > + *
> > + * Copyright (C) 2018 Paul Kocialkowski <paul.kocialkowski@bootlin.com>
> > + *
> > + * This program is free software; you can redistribute it and/or modify it
> > + * under the terms of the GNU General Public License as published by the
> > + * Free Software Foundation; either version 2 of the License, or (at your
> > + * option) any later version.
> > + */
> > +
> > +#ifndef _UAPI_SUN4I_DRM_H_
> > +#define _UAPI_SUN4I_DRM_H_
> > +
> > +#include "drm.h"
> > +
> > +#if defined(__cplusplus)
> > +extern "C" {
> > +#endif
> > +
> > +struct drm_sun4i_gem_create_tiled {
> > + __u32 height;
> > + __u32 width;
> > + __u32 format;
> > + /* handle, offsets, pitches, size will be returned */
> > + __u32 handle;
> > + __u32 pitches[4];
> > + __u32 offsets[4];
> > + __u64 size;
> > +};
> > +
> > +#define DRM_SUN4I_GEM_CREATE_TILED 0x00
> > +
> > +#define DRM_IOCTL_SUN4I_GEM_CREATE_TILED \
> > + DRM_IOWR(DRM_COMMAND_BASE + DRM_SUN4I_GEM_CREATE_TILED, \
> > + struct drm_sun4i_gem_create_tiled)
> > +
> > +#if defined(__cplusplus)
> > +}
> > +#endif
> > +
> > +#endif /* _UAPI_SUN4I_DRM_H_ */
> > --
> > 2.19.1
> >
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Paul Kocialkowski, Bootlin (formerly Free Electrons)
Embedded Linux and kernel engineering
https://bootlin.com
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2018-11-23 12:52 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-23 9:24 [PATCH v2 00/43] drm/sun4i: Support for linear and tiled YUV formats with the frontend Paul Kocialkowski
2018-11-23 9:24 ` [PATCH v2 01/43] drm/sun4i: Cleanup video/YUV source before enabling a layer Paul Kocialkowski
2018-11-27 8:31 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 02/43] drm/sun4i: frontend: Replace ARGB with XRGB as supported format Paul Kocialkowski
2018-11-27 8:31 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 03/43] drm/sun4i: Add TODO comment about supporting scaling with the backend Paul Kocialkowski
2018-11-27 8:31 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 04/43] drm/sun4i: backend: Add a helper and a list for supported formats Paul Kocialkowski
2018-11-27 8:38 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 05/43] drm/sun4i: frontend: " Paul Kocialkowski
2018-11-27 8:38 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 06/43] drm/sun4i: backend: Refine the logic behind using the frontend Paul Kocialkowski
2018-11-27 8:39 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 07/43] drm/sun4i: backend: Use a specific function to check if a plane is supported Paul Kocialkowski
2018-11-27 8:41 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 08/43] drm/fourcc: Add helper to check if a format uses a YUV colorspace Paul Kocialkowski
2018-11-27 8:49 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 09/43] drm/fourcc: Add format info helpers for checking YUV planes disposition Paul Kocialkowski
2018-11-27 8:49 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 10/43] drm/fourcc: Add format " Paul Kocialkowski
2018-11-27 8:49 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 11/43] drm/fourcc: Add format info helpers for checking YUV sub-sampling Paul Kocialkowski
2018-11-27 8:49 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 12/43] drm/fourcc: Add format " Paul Kocialkowski
2018-11-23 16:55 ` Ayan Halder
2018-11-23 17:23 ` Ville Syrjälä
2018-11-26 9:03 ` Paul Kocialkowski
2018-11-23 9:24 ` [PATCH v2 13/43] drm/sun4i: backend: Use explicit fourcc helpers for packed YUV422 check Paul Kocialkowski
2018-11-27 8:51 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 14/43] drm/sun4i: backend: Avoid counting YUV planes that use the frontend Paul Kocialkowski
2018-11-27 8:52 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 15/43] drm/sun4i: Rename sun4i_backend_layer_formats to sun4i_layer_formats Paul Kocialkowski
2018-11-27 8:52 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 16/43] drm/sun4i: frontend: Move CSC bypass setup to format update routine Paul Kocialkowski
2018-11-27 8:53 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 17/43] drm/sun4i: frontend: Add helpers for input data mode and pixel sequence Paul Kocialkowski
2018-11-27 8:53 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 18/43] drm/sun4i: frontend: Add proper definitions for format registers Paul Kocialkowski
2018-11-27 8:54 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 19/43] drm/sun4i: frontend: Determine input mode based on the number of planes Paul Kocialkowski
2018-11-27 8:55 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 20/43] drm/sun4i: frontend: Determine input format based on colorspace Paul Kocialkowski
2018-11-23 9:24 ` [PATCH v2 21/43] drm/sun4i: frontend: Add support for the BGRX8888 input format Paul Kocialkowski
2018-11-27 8:57 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 22/43] drm/sun4i: frontend: Add support for the BGRX8888 output format Paul Kocialkowski
2018-11-27 9:04 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 23/43] drm/sun4i: backend: Detail the YUV to RGB values coding explanation Paul Kocialkowski
2018-11-27 8:57 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 24/43] drm/sun4i: frontend: Configure and enable YUV to RGB CSC when needed Paul Kocialkowski
2018-11-23 9:24 ` [PATCH v2 25/43] drm/sun4i: frontend: Apply format sub-sampling to CH1 dimensions Paul Kocialkowski
2018-11-27 8:58 ` Maxime Ripard
2018-11-23 9:24 ` [PATCH v2 26/43] drm/sun4i: frontend: Add support for packed YUV422 input formats Paul Kocialkowski
2018-11-23 9:24 ` [PATCH v2 27/43] drm/sun4i: frontend: Add support for semi-planar YUV " Paul Kocialkowski
2018-11-27 9:00 ` Maxime Ripard
2018-11-23 9:25 ` [PATCH v2 28/43] drm/sun4i: frontend: Add support for planar " Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 29/43] drm/sun4i: Make pitch even for GEM dumb alloc as per hardware constraint Paul Kocialkowski
2018-11-27 9:02 ` Maxime Ripard
2018-11-23 9:25 ` [PATCH v2 30/43] drm/fourcc: Add definitions for Allwinner vendor and VPU tiled format Paul Kocialkowski
2018-11-27 9:02 ` Maxime Ripard
2018-11-23 9:25 ` [PATCH v2 31/43] drm/sun4i: Add a dedicated ioctl call for allocating tiled buffers Paul Kocialkowski
2018-11-23 11:30 ` Brian Starkey
2018-11-23 12:52 ` Paul Kocialkowski [this message]
2018-11-27 9:03 ` Maxime Ripard
2018-11-23 9:25 ` [PATCH v2 32/43] drm/sun4i: Pass modifier to backend and frontend format support helpers Paul Kocialkowski
2018-11-27 9:13 ` Maxime Ripard
2018-11-23 9:25 ` [PATCH v2 33/43] drm/sun4i: frontend: Add support for tiled YUV input mode configuration Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 34/43] drm/sun4i: Add buffer stride and offset configuration for tiling mode Paul Kocialkowski
2018-11-27 9:24 ` Maxime Ripard
2018-12-04 13:30 ` Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 35/43] drm/sun4i: frontend: Add and use helper for checking tiling support Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 36/43] drm/sun4i: layer: Add tiled modifier support and helper Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 37/43] drm/sun4i: drv: Allow framebuffer modifiers in mode config Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 38/43] drm/sun4i: Move access control before setting the register as documented Paul Kocialkowski
2018-11-27 9:26 ` Maxime Ripard
2018-11-23 9:25 ` [PATCH v2 39/43] drm/sun4i: frontend: Add a quirk structure Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 40/43] drm/sun4i: Set the coef_rdy bit right after the coef have been set Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 41/43] drm/sun4i: Make COEF_RDY conditional Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 42/43] drm/sun4i: frontend: Move the FIR filter phases to our quirks Paul Kocialkowski
2018-11-23 9:25 ` [PATCH v2 43/43] drm/sun4i: frontend: Add A20-specific device-tree compatible and quirks Paul Kocialkowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c838df0a552cfc34de426dc2bc61bcff4a858e10.camel@bootlin.com \
--to=paul.kocialkowski@bootlin.com \
--cc=Brian.Starkey@arm.com \
--cc=airlied@linux.ie \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sunxi@googlegroups.com \
--cc=maxime.ripard@bootlin.com \
--cc=nd@arm.com \
--cc=sean@poorly.run \
--cc=thomas.petazzoni@bootlin.com \
--cc=wens@csie.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).