diff mbox series

[RFC,4/4] media: v4l: ctrl: Add V4L2_CID_CONFIG_MODEL control

Message ID 20241011075535.588140-5-sakari.ailus@linux.intel.com
State New
Headers show
Series Sub-device configuration models | expand

Commit Message

Sakari Ailus Oct. 11, 2024, 7:55 a.m. UTC
Add the V4L2_CID_CONFIG_MODEL control for the configuration model.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
 .../userspace-api/media/v4l/ext-ctrls-image-process.rst      | 4 ++++
 .../userspace-api/media/v4l/subdev-config-model.rst          | 2 ++
 drivers/media/v4l2-core/v4l2-ctrls-defs.c                    | 5 +++++
 include/uapi/linux/v4l2-controls.h                           | 3 +++
 4 files changed, 14 insertions(+)

Comments

Sakari Ailus Nov. 13, 2024, 7:37 a.m. UTC | #1
Hi Laurent,

On Tue, Oct 22, 2024 at 10:42:53PM +0300, Laurent Pinchart wrote:
> > index 8ec801998f5f..d4ae921b69c8 100644
> > --- a/Documentation/userspace-api/media/v4l/subdev-config-model.rst
> > +++ b/Documentation/userspace-api/media/v4l/subdev-config-model.rst
> > @@ -1,5 +1,7 @@
> >  .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later
> >  
> > +.. _media_subdev_config_model:
> > +
> 
> This could be moved to 3/4.

Yes, that's where it belongs indeed.

> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Thanks!
Hans Verkuil Nov. 13, 2024, 8:03 a.m. UTC | #2
On 11/10/2024 09:55, Sakari Ailus wrote:
> Add the V4L2_CID_CONFIG_MODEL control for the configuration model.
> 
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
>  .../userspace-api/media/v4l/ext-ctrls-image-process.rst      | 4 ++++
>  .../userspace-api/media/v4l/subdev-config-model.rst          | 2 ++
>  drivers/media/v4l2-core/v4l2-ctrls-defs.c                    | 5 +++++
>  include/uapi/linux/v4l2-controls.h                           | 3 +++
>  4 files changed, 14 insertions(+)
> 
> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> index 27803dca8d3e..928e8e3eed7f 100644
> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> @@ -55,3 +55,7 @@ Image Process Control IDs
>      control value divided by e.g. 0x100, meaning that to get no
>      digital gain the control value needs to be 0x100. The no-gain
>      configuration is also typically the default.
> +
> +``V4L2_CID_CONFIG_MODEL (bitmask)``
> +    Which configuration models the sub-device supports. Please see
> +    :ref:`media_subdev_config_model`.

First of all the naming is confusing: since this is specific to sub-devices, it
should at least have 'SUBDEV' in the name. I first thought this reported the
model name or something like that, I'm not sure "configuration model" is a very
good name.

Secondly, is this supposed to be valid for all subdevices? Only for sensors?
Would an HDMI-to-CSI bridge qualify?

Thirdly, only V4L2_CID_CONFIG_MODEL_COMMON_RAW is defined right now. What other
models do you have in mind? What models can co-exist (since this is a bitmask)?

Finally, why choose a control for this? Should this perhaps be better done as
a field in media_entity_desc/media_v2_entity?

Regards,

	Hans

> diff --git a/Documentation/userspace-api/media/v4l/subdev-config-model.rst b/Documentation/userspace-api/media/v4l/subdev-config-model.rst
> index 8ec801998f5f..d4ae921b69c8 100644
> --- a/Documentation/userspace-api/media/v4l/subdev-config-model.rst
> +++ b/Documentation/userspace-api/media/v4l/subdev-config-model.rst
> @@ -1,5 +1,7 @@
>  .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later
>  
> +.. _media_subdev_config_model:
> +
>  Sub-device configuration models
>  ===============================
>  
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> index 6b9188a4a220..378657a52cd5 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> @@ -1167,6 +1167,7 @@ const char *v4l2_ctrl_get_name(u32 id)
>  	case V4L2_CID_TEST_PATTERN:		return "Test Pattern";
>  	case V4L2_CID_DEINTERLACING_MODE:	return "Deinterlacing Mode";
>  	case V4L2_CID_DIGITAL_GAIN:		return "Digital Gain";
> +	case V4L2_CID_CONFIG_MODEL:		return "Sub-device configuration model";

Start each word capitalized, just like all the other strings.

>  
>  	/* DV controls */
>  	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
> @@ -1489,6 +1490,10 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
>  	case V4L2_CID_DV_RX_POWER_PRESENT:
>  		*type = V4L2_CTRL_TYPE_BITMASK;
>  		break;
> +	case V4L2_CID_CONFIG_MODEL:
> +		*flags |= V4L2_CTRL_FLAG_READ_ONLY;
> +		*type = V4L2_CTRL_TYPE_BITMASK;
> +		break;
>  	case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
>  	case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
>  		*type = V4L2_CTRL_TYPE_INTEGER;
> diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
> index 974fd254e573..0152240229ab 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -1225,6 +1225,9 @@ enum v4l2_jpeg_chroma_subsampling {
>  #define V4L2_CID_TEST_PATTERN			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 3)
>  #define V4L2_CID_DEINTERLACING_MODE		(V4L2_CID_IMAGE_PROC_CLASS_BASE + 4)
>  #define V4L2_CID_DIGITAL_GAIN			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 5)
> +#define V4L2_CID_CONFIG_MODEL			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 6)
> +
> +#define V4L2_CID_CONFIG_MODEL_COMMON_RAW	(1ULL << 0)
>  
>  /*  DV-class control IDs defined by V4L2 */
>  #define V4L2_CID_DV_CLASS_BASE			(V4L2_CTRL_CLASS_DV | 0x900)
Sakari Ailus Nov. 13, 2024, 8:35 a.m. UTC | #3
Hi Hans,

Thank you for the review.

On Wed, Nov 13, 2024 at 09:03:57AM +0100, Hans Verkuil wrote:
> On 11/10/2024 09:55, Sakari Ailus wrote:
> > Add the V4L2_CID_CONFIG_MODEL control for the configuration model.
> > 
> > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > ---
> >  .../userspace-api/media/v4l/ext-ctrls-image-process.rst      | 4 ++++
> >  .../userspace-api/media/v4l/subdev-config-model.rst          | 2 ++
> >  drivers/media/v4l2-core/v4l2-ctrls-defs.c                    | 5 +++++
> >  include/uapi/linux/v4l2-controls.h                           | 3 +++
> >  4 files changed, 14 insertions(+)
> > 
> > diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> > index 27803dca8d3e..928e8e3eed7f 100644
> > --- a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> > +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> > @@ -55,3 +55,7 @@ Image Process Control IDs
> >      control value divided by e.g. 0x100, meaning that to get no
> >      digital gain the control value needs to be 0x100. The no-gain
> >      configuration is also typically the default.
> > +
> > +``V4L2_CID_CONFIG_MODEL (bitmask)``
> > +    Which configuration models the sub-device supports. Please see
> > +    :ref:`media_subdev_config_model`.
> 
> First of all the naming is confusing: since this is specific to sub-devices, it
> should at least have 'SUBDEV' in the name. I first thought this reported the

I don't object in principle, but the reason why I didn't add that in v1 was
the names would get quite long. Maybe V4L2_CID_SUBDEV_CFG_MODEL?

> model name or something like that, I'm not sure "configuration model" is a very
> good name.

Feel free to propose a different one. :-)

> 
> Secondly, is this supposed to be valid for all subdevices? Only for sensors?
> Would an HDMI-to-CSI bridge qualify?

I think it could but we should have a use case for it. In other words,
something we can't reasonably express using existing means. In this case
it's a number of interfaces and device type specific behaviour (see the 3rd
patch).

> 
> Thirdly, only V4L2_CID_CONFIG_MODEL_COMMON_RAW is defined right now. What other
> models do you have in mind? What models can co-exist (since this is a bitmask)?

We could have different raw camera models if needed. I don't have any
planned right now, though.

> 
> Finally, why choose a control for this? Should this perhaps be better done as
> a field in media_entity_desc/media_v2_entity?

I don't think it's a great fit. This is largely about V4L2 (to some but
lesser extent about MC) and we traditionally have avoided MC -> V4L2
dependencies.
Hans Verkuil Nov. 13, 2024, 12:26 p.m. UTC | #4
On 11/13/24 09:35, Sakari Ailus wrote:
> Hi Hans,
> 
> Thank you for the review.
> 
> On Wed, Nov 13, 2024 at 09:03:57AM +0100, Hans Verkuil wrote:
>> On 11/10/2024 09:55, Sakari Ailus wrote:
>>> Add the V4L2_CID_CONFIG_MODEL control for the configuration model.
>>>
>>> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
>>> ---
>>>  .../userspace-api/media/v4l/ext-ctrls-image-process.rst      | 4 ++++
>>>  .../userspace-api/media/v4l/subdev-config-model.rst          | 2 ++
>>>  drivers/media/v4l2-core/v4l2-ctrls-defs.c                    | 5 +++++
>>>  include/uapi/linux/v4l2-controls.h                           | 3 +++
>>>  4 files changed, 14 insertions(+)
>>>
>>> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
>>> index 27803dca8d3e..928e8e3eed7f 100644
>>> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
>>> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
>>> @@ -55,3 +55,7 @@ Image Process Control IDs
>>>      control value divided by e.g. 0x100, meaning that to get no
>>>      digital gain the control value needs to be 0x100. The no-gain
>>>      configuration is also typically the default.
>>> +
>>> +``V4L2_CID_CONFIG_MODEL (bitmask)``
>>> +    Which configuration models the sub-device supports. Please see
>>> +    :ref:`media_subdev_config_model`.
>>
>> First of all the naming is confusing: since this is specific to sub-devices, it
>> should at least have 'SUBDEV' in the name. I first thought this reported the
> 
> I don't object in principle, but the reason why I didn't add that in v1 was
> the names would get quite long. Maybe V4L2_CID_SUBDEV_CFG_MODEL?
> 
>> model name or something like that, I'm not sure "configuration model" is a very
>> good name.
> 
> Feel free to propose a different one. :-)

I would, if I understood what you intend to achieve :-)

> 
>>
>> Secondly, is this supposed to be valid for all subdevices? Only for sensors?
>> Would an HDMI-to-CSI bridge qualify?
> 
> I think it could but we should have a use case for it. In other words,
> something we can't reasonably express using existing means. In this case
> it's a number of interfaces and device type specific behaviour (see the 3rd
> patch).
> 
>>
>> Thirdly, only V4L2_CID_CONFIG_MODEL_COMMON_RAW is defined right now. What other
>> models do you have in mind? What models can co-exist (since this is a bitmask)?
> 
> We could have different raw camera models if needed. I don't have any
> planned right now, though.
> 
>>
>> Finally, why choose a control for this? Should this perhaps be better done as
>> a field in media_entity_desc/media_v2_entity?
> 
> I don't think it's a great fit. This is largely about V4L2 (to some but
> lesser extent about MC) and we traditionally have avoided MC -> V4L2
> dependencies.
> 

It sounds a bit like you want to report what Mauro calls a 'Profile'.

But I would expect the control to be an enum and not a bitmask, since I
would expect a device to fit just a single configuration mode, and not
multiple modes.

Also, V4L2_CID_CONFIG_MODEL_COMMON_RAW applies only to sensors, right?
So this should be V4L2_CID_CONFIG_MODEL_SENSOR_COMMON_RAW. But what is
common about it and what is raw about it?

Isn't it the case that pretty much all sensor drivers fall into this
category?

The only reason I see for this is if there are actually other configuration
modes going to be added in the near future.

What I am missing in this RFC is a high-level view of why it is needed and
how it is going to be used.

Perhaps I missed a discussion on linux-media?

Regards,

	Hans
Laurent Pinchart Nov. 18, 2024, 2:40 a.m. UTC | #5
Hello,

