Re: [PATCH v7 00/27] v4l: subdev internal routing and streams

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jacopo,

On 23/07/2021 13:21, Jacopo Mondi wrote:

This current series version has a routing table, set with the set-routing
ioctl. When the routing is set, you could think that a set of "virtual" pads
is created (identified by (pad, stream) pair), where each route endpoint has
a pad. Those pads can then be configured similarly to the "normal" pads.


And that's for routes inside an entity. Am I wrong that in this
version multiplexed (or virtual) pads identified by the (pad, stream)
pair have a format assigned at both ends of a link ?

Yes, that is correct.

     Also link validation is of course a bit more complex as shown by
     731facccc987 ("v4l: subdev: Take routing information into account in link validation")
     which was part of the previous series, but it's totally up to the
     core..

Moving everything to the pads by adding a 'stream' field basically
makes all pads potentially multiplexed, reducing the problem of format
configuration/validation to a 1-to-1 {pad, stream} pair validation
which allows to collapse the topology and maintain the current one.

Yes. I think I have problem understanding the counter arguments as I don't
really see a difference with a) two subdevs, each with two non-multiplexed
pads, linked 1-to-1 and b) two subdevs, each with one multiplexed pad, with
two routes.

My main concerns are:

- Usage of format configuration to establish routing as per above.
    Format assignment gets a routing semantic associated, which is an
    implicit behavior difficult to control and inspect for applications.

Again, either I'm totally misunderstanding what you're saying, or you are
talking about the method that has not been implemented.


For routing internal to entities as you said GS_ROUTING is still in
place, so my argument is moot. However I think it still applies to
multiplexed ends of a cross-entity link (see below).


- Userspace is in control of connecting endpoints on the multiplexed
    bus by assigning formats, this has two consequences:
    - A 1-to-1 mapping between streams on the two sides of the
      multiplexed bus which prevents routing multiple streams to the
      same endpoint (is this correct ?)

No, you can have multiple streams with the same endpoint (i.e. the same
(pad, stream) for source/sink side).

    - As the only information about a 'stream' on the multiplexed bus is
      the format it transports, it is required to assign to the stream
      identifier a semantic (ie stream 0 = virtual channel 0). The
      previous version had the information of what's transported on the
      multiplexed bus hidden from userspace and delegated to the
      frame_desc kAPI. This way it was possible to describe precisely
      what's sent on the bus, with bus-specific structures (ie struct
      v4l2_mbus_frame_desc_entry.bus.csi2)

That is how it's in this series too. The difference is that in the previous
version, when a driver needed to know something about the stream which was
not in the frame_desc, it had to start traversing the graph to find out a
non-multiplexed pad. With this version the driver has the information in its
(pad, stream) pair.

That's a (desirable) consequence of the fact multiplexed ends of a
link have a format assigned, right ?

Yes.


    - This might seem a bit pedantic, but, setting image formats and
      sizes on the endpoints of a multiplexed bus such as CSI-2 is not
      technically correct. CSI-2 transports packets tagged with
      identifiers for the virtual channel and data type they transport
      (and identifiers for the packet type, but that's part of the bus
      protocol). The format and size is relevant for configuring the
      size of the memory area where the receiver dumps the received
      packets, but it's not part of the link configuration itself.
      This was better represented by using the information from the
      remote side frame_desc.

Why is a multiplexed CSI-2 bus different than a non-multiplexed parallel
bus? Or more specifically, why is a single stream in a multiplexed CSI-2 bus
different than the stream in non-multiplexed parallel bus? It's the same
data, transported in a slightly different manner.

One could, of course, argue that they are not different, and pad
configuration for non-multiplexed pads should also be removed.

While I get where you're going, I don't completely agree. The format
set on the ends of a non-multiplexed link does not represent what is
transported there but instructs the receiver (less so the transmitter)
about what data it should expects to receive and allows drivers to
prepare for it. The same doesn't apply to multiplexed pads, where
'what is expected to receive' is given by the union of the formats of
the several (pad, stream) endpoints. Assuming my understanding is
correct, that's what I don't like about having formats on multiplexed
pads.

Hmm, I don't quite understand your point. Do you mean that in non-multiplexed case the format is used to configure the receiver hardware, whereas with multiplexed case that is not true?

The format describes the content of a stream. In non-multiplexed case there's only one stream. In both cases the frame-desc can be used to find out details about the transmission.

Maybe this becomes more clear if you can give some practical examples to highlight your concerns?

Thanks, this helps. Do we concur that the main difference between the
two version (let's call them v0 and v1) at least from an uAPI perspective,

Let's rather call them v1 and v2, as I've uesd those terms elsewhere already =)

is basically that the ends of a multiplexed link:

- in v0 had no formats assigned, configuration of the receiver end was
   performed in-kernel through get_frame_desc()

Yes, although if the driver needs to know details found in the format, it has to traverse through the graph to find the data.

- in v1 each (pad, stream) has a format assigned by userspace and the
   receiver configuration is deduced from the formats assigned to the
   several endpoints ?

The receiver configuration needs to be decided based on frame desc, formats, link freq control. This is the same for v0.

I would like to thank you for having bear with me so far and clarify my
doubts, I hope you'll find energy to clarify my last questions
here and I hope my understanding is not completely wrong, this is a
non-easy topic to deal with.

This will perhaps be easier to understand when I provide the drivers I've been using for testing. I'll do that for the next version.

However, I don't want to continue to argue because what I care about
is getting to have some solution merged, and I feel this discussion is
not getting any productive for that. What I can offer, if anyway

I disagree, I think it is productive =). I am relatively new to cameras and V4L2, so it's important to get opinions. It is also good to get questions so that I have to explain what I'm doing, as it often forces me to re-think topics that I have already "finished".

helpful, is in the next weeks (or months?) rebase the work we've done
on R-Car in the past to support VC multiplexing on your series to have
more material for comparison. Then the ideal solution would be to pick

This is a good idea, but please wait until the next version of the series. While there are currently no changes in the concepts, there are quite a lot of kernel side changes due to the new subdev state and using that.

a conference/event most of the interested parties could attend, sit
down for a few days and find a way to move forward. The linux-media
mini conferences held around ELC/plumbers had this purpose and helped
finalize direction for other topics in the past. Considering the
current situation that's very unlikely to happen, but a virtual
version of the same could be considered.

I'm happy to have meetings, one-to-one or bigger ones, to discuss this.

 Tomi



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux