diff mbox series

[1/2] media: subdev: Split V4L2_SUBDEV_ROUTING_NO_STREAM_MIX

Message ID 20230228092346.101105-1-tomi.valkeinen@ideasonboard.com (mailing list archive)
State New, archived
Headers show
Series [1/2] media: subdev: Split V4L2_SUBDEV_ROUTING_NO_STREAM_MIX | expand

Commit Message

Tomi Valkeinen Feb. 28, 2023, 9:23 a.m. UTC
V4L2_SUBDEV_ROUTING_NO_STREAM_MIX routing validation flag means that all
routes from a sink pad must go to the same source pad and all routes
going to the same source pad must originate from the same sink pad.

This does not cover all use cases. For example, if a device routes
all streams from a single sink pad to any of the source pads, but
streams from multiple sink pads can go to the same source pad, the
current flag is too restrictive.

Split the flag into two parts, V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX
and V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX, which add the restriction
only on one side of the device. Together they mean the same as
V4L2_SUBDEV_ROUTING_NO_STREAM_MIX.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/media/v4l2-core/v4l2-subdev.c | 17 +++++++++++++----
 include/media/v4l2-subdev.h           | 16 +++++++++++++---
 2 files changed, 26 insertions(+), 7 deletions(-)

Comments

Jacopo Mondi March 1, 2023, 10:37 a.m. UTC | #1
Hi Tomi