On Wed, Nov 13, 2024 at 01:26:26PM +0100, Hans Verkuil wrote:
> On 11/13/24 09:35, Sakari Ailus wrote:
> > On Wed, Nov 13, 2024 at 09:03:57AM +0100, Hans Verkuil wrote:
> >> On 11/10/2024 09:55, Sakari Ailus wrote:
> >>> Add the V4L2_CID_CONFIG_MODEL control for the configuration model.
> >>>
> >>> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> >>> ---
> >>>  .../userspace-api/media/v4l/ext-ctrls-image-process.rst      | 4 ++++
> >>>  .../userspace-api/media/v4l/subdev-config-model.rst          | 2 ++
> >>>  drivers/media/v4l2-core/v4l2-ctrls-defs.c                    | 5 +++++
> >>>  include/uapi/linux/v4l2-controls.h                           | 3 +++
> >>>  4 files changed, 14 insertions(+)
> >>>
> >>> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> >>> index 27803dca8d3e..928e8e3eed7f 100644
> >>> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> >>> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
> >>> @@ -55,3 +55,7 @@ Image Process Control IDs
> >>>      control value divided by e.g. 0x100, meaning that to get no
> >>>      digital gain the control value needs to be 0x100. The no-gain
> >>>      configuration is also typically the default.
> >>> +
> >>> +``V4L2_CID_CONFIG_MODEL (bitmask)``
> >>> +    Which configuration models the sub-device supports. Please see
> >>> +    :ref:`media_subdev_config_model`.
> >>
> >> First of all the naming is confusing: since this is specific to sub-devices, it
> >> should at least have 'SUBDEV' in the name. I first thought this reported the
> > 
> > I don't object in principle, but the reason why I didn't add that in v1 was
> > the names would get quite long. Maybe V4L2_CID_SUBDEV_CFG_MODEL?
> > 
> >> model name or something like that, I'm not sure "configuration model" is a very
> >> good name.
> > 
> > Feel free to propose a different one. :-)
> 
> I would, if I understood what you intend to achieve :-)

I'll try to rephrase what Sakari wrote in the patches.

The V4L2 specification defines a subdev API that exposes three type of
configuration elements: formats, selection rectangles and controls. The
specification contains generic information about how those configuration
elements behave, but not precisly how they apply to particular hardware
features. We leave some leeway to drivers to decide how to map selection
rectangles to device features, as long as they comply with the V4L2
specification. This is needed, as hardware features differ between
devices, so it's the driver's responsibility to handle this mapping.

Unfortunately, this lack of clearly defined mapping in the specification
has led to different drivers mapping the same hardware features to
different API elements, or implementing the API elements with slightly
different behaviours. Furthermore, many drivers have implemented
selection rectangles in ways that do not comply with the V4L2
specification. All of this makes userspace development difficult.

We can't define precisely how all configuration elements apply to
hardware features in a way that applies to all devices, as devices
differ widely. We can however develop such precise definitions for
classes of similar devices. In order to develop generic userspace code,
we then need a way for subdevs to indicate which class they belong to.
This is what the configuration model control does. The configuration
model tells userspace which section of the V4L2 specification defines
the precise behaviour of the device.

One example of how drivers implement features in different ways is
skipping and binning. Some sensor drivers use selection rectangles,
other just formats.

> >> Secondly, is this supposed to be valid for all subdevices? Only for sensors?
> >> Would an HDMI-to-CSI bridge qualify?
> > 
> > I think it could but we should have a use case for it. In other words,
> > something we can't reasonably express using existing means. In this case
> > it's a number of interfaces and device type specific behaviour (see the 3rd
> > patch).

The control can be used by any type of device, as long as someone
documents a corresponding configuration model.

> >> Thirdly, only V4L2_CID_CONFIG_MODEL_COMMON_RAW is defined right now. What other
> >> models do you have in mind? What models can co-exist (since this is a bitmask)?
> > 
> > We could have different raw camera models if needed. I don't have any
> > planned right now, though.

CCS would be another model, although I'm not sure if any other driver
would implement that model. Still, even if used by the CCS driver only,
I think it would make sense to define a CCS model.

> >> Finally, why choose a control for this? Should this perhaps be better done as
> >> a field in media_entity_desc/media_v2_entity?
> > 
> > I don't think it's a great fit. This is largely about V4L2 (to some but
> > lesser extent about MC) and we traditionally have avoided MC -> V4L2
> > dependencies.
> 
> It sounds a bit like you want to report what Mauro calls a 'Profile'.

There are similarities but it's not the same concept. What Mauro named
"profile" was more about which ioctls were implemented by the device,
and less about their detailed behaviour.

