From: Mauro Carvalho Chehab <mchehab@infradead.org>
To: Hans Verkuil <hverkuil@xs4all.nl>
Cc: "Mauro Carvalho Chehab" <mchehab@s-opensource.com>,
"Sakari Ailus" <sakari.ailus@linux.intel.com>,
linux-media@vger.kernel.org,
"Niklas Söderlund" <niklas.soderlund@ragnatech.se>
Subject: Re: [PATCH v2 1/2] docs-rst: media: Document s_stream() video op usage for MC enabled devices
Date: Mon, 21 Aug 2017 09:07:12 -0300 [thread overview]
Message-ID: <20170821090650.506f91b6@silica> (raw)
In-Reply-To: <17fc3226-9356-cf96-2857-895f1131b23a@xs4all.nl>
Em Mon, 21 Aug 2017 12:14:18 +0200
Hans Verkuil <hverkuil@xs4all.nl> escreveu:
> On 08/21/2017 11:08 AM, Mauro Carvalho Chehab wrote:
> > Em Mon, 21 Aug 2017 09:36:49 +0300
> > Sakari Ailus <sakari.ailus@linux.intel.com> escreveu:
> >
> >> Hi Mauro,
> >>
> >> Mauro Carvalho Chehab wrote:
> >>> Hi Sakari,
> >>>
> >>> Em Wed, 16 Aug 2017 15:20:17 +0300
> >>> Sakari Ailus <sakari.ailus@linux.intel.com> escreveu:
> >>>
> >>>> As we begin to add support for systems with Media controller pipelines
> >>>> controlled by more than one device driver, it is essential that we
> >>>> precisely define the responsibilities of each component in the stream
> >>>> control and common practices.
> >>>>
> >>>> Specifically, streaming control is done per sub-device and sub-device
> >>>> drivers themselves are responsible for streaming setup in upstream
> >>>> sub-devices.
> >>>
> >>> IMO, before this patch, we need something like this:
> >>> https://patchwork.linuxtv.org/patch/43325/
> >>
> >> Thanks. I'll reply separately to that thread.
> >>
> >>>
> >>>>
> >>>> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> >>>> Acked-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> >>>> ---
> >>>> Documentation/media/kapi/v4l2-subdev.rst | 29 +++++++++++++++++++++++++++++
> >>>> 1 file changed, 29 insertions(+)
> >>>>
> >>>> diff --git a/Documentation/media/kapi/v4l2-subdev.rst b/Documentation/media/kapi/v4l2-subdev.rst
> >>>> index e1f0b72..45088ad 100644
> >>>> --- a/Documentation/media/kapi/v4l2-subdev.rst
> >>>> +++ b/Documentation/media/kapi/v4l2-subdev.rst
> >>>> @@ -262,6 +262,35 @@ is called. After all subdevices have been located the .complete() callback is
> >>>> called. When a subdevice is removed from the system the .unbind() method is
> >>>> called. All three callbacks are optional.
> >>>>
> >>>> +Streaming control on Media controller enabled devices
> >>>> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >>>> +
> >>>> +Starting and stopping the stream are somewhat complex operations that
> >>>> +often require walking the media graph to enable streaming on
> >>>> +sub-devices which the pipeline consists of. This involves interaction
> >>>> +between multiple drivers, sometimes more than two.
> >>>
> >>> That's still not ok, as it creates a black hole for devnode-based
> >>> devices.
> >>>
> >>> I would change it to something like:
> >>>
> >>> Streaming control
> >>> ^^^^^^^^^^^^^^^^^
> >>>
> >>> Starting and stopping the stream are somewhat complex operations that
> >>> often require to enable streaming on sub-devices which the pipeline
> >>> consists of. This involves interaction between multiple drivers, sometimes
> >>> more than two.
> >>>
> >>> The ``.s_stream()`` op in :c:type:`v4l2_subdev_video_ops` is responsible
> >>> for starting and stopping the stream on the sub-device it is called
> >>> on.
> >>>
> >>> Streaming control on devnode-centric devices
> >>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >>>
> >>> On **devnode-centric** devices, the main driver is responsible enable
> >>> stream all all sub-devices. On most cases, all the main driver need
> >>> to do is to broadcast s_stream to all connected sub-devices by calling
> >>> :c:func:`v4l2_device_call_all`, e. g.::
> >>>
> >>> v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
> >>
> >> Looks good to me.
> >>
> >>>
> >>> Streaming control on mc-centric devices
> >>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >>>
> >>> On **mc-centric** devices, it usually requires walking the media graph
> >>> to enable streaming only at the sub-devices which the pipeline consists
> >>> of.
> >>>
> >>> (place here the details for such scenario)
> >>
> >> This part requires a more detailed description of the problem area. What
> >> makes a difference here is that there's a pipeline this pipeline may be
> >> controlled more than one driver. (More elaborate discussion below.)
> >>
> >>>
> >>>> +The ``.s_stream()`` op in :c:type:`v4l2_subdev_video_ops` is responsible
> >>>> +for starting and stopping the stream on the sub-device it is called
> >>>> +on. A device driver is only responsible for calling the ``.s_stream()`` ops
> >>>> +of the adjacent sub-devices that are connected to its sink pads
> >>>> +through an enabled link. A driver may not call ``.s_stream()`` op
> >>>> +of any other sub-device further up in the pipeline, for instance.
> >>>> +
> >>>> +This means that a sub-device driver is thus in direct control of
> >>>> +whether the upstream sub-devices start (or stop) streaming before or
> >>>> +after the sub-device itself is set up for streaming.
> >>>> +
> >>>> +.. note::
> >>>> +
> >>>> + As the ``.s_stream()`` callback is called recursively through the
> >>>> + sub-devices along the pipeline, it is important to keep the
> >>>> + recursion as short as possible. To this end, drivers are encouraged
> >>>> + to avoid recursively calling ``.s_stream()`` internally to reduce
> >>>> + stack usage. Instead, the ``.s_stream()`` op of the directly
> >>>> + connected sub-devices should come from the callback through which
> >>>> + the driver was first called.
> >>>> +
> >>>
> >>> That sounds too complex, and can lead into troubles, if the same
> >>> sub-device driver is used on completely different devices.
> >>>
> >>> IMHO, it should be up to the main driver to navigate at the MC
> >>> pipeline and call s_stream(), and not to the sub-drivers.
> >>
> >> I would agree with the above statement *if* we had no devices that
> >> require doing this in a different way.
> >>
> >> Consider the following case:
> >>
> >> sensor -> CSI-2 receiver -> ISP (DMA)
> >> subdev A -> subdev B -> video node
> >
> > Let me be clearer about the issue I see.
> >
> > In the above example, what subdevs are supposed to multicast the
> > s_stream() to their neighbors, and how they will know that they
> > need to multicast it.
> >
> > Let's say, that, in the first pipeline, it would be the sensor
> > and subdev A. How "sensor" and "subdev A" will know that they're
> > meant to broadcast s_stream(), and the other entities know they
> > won't?
>
> So my understanding is that the bridge driver (ISP) will call s_stream
> for the CSI-2 receiver, and that in turn calls s_stream of the sensor.
Alternatively, the ISP driver could call s_stream for both CSI-2 and
sensor.
> This should only be done for mc-centric devices, so we need a clear
> property telling a subdev whether it is part of an mc-centric pipeline
> or a devnode-centric pipeline. Since in the latter case it should not
> call s_stream in this way. For devnode-centric pipelines the bridge
> driver broadcasts s_stream to all subdevs.
It would be easier to have a logic called by the ISP driver that would
get all elements from an active pipeline and call s_stream() there.
That would keep the flexibility that would be needed by devices with a
separate CSI-2 receiver, while preventing the addition of an extra
logic on every sub-device to teach them that s_stream() should be
called to communicate with some specific sub-device.
The thing is that, if you have a pipeline like:
source subdev -> subdev A -> subdev B -> subdev C -> subdev D -> DMA
due to PM constraints, all subdevs on such pipeline may require s_stream()
to control its power consumption. So, it is not just a CSI-2 device that
would need to enable power at the sensor, but an entire pipeline that
would need to receive s_stream() calls.
IMO, the best would be a logic similar to media_entity_pipeline_start() that,
for each entity at the pipeline, s_stream() would be called, e. g. something
like:
v4l2_subdev_pipeline_call()
> For the record, I am not aware of any subdevs that are used by both
> mc and devnode-centric scenarios AND that can sit in the middle of a
> pipeline. Sensors/video receiver subdevs can certainly be used in both
> scenarios, but they don't have to propagate a s_stream call.
em28xx has a bunch of sensors that are also used on embedded drivers.
It also has a tvp5150, with is also used by omap3.
On the only OMAP3 board whose has a DT upstream, the tvp5150 has both source
pads connected to S-Video connectors, but nothing prevents that someone
would add a tuner before it. I remember someone mentioned that such device
exists (although its DT is not upstream).
On an embedded device with both tvp5150 and a tuner, s_stream() should be
called by both.
>
> It would be very helpful if we have a good description of these two
> scenarios in our documentation, and a capability indicating mc-centric
> behavior for devnodes. And also for v4l2-subdevs internally (i.e.
> am I used in a mc-centric scenario or not?).
>
> Then this documentation will start to make more sense as well.
>
> > Also, the same sensor may be used on a device whose CSI-2 is
> > integrated at the ISP driver (the main driver). That's why
> > I think that such logic should be started by the main driver, as
> > it is the only part of the pipeline that it is aware about
> > what it is needed. Also, as the DMA engines are controlled by
> > the main driver (via its associated video devnodes), it is the only
> > part of the pipeline that knows when a stream starts.
>
> Yes, and this driver is the one that calls s_stream on the
> adjacent subdevs. But just those and not all.
>
> >
> >> Assume that the CSI-2 receiver requires hardware setup both *before and
> >> after* streaming has been enabled on the sensor.
> >
> > calling s_stream() before and after seems to be an abuse of it.
>
> I think you misunderstand what Sakari tries to say.
>
> In the scenario above the bridge driver calls s_stream for the
> CSI receiver. That in turn has code like this:
>
> s_stream(bool enable)
> {
> ... initialize CSI ...
> if error initializing CSI
> return error
> call s_stream for adjacent source subdev (i.e. sensor)
> if success
> return 0
> ... de-initialize CSI
> return error
> }
>
> This makes a lot of sense for mc-centric devices and is also much more
> precise than the broadcast that a devnode-centric device would do.
>
> In the very unlikely case that this CSI subdev would also be used in
> a devnode-centric scenario the s_stream implementation would just
> return 0 after it initializes the CSI hardware. It will depend on
> the hardware whether that works or not.
>
> subdevs used in devnode-centric scenarios tend to be pretty simple
> and are able to handle this.
If I understand well, you're basically concerned about error handling, right?
That could easily be handled with something like:
ret = v4l2_subdev_pipeline_call(source_entity, video, s_stream, 1);
if (ret < 0) {
v4l2_subdev_pipeline_call(source_entity, video, s_stream, 0);
return ret;
}
>
> Regards,
>
> Hans
>
> >
> > This callback is meant to be called just once, and there's no
> > requirement if it should be called before or after: both should
> > work.
> >
> >>
> >> In previous cases the CSI-2 receiver and the ISP have been part of the
> >> same device. This is not universally the case anymore. You'll also get
> >> the same when you add adv748x to the pipeline, and the upstream device
> >> in the pipeline before the adv748x is represented as a sub-device (and
> >> is thus controlled by its sub-device driver).
> >>
> >> This is addressable by moving the control of the upstream sub-device
> >
> > what is the "upstream sub-device"? This term is new for me.
> >
> >> streaming state to the driver which is next to it, and what the patch
> >> also documents. Note that there is no difference if you have a
> >> sub-device without sink pads (or in general case, a sub-device that only
> >> has one kind of pads).
> >
> >
> >> What comes to compatibility between MC-centric and devnode-centric
> >> drivers --- on an MC-centric device you have a pipeline and you
> >> typically have multiple pads on the sub-devices along the pipeline.
> >> Drivers that are devnode-centric generally aren't aware of pads, and so
> >> cannot configure sub-devices with multiple pads to begin with.
> >>
> >> You could do that in principle, but you'll start running into the same
> >> problems which were addressed by introducing the Media controller interface.
> >
> > I'm not concerned about compatibility. Yet, the same sub-device may
> > be there on a pipeline that it is mc-centric or devnode-centric.
> >
> > I'm mainly concerned with introducing hacks on some entities due to some
> > specific arrangements between them that are required for an specific
> > board layout to work.
> >
> >> Note that this is not a commonplace. The difference will be only be
> >> there *if and only if* you have a sub-device with sink pads in a
> >> pipeline. There are not many of those, and that difference is not
> >> introduced by this patch: it is a property of hardware.
> >
> > What do you mean? most pipelines have sub-devices with sink pads.
> >
> >>
> >> I'm definitely open to improving the wording as well as other solutions
> >> that can address this.
> >>
> >> Cc Niklas.
> >>
> >
> >
> >
> > Thanks,
> > Mauro
> >
>
next prev parent reply other threads:[~2017-08-21 12:07 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-16 12:20 [PATCH v2 0/2] Document s_stream video op calling (MC only) and CSI-2 stream stopping Sakari Ailus
2017-08-16 12:20 ` [PATCH v2 1/2] docs-rst: media: Document s_stream() video op usage for MC enabled devices Sakari Ailus
2017-08-19 10:35 ` Mauro Carvalho Chehab
2017-08-19 10:40 ` Mauro Carvalho Chehab
2017-08-21 6:36 ` Sakari Ailus
2017-08-21 9:08 ` Mauro Carvalho Chehab
2017-08-21 10:14 ` Hans Verkuil
2017-08-21 12:07 ` Mauro Carvalho Chehab [this message]
2017-08-21 13:52 ` Hans Verkuil
2017-08-21 14:01 ` Mauro Carvalho Chehab
2017-08-22 0:44 ` Niklas Söderlund
2017-08-22 1:13 ` Mauro Carvalho Chehab
2017-08-22 8:31 ` Philipp Zabel
2017-08-22 10:09 ` Sakari Ailus
2017-08-16 12:20 ` [PATCH v2 2/2] docs-rst: media: Document broken frame handling in stream stop for CSI-2 Sakari Ailus
2017-08-19 10:47 ` Mauro Carvalho Chehab
2017-08-21 10:15 ` Hans Verkuil
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=20170821090650.506f91b6@silica \
--to=mchehab@infradead.org \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@s-opensource.com \
--cc=niklas.soderlund@ragnatech.se \
--cc=sakari.ailus@linux.intel.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.