On Tue, Feb 28, 2023 at 11:23:45AM +0200, Tomi Valkeinen wrote:
> V4L2_SUBDEV_ROUTING_NO_STREAM_MIX routing validation flag means that all
> routes from a sink pad must go to the same source pad and all routes
> going to the same source pad must originate from the same sink pad.
>
> This does not cover all use cases. For example, if a device routes
> all streams from a single sink pad to any of the source pads, but
> streams from multiple sink pads can go to the same source pad, the
> current flag is too restrictive.
>
> Split the flag into two parts, V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX
> and V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX, which add the restriction
> only on one side of the device. Together they mean the same as
> V4L2_SUBDEV_ROUTING_NO_STREAM_MIX.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/media/v4l2-core/v4l2-subdev.c | 17 +++++++++++++----
>  include/media/v4l2-subdev.h           | 16 +++++++++++++---
>  2 files changed, 26 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
> index dff1d9be7841..bc3678337048 100644
> --- a/drivers/media/v4l2-core/v4l2-subdev.c
> +++ b/drivers/media/v4l2-core/v4l2-subdev.c
> @@ -1693,10 +1693,11 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
>  		}
>
>  		/*
> -		 * V4L2_SUBDEV_ROUTING_NO_STREAM_MIX: Streams on the same pad
> -		 * may not be routed to streams on different pads.
> +		 * V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX: Streams on the same
> +		 * sink pad may not be routed to streams on different source

nit: it was already like this, but as the flag checks for a condition
that is forbidden I would use "Streams on the same sink pad -shall-
not be routed to streams on -a- different source pad"

> +		 * pads.
>  		 */
> -		if (disallow & V4L2_SUBDEV_ROUTING_NO_STREAM_MIX) {
> +		if (disallow & V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX) {
>  			if (remote_pads[route->sink_pad] != U32_MAX &&
>  			    remote_pads[route->sink_pad] != route->source_pad) {
>  				dev_dbg(sd->dev,
> @@ -1705,6 +1706,15 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
>  				goto out;
>  			}
>
> +			remote_pads[route->sink_pad] = route->source_pad;
> +		}
> +
> +		/*
> +		 * V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX: Streams on the same
> +		 * source pad may not be routed to streams on different sink
> +		 * pads.
> +		 */
> +		if (disallow & V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX) {
>  			if (remote_pads[route->source_pad] != U32_MAX &&
>  			    remote_pads[route->source_pad] != route->sink_pad) {
>  				dev_dbg(sd->dev,
> @@ -1713,7 +1723,6 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
>  				goto out;
>  			}
>
> -			remote_pads[route->sink_pad] = route->source_pad;
>  			remote_pads[route->source_pad] = route->sink_pad;
>  		}
>
> diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
> index 17773be4a4ee..a4331e0a5aeb 100644
> --- a/include/media/v4l2-subdev.h
> +++ b/include/media/v4l2-subdev.h
> @@ -1643,19 +1643,29 @@ u64 v4l2_subdev_state_xlate_streams(const struct v4l2_subdev_state *state,
>   * @V4L2_SUBDEV_ROUTING_NO_N_TO_1:
>   *	multiple input streams may not be routed to the same output stream
>   *	(stream merging)
> - * @V4L2_SUBDEV_ROUTING_NO_STREAM_MIX:
> - *	streams on the same pad may not be routed to streams on different pads
> + * @V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX:
> + *	streams on the same sink pad may not be routed to streams on different
> + *	source pads

Same comment on s/may not/shall not/
Up to you, really

> + * @V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX:
> + *	streams on the same source pad may not be routed to streams on different
> + *	sink pads

I would prefer the way it is described in the commit message:

        streams on the same source pad must originate from the same
        sink pad


>   * @V4L2_SUBDEV_ROUTING_ONLY_1_TO_1:
>   *	only non-overlapping 1-to-1 stream routing is allowed (a combination of
>   *	@V4L2_SUBDEV_ROUTING_NO_1_TO_N and @V4L2_SUBDEV_ROUTING_NO_N_TO_1)
> + * @V4L2_SUBDEV_ROUTING_NO_STREAM_MIX:
> + *	streams on the same pad may not be routed to streams on different pads

        streams on a pad shall all be routed to the same opposite pad

All suggestions, take whatever you like the most

Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>

Thanks
  j

>   */
>  enum v4l2_subdev_routing_restriction {
>  	V4L2_SUBDEV_ROUTING_NO_1_TO_N = BIT(0),
>  	V4L2_SUBDEV_ROUTING_NO_N_TO_1 = BIT(1),
> -	V4L2_SUBDEV_ROUTING_NO_STREAM_MIX = BIT(2),
> +	V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX = BIT(2),
> +	V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX = BIT(3),
>  	V4L2_SUBDEV_ROUTING_ONLY_1_TO_1 =
>  		V4L2_SUBDEV_ROUTING_NO_1_TO_N |
>  		V4L2_SUBDEV_ROUTING_NO_N_TO_1,
> +	V4L2_SUBDEV_ROUTING_NO_STREAM_MIX =
> +		V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX |
> +		V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX,
>  };
>
>  /**
> --
> 2.34.1
>
Tomi Valkeinen March 1, 2023, 2:35 p.m. UTC | #2
On 01/03/2023 12:37, Jacopo Mondi wrote:
> Hi Tomi
> 
> On Tue, Feb 28, 2023 at 11:23:45AM +0200, Tomi Valkeinen wrote:
>> V4L2_SUBDEV_ROUTING_NO_STREAM_MIX routing validation flag means that all
>> routes from a sink pad must go to the same source pad and all routes
>> going to the same source pad must originate from the same sink pad.
>>
>> This does not cover all use cases. For example, if a device routes
>> all streams from a single sink pad to any of the source pads, but
>> streams from multiple sink pads can go to the same source pad, the
>> current flag is too restrictive.
>>
>> Split the flag into two parts, V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX
>> and V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX, which add the restriction
>> only on one side of the device. Together they mean the same as
>> V4L2_SUBDEV_ROUTING_NO_STREAM_MIX.
>>
>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
>> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>> ---
>>   drivers/media/v4l2-core/v4l2-subdev.c | 17 +++++++++++++----
>>   include/media/v4l2-subdev.h           | 16 +++++++++++++---
>>   2 files changed, 26 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
>> index dff1d9be7841..bc3678337048 100644
>> --- a/drivers/media/v4l2-core/v4l2-subdev.c
>> +++ b/drivers/media/v4l2-core/v4l2-subdev.c
>> @@ -1693,10 +1693,11 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
>>   		}
>>
>>   		/*
>> -		 * V4L2_SUBDEV_ROUTING_NO_STREAM_MIX: Streams on the same pad
>> -		 * may not be routed to streams on different pads.
>> +		 * V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX: Streams on the same
>> +		 * sink pad may not be routed to streams on different source
> 
> nit: it was already like this, but as the flag checks for a condition
> that is forbidden I would use "Streams on the same sink pad -shall-
> not be routed to streams on -a- different source pad"

I'm fine with that. There were already other flags, so I'll change the 
wording for them too.

>> +		 * pads.
>>   		 */
>> -		if (disallow & V4L2_SUBDEV_ROUTING_NO_STREAM_MIX) {
>> +		if (disallow & V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX) {
>>   			if (remote_pads[route->sink_pad] != U32_MAX &&
>>   			    remote_pads[route->sink_pad] != route->source_pad) {
>>   				dev_dbg(sd->dev,
>> @@ -1705,6 +1706,15 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
>>   				goto out;
>>   			}
>>
>> +			remote_pads[route->sink_pad] = route->source_pad;
>> +		}
>> +
>> +		/*
>> +		 * V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX: Streams on the same
>> +		 * source pad may not be routed to streams on different sink
>> +		 * pads.
>> +		 */
>> +		if (disallow & V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX) {
>>   			if (remote_pads[route->source_pad] != U32_MAX &&
>>   			    remote_pads[route->source_pad] != route->sink_pad) {
>>   				dev_dbg(sd->dev,
>> @@ -1713,7 +1723,6 @@ int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
>>   				goto out;
>>   			}
>>
>> -			remote_pads[route->sink_pad] = route->source_pad;
>>   			remote_pads[route->source_pad] = route->sink_pad;
>>   		}
>>
>> diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
>> index 17773be4a4ee..a4331e0a5aeb 100644
>> --- a/include/media/v4l2-subdev.h
>> +++ b/include/media/v4l2-subdev.h
>> @@ -1643,19 +1643,29 @@ u64 v4l2_subdev_state_xlate_streams(const struct v4l2_subdev_state *state,
>>    * @V4L2_SUBDEV_ROUTING_NO_N_TO_1:
>>    *	multiple input streams may not be routed to the same output stream
>>    *	(stream merging)
>> - * @V4L2_SUBDEV_ROUTING_NO_STREAM_MIX:
>> - *	streams on the same pad may not be routed to streams on different pads
>> + * @V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX:
>> + *	streams on the same sink pad may not be routed to streams on different
>> + *	source pads
> 
> Same comment on s/may not/shall not/
> Up to you, really
> 
>> + * @V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX:
>> + *	streams on the same source pad may not be routed to streams on different
>> + *	sink pads
> 
> I would prefer the way it is described in the commit message:
> 
>          streams on the same source pad must originate from the same
>          sink pad

Hmm, yes... As the flags are negatives (_NO_), I tried to document them 
as negatives too. But perhaps it's clearer to use positive style in the 
docs.

Or how about "all streams on a source pad must originate from a single 
sink pad".

And for the sink side:

"all streams from a sink pad must be routed to a single source pad"

> 
>>    * @V4L2_SUBDEV_ROUTING_ONLY_1_TO_1:
>>    *	only non-overlapping 1-to-1 stream routing is allowed (a combination of
>>    *	@V4L2_SUBDEV_ROUTING_NO_1_TO_N and @V4L2_SUBDEV_ROUTING_NO_N_TO_1)
>> + * @V4L2_SUBDEV_ROUTING_NO_STREAM_MIX:
>> + *	streams on the same pad may not be routed to streams on different pads
> 
>          streams on a pad shall all be routed to the same opposite pad

I think this would be better if it somehow emphasizes that it's both 
ways. But I can't come up with a good idea right now...

  Tomi
diff mbox series

Patch

diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
index dff1d9be7841..bc3678337048 100644
--- a/drivers/media/v4l2-core/v4l2-subdev.c
+++ b/drivers/media/v4l2-core/v4l2-subdev.c
@@ -1693,10 +1693,11 @@  int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
 		}
 
 		/*
-		 * V4L2_SUBDEV_ROUTING_NO_STREAM_MIX: Streams on the same pad
-		 * may not be routed to streams on different pads.
+		 * V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX: Streams on the same
+		 * sink pad may not be routed to streams on different source
+		 * pads.
 		 */
-		if (disallow & V4L2_SUBDEV_ROUTING_NO_STREAM_MIX) {
+		if (disallow & V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX) {
 			if (remote_pads[route->sink_pad] != U32_MAX &&
 			    remote_pads[route->sink_pad] != route->source_pad) {
 				dev_dbg(sd->dev,
@@ -1705,6 +1706,15 @@  int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
 				goto out;
 			}
 
+			remote_pads[route->sink_pad] = route->source_pad;
+		}
+
+		/*
+		 * V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX: Streams on the same
+		 * source pad may not be routed to streams on different sink
+		 * pads.
+		 */
+		if (disallow & V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX) {
 			if (remote_pads[route->source_pad] != U32_MAX &&
 			    remote_pads[route->source_pad] != route->sink_pad) {
 				dev_dbg(sd->dev,
@@ -1713,7 +1723,6 @@  int v4l2_subdev_routing_validate(struct v4l2_subdev *sd,
 				goto out;
 			}
 
-			remote_pads[route->sink_pad] = route->source_pad;
 			remote_pads[route->source_pad] = route->sink_pad;
 		}
 
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index 17773be4a4ee..a4331e0a5aeb 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -1643,19 +1643,29 @@  u64 v4l2_subdev_state_xlate_streams(const struct v4l2_subdev_state *state,
  * @V4L2_SUBDEV_ROUTING_NO_N_TO_1:
  *	multiple input streams may not be routed to the same output stream
  *	(stream merging)
- * @V4L2_SUBDEV_ROUTING_NO_STREAM_MIX:
- *	streams on the same pad may not be routed to streams on different pads
+ * @V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX:
+ *	streams on the same sink pad may not be routed to streams on different
+ *	source pads
+ * @V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX:
+ *	streams on the same source pad may not be routed to streams on different
+ *	sink pads
  * @V4L2_SUBDEV_ROUTING_ONLY_1_TO_1:
  *	only non-overlapping 1-to-1 stream routing is allowed (a combination of
  *	@V4L2_SUBDEV_ROUTING_NO_1_TO_N and @V4L2_SUBDEV_ROUTING_NO_N_TO_1)
+ * @V4L2_SUBDEV_ROUTING_NO_STREAM_MIX:
+ *	streams on the same pad may not be routed to streams on different pads
  */
 enum v4l2_subdev_routing_restriction {
 	V4L2_SUBDEV_ROUTING_NO_1_TO_N = BIT(0),
 	V4L2_SUBDEV_ROUTING_NO_N_TO_1 = BIT(1),
-	V4L2_SUBDEV_ROUTING_NO_STREAM_MIX = BIT(2),
+	V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX = BIT(2),
+	V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX = BIT(3),
 	V4L2_SUBDEV_ROUTING_ONLY_1_TO_1 =
 		V4L2_SUBDEV_ROUTING_NO_1_TO_N |
 		V4L2_SUBDEV_ROUTING_NO_N_TO_1,
+	V4L2_SUBDEV_ROUTING_NO_STREAM_MIX =
+		V4L2_SUBDEV_ROUTING_NO_SINK_STREAM_MIX |
+		V4L2_SUBDEV_ROUTING_NO_SOURCE_STREAM_MIX,
 };
 
 /**