> But I would expect the control to be an enum and not a bitmask, since I
> would expect a device to fit just a single configuration mode, and not
> multiple modes.

I would have used an enum as well. In theory we could define models that
cover non-overlaping parts of the device features, and a device could
then implement multiple models, but I'm not sure that would happen.

> Also, V4L2_CID_CONFIG_MODEL_COMMON_RAW applies only to sensors, right?
> So this should be V4L2_CID_CONFIG_MODEL_SENSOR_COMMON_RAW. But what is
> common about it and what is raw about it?

Yes, mentioning "SENSOR" in the name makes sense.

> Isn't it the case that pretty much all sensor drivers fall into this
> category?

"raw" is by opposition to YUV sensors. YUV sensors (a.k.a. "smart
sensors") require very different configuration parameters compared to
raw sensors, so the model we're standardizing for raw sensors isn't
applicable.

> The only reason I see for this is if there are actually other configuration
> modes going to be added in the near future.

Even before we add a second model, this is useful for userspace. We have
many camera sensor drivers that implement the V4L2 API in different (and
sometimes non-compliant) ways. Knowing that a sensor is compatible with
the new model we're defining will be useful for libcamera.

> What I am missing in this RFC is a high-level view of why it is needed and
> how it is going to be used.
> 
> Perhaps I missed a discussion on linux-media?
diff mbox series

Patch

diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
index 27803dca8d3e..928e8e3eed7f 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst
@@ -55,3 +55,7 @@  Image Process Control IDs
     control value divided by e.g. 0x100, meaning that to get no
     digital gain the control value needs to be 0x100. The no-gain
     configuration is also typically the default.
+
+``V4L2_CID_CONFIG_MODEL (bitmask)``
+    Which configuration models the sub-device supports. Please see
+    :ref:`media_subdev_config_model`.
diff --git a/Documentation/userspace-api/media/v4l/subdev-config-model.rst b/Documentation/userspace-api/media/v4l/subdev-config-model.rst
index 8ec801998f5f..d4ae921b69c8 100644
--- a/Documentation/userspace-api/media/v4l/subdev-config-model.rst
+++ b/Documentation/userspace-api/media/v4l/subdev-config-model.rst
@@ -1,5 +1,7 @@ 
 .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later
 
+.. _media_subdev_config_model:
+
 Sub-device configuration models
 ===============================
 
diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
index 6b9188a4a220..378657a52cd5 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
@@ -1167,6 +1167,7 @@  const char *v4l2_ctrl_get_name(u32 id)
 	case V4L2_CID_TEST_PATTERN:		return "Test Pattern";
 	case V4L2_CID_DEINTERLACING_MODE:	return "Deinterlacing Mode";
 	case V4L2_CID_DIGITAL_GAIN:		return "Digital Gain";
+	case V4L2_CID_CONFIG_MODEL:		return "Sub-device configuration model";
 
 	/* DV controls */
 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
@@ -1489,6 +1490,10 @@  void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
 	case V4L2_CID_DV_RX_POWER_PRESENT:
 		*type = V4L2_CTRL_TYPE_BITMASK;
 		break;
+	case V4L2_CID_CONFIG_MODEL:
+		*flags |= V4L2_CTRL_FLAG_READ_ONLY;
+		*type = V4L2_CTRL_TYPE_BITMASK;
+		break;
 	case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
 	case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
 		*type = V4L2_CTRL_TYPE_INTEGER;
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 974fd254e573..0152240229ab 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -1225,6 +1225,9 @@  enum v4l2_jpeg_chroma_subsampling {
 #define V4L2_CID_TEST_PATTERN			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 3)
 #define V4L2_CID_DEINTERLACING_MODE		(V4L2_CID_IMAGE_PROC_CLASS_BASE + 4)
 #define V4L2_CID_DIGITAL_GAIN			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 5)
+#define V4L2_CID_CONFIG_MODEL			(V4L2_CID_IMAGE_PROC_CLASS_BASE + 6)
+
+#define V4L2_CID_CONFIG_MODEL_COMMON_RAW	(1ULL << 0)
 
 /*  DV-class control IDs defined by V4L2 */
 #define V4L2_CID_DV_CLASS_BASE			(V4L2_CTRL_CLASS_DV | 0x900)