Re: [PATCH v9 08/13] media: atmel: atmel-isc: change format propagation to subdev into only verification

From: Jacopo Mondi
Date: Fri Apr 29 2022 - 08:39:33 EST


Hi

On Fri, Apr 29, 2022 at 03:28:11PM +0300, Laurent Pinchart wrote:
> On Fri, Apr 29, 2022 at 02:23:45PM +0200, Hans Verkuil wrote:
> > On 29/04/2022 14:02, Laurent Pinchart wrote:
> > > On Fri, Apr 29, 2022 at 01:17:27PM +0200, Hans Verkuil wrote:
> > >> On 29/04/2022 12:20, Laurent Pinchart wrote:
> > >>> On Fri, Apr 29, 2022 at 12:13:46PM +0200, Hans Verkuil wrote:
> > >>>> On 29/04/2022 12:07, Laurent Pinchart wrote:
> > >>>>> On Fri, Apr 29, 2022 at 11:58:48AM +0200, Jacopo Mondi wrote:
> > >>>>>> On Fri, Apr 29, 2022 at 10:43:09AM +0200, Hans Verkuil wrote:
> > >>>>>>> On 29/04/2022 10:28, Eugen.Hristev@xxxxxxxxxxxxx wrote:
> > >>>>>>>> On 4/29/22 11:17 AM, Hans Verkuil wrote:
> > >>>>>>>>> On 10/03/2022 10:51, Eugen Hristev wrote:
> > >>>>>>>>>> As a top MC video driver, the atmel-isc should not propagate the format to the
> > >>>>>>>>>> subdevice, it should rather check at start_streaming() time if the subdev is properly
> > >>>>>>>>>> configured with a compatible format.
> > >>>>>>>>>> Removed the whole format finding logic, and reworked the format verification
> > >>>>>>>>>> at start_streaming time, such that the ISC will return an error if the subdevice
> > >>>>>>>>>> is not properly configured. To achieve this, media_pipeline_start
> > >>>>>>>>>> is called and a link_validate callback is created to check the formats.
> > >>>>>>>>>> With this being done, the module parameter 'sensor_preferred' makes no sense
> > >>>>>>>>>> anymore. The ISC should not decide which format the sensor is using. The
> > >>>>>>>>>> ISC should only cope with the situation and inform userspace if the streaming
> > >>>>>>>>>> is possible in the current configuration.
> > >>>>>>>>>> The redesign of the format propagation has also risen the question of the
> > >>>>>>>>>> enumfmt callback. If enumfmt is called with an mbus_code, the enumfmt handler
> > >>>>>>>>>> should only return the formats that are supported for this mbus_code.
> > >>>>>>>>>> Otherwise, the enumfmt will report all the formats that the ISC could output.
> > >>>>>>>>>> With this rework, the dynamic list of user formats is removed. It makes no
> > >>>>>>>>>> more sense to identify at complete time which formats the sensor could emit,
> > >>>>>>>>>> and add those into a separate dynamic list.
> > >>>>>>>>>> The ISC will start with a simple preconfigured default format, and at
> > >>>>>>>>>> link validate time, decide whether it can use the format that is configured
> > >>>>>>>>>> on the sink or not.
> > >>>>>>>>>>
> > >>>>>>>>>> Signed-off-by: Eugen Hristev <eugen.hristev@xxxxxxxxxxxxx>
> > >>>>>>>>>> Reviewed-by: Jacopo Mondi <jacopo@xxxxxxxxxx>
> > >>>>>>>>>> ---
> > >>>>>>>>>> Changes in v9:
> > >>>>>>>>>> - isc_link_validate now static
> > >>>>>>>>>>
> > >>>>>>>>>> Changes in v7:
> > >>>>>>>>>> - minor typos as suggested by Jacopo
> > >>>>>>>>>> - small changes, reduce some indentation, modified an index, as suggested by
> > >>>>>>>>>> Jacopo
> > >>>>>>>>>>
> > >>>>>>>>>> Changes in v6:
> > >>>>>>>>>> - reworked a bit enum_fmt as suggested by Jacopo
> > >>>>>>>>>>
> > >>>>>>>>>> Changes in v5:
> > >>>>>>>>>> - removed user_formats dynamic list as it is now pointless
> > >>>>>>>>>> - greatly simplified the enum_fmt function
> > >>>>>>>>>> - removed some init code that was useless now
> > >>>>>>>>>>
> > >>>>>>>>>> Changes in v4:
> > >>>>>>>>>> - moved validation code into link_validate and used media_pipeline_start
> > >>>>>>>>>> - merged this patch with the enum_fmt patch which was previously in v3 of
> > >>>>>>>>>> the series
> > >>>>>>>>>>
> > >>>>>>>>>> Changes in v3:
> > >>>>>>>>>> - clamp to maximum resolution once the frame size from the subdev is found
> > >>>>>>>>>> drivers/media/platform/atmel/atmel-isc-base.c | 412 ++++++++----------
> > >>>>>>>>>> .../media/platform/atmel/atmel-isc-scaler.c | 5 +
> > >>>>>>>>>> drivers/media/platform/atmel/atmel-isc.h | 13 +-
> > >>>>>>>>>> .../media/platform/atmel/atmel-sama5d2-isc.c | 20 +
> > >>>>>>>>>> .../media/platform/atmel/atmel-sama7g5-isc.c | 20 +
> > >>>>>>>>>> 5 files changed, 236 insertions(+), 234 deletions(-)
> > >>>>>>>>>>
> > >>>>>>>>>> diff --git a/drivers/media/platform/atmel/atmel-isc-base.c b/drivers/media/platform/atmel/atmel-isc-base.c
> > >>>>>>>>>> index ee1dda6707a0..fe2c0af58060 100644
> > >>>>>>>>>> --- a/drivers/media/platform/atmel/atmel-isc-base.c
> > >>>>>>>>>> +++ b/drivers/media/platform/atmel/atmel-isc-base.c
> > >>>>>>>>>> @@ -36,11 +36,6 @@ static unsigned int debug;
> > >>>>>>>>>> module_param(debug, int, 0644);
> > >>>>>>>>>> MODULE_PARM_DESC(debug, "debug level (0-2)");
> > >>>>>>>>>>
> > >>>>>>>>>> -static unsigned int sensor_preferred = 1;
> > >>>>>>>>>> -module_param(sensor_preferred, uint, 0644);
> > >>>>>>>>>> -MODULE_PARM_DESC(sensor_preferred,
> > >>>>>>>>>> - "Sensor is preferred to output the specified format (1-on 0-off), default 1");
> > >>>>>>>>>> -
> > >>>>>>>>>> #define ISC_IS_FORMAT_RAW(mbus_code) \
> > >>>>>>>>>> (((mbus_code) & 0xf000) == 0x3000)
> > >>>>>>>>>>
> > >>>>>>>>>> @@ -337,6 +332,10 @@ static int isc_start_streaming(struct vb2_queue *vq, unsigned int count)
> > >>>>>>>>>> unsigned long flags;
> > >>>>>>>>>> int ret;
> > >>>>>>>>>>
> > >>>>>>>>>> + ret = media_pipeline_start(&isc->video_dev.entity, &isc->mpipe);
> > >>>>>>>>>
> > >>>>>>>>> The pipeline validation is done in start_streaming, but I don't think that
> > >>>>>>>>> is the best place: if STREAMON is called before buffers are queued, then
> > >>>>>>>>> an invalid pipeline isn't discovered until enough buffers are queued to
> > >>>>>>>>> kick off start_streaming.
> > >>>>>>>>>
> > >>>>>>>>> Drivers like vsp1, omap3isp and the samsung drivers all do this in streamon().
> > >>>>>>>>>
> > >>>>>>>>> I think that is the correct time to do this.
> > >>>>>>>>
> > >>>>>>>> Hello Hans,
> > >>>>>>>>
> > >>>>>>>> Initially (v2, v3) I had this in streamon(). The problem that I faced at
> > >>>>>>>> that time was that streamoff was never called, so I could not call
> > >>>>>>>> media_pipeline_stop(). Then Jacopo told me to move it to start_streaming
> > >>>>>>>> (see change log for v4) , and I did not face any more problems.
> > >>>>>>
> > >>>>>> Yes indeed, seems I suggested to use media_pipeline_handler in a
> > >>>>>> comment on your v3
> > >>>>>>
> > >>>>>> "at s_stream time your top driver calls media_pipeline_start()"
> > >>>>>>
> > >>>>>> sorry about that, I should have looked around a bit more carefully and
> > >>>>>> notice most drivers do so at vb2 streamon
> > >>>>>>
> > >>>>>> However I don't see media_pipeline_start being called at all in v3 of
> > >>>>>> the patch
> > >>>>>>
> > >>>>>>> It's a mess. Looking at some drivers I see that omap3isp calls media_pipeline_stop
> > >>>>>>> in streamoff (so will have the same problem as you described if VIDIOC_STREAMOFF
> > >>>>>>> isn't called), exynos4-is does the same, but it also checks the streaming state in
> > >>>>>>> the release() fop callback, so that would fix this problem. And vimc does this
> > >>>>>>> in stop_streaming.
> > >>>>>>>
> > >>>>>>> I'm in favor of fixing this in vb2, that framework knows exactly when this needs
> > >>>>>>> to be called.
> > >>>>>>
> > >>>>>> Are you suggesting to have vb2 to call media_pipeline_start() or is it
> > >>>>>> more complex than this ?
> > >>>>>
> > >>>>> I think Hans meant adding a .validate() operation to vb2.
> > >>>>>
> > >>>>> vb2 is already quite complex, I don't think adding more features is a
> > >>>>> good idea. I'd rather have vb2 focus on buffer management only
> > >>>>> (.start_streaming() and .stop_streaming() shouldn't have been in there
> > >>>>> in my opinion), and handle validation in the .streamon() handler. I'd
> > >>>>> expect most drivers that deal with media pipelines to do more work in
> > >>>>> .streamon() anyway.
> > >>>>
> > >>>> I disagree with that :-)
> > >>>>
> > >>>> It's vb2 that keeps track of the streaming state and when what actions
> > >>>> need to be taken. Drivers really shouldn't need to care about the ioctls
> > >>>> themselves, and just implement the relevant vb2 callbacks. Relying on
> > >>>> drivers to handle any of the streaming ioctls is asking for problems,
> > >>>> as this shows: most drivers implement this wrong today.
> > >>>>
> > >>>> The vb2 framework knows when e.g. the pipeline needs to be started or
> > >>>> stopped, and can do this at the best time, without drivers needing to
> > >>>> keep track of when streamon/off/release is called. Keep that logic in
> > >>>> vb2.
> > >>>
> > >>> Pipeline management and buffer management are two different issues.
> > >>> Don't forget about devices that have multiple video nodes, part of the
> > >>> same pipeline (possibly a combination of output and capture nodes, or
> > >>> all of the same type). Forcing drivers to go through vb2 operations to
> > >>> handle the pipeline will be messy, will result in more bloat in vb2, and
> > >>> make the result more bug-prone and harder to maintain.
> > >>>
> > >>> If pipeline management is too complex, let's simplify it, new helpers
> > >>> can make sense, but not through vb2.
> > >>
> > >> But it is vb2 that knows when streaming starts and stops.
> > >
> > > That's right, but pipeline start (which includes validation and resource
> > > reservation) needs to be performed synchronously with VIDIOC_STREAMON.
> > > The streaming state managed by vb2 is not relevant,
> > > media_pipeline_start() must not be delayed the same way
> > > .start_streaming() is.
> >
> > It will be the first thing that vb2_streamon calls. This has nothing to do
> > with start_streaming: that's called when sufficient number of buffers are
> > queued up to be able to start the DMA. This proposed prepare_streaming op
> > will be called when VIDIOC_STREAMON is called.
>
> Then it doesn't need vb2's knowledge of the stream state :-)
>
> > >> The driver just
> > >> needs to be informed (e.g. prepare_streaming and unprepare_streaming ops).
> > >>
> > >> vb2 deals with buffer management and it keeps track of the streaming state
> > >> and makes the streaming state transitions. That *is* an integral part of
> > >> vb2. What is missing at the moment are callbacks done at streamon time and
> > >> when the streaming stops (streamoff, or close() when is_streaming is true).
> > >>
> > >> If you want to implement stream validation in a driver, then there are a
> > >> lot of things you need to do:
> > >>
> > >> - override streamon, make sure you call vb2_queue_is_busy(), validate the
> > >> pipeline, then call vb2_streamon, if that fails, remember to stop the
> > >> pipeline.
> > >>
> > >> - override streamoff, make sure you call vb2_queue_is_busy(), stop the
> > >> pipeline and call vb2_streamoff.
> > >>
> > >> - in the release() function when the fh is closed, you have to check
> > >> vb2_is_streaming(), check that you are the owner of the queue, and if true,
> > >> stop the pipeline.
> > >
> > > I'm not opposed to helper functions to implement that, they can bundle
> > > vb2 calls and pipeline management.
> > >
> > >> By moving this to vb2 ops all you need to implement are the prepare and
> > >> unprepare ops.
> > >>
> > >> Esp. the release() implementation is tricky. I'm pretty sure that
> > >> drivers/media/platform/samsung/exynos4-is/fimc-lite.c is wrong, since it
> > >> should only call media_pipeline_stop() for the owner of the queue. Instead
> > >> it calls it for the last user of the queue.
> > >>
> > >> I see that fimc_lite_streamoff() is wrong too: you can safely call
> > >> VIDIOC_STREAMOFF twice: the second streamoff just returns 0 without
> > >> doing anything. Instead media_pipeline_stop is called without testing if
> > >> the queue is streaming.
> > >>
> > >> And yes, this is in part because V4L2 has quite some history and certainly
> > >> API choice were made in the past that we wouldn't make today. But vb2
> > >> shields you from that, and behaves much more like a proper state machine.
> > >>
> > >> I know you prefer to give a lot more control to driver developers, but
> > >> in my experience very few developers can do things like this right. And
> > >> it is really hard as a reviewer to check if all the corner cases are handled
> > >> correctly in a driver. If vb2 is used, then I know things are called at the
> > >> right time, and that makes my life as reviewer so much easier.
> > >
> > > It's not just about giving more control to drivers, it's about
> > > organizing the software layers in a way that keeps them maintainable,
> > > with layered abstractions and not midlayers.
> > >
> > > We are extensively reworking the media pipeline management as part of
> > > the stream series, and there will be more work on top of that that will
> > > make even more fundamental changes. I would like to at least postpone
> > > any work on vb2 until then, to be able to evaluate the impact.
> >
> > I'll make an RFC patch for vb2 so you have a better idea of what it does.
>
> As long as we don't merge it before I get the chance to send the media
> pipeline management rework, I'm all for RFCs :-)
>

To unblock Eugen is it fine if he moves media_pipeline_start() at
streamon() time for now ? It will require overriding
v4l2_ioctl.vidioc_streamon which might be a bit of additional work
(but probably easier to replace once a proper solution lands)

Otherwise, should the series go in as it is now ?

Thanks
j

> > >> There may still be a few drivers that really need to do this manually, and
> > >> that's OK, but a driver like the atmel-isc doesn't need that at all.
>
> --
> Regards,
>
> Laurent Pinchart