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 Workerto_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