History

media: v4l2-subdev: Add new ioctl for client capabilities

Add new ioctls to set and get subdev client capabilities. Client in this context means the userspace application which opens the subdev device node. The client capabilities are stored in the file handle of the opened subdev device node, and the client must set the capabilities for each opened subdev. For now we only add a single flag, V4L2_SUBDEV_CLIENT_CAP_STREAMS, which indicates that the client is streams-aware. The reason for needing such a flag is as follows: Many structs passed via ioctls, e.g. struct v4l2_subdev_format, contain reserved fields (usually a single array field). These reserved fields can be used to extend the ioctl. The userspace is required to zero the reserved fields. We recently added a new 'stream' field to many of these structs, and the space for the field was taken from these reserved arrays. The assumption was that these new 'stream' fields are always initialized to zero if the userspace does not use them. This was a mistake, as, as mentioned above, the userspace is required to zero the _reserved_ fields. In other words, there is no requirement to zero this new stream field, and if the userspace doesn't use the field (which is the case for all userspace applications at the moment), the field may contain random data. This shows that the way the reserved fields are defined in v4l2 is, in my opinion, somewhat broken, but there is nothing to do about that. To fix this issue we need a way for the userspace to tell the kernel that the userspace has indeed set the 'stream' field, and it's fine for the kernel to access it. This is achieved with the new ioctl, which the userspace should usually use right after opening the subdev device node.

Tomi Valkeinen committed 3 years ago

Commit f57fa291 parent 5fe42305 files · +169 −0Browse files

Showing the changes to include/uapi (1 of 5 files). Show all

Unified · Split

include/uapi/linux/v4l2-subdev.h+21−0
@@ -233,6 +233,24 @@ struct v4l2_subdev_routing { · 232 unmodified lines
233233 __u32 reserved[6];
234234 };
235235
236+/*
237+ * The client is aware of streams. Setting this flag enables the use of 'stream'
238+ * fields (referring to the stream number) with various ioctls. If this is not
239+ * set (which is the default), the 'stream' fields will be forced to 0 by the
240+ * kernel.
241+ */
242+ #define V4L2_SUBDEV_CLIENT_CAP_STREAMS (1U << 0)
243+
244+/**
245+ * struct v4l2_subdev_client_capability - Capabilities of the client accessing
246+ * the subdev
247+ *
248+ * @capabilities: A bitmask of V4L2_SUBDEV_CLIENT_CAP_* flags.
249+ */
250+struct v4l2_subdev_client_capability {
251+ __u64 capabilities;
252+};
253+
236254 /* Backwards compatibility define --- to be removed */
237255 #define v4l2_subdev_edid v4l2_edid
238256
@@ -250,6 +268,9 @@ struct v4l2_subdev_routing { · 11 unmodified lines
250268 #define VIDIOC_SUBDEV_S_SELECTION _IOWR('V', 62, struct v4l2_subdev_selection)
251269 #define VIDIOC_SUBDEV_G_ROUTING _IOWR('V', 38, struct v4l2_subdev_routing)
252270 #define VIDIOC_SUBDEV_S_ROUTING _IOWR('V', 39, struct v4l2_subdev_routing)
271+#define VIDIOC_SUBDEV_G_CLIENT_CAP _IOR('V', 101, struct v4l2_subdev_client_capability)
272+#define VIDIOC_SUBDEV_S_CLIENT_CAP _IOWR('V', 102, struct v4l2_subdev_client_capability)
273+
253274 /* The following ioctls are identical to the ioctls in videodev2.h */
254275 #define VIDIOC_SUBDEV_G_STD _IOR('V', 23, v4l2_std_id)
255276 #define VIDIOC_SUBDEV_S_STD _IOW('V', 24, v4l2_std_id)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t