Lines Matching refs:q

91 #define log_qop(q, op)							\  argument
92 dprintk(2, "call_qop(%p, %s)%s\n", q, #op, \
93 (q)->ops->op ? "" : " (nop)")
95 #define call_qop(q, op, args...) \ argument
99 log_qop(q, op); \
100 err = (q)->ops->op ? (q)->ops->op(args) : 0; \
102 (q)->cnt_ ## op++; \
106 #define call_void_qop(q, op, args...) \ argument
108 log_qop(q, op); \
109 if ((q)->ops->op) \
110 (q)->ops->op(args); \
111 (q)->cnt_ ## op++; \
155 #define call_qop(q, op, args...) \ argument
156 ((q)->ops->op ? (q)->ops->op(args) : 0)
158 #define call_void_qop(q, op, args...) \ argument
160 if ((q)->ops->op) \
161 (q)->ops->op(args); \
184 static void __vb2_queue_cancel(struct vb2_queue *q);
191 struct vb2_queue *q = vb->vb2_queue; in __vb2_buf_mem_alloc() local
193 V4L2_TYPE_IS_OUTPUT(q->type) ? DMA_TO_DEVICE : DMA_FROM_DEVICE; in __vb2_buf_mem_alloc()
202 unsigned long size = PAGE_ALIGN(q->plane_sizes[plane]); in __vb2_buf_mem_alloc()
204 mem_priv = call_ptr_memop(vb, alloc, q->alloc_ctx[plane], in __vb2_buf_mem_alloc()
205 size, dma_dir, q->gfp_flags); in __vb2_buf_mem_alloc()
211 vb->v4l2_planes[plane].length = q->plane_sizes[plane]; in __vb2_buf_mem_alloc()
288 static void __setup_lengths(struct vb2_queue *q, unsigned int n) in __setup_lengths() argument
293 for (buffer = q->num_buffers; buffer < q->num_buffers + n; ++buffer) { in __setup_lengths()
294 vb = q->bufs[buffer]; in __setup_lengths()
299 vb->v4l2_planes[plane].length = q->plane_sizes[plane]; in __setup_lengths()
307 static void __setup_offsets(struct vb2_queue *q, unsigned int n) in __setup_offsets() argument
313 if (q->num_buffers) { in __setup_offsets()
315 vb = q->bufs[q->num_buffers - 1]; in __setup_offsets()
322 for (buffer = q->num_buffers; buffer < q->num_buffers + n; ++buffer) { in __setup_offsets()
323 vb = q->bufs[buffer]; in __setup_offsets()
346 static int __vb2_queue_alloc(struct vb2_queue *q, enum v4l2_memory memory, in __vb2_queue_alloc() argument
355 vb = kzalloc(q->buf_struct_size, GFP_KERNEL); in __vb2_queue_alloc()
362 if (V4L2_TYPE_IS_MULTIPLANAR(q->type)) in __vb2_queue_alloc()
366 vb->vb2_queue = q; in __vb2_queue_alloc()
368 vb->v4l2_buf.index = q->num_buffers + buffer; in __vb2_queue_alloc()
369 vb->v4l2_buf.type = q->type; in __vb2_queue_alloc()
396 q->bufs[q->num_buffers + buffer] = vb; in __vb2_queue_alloc()
399 __setup_lengths(q, buffer); in __vb2_queue_alloc()
401 __setup_offsets(q, buffer); in __vb2_queue_alloc()
412 static void __vb2_free_mem(struct vb2_queue *q, unsigned int buffers) in __vb2_free_mem() argument
417 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_free_mem()
419 vb = q->bufs[buffer]; in __vb2_free_mem()
424 if (q->memory == V4L2_MEMORY_MMAP) in __vb2_free_mem()
426 else if (q->memory == V4L2_MEMORY_DMABUF) in __vb2_free_mem()
438 static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers) in __vb2_queue_free() argument
450 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_queue_free()
452 if (q->bufs[buffer] == NULL) in __vb2_queue_free()
454 if (q->bufs[buffer]->state == VB2_BUF_STATE_PREPARING) { in __vb2_queue_free()
461 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_queue_free()
463 struct vb2_buffer *vb = q->bufs[buffer]; in __vb2_queue_free()
470 __vb2_free_mem(q, buffers); in __vb2_queue_free()
478 if (q->num_buffers) { in __vb2_queue_free()
479 bool unbalanced = q->cnt_start_streaming != q->cnt_stop_streaming || in __vb2_queue_free()
480 q->cnt_wait_prepare != q->cnt_wait_finish; in __vb2_queue_free()
483 pr_info("vb2: counters for queue %p:%s\n", q, in __vb2_queue_free()
486 q->cnt_queue_setup, q->cnt_start_streaming, in __vb2_queue_free()
487 q->cnt_stop_streaming); in __vb2_queue_free()
489 q->cnt_wait_prepare, q->cnt_wait_finish); in __vb2_queue_free()
491 q->cnt_queue_setup = 0; in __vb2_queue_free()
492 q->cnt_wait_prepare = 0; in __vb2_queue_free()
493 q->cnt_wait_finish = 0; in __vb2_queue_free()
494 q->cnt_start_streaming = 0; in __vb2_queue_free()
495 q->cnt_stop_streaming = 0; in __vb2_queue_free()
497 for (buffer = 0; buffer < q->num_buffers; ++buffer) { in __vb2_queue_free()
498 struct vb2_buffer *vb = q->bufs[buffer]; in __vb2_queue_free()
510 q, buffer, unbalanced ? " UNBALANCED!" : ""); in __vb2_queue_free()
535 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_queue_free()
537 kfree(q->bufs[buffer]); in __vb2_queue_free()
538 q->bufs[buffer] = NULL; in __vb2_queue_free()
541 q->num_buffers -= buffers; in __vb2_queue_free()
542 if (!q->num_buffers) { in __vb2_queue_free()
543 q->memory = 0; in __vb2_queue_free()
544 INIT_LIST_HEAD(&q->queued_list); in __vb2_queue_free()
619 static bool __buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb) in __buffer_in_use() argument
640 static bool __buffers_in_use(struct vb2_queue *q) in __buffers_in_use() argument
643 for (buffer = 0; buffer < q->num_buffers; ++buffer) { in __buffers_in_use()
644 if (__buffer_in_use(q, q->bufs[buffer])) in __buffers_in_use()
656 struct vb2_queue *q = vb->vb2_queue; in __fill_v4l2_buffer() local
663 if (V4L2_TYPE_IS_MULTIPLANAR(q->type)) { in __fill_v4l2_buffer()
678 if (q->memory == V4L2_MEMORY_MMAP) in __fill_v4l2_buffer()
680 else if (q->memory == V4L2_MEMORY_USERPTR) in __fill_v4l2_buffer()
682 else if (q->memory == V4L2_MEMORY_DMABUF) in __fill_v4l2_buffer()
690 b->flags |= q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK; in __fill_v4l2_buffer()
691 if ((q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) != in __fill_v4l2_buffer()
698 b->flags |= q->timestamp_flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK; in __fill_v4l2_buffer()
721 if (__buffer_in_use(q, vb)) in __fill_v4l2_buffer()
738 int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b) in vb2_querybuf() argument
743 if (b->type != q->type) { in vb2_querybuf()
748 if (b->index >= q->num_buffers) { in vb2_querybuf()
752 vb = q->bufs[b->index]; in vb2_querybuf()
764 static int __verify_userptr_ops(struct vb2_queue *q) in __verify_userptr_ops() argument
766 if (!(q->io_modes & VB2_USERPTR) || !q->mem_ops->get_userptr || in __verify_userptr_ops()
767 !q->mem_ops->put_userptr) in __verify_userptr_ops()
777 static int __verify_mmap_ops(struct vb2_queue *q) in __verify_mmap_ops() argument
779 if (!(q->io_modes & VB2_MMAP) || !q->mem_ops->alloc || in __verify_mmap_ops()
780 !q->mem_ops->put || !q->mem_ops->mmap) in __verify_mmap_ops()
790 static int __verify_dmabuf_ops(struct vb2_queue *q) in __verify_dmabuf_ops() argument
792 if (!(q->io_modes & VB2_DMABUF) || !q->mem_ops->attach_dmabuf || in __verify_dmabuf_ops()
793 !q->mem_ops->detach_dmabuf || !q->mem_ops->map_dmabuf || in __verify_dmabuf_ops()
794 !q->mem_ops->unmap_dmabuf) in __verify_dmabuf_ops()
804 static int __verify_memory_type(struct vb2_queue *q, in __verify_memory_type() argument
813 if (type != q->type) { in __verify_memory_type()
822 if (memory == V4L2_MEMORY_MMAP && __verify_mmap_ops(q)) { in __verify_memory_type()
827 if (memory == V4L2_MEMORY_USERPTR && __verify_userptr_ops(q)) { in __verify_memory_type()
832 if (memory == V4L2_MEMORY_DMABUF && __verify_dmabuf_ops(q)) { in __verify_memory_type()
842 if (vb2_fileio_is_active(q)) { in __verify_memory_type()
872 static int __reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req) in __reqbufs() argument
877 if (q->streaming) { in __reqbufs()
882 if (req->count == 0 || q->num_buffers != 0 || q->memory != req->memory) { in __reqbufs()
887 mutex_lock(&q->mmap_lock); in __reqbufs()
888 if (q->memory == V4L2_MEMORY_MMAP && __buffers_in_use(q)) { in __reqbufs()
889 mutex_unlock(&q->mmap_lock); in __reqbufs()
899 __vb2_queue_cancel(q); in __reqbufs()
900 ret = __vb2_queue_free(q, q->num_buffers); in __reqbufs()
901 mutex_unlock(&q->mmap_lock); in __reqbufs()
917 num_buffers = max_t(unsigned int, num_buffers, q->min_buffers_needed); in __reqbufs()
918 memset(q->plane_sizes, 0, sizeof(q->plane_sizes)); in __reqbufs()
919 memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx)); in __reqbufs()
920 q->memory = req->memory; in __reqbufs()
926 ret = call_qop(q, queue_setup, q, NULL, &num_buffers, &num_planes, in __reqbufs()
927 q->plane_sizes, q->alloc_ctx); in __reqbufs()
932 allocated_buffers = __vb2_queue_alloc(q, req->memory, num_buffers, num_planes); in __reqbufs()
942 if (allocated_buffers < q->min_buffers_needed) in __reqbufs()
951 ret = call_qop(q, queue_setup, q, NULL, &num_buffers, in __reqbufs()
952 &num_planes, q->plane_sizes, q->alloc_ctx); in __reqbufs()
963 mutex_lock(&q->mmap_lock); in __reqbufs()
964 q->num_buffers = allocated_buffers; in __reqbufs()
971 __vb2_queue_free(q, allocated_buffers); in __reqbufs()
972 mutex_unlock(&q->mmap_lock); in __reqbufs()
975 mutex_unlock(&q->mmap_lock); in __reqbufs()
982 q->waiting_for_buffers = !V4L2_TYPE_IS_OUTPUT(q->type); in __reqbufs()
993 int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req) in vb2_reqbufs() argument
995 int ret = __verify_memory_type(q, req->memory, req->type); in vb2_reqbufs()
997 return ret ? ret : __reqbufs(q, req); in vb2_reqbufs()
1016 static int __create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create) in __create_bufs() argument
1021 if (q->num_buffers == VIDEO_MAX_FRAME) { in __create_bufs()
1026 if (!q->num_buffers) { in __create_bufs()
1027 memset(q->plane_sizes, 0, sizeof(q->plane_sizes)); in __create_bufs()
1028 memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx)); in __create_bufs()
1029 q->memory = create->memory; in __create_bufs()
1030 q->waiting_for_buffers = !V4L2_TYPE_IS_OUTPUT(q->type); in __create_bufs()
1033 num_buffers = min(create->count, VIDEO_MAX_FRAME - q->num_buffers); in __create_bufs()
1039 ret = call_qop(q, queue_setup, q, &create->format, &num_buffers, in __create_bufs()
1040 &num_planes, q->plane_sizes, q->alloc_ctx); in __create_bufs()
1045 allocated_buffers = __vb2_queue_alloc(q, create->memory, num_buffers, in __create_bufs()
1062 ret = call_qop(q, queue_setup, q, &create->format, &num_buffers, in __create_bufs()
1063 &num_planes, q->plane_sizes, q->alloc_ctx); in __create_bufs()
1074 mutex_lock(&q->mmap_lock); in __create_bufs()
1075 q->num_buffers += allocated_buffers; in __create_bufs()
1082 __vb2_queue_free(q, allocated_buffers); in __create_bufs()
1083 mutex_unlock(&q->mmap_lock); in __create_bufs()
1086 mutex_unlock(&q->mmap_lock); in __create_bufs()
1104 int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create) in vb2_create_bufs() argument
1106 int ret = __verify_memory_type(q, create->memory, create->format.type); in vb2_create_bufs()
1108 create->index = q->num_buffers; in vb2_create_bufs()
1111 return ret ? ret : __create_bufs(q, create); in vb2_create_bufs()
1174 struct vb2_queue *q = vb->vb2_queue; in vb2_buffer_done() local
1201 spin_lock_irqsave(&q->done_lock, flags); in vb2_buffer_done()
1204 list_add_tail(&vb->done_entry, &q->done_list); in vb2_buffer_done()
1205 atomic_dec(&q->owned_by_drv_count); in vb2_buffer_done()
1206 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_buffer_done()
1212 wake_up(&q->done_wq); in vb2_buffer_done()
1228 void vb2_discard_done(struct vb2_queue *q) in vb2_discard_done() argument
1233 spin_lock_irqsave(&q->done_lock, flags); in vb2_discard_done()
1234 list_for_each_entry(vb, &q->done_list, done_entry) in vb2_discard_done()
1236 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_discard_done()
1399 struct vb2_queue *q = vb->vb2_queue; in __qbuf_userptr() local
1404 V4L2_TYPE_IS_OUTPUT(q->type) ? DMA_TO_DEVICE : DMA_FROM_DEVICE; in __qbuf_userptr()
1422 if (planes[plane].length < q->plane_sizes[plane]) { in __qbuf_userptr()
1426 q->plane_sizes[plane], plane); in __qbuf_userptr()
1444 mem_priv = call_ptr_memop(vb, get_userptr, q->alloc_ctx[plane], in __qbuf_userptr()
1503 struct vb2_queue *q = vb->vb2_queue; in __qbuf_dmabuf() local
1508 V4L2_TYPE_IS_OUTPUT(q->type) ? DMA_TO_DEVICE : DMA_FROM_DEVICE; in __qbuf_dmabuf()
1529 if (planes[plane].length < q->plane_sizes[plane]) { in __qbuf_dmabuf()
1555 mem_priv = call_ptr_memop(vb, attach_dmabuf, q->alloc_ctx[plane], in __qbuf_dmabuf()
1621 struct vb2_queue *q = vb->vb2_queue; in __enqueue_in_driver() local
1625 atomic_inc(&q->owned_by_drv_count); in __enqueue_in_driver()
1636 struct vb2_queue *q = vb->vb2_queue; in __buf_prepare() local
1644 if (b->field == V4L2_FIELD_ALTERNATE && V4L2_TYPE_IS_OUTPUT(q->type)) { in __buf_prepare()
1658 if (q->error) { in __buf_prepare()
1668 switch (q->memory) { in __buf_prepare()
1692 static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct v4l2_buffer *b, in vb2_queue_or_prepare_buf() argument
1695 if (b->type != q->type) { in vb2_queue_or_prepare_buf()
1700 if (b->index >= q->num_buffers) { in vb2_queue_or_prepare_buf()
1705 if (q->bufs[b->index] == NULL) { in vb2_queue_or_prepare_buf()
1711 if (b->memory != q->memory) { in vb2_queue_or_prepare_buf()
1716 return __verify_planes_array(q->bufs[b->index], b); in vb2_queue_or_prepare_buf()
1734 int vb2_prepare_buf(struct vb2_queue *q, struct v4l2_buffer *b) in vb2_prepare_buf() argument
1739 if (vb2_fileio_is_active(q)) { in vb2_prepare_buf()
1744 ret = vb2_queue_or_prepare_buf(q, b, "prepare_buf"); in vb2_prepare_buf()
1748 vb = q->bufs[b->index]; in vb2_prepare_buf()
1777 static int vb2_start_streaming(struct vb2_queue *q) in vb2_start_streaming() argument
1786 list_for_each_entry(vb, &q->queued_list, queued_entry) in vb2_start_streaming()
1790 q->start_streaming_called = 1; in vb2_start_streaming()
1791 ret = call_qop(q, start_streaming, q, in vb2_start_streaming()
1792 atomic_read(&q->owned_by_drv_count)); in vb2_start_streaming()
1796 q->start_streaming_called = 0; in vb2_start_streaming()
1805 if (WARN_ON(atomic_read(&q->owned_by_drv_count))) { in vb2_start_streaming()
1812 for (i = 0; i < q->num_buffers; ++i) { in vb2_start_streaming()
1813 vb = q->bufs[i]; in vb2_start_streaming()
1818 WARN_ON(atomic_read(&q->owned_by_drv_count)); in vb2_start_streaming()
1825 WARN_ON(!list_empty(&q->done_list)); in vb2_start_streaming()
1829 static int vb2_internal_qbuf(struct vb2_queue *q, struct v4l2_buffer *b) in vb2_internal_qbuf() argument
1831 int ret = vb2_queue_or_prepare_buf(q, b, "qbuf"); in vb2_internal_qbuf()
1837 vb = q->bufs[b->index]; in vb2_internal_qbuf()
1859 list_add_tail(&vb->queued_entry, &q->queued_list); in vb2_internal_qbuf()
1860 q->queued_count++; in vb2_internal_qbuf()
1861 q->waiting_for_buffers = false; in vb2_internal_qbuf()
1863 if (V4L2_TYPE_IS_OUTPUT(q->type)) { in vb2_internal_qbuf()
1868 if ((q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) == in vb2_internal_qbuf()
1880 if (q->start_streaming_called) in vb2_internal_qbuf()
1892 if (q->streaming && !q->start_streaming_called && in vb2_internal_qbuf()
1893 q->queued_count >= q->min_buffers_needed) { in vb2_internal_qbuf()
1894 ret = vb2_start_streaming(q); in vb2_internal_qbuf()
1920 int vb2_qbuf(struct vb2_queue *q, struct v4l2_buffer *b) in vb2_qbuf() argument
1922 if (vb2_fileio_is_active(q)) { in vb2_qbuf()
1927 return vb2_internal_qbuf(q, b); in vb2_qbuf()
1937 static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) in __vb2_wait_for_done_vb() argument
1951 if (!q->streaming) { in __vb2_wait_for_done_vb()
1956 if (q->error) { in __vb2_wait_for_done_vb()
1961 if (!list_empty(&q->done_list)) { in __vb2_wait_for_done_vb()
1979 call_void_qop(q, wait_prepare, q); in __vb2_wait_for_done_vb()
1985 ret = wait_event_interruptible(q->done_wq, in __vb2_wait_for_done_vb()
1986 !list_empty(&q->done_list) || !q->streaming || in __vb2_wait_for_done_vb()
1987 q->error); in __vb2_wait_for_done_vb()
1993 call_void_qop(q, wait_finish, q); in __vb2_wait_for_done_vb()
2007 static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, in __vb2_get_done_vb() argument
2016 ret = __vb2_wait_for_done_vb(q, nonblocking); in __vb2_get_done_vb()
2024 spin_lock_irqsave(&q->done_lock, flags); in __vb2_get_done_vb()
2025 *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry); in __vb2_get_done_vb()
2033 spin_unlock_irqrestore(&q->done_lock, flags); in __vb2_get_done_vb()
2047 int vb2_wait_for_all_buffers(struct vb2_queue *q) in vb2_wait_for_all_buffers() argument
2049 if (!q->streaming) { in vb2_wait_for_all_buffers()
2054 if (q->start_streaming_called) in vb2_wait_for_all_buffers()
2055 wait_event(q->done_wq, !atomic_read(&q->owned_by_drv_count)); in vb2_wait_for_all_buffers()
2065 struct vb2_queue *q = vb->vb2_queue; in __vb2_dqbuf() local
2075 if (q->memory == V4L2_MEMORY_DMABUF) in __vb2_dqbuf()
2084 static int vb2_internal_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking) in vb2_internal_dqbuf() argument
2089 if (b->type != q->type) { in vb2_internal_dqbuf()
2093 ret = __vb2_get_done_vb(q, &vb, b, nonblocking); in vb2_internal_dqbuf()
2115 q->queued_count--; in vb2_internal_dqbuf()
2146 int vb2_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking) in vb2_dqbuf() argument
2148 if (vb2_fileio_is_active(q)) { in vb2_dqbuf()
2152 return vb2_internal_dqbuf(q, b, nonblocking); in vb2_dqbuf()
2162 static void __vb2_queue_cancel(struct vb2_queue *q) in __vb2_queue_cancel() argument
2170 if (q->start_streaming_called) in __vb2_queue_cancel()
2171 call_void_qop(q, stop_streaming, q); in __vb2_queue_cancel()
2179 if (WARN_ON(atomic_read(&q->owned_by_drv_count))) { in __vb2_queue_cancel()
2180 for (i = 0; i < q->num_buffers; ++i) in __vb2_queue_cancel()
2181 if (q->bufs[i]->state == VB2_BUF_STATE_ACTIVE) in __vb2_queue_cancel()
2182 vb2_buffer_done(q->bufs[i], VB2_BUF_STATE_ERROR); in __vb2_queue_cancel()
2184 WARN_ON(atomic_read(&q->owned_by_drv_count)); in __vb2_queue_cancel()
2187 q->streaming = 0; in __vb2_queue_cancel()
2188 q->start_streaming_called = 0; in __vb2_queue_cancel()
2189 q->queued_count = 0; in __vb2_queue_cancel()
2190 q->error = 0; in __vb2_queue_cancel()
2195 INIT_LIST_HEAD(&q->queued_list); in __vb2_queue_cancel()
2200 INIT_LIST_HEAD(&q->done_list); in __vb2_queue_cancel()
2201 atomic_set(&q->owned_by_drv_count, 0); in __vb2_queue_cancel()
2202 wake_up_all(&q->done_wq); in __vb2_queue_cancel()
2213 for (i = 0; i < q->num_buffers; ++i) { in __vb2_queue_cancel()
2214 struct vb2_buffer *vb = q->bufs[i]; in __vb2_queue_cancel()
2224 static int vb2_internal_streamon(struct vb2_queue *q, enum v4l2_buf_type type) in vb2_internal_streamon() argument
2228 if (type != q->type) { in vb2_internal_streamon()
2233 if (q->streaming) { in vb2_internal_streamon()
2238 if (!q->num_buffers) { in vb2_internal_streamon()
2243 if (q->num_buffers < q->min_buffers_needed) { in vb2_internal_streamon()
2245 q->min_buffers_needed); in vb2_internal_streamon()
2253 if (q->queued_count >= q->min_buffers_needed) { in vb2_internal_streamon()
2254 ret = vb2_start_streaming(q); in vb2_internal_streamon()
2256 __vb2_queue_cancel(q); in vb2_internal_streamon()
2261 q->streaming = 1; in vb2_internal_streamon()
2280 void vb2_queue_error(struct vb2_queue *q) in vb2_queue_error() argument
2282 q->error = 1; in vb2_queue_error()
2284 wake_up_all(&q->done_wq); in vb2_queue_error()
2301 int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type) in vb2_streamon() argument
2303 if (vb2_fileio_is_active(q)) { in vb2_streamon()
2307 return vb2_internal_streamon(q, type); in vb2_streamon()
2311 static int vb2_internal_streamoff(struct vb2_queue *q, enum v4l2_buf_type type) in vb2_internal_streamoff() argument
2313 if (type != q->type) { in vb2_internal_streamoff()
2327 __vb2_queue_cancel(q); in vb2_internal_streamoff()
2328 q->waiting_for_buffers = !V4L2_TYPE_IS_OUTPUT(q->type); in vb2_internal_streamoff()
2349 int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type) in vb2_streamoff() argument
2351 if (vb2_fileio_is_active(q)) { in vb2_streamoff()
2355 return vb2_internal_streamoff(q, type); in vb2_streamoff()
2362 static int __find_plane_by_offset(struct vb2_queue *q, unsigned long off, in __find_plane_by_offset() argument
2373 for (buffer = 0; buffer < q->num_buffers; ++buffer) { in __find_plane_by_offset()
2374 vb = q->bufs[buffer]; in __find_plane_by_offset()
2397 int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb) in vb2_expbuf() argument
2404 if (q->memory != V4L2_MEMORY_MMAP) { in vb2_expbuf()
2409 if (!q->mem_ops->get_dmabuf) { in vb2_expbuf()
2419 if (eb->type != q->type) { in vb2_expbuf()
2424 if (eb->index >= q->num_buffers) { in vb2_expbuf()
2429 vb = q->bufs[eb->index]; in vb2_expbuf()
2436 if (vb2_fileio_is_active(q)) { in vb2_expbuf()
2485 int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma) in vb2_mmap() argument
2493 if (q->memory != V4L2_MEMORY_MMAP) { in vb2_mmap()
2505 if (V4L2_TYPE_IS_OUTPUT(q->type)) { in vb2_mmap()
2516 if (vb2_fileio_is_active(q)) { in vb2_mmap()
2524 ret = __find_plane_by_offset(q, off, &buffer, &plane); in vb2_mmap()
2528 vb = q->bufs[buffer]; in vb2_mmap()
2542 mutex_lock(&q->mmap_lock); in vb2_mmap()
2544 mutex_unlock(&q->mmap_lock); in vb2_mmap()
2554 unsigned long vb2_get_unmapped_area(struct vb2_queue *q, in vb2_get_unmapped_area() argument
2566 if (q->memory != V4L2_MEMORY_MMAP) { in vb2_get_unmapped_area()
2574 ret = __find_plane_by_offset(q, off, &buffer, &plane); in vb2_get_unmapped_area()
2578 vb = q->bufs[buffer]; in vb2_get_unmapped_area()
2586 static int __vb2_init_fileio(struct vb2_queue *q, int read);
2587 static int __vb2_cleanup_fileio(struct vb2_queue *q);
2608 unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) in vb2_poll() argument
2625 if (!V4L2_TYPE_IS_OUTPUT(q->type) && !(req_events & (POLLIN | POLLRDNORM))) in vb2_poll()
2627 if (V4L2_TYPE_IS_OUTPUT(q->type) && !(req_events & (POLLOUT | POLLWRNORM))) in vb2_poll()
2633 if (q->num_buffers == 0 && !vb2_fileio_is_active(q)) { in vb2_poll()
2634 if (!V4L2_TYPE_IS_OUTPUT(q->type) && (q->io_modes & VB2_READ) && in vb2_poll()
2636 if (__vb2_init_fileio(q, 1)) in vb2_poll()
2639 if (V4L2_TYPE_IS_OUTPUT(q->type) && (q->io_modes & VB2_WRITE) && in vb2_poll()
2641 if (__vb2_init_fileio(q, 0)) in vb2_poll()
2654 if (!vb2_is_streaming(q) || q->error) in vb2_poll()
2661 if (q->waiting_for_buffers) in vb2_poll()
2668 if (V4L2_TYPE_IS_OUTPUT(q->type) && q->fileio && q->queued_count < q->num_buffers) in vb2_poll()
2671 if (list_empty(&q->done_list)) in vb2_poll()
2672 poll_wait(file, &q->done_wq, wait); in vb2_poll()
2677 spin_lock_irqsave(&q->done_lock, flags); in vb2_poll()
2678 if (!list_empty(&q->done_list)) in vb2_poll()
2679 vb = list_first_entry(&q->done_list, struct vb2_buffer, in vb2_poll()
2681 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_poll()
2685 return (V4L2_TYPE_IS_OUTPUT(q->type)) ? in vb2_poll()
2704 int vb2_queue_init(struct vb2_queue *q) in vb2_queue_init() argument
2709 if (WARN_ON(!q) || in vb2_queue_init()
2710 WARN_ON(!q->ops) || in vb2_queue_init()
2711 WARN_ON(!q->mem_ops) || in vb2_queue_init()
2712 WARN_ON(!q->type) || in vb2_queue_init()
2713 WARN_ON(!q->io_modes) || in vb2_queue_init()
2714 WARN_ON(!q->ops->queue_setup) || in vb2_queue_init()
2715 WARN_ON(!q->ops->buf_queue) || in vb2_queue_init()
2716 WARN_ON(q->timestamp_flags & in vb2_queue_init()
2722 WARN_ON((q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) == in vb2_queue_init()
2725 INIT_LIST_HEAD(&q->queued_list); in vb2_queue_init()
2726 INIT_LIST_HEAD(&q->done_list); in vb2_queue_init()
2727 spin_lock_init(&q->done_lock); in vb2_queue_init()
2728 mutex_init(&q->mmap_lock); in vb2_queue_init()
2729 init_waitqueue_head(&q->done_wq); in vb2_queue_init()
2731 if (q->buf_struct_size == 0) in vb2_queue_init()
2732 q->buf_struct_size = sizeof(struct vb2_buffer); in vb2_queue_init()
2746 void vb2_queue_release(struct vb2_queue *q) in vb2_queue_release() argument
2748 __vb2_cleanup_fileio(q); in vb2_queue_release()
2749 __vb2_queue_cancel(q); in vb2_queue_release()
2750 mutex_lock(&q->mmap_lock); in vb2_queue_release()
2751 __vb2_queue_free(q, q->num_buffers); in vb2_queue_release()
2752 mutex_unlock(&q->mmap_lock); in vb2_queue_release()
2812 static int __vb2_init_fileio(struct vb2_queue *q, int read) in __vb2_init_fileio() argument
2821 if (WARN_ON((read && !(q->io_modes & VB2_READ)) || in __vb2_init_fileio()
2822 (!read && !(q->io_modes & VB2_WRITE)))) in __vb2_init_fileio()
2828 if (!q->mem_ops->vaddr) in __vb2_init_fileio()
2834 if (q->streaming || q->num_buffers > 0) in __vb2_init_fileio()
2843 (read) ? "read" : "write", count, q->fileio_read_once, in __vb2_init_fileio()
2844 q->fileio_write_immediately); in __vb2_init_fileio()
2850 fileio->read_once = q->fileio_read_once; in __vb2_init_fileio()
2851 fileio->write_immediately = q->fileio_write_immediately; in __vb2_init_fileio()
2859 fileio->req.type = q->type; in __vb2_init_fileio()
2860 q->fileio = fileio; in __vb2_init_fileio()
2861 ret = __reqbufs(q, &fileio->req); in __vb2_init_fileio()
2869 if (q->bufs[0]->num_planes != 1) { in __vb2_init_fileio()
2877 for (i = 0; i < q->num_buffers; i++) { in __vb2_init_fileio()
2878 fileio->bufs[i].vaddr = vb2_plane_vaddr(q->bufs[i], 0); in __vb2_init_fileio()
2883 fileio->bufs[i].size = vb2_plane_size(q->bufs[i], 0); in __vb2_init_fileio()
2890 bool is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(q->type); in __vb2_init_fileio()
2895 for (i = 0; i < q->num_buffers; i++) { in __vb2_init_fileio()
2899 b->type = q->type; in __vb2_init_fileio()
2905 b->memory = q->memory; in __vb2_init_fileio()
2907 ret = vb2_internal_qbuf(q, b); in __vb2_init_fileio()
2916 fileio->initial_index = q->num_buffers; in __vb2_init_fileio()
2917 fileio->cur_index = q->num_buffers; in __vb2_init_fileio()
2923 ret = vb2_internal_streamon(q, q->type); in __vb2_init_fileio()
2931 __reqbufs(q, &fileio->req); in __vb2_init_fileio()
2934 q->fileio = NULL; in __vb2_init_fileio()
2943 static int __vb2_cleanup_fileio(struct vb2_queue *q) in __vb2_cleanup_fileio() argument
2945 struct vb2_fileio_data *fileio = q->fileio; in __vb2_cleanup_fileio()
2948 vb2_internal_streamoff(q, q->type); in __vb2_cleanup_fileio()
2949 q->fileio = NULL; in __vb2_cleanup_fileio()
2951 vb2_reqbufs(q, &fileio->req); in __vb2_cleanup_fileio()
2967 static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_t count, in __vb2_perform_fileio() argument
2972 bool is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(q->type); in __vb2_perform_fileio()
2979 (q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) == in __vb2_perform_fileio()
2993 if (!vb2_fileio_is_active(q)) { in __vb2_perform_fileio()
2994 ret = __vb2_init_fileio(q, read); in __vb2_perform_fileio()
2999 fileio = q->fileio; in __vb2_perform_fileio()
3005 if (index >= q->num_buffers) { in __vb2_perform_fileio()
3010 fileio->b.type = q->type; in __vb2_perform_fileio()
3011 fileio->b.memory = q->memory; in __vb2_perform_fileio()
3017 ret = vb2_internal_dqbuf(q, &fileio->b, nonblock); in __vb2_perform_fileio()
3031 buf->size = read ? vb2_get_plane_payload(q->bufs[index], 0) in __vb2_perform_fileio()
3032 : vb2_plane_size(q->bufs[index], 0); in __vb2_perform_fileio()
3080 return __vb2_cleanup_fileio(q); in __vb2_perform_fileio()
3087 fileio->b.type = q->type; in __vb2_perform_fileio()
3088 fileio->b.memory = q->memory; in __vb2_perform_fileio()
3099 ret = vb2_internal_qbuf(q, &fileio->b); in __vb2_perform_fileio()
3109 buf->size = vb2_plane_size(q->bufs[index], 0); in __vb2_perform_fileio()
3115 if (fileio->initial_index < q->num_buffers) in __vb2_perform_fileio()
3135 size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count, in vb2_read() argument
3138 return __vb2_perform_fileio(q, data, count, ppos, nonblocking, 1); in vb2_read()
3142 size_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count, in vb2_write() argument
3145 return __vb2_perform_fileio(q, (char __user *) data, count, in vb2_write()
3159 struct vb2_queue *q = data; in vb2_thread() local
3160 struct vb2_threadio_data *threadio = q->threadio; in vb2_thread()
3161 struct vb2_fileio_data *fileio = q->fileio; in vb2_thread()
3167 if (V4L2_TYPE_IS_OUTPUT(q->type)) { in vb2_thread()
3168 prequeue = q->num_buffers; in vb2_thread()
3170 (q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) == in vb2_thread()
3183 fileio->b.type = q->type; in vb2_thread()
3184 fileio->b.memory = q->memory; in vb2_thread()
3189 call_void_qop(q, wait_finish, q); in vb2_thread()
3191 ret = vb2_internal_dqbuf(q, &fileio->b, 0); in vb2_thread()
3192 call_void_qop(q, wait_prepare, q); in vb2_thread()
3199 vb = q->bufs[fileio->b.index]; in vb2_thread()
3203 call_void_qop(q, wait_finish, q); in vb2_thread()
3207 ret = vb2_internal_qbuf(q, &fileio->b); in vb2_thread()
3208 call_void_qop(q, wait_prepare, q); in vb2_thread()
3226 int vb2_thread_start(struct vb2_queue *q, vb2_thread_fnc fnc, void *priv, in vb2_thread_start() argument
3232 if (q->threadio) in vb2_thread_start()
3234 if (vb2_is_busy(q)) in vb2_thread_start()
3236 if (WARN_ON(q->fileio)) in vb2_thread_start()
3245 ret = __vb2_init_fileio(q, !V4L2_TYPE_IS_OUTPUT(q->type)); in vb2_thread_start()
3249 q->threadio = threadio; in vb2_thread_start()
3250 threadio->thread = kthread_run(vb2_thread, q, "vb2-%s", thread_name); in vb2_thread_start()
3259 __vb2_cleanup_fileio(q); in vb2_thread_start()
3266 int vb2_thread_stop(struct vb2_queue *q) in vb2_thread_stop() argument
3268 struct vb2_threadio_data *threadio = q->threadio; in vb2_thread_stop()
3275 vb2_queue_error(q); in vb2_thread_stop()
3277 __vb2_cleanup_fileio(q); in vb2_thread_stop()
3280 q->threadio = NULL; in vb2_thread_stop()
3498 struct vb2_queue *q = vdev->queue; in vb2_fop_poll() local
3499 struct mutex *lock = q->lock ? q->lock : vdev->lock; in vb2_fop_poll()
3512 fileio = q->fileio; in vb2_fop_poll()
3517 if (!fileio && q->fileio) in vb2_fop_poll()
3518 q->owner = file->private_data; in vb2_fop_poll()