xref: /aosp_15_r20/external/virtio-media/driver/virtio_media.h (revision 1b4853f54772485c5dd4001ae33a7a958bcc97a1)
1*1b4853f5SAndroid Build Coastguard Worker // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0+
2*1b4853f5SAndroid Build Coastguard Worker 
3*1b4853f5SAndroid Build Coastguard Worker /*
4*1b4853f5SAndroid Build Coastguard Worker  * Virtio-media structures & functions declarations.
5*1b4853f5SAndroid Build Coastguard Worker  *
6*1b4853f5SAndroid Build Coastguard Worker  * Copyright (c) 2023-2024 Google LLC.
7*1b4853f5SAndroid Build Coastguard Worker  */
8*1b4853f5SAndroid Build Coastguard Worker 
9*1b4853f5SAndroid Build Coastguard Worker #ifndef __VIRTIO_MEDIA_H
10*1b4853f5SAndroid Build Coastguard Worker #define __VIRTIO_MEDIA_H
11*1b4853f5SAndroid Build Coastguard Worker 
12*1b4853f5SAndroid Build Coastguard Worker #include <linux/virtio_config.h>
13*1b4853f5SAndroid Build Coastguard Worker #include <media/v4l2-device.h>
14*1b4853f5SAndroid Build Coastguard Worker 
15*1b4853f5SAndroid Build Coastguard Worker #include "protocol.h"
16*1b4853f5SAndroid Build Coastguard Worker 
17*1b4853f5SAndroid Build Coastguard Worker #define DESC_CHAIN_MAX_LEN SG_MAX_SINGLE_ALLOC
18*1b4853f5SAndroid Build Coastguard Worker 
19*1b4853f5SAndroid Build Coastguard Worker #define VIRTIO_MEDIA_DEFAULT_DRIVER_NAME "virtio_media"
20*1b4853f5SAndroid Build Coastguard Worker 
21*1b4853f5SAndroid Build Coastguard Worker extern char *driver_name;
22*1b4853f5SAndroid Build Coastguard Worker 
23*1b4853f5SAndroid Build Coastguard Worker /**
24*1b4853f5SAndroid Build Coastguard Worker  * Virtio-media device.
25*1b4853f5SAndroid Build Coastguard Worker  */
26*1b4853f5SAndroid Build Coastguard Worker struct virtio_media {
27*1b4853f5SAndroid Build Coastguard Worker 	struct v4l2_device v4l2_dev;
28*1b4853f5SAndroid Build Coastguard Worker 	struct video_device video_dev;
29*1b4853f5SAndroid Build Coastguard Worker 
30*1b4853f5SAndroid Build Coastguard Worker 	struct virtio_device *virtio_dev;
31*1b4853f5SAndroid Build Coastguard Worker 	struct virtqueue *commandq;
32*1b4853f5SAndroid Build Coastguard Worker 	struct virtqueue *eventq;
33*1b4853f5SAndroid Build Coastguard Worker 	struct work_struct eventq_work;
34*1b4853f5SAndroid Build Coastguard Worker 
35*1b4853f5SAndroid Build Coastguard Worker 	/* Region into which MMAP buffers are mapped by the host. */
36*1b4853f5SAndroid Build Coastguard Worker 	struct virtio_shm_region mmap_region;
37*1b4853f5SAndroid Build Coastguard Worker 
38*1b4853f5SAndroid Build Coastguard Worker 	/* Buffer for event descriptors. */
39*1b4853f5SAndroid Build Coastguard Worker 	void *event_buffer;
40*1b4853f5SAndroid Build Coastguard Worker 
41*1b4853f5SAndroid Build Coastguard Worker 	/* List of active decoding sessions */
42*1b4853f5SAndroid Build Coastguard Worker 	struct list_head sessions;
43*1b4853f5SAndroid Build Coastguard Worker 	/* Protects `sessions` */
44*1b4853f5SAndroid Build Coastguard Worker 	struct mutex sessions_lock;
45*1b4853f5SAndroid Build Coastguard Worker 
46*1b4853f5SAndroid Build Coastguard Worker 	/* Make sure we don't have two threads processing events at the same time */
47*1b4853f5SAndroid Build Coastguard Worker 	struct mutex events_process_lock;
48*1b4853f5SAndroid Build Coastguard Worker 
49*1b4853f5SAndroid Build Coastguard Worker 	union {
50*1b4853f5SAndroid Build Coastguard Worker 		struct virtio_media_cmd_open open;
51*1b4853f5SAndroid Build Coastguard Worker 		struct virtio_media_cmd_munmap munmap;
52*1b4853f5SAndroid Build Coastguard Worker 	} cmd;
53*1b4853f5SAndroid Build Coastguard Worker 
54*1b4853f5SAndroid Build Coastguard Worker 	union {
55*1b4853f5SAndroid Build Coastguard Worker 		struct virtio_media_resp_open open;
56*1b4853f5SAndroid Build Coastguard Worker 		struct virtio_media_resp_munmap munmap;
57*1b4853f5SAndroid Build Coastguard Worker 	} resp;
58*1b4853f5SAndroid Build Coastguard Worker 
59*1b4853f5SAndroid Build Coastguard Worker 	/* Protects `cmd_buf` and `resp_buf` */
60*1b4853f5SAndroid Build Coastguard Worker 	struct mutex bufs_lock;
61*1b4853f5SAndroid Build Coastguard Worker 
62*1b4853f5SAndroid Build Coastguard Worker 	/* Used to serialize all virtio commands */
63*1b4853f5SAndroid Build Coastguard Worker 	struct mutex vlock;
64*1b4853f5SAndroid Build Coastguard Worker 
65*1b4853f5SAndroid Build Coastguard Worker 	/* Waitqueue for host responses on the command queue */
66*1b4853f5SAndroid Build Coastguard Worker 	wait_queue_head_t wq;
67*1b4853f5SAndroid Build Coastguard Worker };
68*1b4853f5SAndroid Build Coastguard Worker 
69*1b4853f5SAndroid Build Coastguard Worker static inline struct virtio_media *
to_virtio_media(struct video_device * video_dev)70*1b4853f5SAndroid Build Coastguard Worker to_virtio_media(struct video_device *video_dev)
71*1b4853f5SAndroid Build Coastguard Worker {
72*1b4853f5SAndroid Build Coastguard Worker 	return container_of(video_dev, struct virtio_media, video_dev);
73*1b4853f5SAndroid Build Coastguard Worker }
74*1b4853f5SAndroid Build Coastguard Worker 
75*1b4853f5SAndroid Build Coastguard Worker /* virtio_media_driver.c */
76*1b4853f5SAndroid Build Coastguard Worker 
77*1b4853f5SAndroid Build Coastguard Worker int virtio_media_send_command(struct virtio_media *vv, struct scatterlist **sgs,
78*1b4853f5SAndroid Build Coastguard Worker 			      const size_t out_sgs, const size_t in_sgs,
79*1b4853f5SAndroid Build Coastguard Worker 			      size_t minimum_resp_len, size_t *resp_len);
80*1b4853f5SAndroid Build Coastguard Worker void virtio_media_process_events(struct virtio_media *vv);
81*1b4853f5SAndroid Build Coastguard Worker 
82*1b4853f5SAndroid Build Coastguard Worker /* virtio_media_ioctls.c */
83*1b4853f5SAndroid Build Coastguard Worker 
84*1b4853f5SAndroid Build Coastguard Worker long virtio_media_device_ioctl(struct file *file, unsigned int cmd,
85*1b4853f5SAndroid Build Coastguard Worker 			       unsigned long arg);
86*1b4853f5SAndroid Build Coastguard Worker extern const struct v4l2_ioctl_ops virtio_media_ioctl_ops;
87*1b4853f5SAndroid Build Coastguard Worker 
88*1b4853f5SAndroid Build Coastguard Worker #endif // __VIRTIO_MEDIA_H
89