On Tue, Aug 25, 2026 at 11:47 AM Dorinda Bassey <[email protected]> wrote: > > Hi Brian, > > I've been backporting the virtio-media v7 patches for libkrunfw and hit > some failures on aarch64 when running make on the headers. The v7 > patches has UAPI headers issues in include/uapi/linux/virtio_media.h: > 1. It's using `u32`/`u64` instead of `__u32`/`__u64` > UAPI headers exposed to userspace must use the double-underscore > types. > > 2. It's missing `#include <linux/types.h>` > Without this, `__u32`/`__u64` are undefined when the header is included > from userspace. > > causing errors like: > ./usr/include/linux/virtio_media.h:27:9: error: unknown type name ‘u32’ > 27 | u32 cmd; > | ^~~ > > See patterns: > > > +struct virtio_media_cmd_header { > > + u32 cmd; > > + u32 __reserved; > > +}; > > here > > > +struct virtio_media_sg_entry { > > + u64 start; > > + u32 len; > > + u32 __reserved; > > +}; > > here and more.
Thanks very much for raising this. I've prepped the corrections in v8. > > I've applied these fixes locally for the backport. These would fail > on any system that runs UAPI header validation during build too. Is there a specific command to run the uapi header validation? I did some searching and only found the ``scripts/check-uapi.sh`` script, which didn't raise any issues when I ran it. Could you share the command you're using to validate the UAPI headers? > BR, > Dorinda. > > > On Wed, Aug 19, 2026 at 12:54 PM Dorinda Bassey <[email protected]> wrote: > > > > > From: Alexandre Courbot <[email protected]> > > > This patch adds a minimum viable virtio-media driver that binds to the > > > virtio device and registers a V4L2 device and a video device, but lacks > > > any actual functionality. > > > It adds the UAPI header defining the protocol, internal driver headers, > > > Kconfig and Makefile entries, and MAINTAINERS entry. Many of the structs > > > in the protocol add reserved bits. These are present to ensure 64-bit > > > alignment. They are not intended to be used as reserved expansion for > > > the protocol in the future, so more reserved space is not required. > > > Signed-off-by: Alexandre Courbot <[email protected]> > > > Assisted-by: Antigravity:gemini-3.5-flash > > > Co-developed-by: Brian Daniels <[email protected]> > > > Signed-off-by: Brian Daniels <[email protected]> > > > > > > Reviewed-by: Dorinda Bassey <[email protected]> > > Tested-by: Dorinda Bassey <[email protected]> > > > > Thanks! > > > > > > On Thu, Aug 13, 2026 at 8:00 PM Brian Daniels <[email protected]> > > wrote: > > > > > > From: Alexandre Courbot <[email protected]> > > > > > > This patch adds a minimum viable virtio-media driver that binds to the > > > virtio device and registers a V4L2 device and a video device, but lacks > > > any actual functionality. > > > > > > It adds the UAPI header defining the protocol, internal driver headers, > > > Kconfig and Makefile entries, and MAINTAINERS entry. Many of the structs > > > in the protocol add reserved bits. These are present to ensure 64-bit > > > alignment. They are not intended to be used as reserved expansion for > > > the protocol in the future, so more reserved space is not required. > > > > > > Signed-off-by: Alexandre Courbot <[email protected]> > > > Assisted-by: Antigravity:gemini-3.5-flash > > > Co-developed-by: Brian Daniels <[email protected]> > > > Signed-off-by: Brian Daniels <[email protected]> > > > --- > > > MAINTAINERS | 8 + > > > drivers/media/Kconfig | 13 + > > > drivers/media/Makefile | 2 + > > > drivers/media/virtio/Makefile | 7 + > > > drivers/media/virtio/virtio_media.h | 95 +++++++ > > > drivers/media/virtio/virtio_media_driver.c | 146 +++++++++++ > > > include/uapi/linux/virtio_media.h | 287 +++++++++++++++++++++ > > > 7 files changed, 558 insertions(+) > > > create mode 100644 drivers/media/virtio/Makefile > > > create mode 100644 drivers/media/virtio/virtio_media.h > > > create mode 100644 drivers/media/virtio/virtio_media_driver.c > > > create mode 100644 include/uapi/linux/virtio_media.h > > > > > > diff --git a/MAINTAINERS b/MAINTAINERS > > > index 3785b8c1d..c3b5c5eb6 100644 > > > --- a/MAINTAINERS > > > +++ b/MAINTAINERS > > > @@ -28573,6 +28573,7 @@ F: Documentation/devicetree/bindings/virtio/ > > > F: Documentation/driver-api/virtio/ > > > F: drivers/block/virtio_blk.c > > > F: drivers/crypto/virtio/ > > > +F: drivers/media/virtio/ > > > F: drivers/vdpa/ > > > F: drivers/virtio/ > > > F: include/linux/vdpa.h > > > @@ -28685,6 +28686,13 @@ S: Maintained > > > F: drivers/iommu/virtio-iommu.c > > > F: include/uapi/linux/virtio_iommu.h > > > > > > +VIRTIO MEDIA DRIVER > > > +M: Brian Daniels <[email protected]> > > > +L: [email protected] > > > +S: Maintained > > > +F: drivers/media/virtio/ > > > +F: include/uapi/linux/virtio_media.h > > > + > > > VIRTIO MEM DRIVER > > > M: David Hildenbrand <[email protected]> > > > L: [email protected] > > > diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig > > > index 6abc9302c..ce7d088e7 100644 > > > --- a/drivers/media/Kconfig > > > +++ b/drivers/media/Kconfig > > > @@ -136,6 +136,19 @@ config MEDIA_PLATFORM_SUPPORT > > > > > > Say Y when you want to be able to see such devices. > > > > > > +config MEDIA_VIRTIO > > > + tristate "Virtio-media Driver" > > > + depends on VIRTIO && VIDEO_DEV && 64BIT && (X86 || > > > CPU_LITTLE_ENDIAN) > > > + select VIDEOBUF2_CORE > > > + select VIDEOBUF2_MEMOPS > > > + help > > > + Enables the virtio-media driver. > > > + > > > + This driver is used to virtualize media devices such as cameras > > > or > > > + decoders from a host into a guest using the V4L2 protocol. > > > + > > > + If unsure, say N. > > > + > > > config MEDIA_TEST_SUPPORT > > > bool > > > prompt "Test drivers" if MEDIA_SUPPORT_FILTER > > > diff --git a/drivers/media/Makefile b/drivers/media/Makefile > > > index 20fac24e4..357e786cc 100644 > > > --- a/drivers/media/Makefile > > > +++ b/drivers/media/Makefile > > > @@ -23,6 +23,8 @@ obj-$(CONFIG_DVB_CORE) += dvb-core/ > > > # There are both core and drivers at RC subtree - merge before drivers > > > obj-y += rc/ > > > > > > +obj-$(CONFIG_MEDIA_VIRTIO) += virtio/ > > > + > > > obj-$(CONFIG_CEC_CORE) += cec/ > > > > > > # > > > diff --git a/drivers/media/virtio/Makefile b/drivers/media/virtio/Makefile > > > new file mode 100644 > > > index 000000000..09d9834da > > > --- /dev/null > > > +++ b/drivers/media/virtio/Makefile > > > @@ -0,0 +1,7 @@ > > > +# SPDX-License-Identifier: GPL-2.0 > > > +# > > > +# Makefile for the virtio-media device driver. > > > + > > > +virtio-media-objs := virtio_media_driver.o > > > + > > > +obj-$(CONFIG_MEDIA_VIRTIO) += virtio-media.o > > > diff --git a/drivers/media/virtio/virtio_media.h > > > b/drivers/media/virtio/virtio_media.h > > > new file mode 100644 > > > index 000000000..7acb2b842 > > > --- /dev/null > > > +++ b/drivers/media/virtio/virtio_media.h > > > @@ -0,0 +1,95 @@ > > > +/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0+ */ > > > + > > > +/* > > > + * Virtio-media structures & functions declarations. > > > + * > > > + * Copyright (c) 2024-2026 Google LLC. > > > + */ > > > + > > > +#ifndef __VIRTIO_MEDIA_H > > > +#define __VIRTIO_MEDIA_H > > > + > > > +#include <linux/virtio_config.h> > > > +#include <media/v4l2-device.h> > > > + > > > +#include "uapi/linux/virtio_media.h" > > > + > > > +#define DESC_CHAIN_MAX_LEN SG_MAX_SINGLE_ALLOC > > > + > > > +#define VIRTIO_MEDIA_DEFAULT_DRIVER_NAME "virtio-media" > > > + > > > +/** > > > + * struct virtio_media - Virtio-media device. > > > + * @v4l2_dev: v4l2_device for the media device. > > > + * @video_dev: video_device for the media device. > > > + * @virtio_dev: virtio device for the media device. > > > + * @commandq: virtio command queue. > > > + * @eventq: virtio event queue. > > > + * @eventq_work: work to run when events are received on @eventq. > > > + * @mmap_region: region into which MMAP buffers are mapped by the host. > > > + * @event_buffer: buffer for event descriptors. > > > + * @sessions: list of active sessions on the device. > > > + * @sessions_lock: protects @sessions and &struct > > > virtio_media_session.list. > > > + * @events_lock: prevents concurrent processing of events. > > > + * @cmd: union of the device commands ``open`` and ``munmap``. The other > > > + * commands are handled by &struct virtio_media_session > > > + * @resp: union of responses to device commands ``open`` and ``munmap``. > > > The > > > + * other responses are handled by &struct virtio_media_session > > > + * @vlock: serializes access to the command queue. > > > + * @wq: waitqueue for host responses on the command queue. > > > + */ > > > +struct virtio_media { > > > + struct v4l2_device v4l2_dev; > > > + struct video_device video_dev; > > > + > > > + struct virtio_device *virtio_dev; > > > + struct virtqueue *commandq; > > > + struct virtqueue *eventq; > > > + struct work_struct eventq_work; > > > + > > > + struct virtio_shm_region mmap_region; > > > + > > > + void *event_buffer; > > > + > > > + struct list_head sessions; > > > + struct mutex sessions_lock; /* protects sessions list */ > > > + > > > + struct mutex events_lock; /* prevents concurrent event processing > > > */ > > > + > > > + __dma_from_device_group_begin(); > > > + union { > > > + struct virtio_media_cmd_open open; > > > + struct virtio_media_cmd_munmap munmap; > > > + } cmd; > > > + > > > + union { > > > + struct virtio_media_resp_open open; > > > + struct virtio_media_resp_munmap munmap; > > > + } resp; > > > + __dma_from_device_group_end(); > > > + > > > + struct mutex vlock; /* serializes command queue access */ > > > + wait_queue_head_t wq; > > > +}; > > > + > > > +static inline struct virtio_media * > > > +to_virtio_media(struct video_device *video_dev) > > > +{ > > > + return container_of(video_dev, struct virtio_media, video_dev); > > > +} > > > + > > > +/* virtio_media_driver.c */ > > > + > > > +int virtio_media_send_command(struct virtio_media *vv, struct > > > scatterlist **sgs, > > > + const size_t out_sgs, const size_t in_sgs, > > > + size_t minimum_resp_len, size_t *resp_len); > > > +void virtio_media_process_events(struct virtio_media *vv); > > > + > > > +/* virtio_media_ioctls.c */ > > > + > > > +long virtio_media_device_ioctl(struct file *file, unsigned int cmd, > > > + unsigned long arg); > > > +extern const struct v4l2_ioctl_ops virtio_media_ioctl_ops; > > > + > > > +#endif // __VIRTIO_MEDIA_H > > > + > > > diff --git a/drivers/media/virtio/virtio_media_driver.c > > > b/drivers/media/virtio/virtio_media_driver.c > > > new file mode 100644 > > > index 000000000..25f2ceaa6 > > > --- /dev/null > > > +++ b/drivers/media/virtio/virtio_media_driver.c > > > @@ -0,0 +1,146 @@ > > > +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0+ > > > + > > > +/* > > > + * Virtio-media driver. > > > + * > > > + * Copyright (c) 2024-2026 Google LLC. > > > + */ > > > + > > > +#include <linux/device.h> > > > +#include <linux/dev_printk.h> > > > +#include <linux/mutex.h> > > > +#include <linux/types.h> > > > +#include <linux/module.h> > > > +#include <linux/virtio.h> > > > +#include <linux/virtio_config.h> > > > +#include <linux/virtio_ids.h> > > > + > > > +#include <media/v4l2-dev.h> > > > +#include <media/v4l2-device.h> > > > + > > > +#include "uapi/linux/virtio_media.h" > > > +#include "virtio_media.h" > > > + > > > +static void commandq_callback(struct virtqueue *vq) > > > +{ > > > +} > > > + > > > +static void eventq_callback(struct virtqueue *vq) > > > +{ > > > +} > > > + > > > +static const struct v4l2_file_operations virtio_media_fops = { > > > + .owner = THIS_MODULE, > > > + .open = v4l2_fh_open, > > > + .release = v4l2_fh_release, > > > +}; > > > + > > > +static int virtio_media_probe(struct virtio_device *virtio_dev) > > > +{ > > > + struct device *dev = &virtio_dev->dev; > > > + struct virtqueue *vqs[2]; > > > + static struct virtqueue_info vq_info[2] = { > > > + { > > > + .name = "command", > > > + .callback = commandq_callback, > > > + }, > > > + { > > > + .name = "event", > > > + .callback = eventq_callback, > > > + }, > > > + }; > > > + struct virtio_media *vv; > > > + struct video_device *vd; > > > + int ret; > > > + > > > + vv = devm_kzalloc(dev, sizeof(*vv), GFP_KERNEL); > > > + if (!vv) > > > + return -ENOMEM; > > > + > > > + INIT_LIST_HEAD(&vv->sessions); > > > + mutex_init(&vv->sessions_lock); > > > + mutex_init(&vv->events_lock); > > > + mutex_init(&vv->vlock); > > > + > > > + vv->virtio_dev = virtio_dev; > > > + virtio_dev->priv = vv; > > > + > > > + init_waitqueue_head(&vv->wq); > > > + > > > + ret = v4l2_device_register(dev, &vv->v4l2_dev); > > > + if (ret) > > > + return ret; > > > + > > > + ret = virtio_find_vqs(virtio_dev, 2, vqs, vq_info, NULL); > > > + if (ret) > > > + goto err_find_vqs; > > > + > > > + vv->commandq = vqs[0]; > > > + vv->eventq = vqs[1]; > > > + > > > + vd = &vv->video_dev; > > > + vd->v4l2_dev = &vv->v4l2_dev; > > > + vd->vfl_type = VFL_TYPE_VIDEO; > > > + vd->fops = &virtio_media_fops; > > > + vd->release = video_device_release_empty; > > > + strscpy(vd->name, "virtio-media", sizeof(vd->name)); > > > + > > > + video_set_drvdata(vd, vv); > > > + > > > + vd->device_caps = virtio_cread32(virtio_dev, 0); > > > + if (vd->device_caps & (V4L2_CAP_VIDEO_M2M | > > > V4L2_CAP_VIDEO_M2M_MPLANE)) > > > + vd->vfl_dir = VFL_DIR_M2M; > > > + else if (vd->device_caps & > > > + (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_MPLANE)) > > > + vd->vfl_dir = VFL_DIR_TX; > > > + else > > > + vd->vfl_dir = VFL_DIR_RX; > > > + > > > + ret = video_register_device(vd, virtio_cread32(virtio_dev, 4), 0); > > > + if (ret) > > > + goto err_register_device; > > > + > > > + virtio_device_ready(virtio_dev); > > > + > > > + return 0; > > > + > > > +err_register_device: > > > + virtio_dev->config->del_vqs(virtio_dev); > > > +err_find_vqs: > > > + v4l2_device_unregister(&vv->v4l2_dev); > > > + return ret; > > > +} > > > + > > > +static void virtio_media_remove(struct virtio_device *virtio_dev) > > > +{ > > > + struct virtio_media *vv = virtio_dev->priv; > > > + > > > + virtio_reset_device(virtio_dev); > > > + v4l2_device_unregister(&vv->v4l2_dev); > > > + virtio_dev->config->del_vqs(virtio_dev); > > > + video_unregister_device(&vv->video_dev); > > > +} > > > + > > > +static struct virtio_device_id id_table[] = { > > > + { VIRTIO_ID_MEDIA, VIRTIO_DEV_ANY_ID }, > > > + { 0 }, > > > +}; > > > + > > > +static unsigned int features[] = {}; > > > + > > > +static struct virtio_driver virtio_media_driver = { > > > + .feature_table = features, > > > + .feature_table_size = ARRAY_SIZE(features), > > > + .driver.name = VIRTIO_MEDIA_DEFAULT_DRIVER_NAME, > > > + .driver.owner = THIS_MODULE, > > > + .id_table = id_table, > > > + .probe = virtio_media_probe, > > > + .remove = virtio_media_remove, > > > +}; > > > + > > > +module_virtio_driver(virtio_media_driver); > > > + > > > +MODULE_DEVICE_TABLE(virtio, id_table); > > > +MODULE_DESCRIPTION("virtio media driver"); > > > +MODULE_AUTHOR("Alexandre Courbot <[email protected]>"); > > > +MODULE_LICENSE("Dual BSD/GPL"); > > > diff --git a/include/uapi/linux/virtio_media.h > > > b/include/uapi/linux/virtio_media.h > > > new file mode 100644 > > > index 000000000..280fbbe94 > > > --- /dev/null > > > +++ b/include/uapi/linux/virtio_media.h > > > @@ -0,0 +1,287 @@ > > > +/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR > > > BSD-3-Clause) */ > > > + > > > +/* > > > + * Definitions of virtio-media protocol structures. > > > + * > > > + * Copyright (c) 2024-2026 Google LLC. > > > + */ > > > + > > > +#ifndef __VIRTIO_MEDIA_PROTOCOL_H > > > +#define __VIRTIO_MEDIA_PROTOCOL_H > > > + > > > +#include <linux/videodev2.h> > > > + > > > +/* > > > + * Virtio protocol definition. > > > + */ > > > + > > > +/** > > > + * struct virtio_media_cmd_header - Header for all virtio-media commands. > > > + * @cmd: one of VIRTIO_MEDIA_CMD_*. > > > + * @__reserved: must be set to zero by the driver. > > > + * > > > + * This header starts all commands from the driver to the device on the > > > + * commandq. > > > + */ > > > +struct virtio_media_cmd_header { > > > + u32 cmd; > > > + u32 __reserved; > > > +}; > > > + > > > +/** > > > + * struct virtio_media_resp_header - Header for all virtio-media > > > responses. > > > + * @status: 0 if the command was successful, or one of the standard > > > Linux error > > > + * codes as a positive integer. > > > + * @__reserved: must be set to zero by the device. > > > + * > > > + * This header starts all responses from the device to the driver on the > > > + * commandq. > > > + */ > > > +struct virtio_media_resp_header { > > > + u32 status; > > > + u32 __reserved; > > > +}; > > > + > > > +/** > > > + * VIRTIO_MEDIA_CMD_OPEN - Command for creating a new session. > > > + * > > > + * This is the equivalent of calling ``open`` on a V4L2 device node. Upon > > > + * success, a session id is returned which can be used to perform other > > > + * commands on the session, notably ioctls. > > > + */ > > > +#define VIRTIO_MEDIA_CMD_OPEN 1 > > > + > > > +/** > > > + * struct virtio_media_cmd_open - Driver command for > > > VIRTIO_MEDIA_CMD_OPEN. > > > + * @hdr: header with cmd member set to VIRTIO_MEDIA_CMD_OPEN. > > > + */ > > > +struct virtio_media_cmd_open { > > > + struct virtio_media_cmd_header hdr; > > > +}; > > > + > > > +/** > > > + * struct virtio_media_resp_open - Device response for > > > VIRTIO_MEDIA_CMD_OPEN. > > > + * @hdr: header containing the status of the command. > > > + * @session_id: if &struct virtio_media_resp_header.status == 0, > > > contains the > > > + * id of the newly created session. > > > + * @__reserved: must be set to zero by the device. > > > + */ > > > +struct virtio_media_resp_open { > > > + struct virtio_media_resp_header hdr; > > > + u32 session_id; > > > + u32 __reserved; > > > +}; > > > + > > > +/** > > > + * VIRTIO_MEDIA_CMD_CLOSE - Command for closing an active session. > > > + * > > > + * This is the equivalent of calling ``close`` on a previously opened > > > V4L2 > > > + * session. All resources associated with this session will be freed and > > > the > > > + * session ID shall not be used again after queueing this command. > > > + * > > > + * This command does not require a response from the device. > > > + */ > > > +#define VIRTIO_MEDIA_CMD_CLOSE 2 > > > + > > > +/** > > > + * struct virtio_media_cmd_close - Driver command for > > > VIRTIO_MEDIA_CMD_CLOSE. > > > + * @hdr: header with cmd member set to VIRTIO_MEDIA_CMD_CLOSE. > > > + * @session_id: id of the session to close. > > > + * @__reserved: must be set to zero by the driver. > > > + */ > > > +struct virtio_media_cmd_close { > > > + struct virtio_media_cmd_header hdr; > > > + u32 session_id; > > > + u32 __reserved; > > > +}; > > > + > > > +/** > > > + * VIRTIO_MEDIA_CMD_IOCTL - Driver command for executing an ioctl. > > > + * > > > + * This command asks the device to run one of the ``VIDIOC_*`` ioctls on > > > the > > > + * active session. > > > + * > > > + * The code of the ioctl is extracted from the VIDIOC_* definitions in > > > + * ``videodev2.h``, and consists of the second argument of the ``_IO*`` > > > macro. > > > + * > > > + * Each ioctl has a payload, which is defined by the third argument of > > > the > > > + * ``_IO*`` macro defining it. It can be writable by the driver > > > (``_IOW``), the > > > + * device (``_IOR``), or both (``_IOWR``). > > > + * > > > + * If an ioctl is writable by the driver, it must be followed by a > > > + * driver-writable descriptor containing the payload. > > > + * > > > + * If an ioctl is writable by the device, it must be followed by a > > > + * device-writable descriptor of the size of the payload that the device > > > will > > > + * write into. > > > + * > > > + */ > > > +#define VIRTIO_MEDIA_CMD_IOCTL 3 > > > + > > > +/** > > > + * struct virtio_media_cmd_ioctl - Driver command for > > > VIRTIO_MEDIA_CMD_IOCTL. > > > + * @hdr: header with cmd member set to VIRTIO_MEDIA_CMD_IOCTL. > > > + * @session_id: id of the session to run the ioctl on. > > > + * @code: code of the ioctl to run. > > > + */ > > > +struct virtio_media_cmd_ioctl { > > > + struct virtio_media_cmd_header hdr; > > > + u32 session_id; > > > + u32 code; > > > +}; > > > + > > > +/** > > > + * struct virtio_media_resp_ioctl - Device response for > > > VIRTIO_MEDIA_CMD_IOCTL. > > > + * @hdr: header containing the status of the ioctl. > > > + */ > > > +struct virtio_media_resp_ioctl { > > > + struct virtio_media_resp_header hdr; > > > +}; > > > + > > > +/** > > > + * struct virtio_media_sg_entry - Description of part of a scattered > > > guest > > > + * memory. > > > + * @start: start guest address of the memory segment. > > > + * @len: length of this memory segment. > > > + * @__reserved: must be set to zero by the driver. > > > + */ > > > +struct virtio_media_sg_entry { > > > + u64 start; > > > + u32 len; > > > + u32 __reserved; > > > +}; > > > + > > > +/** > > > + * VIRTIO_MEDIA_MMAP_FLAG_RW - Bit position of the > > > VIRTIO_MEDIA_MMAP_FLAG_RW > > > + * flag. > > > + */ > > > +#define VIRTIO_MEDIA_MMAP_FLAG_RW 0 > > > + > > > +/** > > > + * VIRTIO_MEDIA_CMD_MMAP - Command for mapping a MMAP buffer into the > > > driver's > > > + * address space. > > > + */ > > > +#define VIRTIO_MEDIA_CMD_MMAP 4 > > > + > > > +/** > > > + * struct virtio_media_cmd_mmap - Driver command for > > > VIRTIO_MEDIA_CMD_MMAP. > > > + * @hdr: header with cmd member set to VIRTIO_MEDIA_CMD_MMAP. > > > + * @session_id: ID of the session we are mapping for. > > > + * @flags: combination of VIRTIO_MEDIA_MMAP_FLAG_*. > > > + * @offset: mem_offset field of the plane to map, as returned by > > > + * VIDIOC_QUERYBUF. > > > + */ > > > +struct virtio_media_cmd_mmap { > > > + struct virtio_media_cmd_header hdr; > > > + u32 session_id; > > > + u32 flags; > > > + u32 offset; > > > +}; > > > + > > > +/** > > > + * struct virtio_media_resp_mmap - Device response for > > > VIRTIO_MEDIA_CMD_MMAP. > > > + * @hdr: header containing the status of the command. > > > + * @driver_addr: offset into SHM region 0 of the start of the mapping. > > > + * @len: length of the mapping. > > > + */ > > > +struct virtio_media_resp_mmap { > > > + struct virtio_media_resp_header hdr; > > > + u64 driver_addr; > > > + u64 len; > > > +}; > > > + > > > +/** > > > + * VIRTIO_MEDIA_CMD_MUNMAP - Unmap a MMAP buffer previously mapped using > > > + * VIRTIO_MEDIA_CMD_MMAP. > > > + */ > > > +#define VIRTIO_MEDIA_CMD_MUNMAP 5 > > > + > > > +/** > > > + * struct virtio_media_cmd_munmap - Driver command for > > > VIRTIO_MEDIA_CMD_MUNMAP. > > > + * @hdr: header with cmd member set to VIRTIO_MEDIA_CMD_MUNMAP. > > > + * @driver_addr: offset into SHM region 0 at which the buffer has been > > > + * previously mapped. > > > + */ > > > +struct virtio_media_cmd_munmap { > > > + struct virtio_media_cmd_header hdr; > > > + u64 driver_addr; > > > +}; > > > + > > > +/** > > > + * struct virtio_media_resp_munmap - Device response for > > > + * VIRTIO_MEDIA_CMD_MUNMAP. > > > + * @hdr: header containing the status of the command. > > > + */ > > > +struct virtio_media_resp_munmap { > > > + struct virtio_media_resp_header hdr; > > > +}; > > > + > > > +/* The values for these events are set by the virtio-media > > > specification. */ > > > +#define VIRTIO_MEDIA_EVT_ERROR 0 > > > +#define VIRTIO_MEDIA_EVT_DQBUF 1 > > > +#define VIRTIO_MEDIA_EVT_EVENT 2 > > > + > > > +/** > > > + * struct virtio_media_event_header - Header for events on the eventq. > > > + * @event: one of VIRTIO_MEDIA_EVT_* > > > + * @session_id: ID of the session the event applies to. > > > + */ > > > +struct virtio_media_event_header { > > > + u32 event; > > > + u32 session_id; > > > +}; > > > + > > > +/** > > > + * struct virtio_media_event_error - Unrecoverable device-side error. > > > + * @hdr: header for the event. > > > + * @errno: error code describing the kind of error that occurred. > > > + * @__reserved: must be set to zero by the device. > > > + * > > > + * Upon receiving this event, the session mentioned in the header is > > > considered > > > + * corrupted and closed. > > > + */ > > > +struct virtio_media_event_error { > > > + struct virtio_media_event_header hdr; > > > + u32 errno; > > > + u32 __reserved; > > > +}; > > > + > > > +/* This is set to VIDEO_MAX_PLANES defined in > > > include/uapi/linux/videodev2.h. > > > + * It is renamed here to match the constant that is defined in the > > > virtio-media > > > + * specification. > > > + */ > > > +#define VIRTIO_MEDIA_MAX_PLANES VIDEO_MAX_PLANES > > > + > > > +/** > > > + * struct virtio_media_event_dqbuf - Dequeued buffer event. > > > + * @hdr: header for the event. > > > + * @buffer: &struct v4l2_buffer describing the buffer that has been > > > dequeued. > > > + * @planes: plane information for the dequeued buffer. > > > + * > > > + * This event is used to signal that a buffer is not being used anymore > > > by the > > > + * device and is returned to the driver. > > > + */ > > > +struct virtio_media_event_dqbuf { > > > + struct virtio_media_event_header hdr; > > > + struct v4l2_buffer buffer; > > > + struct v4l2_plane planes[VIRTIO_MEDIA_MAX_PLANES]; > > > +}; > > > + > > > +/** > > > + * struct virtio_media_event_event - V4L2 event. > > > + * @hdr: header for the event. > > > + * @event: description of the event that occurred. > > > + * > > > + * This event signals that a V4L2 event has been emitted for a session. > > > + */ > > > +struct virtio_media_event_event { > > > + struct virtio_media_event_header hdr; > > > + struct v4l2_event event; > > > +}; > > > + > > > +/* Maximum size of an event. We will queue descriptors of this size on > > > the > > > + * eventq. > > > + */ > > > +#define VIRTIO_MEDIA_EVENT_MAX_SIZE sizeof(struct > > > virtio_media_event_dqbuf) > > > + > > > +#endif // __VIRTIO_MEDIA_PROTOCOL_H > > > -- > > > 2.55.0.737.g08866a6d13-goog > > > >

