1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /* Common header for virtio video driver.
4 * Copyright 2020 OpenSynergy GmbH.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 #ifndef _VIRTIO_VIDEO_H
21 #define _VIRTIO_VIDEO_H
23 #include <linux/virtio.h>
24 #include <linux/virtio_ids.h>
25 #include <linux/virtio_config.h>
26 #include <linux/virtio_video.h>
27 #include <linux/list.h>
28 #include <linux/completion.h>
29 #include <media/v4l2-device.h>
30 #include <media/v4l2-mem2mem.h>
31 #include <media/v4l2-ctrls.h>
32 #include <media/videobuf2-dma-sg.h>
33 #include <media/videobuf2-dma-contig.h>
35 #define DRIVER_NAME "virtio-video"
37 #define VIRTIO_ID_VIDEO_DEC 31
38 #define VIRTIO_ID_VIDEO_ENC 30
39 #define VIRTIO_ID_VIDEO_CAM 100
41 #define MIN_BUFS_MIN 0
42 #define MIN_BUFS_MAX VIDEO_MAX_FRAME
43 #define MIN_BUFS_STEP 1
44 #define MIN_BUFS_DEF 1
46 struct video_format_frame {
47 struct virtio_video_format_frame frame;
48 struct virtio_video_format_range *frame_rates;
52 struct list_head formats_list_entry;
53 struct virtio_video_format_desc desc;
54 struct video_format_frame *frames;
57 struct video_control_fmt_data {
65 struct video_control_format {
66 struct list_head controls_list_entry;
68 struct video_control_fmt_data *profile;
69 struct video_control_fmt_data *level;
72 struct video_plane_format {
77 struct video_format_info {
78 uint32_t fourcc_format;
81 uint32_t frame_height;
84 struct virtio_video_crop crop;
86 struct video_plane_format plane_format[VIRTIO_VIDEO_MAX_PLANES];
89 struct video_control_info {
95 struct virtio_video_device;
96 struct virtio_video_vbuffer;
98 typedef void (*virtio_video_resp_cb)(struct virtio_video_device *vvd,
99 struct virtio_video_vbuffer *vbuf);
101 struct virtio_video_vbuffer {
113 virtio_video_resp_cb resp_cb;
116 struct completion reclaimed;
118 struct list_head pending_list_entry;
121 struct virtio_video_cmd_queue {
122 struct virtqueue *vq;
125 wait_queue_head_t reclaim_queue;
128 struct virtio_video_event_queue {
129 struct virtqueue *vq;
131 struct work_struct work;
134 enum video_stream_state {
135 STREAM_STATE_IDLE = 0,
137 STREAM_STATE_DYNAMIC_RES_CHANGE, /* specific to decoder */
138 STREAM_STATE_RUNNING,
140 STREAM_STATE_STOPPED,
141 STREAM_STATE_RESET, /* specific to encoder */
145 struct virtio_video_stream {
148 struct video_device *video_dev;
150 struct mutex vq_mutex;
151 struct v4l2_ctrl_handler ctrl_handler;
152 struct video_format_info in_info;
153 struct video_format_info out_info;
154 struct video_control_info control;
155 struct video_format_frame *current_frame;
158 struct virtio_video_device {
159 struct virtio_device *vdev;
160 struct virtio_video_cmd_queue commandq;
161 struct virtio_video_event_queue eventq;
162 wait_queue_head_t wq;
164 struct kmem_cache *vbufs;
165 struct virtio_video_event *evts;
167 struct idr resource_idr;
168 spinlock_t resource_idr_lock;
169 struct idr stream_idr;
170 spinlock_t stream_idr_lock;
172 uint32_t max_caps_len;
173 uint32_t max_resp_len;
176 bool supp_non_contig;
181 struct v4l2_device v4l2_dev;
182 struct video_device video_dev;
183 struct mutex video_dev_mutex;
186 struct v4l2_m2m_dev *m2m_dev;
188 /* non-m2m queue (camera) */
189 struct vb2_queue vb2_output_queue;
190 struct list_head pending_buf_list;
191 spinlock_t pending_buf_list_lock;
194 struct list_head pending_vbuf_list;
196 /* device_busy - to block multiple opens for non-m2m (camera) */
199 /* vid_dev_nr - try register starting at video device number */
202 /* is_mplane_cam - camera has multiplanar capabilities (default true) */
205 /* VIRTIO_VIDEO_FUNC_ */
208 uint32_t num_input_fmts;
209 struct list_head input_fmt_list;
211 uint32_t num_output_fmts;
212 struct list_head output_fmt_list;
214 struct list_head controls_fmt_list;
215 struct virtio_video_device_ops *ops;
218 struct virtio_video_device_ops {
219 int (*init_ctrls)(struct virtio_video_stream *stream);
220 int (*init_queues)(void *priv, struct vb2_queue *src_vq,
221 struct vb2_queue *dst_vq);
222 void* (*get_fmt_list)(struct virtio_video_device *vvd);
225 struct virtio_video_buffer {
226 struct v4l2_m2m_buffer v4l2_m2m_vb;
227 uint32_t resource_id;
229 struct list_head list;
233 virtio_video_gfp_flags(struct virtio_video_device *vvd)
235 if (vvd->use_dma_mem)
241 static inline const struct vb2_mem_ops *
242 virtio_video_mem_ops(struct virtio_video_device *vvd)
244 if (vvd->supp_non_contig)
245 return &vb2_dma_sg_memops;
247 return &vb2_dma_contig_memops;
250 static inline struct virtio_video_device *
251 to_virtio_vd(struct video_device *video_dev)
253 return container_of(video_dev, struct virtio_video_device,
257 static inline struct virtio_video_stream *file2stream(struct file *file)
259 return container_of(file->private_data, struct virtio_video_stream, fh);
262 static inline struct virtio_video_stream *ctrl2stream(struct v4l2_ctrl *ctrl)
264 return container_of(ctrl->handler, struct virtio_video_stream,
268 static inline struct virtio_video_buffer *to_virtio_vb(struct vb2_buffer *vb)
270 struct vb2_v4l2_buffer *v4l2_vb = to_vb2_v4l2_buffer(vb);
272 return container_of(v4l2_vb, struct virtio_video_buffer,
276 static inline enum virtio_video_queue_type
277 to_virtio_queue_type(enum v4l2_buf_type type)
279 if (V4L2_TYPE_IS_OUTPUT(type))
280 return VIRTIO_VIDEO_QUEUE_TYPE_INPUT;
282 return VIRTIO_VIDEO_QUEUE_TYPE_OUTPUT;
285 static inline bool within_range(uint32_t min, uint32_t val, uint32_t max)
287 return ((min <= val) && (val <= max));
290 static inline bool needs_alignment(uint32_t val, uint32_t a)
292 if (a == 0 || IS_ALIGNED(val, a))
298 enum video_stream_state virtio_video_state(struct virtio_video_stream *stream);
299 void virtio_video_state_reset(struct virtio_video_stream *stream);
300 void virtio_video_state_update(struct virtio_video_stream *stream,
301 enum video_stream_state new_state);
303 int virtio_video_alloc_vbufs(struct virtio_video_device *vvd);
304 void virtio_video_free_vbufs(struct virtio_video_device *vvd);
305 int virtio_video_alloc_events(struct virtio_video_device *vvd);
307 int virtio_video_device_init(struct virtio_video_device *vvd);
308 void virtio_video_device_deinit(struct virtio_video_device *vvd);
310 int virtio_video_dec_init(struct virtio_video_device *vvd);
311 int virtio_video_enc_init(struct virtio_video_device *vvd);
312 int virtio_video_cam_init(struct virtio_video_device *vvd);
314 void virtio_video_stream_id_get(struct virtio_video_device *vvd,
315 struct virtio_video_stream *stream,
317 void virtio_video_stream_id_put(struct virtio_video_device *vvd, uint32_t id);
318 void virtio_video_resource_id_get(struct virtio_video_device *vvd,
320 void virtio_video_resource_id_put(struct virtio_video_device *vvd, uint32_t id);
322 int virtio_video_cmd_stream_create(struct virtio_video_device *vvd,
324 enum virtio_video_format format,
326 int virtio_video_cmd_stream_destroy(struct virtio_video_device *vvd,
328 int virtio_video_cmd_stream_drain(struct virtio_video_device *vvd,
330 int virtio_video_cmd_resource_attach(struct virtio_video_device *vvd,
331 uint32_t stream_id, uint32_t resource_id,
332 enum virtio_video_queue_type queue_type,
333 void *buf, size_t buf_size);
334 int virtio_video_cmd_resource_queue(struct virtio_video_device *vvd,
336 struct virtio_video_buffer *virtio_vb,
337 uint32_t data_size[], uint8_t num_data_size,
338 enum virtio_video_queue_type queue_type);
339 int virtio_video_cmd_queue_detach_resources(struct virtio_video_device *vvd,
340 struct virtio_video_stream *stream,
341 enum virtio_video_queue_type queue_type);
342 int virtio_video_cmd_queue_clear(struct virtio_video_device *vvd,
343 struct virtio_video_stream *stream,
344 enum virtio_video_queue_type queue_type);
345 int virtio_video_cmd_query_capability(struct virtio_video_device *vvd,
346 void *resp_buf, size_t resp_size,
347 enum virtio_video_queue_type queue_type);
348 int virtio_video_query_control_profile(struct virtio_video_device *vvd,
349 void *resp_buf, size_t resp_size,
350 enum virtio_video_format format);
351 int virtio_video_query_control_level(struct virtio_video_device *vvd,
352 void *resp_buf, size_t resp_size,
353 enum virtio_video_format format);
354 int virtio_video_cmd_set_params(struct virtio_video_device *vvd,
355 struct virtio_video_stream *stream,
356 struct video_format_info *format_info,
357 enum virtio_video_queue_type queue_type);
358 int virtio_video_cmd_get_params(struct virtio_video_device *vvd,
359 struct virtio_video_stream *stream,
360 enum virtio_video_queue_type queue_type);
361 int virtio_video_cmd_set_control(struct virtio_video_device *vvd,
363 enum virtio_video_control_type control,
365 int virtio_video_cmd_get_control(struct virtio_video_device *vvd,
366 struct virtio_video_stream *stream,
367 enum virtio_video_control_type control);
369 void virtio_video_queue_res_chg_event(struct virtio_video_stream *stream);
370 void virtio_video_queue_eos_event(struct virtio_video_stream *stream);
371 void virtio_video_handle_error(struct virtio_video_stream *stream);
372 int virtio_video_queue_release_buffers(struct virtio_video_stream *stream,
373 enum virtio_video_queue_type queue_type);
375 void virtio_video_cmd_cb(struct virtqueue *vq);
376 void virtio_video_event_cb(struct virtqueue *vq);
377 void virtio_video_process_events(struct work_struct *work);
379 void virtio_video_buf_done(struct virtio_video_buffer *virtio_vb,
380 uint32_t flags, uint64_t timestamp,
381 uint32_t data_sizes[]);
382 int virtio_video_buf_plane_init(uint32_t idx,uint32_t resource_id,
383 struct virtio_video_device *vvd,
384 struct virtio_video_stream *stream,
385 struct vb2_buffer *vb);
386 int virtio_video_queue_setup(struct vb2_queue *vq, unsigned int *num_buffers,
387 unsigned int *num_planes, unsigned int sizes[],
388 struct device *alloc_devs[]);
389 int virtio_video_buf_init(struct vb2_buffer *vb);
390 void virtio_video_buf_cleanup(struct vb2_buffer *vb);
391 void virtio_video_buf_queue(struct vb2_buffer *vb);
392 int virtio_video_qbuf(struct file *file, void *priv,
393 struct v4l2_buffer *buf);
394 int virtio_video_dqbuf(struct file *file, void *priv,
395 struct v4l2_buffer *buf);
396 int virtio_video_querycap(struct file *file, void *fh,
397 struct v4l2_capability *cap);
398 int virtio_video_enum_framesizes(struct file *file, void *fh,
399 struct v4l2_frmsizeenum *f);
400 int virtio_video_enum_framemintervals(struct file *file, void *fh,
401 struct v4l2_frmivalenum *f);
402 int virtio_video_g_fmt(struct file *file, void *fh, struct v4l2_format *f);
403 int virtio_video_s_fmt(struct file *file, void *fh, struct v4l2_format *f);
404 int virtio_video_try_fmt(struct virtio_video_stream *stream,
405 struct v4l2_format *f);
406 int virtio_video_reqbufs(struct file *file, void *priv,
407 struct v4l2_requestbuffers *rb);
408 int virtio_video_subscribe_event(struct v4l2_fh *fh,
409 const struct v4l2_event_subscription *sub);
411 void virtio_video_free_caps_list(struct list_head *caps_list);
412 int virtio_video_parse_virtio_capabilities(struct virtio_video_device *vvd,
413 void *input_buf, void *output_buf);
414 void virtio_video_clean_capability(struct virtio_video_device *vvd);
415 int virtio_video_parse_virtio_control(struct virtio_video_device *vvd);
416 void virtio_video_clean_control(struct virtio_video_device *vvd);
418 uint32_t virtio_video_format_to_v4l2(uint32_t format);
419 uint32_t virtio_video_control_to_v4l2(uint32_t control);
420 uint32_t virtio_video_profile_to_v4l2(uint32_t profile);
421 uint32_t virtio_video_level_to_v4l2(uint32_t level);
422 uint32_t virtio_video_v4l2_format_to_virtio(uint32_t v4l2_format);
423 uint32_t virtio_video_v4l2_control_to_virtio(uint32_t v4l2_control);
424 uint32_t virtio_video_v4l2_profile_to_virtio(uint32_t v4l2_profile);
425 uint32_t virtio_video_v4l2_level_to_virtio(uint32_t v4l2_level);
427 struct video_format *virtio_video_find_video_format(struct list_head *fmts_list,
429 void virtio_video_format_from_info(struct video_format_info *info,
430 struct v4l2_pix_format_mplane *pix_mp);
431 void virtio_video_format_fill_default_info(struct video_format_info *dst_info,
432 struct video_format_info *src_info);
433 void virtio_video_pix_fmt_sp2mp(const struct v4l2_pix_format *pix,
434 struct v4l2_pix_format_mplane *pix_mp);
435 void virtio_video_pix_fmt_mp2sp(const struct v4l2_pix_format_mplane *pix_mp,
436 struct v4l2_pix_format *pix);
438 int virtio_video_g_selection(struct file *file, void *fh,
439 struct v4l2_selection *sel);
441 int virtio_video_stream_get_params(struct virtio_video_device *vvd,
442 struct virtio_video_stream *stream);
443 int virtio_video_stream_get_controls(struct virtio_video_device *vvd,
444 struct virtio_video_stream *stream);
446 #endif /* _VIRTIO_VIDEO_H */