[PATCH 1/2] drm/vc4: Add a mechanism to easily extend CL submissions
Boris Brezillon
boris.brezillon at free-electrons.com
Fri Dec 22 20:59:23 UTC 2017
On Fri, 22 Dec 2017 12:53:36 -0800
Eric Anholt <eric at anholt.net> wrote:
> Boris Brezillon <boris.brezillon at free-electrons.com> writes:
>
> > The number of attributes/objects you can pass to the
> > DRM_IOCTL_VC4_SUBMIT_CL ioctl is limited by the drm_vc4_submit_cl struct
> > size.
> >
> > Add a mechanism to easily pass extra attributes when submitting a CL to
> > the V3D engine.
> >
> > Signed-off-by: Boris Brezillon <boris.brezillon at free-electrons.com>
> > ---
>
> > diff --git a/include/uapi/drm/vc4_drm.h b/include/uapi/drm/vc4_drm.h
> > index 52263b575bdc..ddcaa72da82a 100644
> > --- a/include/uapi/drm/vc4_drm.h
> > +++ b/include/uapi/drm/vc4_drm.h
> > @@ -70,6 +70,50 @@ struct drm_vc4_submit_rcl_surface {
> > };
> >
> > /**
> > + * @VC4_BIN_CL_CHUNK: binner CL chunk
> > + */
> > +enum {
> > + VC4_BIN_CL_CHUNK,
> > +};
> > +
> > +/**
> > + * struct drm_vc4_submit_cl_chunk - dummy chunk
> > + * @type: extension type
> > + * @pad: unused, should be set to zero
> > + *
> > + * Meant to be used for chunks that do not require extra parameters.
> > + */
> > +struct drm_vc4_submit_cl_dummy_chunk {
> > + __u32 type;
> > + __u32 pad[3];
> > +};
> > +
> > +/**
> > + * struct drm_vc4_submit_cl_bin_chunk - binner CL chunk
> > + *
> > + * @type: extention type, should be set to %VC4_BIN_CL_CHUNK
> > + * @size: size in bytes of the binner CL
> > + * @ptr: userspace pointer to the binner CL
> > + */
> > +struct drm_vc4_submit_cl_bin_chunk {
> > + __u32 type;
> > + __u32 size;
> > + __u64 ptr;
> > +};
> > +
> > +/**
> > + * union drm_vc4_submit_cl_chunk - CL chunk
> > + *
> > + * CL chunks allow us to easily extend the set of arguments one can pass
> > + * to the submit CL ioctl without having to add new ioctls/struct everytime
> > + * we run out of free fields in the drm_vc4_submit_cl struct.
> > + */
> > +union drm_vc4_submit_cl_chunk {
> > + struct drm_vc4_submit_cl_dummy_chunk dummy;
> > + struct drm_vc4_submit_cl_bin_chunk bin;
> > +};
> > +
> > +/**
> > * struct drm_vc4_submit_cl - ioctl argument for submitting commands to the 3D
> > * engine.
> > *
> > @@ -83,14 +127,23 @@ struct drm_vc4_submit_rcl_surface {
> > * BO.
> > */
> > struct drm_vc4_submit_cl {
> > - /* Pointer to the binner command list.
> > - *
> > - * This is the first set of commands executed, which runs the
> > - * coordinate shader to determine where primitives land on the screen,
> > - * then writes out the state updates and draw calls necessary per tile
> > - * to the tile allocation BO.
> > - */
> > - __u64 bin_cl;
> > + union {
> > + /* Pointer to the binner command list.
> > + *
> > + * This is the first set of commands executed, which runs the
> > + * coordinate shader to determine where primitives land on
> > + * the screen, then writes out the state updates and draw calls
> > + * necessary per tile to the tile allocation BO.
> > + */
> > + __u64 bin_cl;
> > +
> > + /* Pointer to an array of CL chunks.
> > + *
> > + * This is now the preferred way of passing optional attributes
> > + * when submitting a job.
> > + */
> > + __u64 cl_chunks;
> > + };
> >
> > /* Pointer to the shader records.
> > *
> > @@ -120,8 +173,14 @@ struct drm_vc4_submit_cl {
> > __u64 uniforms;
> > __u64 bo_handles;
> >
> > - /* Size in bytes of the binner command list. */
> > - __u32 bin_cl_size;
> > + union {
> > + /* Size in bytes of the binner command list. */
> > + __u32 bin_cl_size;
> > +
> > + /* Number of entries in the CL extension array. */
> > + __u32 num_cl_chunks;
> > + };
> > +
> > /* Size in bytes of the set of shader records. */
> > __u32 shader_rec_size;
> > /* Number of shader records.
> > @@ -167,6 +226,7 @@ struct drm_vc4_submit_cl {
> > #define VC4_SUBMIT_CL_FIXED_RCL_ORDER (1 << 1)
> > #define VC4_SUBMIT_CL_RCL_ORDER_INCREASING_X (1 << 2)
> > #define VC4_SUBMIT_CL_RCL_ORDER_INCREASING_Y (1 << 3)
> > +#define VC4_SUBMIT_CL_EXTENDED (1 << 4)
> > __u32 flags;
> >
> > /* Returned value of the seqno of this render job (for the
> > @@ -308,6 +368,7 @@ struct drm_vc4_get_hang_state {
> > #define DRM_VC4_PARAM_SUPPORTS_THREADED_FS 5
> > #define DRM_VC4_PARAM_SUPPORTS_FIXED_RCL_ORDER 6
> > #define DRM_VC4_PARAM_SUPPORTS_MADVISE 7
> > +#define DRM_VC4_PARAM_SUPPORTS_EXTENDED_CL 8
> >
> > struct drm_vc4_get_param {
> > __u32 param;
> > --
> > 2.11.0
>
> The vivante folks just extended their batch submit for performance
> monitors, and I was surprised to see that they actually extended their
> struct (without even a flag indicating that userspace was submitting an
> extended struct), which I thought we couldn't do. Apparently 6 years
> ago(!) the DRM core support was changed so that the driver always gets
> an ioctl arg of the size it requested, and if userspace submitted
> shorter then only the shorter amount is copied in/out and the rest is
> zero-padded.
>
> That means we could avoid this union stuff and even the whole idea of
> chunks, and just have a single extra id for the perfmon to use in this
> exec. (assuming that 0 isn't a valid perfmon handle).
0 was a valid ID in my implementation, but I can easily exclude it.
>
> Does this sound good to you? It seems like it would be a lot cleaner.
Yep, I'll rework the patch to just extend the drm_vc4_submit_cl
struct (add a new u32 perfmonid field).
More information about the dri-devel
mailing list