From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
linux-media@vger.kernel.org, tomi.valkeinen@ideasonboard.com,
jacopo.mondi@ideasonboard.com, bingbu.cao@intel.com,
hongju.wang@intel.com
Subject: Re: [PATCH v3 5/8] media: v4l: subdev: Make stream argument optional in state access functions
Date: Wed, 25 Oct 2023 13:50:55 +0300 [thread overview]
Message-ID: <20231025105055.GC481@pendragon.ideasonboard.com> (raw)
In-Reply-To: <ZTjro-bLwouKcJ4c@kekkonen.localdomain>
Hi Sakari,
On Wed, Oct 25, 2023 at 10:19:15AM +0000, Sakari Ailus wrote:
> On Wed, Oct 25, 2023 at 11:53:35AM +0200, Hans Verkuil wrote:
> > On 23/10/2023 19:44, Sakari Ailus wrote:
> > > The sub-device state access functions take three arguments: sub-device
> > > state, pad and stream. The stream is not relevant for the majority of
> > > drivers and having to specify 0 for the stream is considered a nuisance.
> > >
> > > Provide a two-argument macros for these state access functions to cover
> > > the needs of stream-unaware users.
> > >
> > > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > > ---
> > > drivers/media/v4l2-core/v4l2-subdev.c | 18 ++++++-------
> > > include/media/v4l2-subdev.h | 39 ++++++++++++++++++++-------
> > > 2 files changed, 39 insertions(+), 18 deletions(-)
> > >
> > > diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
> > > index f0f0af48730f..e35226587244 100644
> > > --- a/drivers/media/v4l2-core/v4l2-subdev.c
> > > +++ b/drivers/media/v4l2-core/v4l2-subdev.c
> > > @@ -1671,8 +1671,8 @@ int v4l2_subdev_set_routing_with_fmt(struct v4l2_subdev *sd,
> > > EXPORT_SYMBOL_GPL(v4l2_subdev_set_routing_with_fmt);
> > >
> > > struct v4l2_mbus_framefmt *
> > > -v4l2_subdev_state_get_format(struct v4l2_subdev_state *state, unsigned int pad,
> > > - u32 stream)
> > > +__v4l2_subdev_state_get_format(struct v4l2_subdev_state *state,
> > > + unsigned int pad, u32 stream)
> > > {
> > > struct v4l2_subdev_stream_configs *stream_configs;
> > > unsigned int i;
> > > @@ -1702,11 +1702,11 @@ v4l2_subdev_state_get_format(struct v4l2_subdev_state *state, unsigned int pad,
> > >
> > > return NULL;
> > > }
> > > -EXPORT_SYMBOL_GPL(v4l2_subdev_state_get_format);
> > > +EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_format);
> > >
> > > struct v4l2_rect *
> > > -v4l2_subdev_state_get_crop(struct v4l2_subdev_state *state, unsigned int pad,
> > > - u32 stream)
> > > +__v4l2_subdev_state_get_crop(struct v4l2_subdev_state *state, unsigned int pad,
> > > + u32 stream)
> > > {
> > > struct v4l2_subdev_stream_configs *stream_configs;
> > > unsigned int i;
> > > @@ -1736,11 +1736,11 @@ v4l2_subdev_state_get_crop(struct v4l2_subdev_state *state, unsigned int pad,
> > >
> > > return NULL;
> > > }
> > > -EXPORT_SYMBOL_GPL(v4l2_subdev_state_get_crop);
> > > +EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_crop);
> > >
> > > struct v4l2_rect *
> > > -v4l2_subdev_state_get_compose(struct v4l2_subdev_state *state, unsigned int pad,
> > > - u32 stream)
> > > +__v4l2_subdev_state_get_compose(struct v4l2_subdev_state *state,
> > > + unsigned int pad, u32 stream)
> > > {
> > > struct v4l2_subdev_stream_configs *stream_configs;
> > > unsigned int i;
> > > @@ -1770,7 +1770,7 @@ v4l2_subdev_state_get_compose(struct v4l2_subdev_state *state, unsigned int pad,
> > >
> > > return NULL;
> > > }
> > > -EXPORT_SYMBOL_GPL(v4l2_subdev_state_get_compose);
> > > +EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_compose);
> > >
> > > int v4l2_subdev_routing_find_opposite_end(const struct v4l2_subdev_krouting *routing,
> > > u32 pad, u32 stream, u32 *other_pad,
> > > diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
> > > index 71cb35133b4a..12eb0fe746d7 100644
> > > --- a/include/media/v4l2-subdev.h
> > > +++ b/include/media/v4l2-subdev.h
> > > @@ -1545,7 +1545,7 @@ int v4l2_subdev_set_routing_with_fmt(struct v4l2_subdev *sd,
> > > * v4l2_subdev_state_get_format() - Get pointer to a stream format
> > > * @state: subdevice state
> > > * @pad: pad id
> > > - * @stream: stream id
> > > + * @...: stream id (optional argument)
> > > *
> > > * This returns a pointer to &struct v4l2_mbus_framefmt for the given pad +
> > > * stream in the subdev state.
> > > @@ -1553,15 +1553,22 @@ int v4l2_subdev_set_routing_with_fmt(struct v4l2_subdev *sd,
> > > * For stream-unaware drivers the format for the corresponding pad is returned.
> > > * If the pad does not exist, NULL is returned.
> > > */
> > > +#define v4l2_subdev_state_get_format(state, pad, ...) \
> > > + __v4l2_subdev_state_get_format_ ## __VA_OPT__(stream) \
> > > + (state, pad __VA_OPT__(,) __VA_ARGS__)
> > > +#define __v4l2_subdev_state_get_format_(state, pad) \
> > > + __v4l2_subdev_state_get_format(state, pad, 0)
> > > +#define __v4l2_subdev_state_get_format_stream(state, pad, stream) \
> > > + __v4l2_subdev_state_get_format(state, pad, stream)
> >
> > Hmm, 'git grep __VA_OPT__' finds no use of this in the kernel. Are you sure this
> > is safe to use? Does clang support it? Do all gcc versions that the kernel support
> > implement it?
> >
> > A 10+ for creativity, but I'm a bit concerned about it.
>
> :-)
>
> I noticed the problem, too, as the lkp bot failed compiling this on GCC
> 7.5. Indeed only GCC 8 supports __VA_OPT__ but the oldest GCC version
> supported for kernel compilation is 7.1. So __VA_OPT__ isn't... an option.
>
> I thought this could be done using variable arguments, making most error
> handling take place at runtime (for GCC versions not supporting
> __VA_OPT__), but then Laurent figured this can be done with just
> __VA_ARGS__ which is part of C99.
>
> The code would look like this, which is only slightly less understandable
> than with __VA_OPT__:
>
> #define v4l2_subdev_state_get_format(...) \
> __v4l2_subdev_state_get_format_var(__VA_ARGS__, , _2)(__VA_ARGS__)
How about
__v4l2_subdev_state_get_format_var(__VA_ARGS__, _stream, _pad)(__VA_ARGS__)
? The internal macro and function names would then be more explicit.
> #define __v4l2_subdev_state_get_format_var(_1, _2, _3, NUM, ...) \
> __v4l2_subdev_state_get_format ## NUM
> #define __v4l2_subdev_state_get_format_2(state, pad) \
> __v4l2_subdev_state_get_format(state, pad, 0)
> struct v4l2_mbus_framefmt *
> __v4l2_subdev_state_get_format(struct v4l2_subdev_state *state,
> unsigned int pad, u32 stream);
>
> > And if there are only a few drivers that need to give a specific stream,
> > wouldn't it be easier to just have a v4l2_subdev_state_get_format_stream
> > function and a static inline v4l2_subdev_state_get_format() that just calls
> > the _stream version with 0?
>
> I'm trying to shorten function names here: they're overly long. Also I'd
> like to see a single set of API functions to access sub-device state
> information irrespective of how it is stored. I originally proposed just
> specifying stream zero but both Laurent and Tomi opined against it.
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2023-10-25 10:50 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-23 17:44 [PATCH v3 0/8] Unify sub-device state access functions Sakari Ailus
2023-10-23 17:44 ` [PATCH v3 1/8] media: v4l: subdev: Store the sub-device in the sub-device state Sakari Ailus
2023-10-23 22:04 ` Laurent Pinchart
2023-10-24 7:35 ` Tomi Valkeinen
2023-10-23 17:44 ` [PATCH v3 2/8] media: v4l: subdev: Also return pads array information on stream functions Sakari Ailus
2023-10-23 22:07 ` Laurent Pinchart
2023-10-23 22:18 ` Sakari Ailus
2023-10-24 14:45 ` Tomi Valkeinen
2023-10-24 18:07 ` Sakari Ailus
2023-10-25 9:32 ` Hans Verkuil
2023-10-25 10:20 ` Sakari Ailus
2023-10-23 17:44 ` [PATCH v3 3/8] media: v4l: subdev: Rename sub-device state information access functions Sakari Ailus
2023-10-24 7:37 ` Tomi Valkeinen
2023-10-23 17:44 ` [PATCH v3 4/8] media: v4l: subdev: v4l2_subdev_state_get_format always returns format now Sakari Ailus
2023-10-24 14:47 ` Tomi Valkeinen
2023-10-23 17:44 ` [PATCH v3 5/8] media: v4l: subdev: Make stream argument optional in state access functions Sakari Ailus
2023-10-23 22:15 ` Laurent Pinchart
2023-10-25 9:53 ` Hans Verkuil
2023-10-25 10:19 ` Sakari Ailus
2023-10-25 10:50 ` Laurent Pinchart [this message]
2023-10-25 11:03 ` Sakari Ailus
2023-10-25 11:20 ` Hans Verkuil
2023-10-25 11:30 ` Sakari Ailus
2023-10-23 17:44 ` [PATCH v3 6/8] media: v4l: subdev: Switch to stream-aware state functions Sakari Ailus
2023-10-23 22:13 ` Laurent Pinchart
2023-10-24 5:54 ` Sakari Ailus
2023-10-24 7:21 ` Laurent Pinchart
2023-10-24 9:20 ` Sakari Ailus
2023-10-23 17:44 ` [PATCH v3 7/8] media: v4l: subdev: Remove stream-unaware sub-device state access Sakari Ailus
2023-10-23 22:14 ` Laurent Pinchart
2023-10-23 17:44 ` [PATCH v3 8/8] media: v4l: subdev: Also assert acquired mutex for non-stream drivers Sakari Ailus
2023-10-23 22:14 ` Laurent Pinchart
2023-10-23 22:33 ` Sakari Ailus
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=20231025105055.GC481@pendragon.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=bingbu.cao@intel.com \
--cc=hongju.wang@intel.com \
--cc=hverkuil@xs4all.nl \
--cc=jacopo.mondi@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=sakari.ailus@linux.intel.com \
--cc=tomi.valkeinen@ideasonboard.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.