Lines Matching full:q
47 #define dprintk(q, level, fmt, arg...) \ argument
50 pr_info("[%s] %s: " fmt, (q)->name, __func__, \
103 #define log_qop(q, op) \ argument
104 dprintk(q, 2, "call_qop(%s)%s\n", #op, \
105 (q)->ops->op ? "" : " (nop)")
107 #define call_qop(q, op, args...) \ argument
111 log_qop(q, op); \
112 err = (q)->ops->op ? (q)->ops->op(args) : 0; \
114 (q)->cnt_ ## op++; \
118 #define call_void_qop(q, op, args...) \ argument
120 log_qop(q, op); \
121 if ((q)->ops->op) \
122 (q)->ops->op(args); \
123 (q)->cnt_ ## op++; \
167 #define call_qop(q, op, args...) \ argument
168 ((q)->ops->op ? (q)->ops->op(args) : 0)
170 #define call_void_qop(q, op, args...) \ argument
172 if ((q)->ops->op) \
173 (q)->ops->op(args); \
187 #define call_bufop(q, op, args...) \ argument
190 if (q && q->buf_ops && q->buf_ops->op) \
191 ret = q->buf_ops->op(args); \
195 #define call_void_bufop(q, op, args...) \ argument
197 if (q && q->buf_ops && q->buf_ops->op) \
198 q->buf_ops->op(args); \
201 static void __vb2_queue_cancel(struct vb2_queue *q);
226 struct vb2_queue *q = vb->vb2_queue; in __vb2_buf_mem_alloc() local
245 q->alloc_devs[plane] ? : q->dev, in __vb2_buf_mem_alloc()
367 struct vb2_queue *q = vb->vb2_queue; in __setup_offsets() local
390 dprintk(q, 3, "buffer %d, plane %d offset 0x%08lx\n", in __setup_offsets()
395 static void init_buffer_cache_hints(struct vb2_queue *q, struct vb2_buffer *vb) in init_buffer_cache_hints() argument
402 if (q->memory == VB2_MEMORY_DMABUF) { in init_buffer_cache_hints()
412 if (q->dma_dir == DMA_TO_DEVICE) in init_buffer_cache_hints()
418 * @q: pointer to &struct vb2_queue with videobuf2 queue.
422 static void vb2_queue_add_buffer(struct vb2_queue *q, struct vb2_buffer *vb, unsigned int index) in vb2_queue_add_buffer() argument
424 WARN_ON(index >= q->max_num_buffers || q->bufs[index] || vb->vb2_queue); in vb2_queue_add_buffer()
426 q->bufs[index] = vb; in vb2_queue_add_buffer()
428 vb->vb2_queue = q; in vb2_queue_add_buffer()
448 static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory, in __vb2_queue_alloc() argument
452 unsigned int q_num_buffers = vb2_get_num_buffers(q); in __vb2_queue_alloc()
459 * in the queue is below q->max_num_buffers in __vb2_queue_alloc()
462 q->max_num_buffers - q_num_buffers); in __vb2_queue_alloc()
466 vb = kzalloc(q->buf_struct_size, GFP_KERNEL); in __vb2_queue_alloc()
468 dprintk(q, 1, "memory alloc for buffer struct failed\n"); in __vb2_queue_alloc()
474 vb->type = q->type; in __vb2_queue_alloc()
476 init_buffer_cache_hints(q, vb); in __vb2_queue_alloc()
482 vb2_queue_add_buffer(q, vb, q_num_buffers + buffer); in __vb2_queue_alloc()
483 call_void_bufop(q, init_buffer, vb); in __vb2_queue_alloc()
489 dprintk(q, 1, "failed allocating memory for buffer %d\n", in __vb2_queue_alloc()
503 dprintk(q, 1, "buffer %d %p initialization failed\n", in __vb2_queue_alloc()
513 dprintk(q, 3, "allocated %d buffers, %d plane(s) each\n", in __vb2_queue_alloc()
522 static void __vb2_free_mem(struct vb2_queue *q, unsigned int buffers) in __vb2_free_mem() argument
526 unsigned int q_num_buffers = vb2_get_num_buffers(q); in __vb2_free_mem()
530 vb = vb2_get_buffer(q, buffer); in __vb2_free_mem()
535 if (q->memory == VB2_MEMORY_MMAP) in __vb2_free_mem()
537 else if (q->memory == VB2_MEMORY_DMABUF) in __vb2_free_mem()
549 static void __vb2_queue_free(struct vb2_queue *q, unsigned int buffers) in __vb2_queue_free() argument
552 unsigned int q_num_buffers = vb2_get_num_buffers(q); in __vb2_queue_free()
554 lockdep_assert_held(&q->mmap_lock); in __vb2_queue_free()
559 struct vb2_buffer *vb = vb2_get_buffer(q, buffer); in __vb2_queue_free()
566 __vb2_free_mem(q, buffers); in __vb2_queue_free()
574 bool unbalanced = q->cnt_start_streaming != q->cnt_stop_streaming || in __vb2_queue_free()
575 q->cnt_prepare_streaming != q->cnt_unprepare_streaming || in __vb2_queue_free()
576 q->cnt_wait_prepare != q->cnt_wait_finish; in __vb2_queue_free()
579 pr_info("unbalanced counters for queue %p:\n", q); in __vb2_queue_free()
580 if (q->cnt_start_streaming != q->cnt_stop_streaming) in __vb2_queue_free()
582 q->cnt_queue_setup, q->cnt_start_streaming, in __vb2_queue_free()
583 q->cnt_stop_streaming); in __vb2_queue_free()
584 if (q->cnt_prepare_streaming != q->cnt_unprepare_streaming) in __vb2_queue_free()
586 q->cnt_prepare_streaming, q->cnt_unprepare_streaming); in __vb2_queue_free()
587 if (q->cnt_wait_prepare != q->cnt_wait_finish) in __vb2_queue_free()
589 q->cnt_wait_prepare, q->cnt_wait_finish); in __vb2_queue_free()
591 q->cnt_queue_setup = 0; in __vb2_queue_free()
592 q->cnt_wait_prepare = 0; in __vb2_queue_free()
593 q->cnt_wait_finish = 0; in __vb2_queue_free()
594 q->cnt_prepare_streaming = 0; in __vb2_queue_free()
595 q->cnt_start_streaming = 0; in __vb2_queue_free()
596 q->cnt_stop_streaming = 0; in __vb2_queue_free()
597 q->cnt_unprepare_streaming = 0; in __vb2_queue_free()
599 for (buffer = 0; buffer < vb2_get_num_buffers(q); buffer++) { in __vb2_queue_free()
600 struct vb2_buffer *vb = vb2_get_buffer(q, buffer); in __vb2_queue_free()
617 q, buffer); in __vb2_queue_free()
653 struct vb2_buffer *vb = vb2_get_buffer(q, buffer); in __vb2_queue_free()
662 q->num_buffers -= buffers; in __vb2_queue_free()
663 if (!vb2_get_num_buffers(q)) { in __vb2_queue_free()
664 q->memory = VB2_MEMORY_UNKNOWN; in __vb2_queue_free()
665 INIT_LIST_HEAD(&q->queued_list); in __vb2_queue_free()
669 bool vb2_buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb) in vb2_buffer_in_use() argument
691 static bool __buffers_in_use(struct vb2_queue *q) in __buffers_in_use() argument
694 for (buffer = 0; buffer < vb2_get_num_buffers(q); ++buffer) { in __buffers_in_use()
695 struct vb2_buffer *vb = vb2_get_buffer(q, buffer); in __buffers_in_use()
700 if (vb2_buffer_in_use(q, vb)) in __buffers_in_use()
706 void vb2_core_querybuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb) in vb2_core_querybuf() argument
708 call_void_bufop(q, fill_user_buffer, vb, pb); in vb2_core_querybuf()
716 static int __verify_userptr_ops(struct vb2_queue *q) in __verify_userptr_ops() argument
718 if (!(q->io_modes & VB2_USERPTR) || !q->mem_ops->get_userptr || in __verify_userptr_ops()
719 !q->mem_ops->put_userptr) in __verify_userptr_ops()
729 static int __verify_mmap_ops(struct vb2_queue *q) in __verify_mmap_ops() argument
731 if (!(q->io_modes & VB2_MMAP) || !q->mem_ops->alloc || in __verify_mmap_ops()
732 !q->mem_ops->put || !q->mem_ops->mmap) in __verify_mmap_ops()
742 static int __verify_dmabuf_ops(struct vb2_queue *q) in __verify_dmabuf_ops() argument
744 if (!(q->io_modes & VB2_DMABUF) || !q->mem_ops->attach_dmabuf || in __verify_dmabuf_ops()
745 !q->mem_ops->detach_dmabuf || !q->mem_ops->map_dmabuf || in __verify_dmabuf_ops()
746 !q->mem_ops->unmap_dmabuf) in __verify_dmabuf_ops()
752 int vb2_verify_memory_type(struct vb2_queue *q, in vb2_verify_memory_type() argument
757 dprintk(q, 1, "unsupported memory type\n"); in vb2_verify_memory_type()
761 if (type != q->type) { in vb2_verify_memory_type()
762 dprintk(q, 1, "requested type is incorrect\n"); in vb2_verify_memory_type()
770 if (memory == VB2_MEMORY_MMAP && __verify_mmap_ops(q)) { in vb2_verify_memory_type()
771 dprintk(q, 1, "MMAP for current setup unsupported\n"); in vb2_verify_memory_type()
775 if (memory == VB2_MEMORY_USERPTR && __verify_userptr_ops(q)) { in vb2_verify_memory_type()
776 dprintk(q, 1, "USERPTR for current setup unsupported\n"); in vb2_verify_memory_type()
780 if (memory == VB2_MEMORY_DMABUF && __verify_dmabuf_ops(q)) { in vb2_verify_memory_type()
781 dprintk(q, 1, "DMABUF for current setup unsupported\n"); in vb2_verify_memory_type()
790 if (vb2_fileio_is_active(q)) { in vb2_verify_memory_type()
791 dprintk(q, 1, "file io in progress\n"); in vb2_verify_memory_type()
798 static void set_queue_coherency(struct vb2_queue *q, bool non_coherent_mem) in set_queue_coherency() argument
800 q->non_coherent_mem = 0; in set_queue_coherency()
802 if (!vb2_queue_allows_cache_hints(q)) in set_queue_coherency()
804 q->non_coherent_mem = non_coherent_mem; in set_queue_coherency()
807 static bool verify_coherency_flags(struct vb2_queue *q, bool non_coherent_mem) in verify_coherency_flags() argument
809 if (non_coherent_mem != q->non_coherent_mem) { in verify_coherency_flags()
810 dprintk(q, 1, "memory coherency model mismatch\n"); in verify_coherency_flags()
816 int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory, in vb2_core_reqbufs() argument
820 unsigned int q_num_bufs = vb2_get_num_buffers(q); in vb2_core_reqbufs()
826 if (q->streaming) { in vb2_core_reqbufs()
827 dprintk(q, 1, "streaming active\n"); in vb2_core_reqbufs()
831 if (q->waiting_in_dqbuf && *count) { in vb2_core_reqbufs()
832 dprintk(q, 1, "another dup()ped fd is waiting for a buffer\n"); in vb2_core_reqbufs()
837 (q->memory != VB2_MEMORY_UNKNOWN && q->memory != memory) || in vb2_core_reqbufs()
838 !verify_coherency_flags(q, non_coherent_mem)) { in vb2_core_reqbufs()
843 mutex_lock(&q->mmap_lock); in vb2_core_reqbufs()
844 if (debug && q->memory == VB2_MEMORY_MMAP && in vb2_core_reqbufs()
845 __buffers_in_use(q)) in vb2_core_reqbufs()
846 dprintk(q, 1, "memory in use, orphaning buffers\n"); in vb2_core_reqbufs()
853 __vb2_queue_cancel(q); in vb2_core_reqbufs()
854 __vb2_queue_free(q, q_num_bufs); in vb2_core_reqbufs()
855 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
868 num_buffers = max_t(unsigned int, *count, q->min_queued_buffers); in vb2_core_reqbufs()
869 num_buffers = min_t(unsigned int, num_buffers, q->max_num_buffers); in vb2_core_reqbufs()
870 memset(q->alloc_devs, 0, sizeof(q->alloc_devs)); in vb2_core_reqbufs()
872 * Set this now to ensure that drivers see the correct q->memory value in vb2_core_reqbufs()
875 mutex_lock(&q->mmap_lock); in vb2_core_reqbufs()
876 if (!q->bufs) in vb2_core_reqbufs()
877 q->bufs = kcalloc(q->max_num_buffers, sizeof(*q->bufs), GFP_KERNEL); in vb2_core_reqbufs()
878 if (!q->bufs) in vb2_core_reqbufs()
880 q->memory = memory; in vb2_core_reqbufs()
881 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
884 set_queue_coherency(q, non_coherent_mem); in vb2_core_reqbufs()
890 ret = call_qop(q, queue_setup, q, &num_buffers, &num_planes, in vb2_core_reqbufs()
891 plane_sizes, q->alloc_devs); in vb2_core_reqbufs()
909 __vb2_queue_alloc(q, memory, num_buffers, num_planes, plane_sizes); in vb2_core_reqbufs()
911 dprintk(q, 1, "memory allocation failed\n"); in vb2_core_reqbufs()
920 if (allocated_buffers < q->min_queued_buffers) in vb2_core_reqbufs()
936 ret = call_qop(q, queue_setup, q, &num_buffers, in vb2_core_reqbufs()
937 &num_planes, plane_sizes, q->alloc_devs); in vb2_core_reqbufs()
948 mutex_lock(&q->mmap_lock); in vb2_core_reqbufs()
949 q->num_buffers = allocated_buffers; in vb2_core_reqbufs()
954 * from already queued buffers and it will reset q->memory to in vb2_core_reqbufs()
957 __vb2_queue_free(q, allocated_buffers); in vb2_core_reqbufs()
958 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
961 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
968 q->waiting_for_buffers = !q->is_output; in vb2_core_reqbufs()
973 mutex_lock(&q->mmap_lock); in vb2_core_reqbufs()
974 q->memory = VB2_MEMORY_UNKNOWN; in vb2_core_reqbufs()
975 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
980 int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory, in vb2_core_create_bufs() argument
988 unsigned int q_num_bufs = vb2_get_num_buffers(q); in vb2_core_create_bufs()
992 if (q_num_bufs == q->max_num_buffers) { in vb2_core_create_bufs()
993 dprintk(q, 1, "maximum number of buffers already allocated\n"); in vb2_core_create_bufs()
998 if (q->waiting_in_dqbuf && *count) { in vb2_core_create_bufs()
999 dprintk(q, 1, "another dup()ped fd is waiting for a buffer\n"); in vb2_core_create_bufs()
1002 memset(q->alloc_devs, 0, sizeof(q->alloc_devs)); in vb2_core_create_bufs()
1004 * Set this now to ensure that drivers see the correct q->memory in vb2_core_create_bufs()
1007 mutex_lock(&q->mmap_lock); in vb2_core_create_bufs()
1008 q->memory = memory; in vb2_core_create_bufs()
1009 if (!q->bufs) in vb2_core_create_bufs()
1010 q->bufs = kcalloc(q->max_num_buffers, sizeof(*q->bufs), GFP_KERNEL); in vb2_core_create_bufs()
1011 if (!q->bufs) in vb2_core_create_bufs()
1013 mutex_unlock(&q->mmap_lock); in vb2_core_create_bufs()
1016 q->waiting_for_buffers = !q->is_output; in vb2_core_create_bufs()
1017 set_queue_coherency(q, non_coherent_mem); in vb2_core_create_bufs()
1019 if (q->memory != memory) { in vb2_core_create_bufs()
1020 dprintk(q, 1, "memory model mismatch\n"); in vb2_core_create_bufs()
1023 if (!verify_coherency_flags(q, non_coherent_mem)) in vb2_core_create_bufs()
1027 num_buffers = min(*count, q->max_num_buffers - q_num_bufs); in vb2_core_create_bufs()
1038 ret = call_qop(q, queue_setup, q, &num_buffers, in vb2_core_create_bufs()
1039 &num_planes, plane_sizes, q->alloc_devs); in vb2_core_create_bufs()
1044 allocated_buffers = __vb2_queue_alloc(q, memory, num_buffers, in vb2_core_create_bufs()
1047 dprintk(q, 1, "memory allocation failed\n"); in vb2_core_create_bufs()
1062 ret = call_qop(q, queue_setup, q, &num_buffers, in vb2_core_create_bufs()
1063 &num_planes, plane_sizes, q->alloc_devs); in vb2_core_create_bufs()
1074 mutex_lock(&q->mmap_lock); in vb2_core_create_bufs()
1075 q->num_buffers += allocated_buffers; in vb2_core_create_bufs()
1080 * from already queued buffers and it will reset q->memory to in vb2_core_create_bufs()
1083 __vb2_queue_free(q, allocated_buffers); in vb2_core_create_bufs()
1084 mutex_unlock(&q->mmap_lock); in vb2_core_create_bufs()
1087 mutex_unlock(&q->mmap_lock); in vb2_core_create_bufs()
1099 mutex_lock(&q->mmap_lock); in vb2_core_create_bufs()
1100 q->memory = VB2_MEMORY_UNKNOWN; in vb2_core_create_bufs()
1101 mutex_unlock(&q->mmap_lock); in vb2_core_create_bufs()
1128 struct vb2_queue *q = vb->vb2_queue; in vb2_buffer_done() local
1146 dprintk(q, 4, "done processing on buffer %d, state: %s\n", in vb2_buffer_done()
1152 spin_lock_irqsave(&q->done_lock, flags); in vb2_buffer_done()
1157 list_add_tail(&vb->done_entry, &q->done_list); in vb2_buffer_done()
1160 atomic_dec(&q->owned_by_drv_count); in vb2_buffer_done()
1167 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_buffer_done()
1169 trace_vb2_buf_done(q, vb); in vb2_buffer_done()
1176 wake_up(&q->done_wq); in vb2_buffer_done()
1182 void vb2_discard_done(struct vb2_queue *q) in vb2_discard_done() argument
1187 spin_lock_irqsave(&q->done_lock, flags); in vb2_discard_done()
1188 list_for_each_entry(vb, &q->done_list, done_entry) in vb2_discard_done()
1190 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_discard_done()
1212 struct vb2_queue *q = vb->vb2_queue; in __prepare_userptr() local
1232 dprintk(q, 3, "userspace address for plane %d changed, reacquiring memory\n", in __prepare_userptr()
1237 dprintk(q, 1, "provided buffer size %u is less than setup size %u for plane %d\n", in __prepare_userptr()
1264 q->alloc_devs[plane] ? : q->dev, in __prepare_userptr()
1268 dprintk(q, 1, "failed acquiring userspace memory for plane %d\n", in __prepare_userptr()
1295 dprintk(q, 1, "buffer initialization failed\n"); in __prepare_userptr()
1302 dprintk(q, 1, "buffer preparation failed\n"); in __prepare_userptr()
1328 struct vb2_queue *q = vb->vb2_queue; in __prepare_dmabuf() local
1345 dprintk(q, 1, "invalid dmabuf fd for plane %d\n", in __prepare_dmabuf()
1356 dprintk(q, 1, "invalid dmabuf length %u for plane %d, minimum length %u\n", in __prepare_dmabuf()
1371 dprintk(q, 3, "buffer for plane %d changed\n", plane); in __prepare_dmabuf()
1389 q->alloc_devs[plane] ? : q->dev, in __prepare_dmabuf()
1393 dprintk(q, 1, "failed to attach dmabuf\n"); in __prepare_dmabuf()
1414 dprintk(q, 1, "failed to map dmabuf for plane %d\n", in __prepare_dmabuf()
1439 dprintk(q, 1, "buffer initialization failed\n"); in __prepare_dmabuf()
1446 dprintk(q, 1, "buffer preparation failed\n"); in __prepare_dmabuf()
1464 struct vb2_queue *q = vb->vb2_queue; in __enqueue_in_driver() local
1467 atomic_inc(&q->owned_by_drv_count); in __enqueue_in_driver()
1469 trace_vb2_buf_queue(q, vb); in __enqueue_in_driver()
1476 struct vb2_queue *q = vb->vb2_queue; in __buf_prepare() local
1480 if (q->error) { in __buf_prepare()
1481 dprintk(q, 1, "fatal error occurred on queue\n"); in __buf_prepare()
1489 if (q->is_output) { in __buf_prepare()
1492 dprintk(q, 1, "buffer validation failed\n"); in __buf_prepare()
1499 switch (q->memory) { in __buf_prepare()
1516 dprintk(q, 1, "buffer preparation failed: %d\n", ret); in __buf_prepare()
1565 * The only exception is -EIO which is returned if q->error is in vb2_req_queue()
1624 int vb2_core_prepare_buf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb) in vb2_core_prepare_buf() argument
1629 dprintk(q, 1, "invalid buffer state %s\n", in vb2_core_prepare_buf()
1634 dprintk(q, 1, "buffer already prepared\n"); in vb2_core_prepare_buf()
1643 call_void_bufop(q, fill_user_buffer, vb, pb); in vb2_core_prepare_buf()
1645 dprintk(q, 2, "prepare of buffer %d succeeded\n", vb->index); in vb2_core_prepare_buf()
1653 * @q: videobuf2 queue
1656 * at least q->min_queued_buffers queued up (i.e. the minimum
1662 static int vb2_start_streaming(struct vb2_queue *q) in vb2_start_streaming() argument
1671 list_for_each_entry(vb, &q->queued_list, queued_entry) in vb2_start_streaming()
1675 q->start_streaming_called = 1; in vb2_start_streaming()
1676 ret = call_qop(q, start_streaming, q, in vb2_start_streaming()
1677 atomic_read(&q->owned_by_drv_count)); in vb2_start_streaming()
1681 q->start_streaming_called = 0; in vb2_start_streaming()
1683 dprintk(q, 1, "driver refused to start streaming\n"); in vb2_start_streaming()
1690 if (WARN_ON(atomic_read(&q->owned_by_drv_count))) { in vb2_start_streaming()
1697 for (i = 0; i < vb2_get_num_buffers(q); ++i) { in vb2_start_streaming()
1698 vb = vb2_get_buffer(q, i); in vb2_start_streaming()
1707 WARN_ON(atomic_read(&q->owned_by_drv_count)); in vb2_start_streaming()
1714 WARN_ON(!list_empty(&q->done_list)); in vb2_start_streaming()
1718 int vb2_core_qbuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb, in vb2_core_qbuf() argument
1724 if (q->error) { in vb2_core_qbuf()
1725 dprintk(q, 1, "fatal error occurred on queue\n"); in vb2_core_qbuf()
1730 q->requires_requests) { in vb2_core_qbuf()
1731 dprintk(q, 1, "qbuf requires a request\n"); in vb2_core_qbuf()
1735 if ((req && q->uses_qbuf) || in vb2_core_qbuf()
1737 q->uses_requests)) { in vb2_core_qbuf()
1738 dprintk(q, 1, "queue in wrong mode (qbuf vs requests)\n"); in vb2_core_qbuf()
1745 q->uses_requests = 1; in vb2_core_qbuf()
1747 dprintk(q, 1, "buffer %d not in dequeued state\n", in vb2_core_qbuf()
1752 if (q->is_output && !vb->prepared) { in vb2_core_qbuf()
1755 dprintk(q, 1, "buffer validation failed\n"); in vb2_core_qbuf()
1767 q, true, &vb->req_obj); in vb2_core_qbuf()
1787 call_void_bufop(q, copy_timestamp, vb, pb); in vb2_core_qbuf()
1788 call_void_bufop(q, fill_user_buffer, vb, pb); in vb2_core_qbuf()
1791 dprintk(q, 2, "qbuf of buffer %d succeeded\n", vb->index); in vb2_core_qbuf()
1796 q->uses_qbuf = 1; in vb2_core_qbuf()
1808 dprintk(q, 1, "buffer still being prepared\n"); in vb2_core_qbuf()
1811 dprintk(q, 1, "invalid buffer state %s\n", in vb2_core_qbuf()
1821 list_add_tail(&vb->queued_entry, &q->queued_list); in vb2_core_qbuf()
1822 q->queued_count++; in vb2_core_qbuf()
1823 q->waiting_for_buffers = false; in vb2_core_qbuf()
1827 call_void_bufop(q, copy_timestamp, vb, pb); in vb2_core_qbuf()
1829 trace_vb2_qbuf(q, vb); in vb2_core_qbuf()
1835 if (q->start_streaming_called) in vb2_core_qbuf()
1840 call_void_bufop(q, fill_user_buffer, vb, pb); in vb2_core_qbuf()
1848 if (q->streaming && !q->start_streaming_called && in vb2_core_qbuf()
1849 q->queued_count >= q->min_queued_buffers) { in vb2_core_qbuf()
1850 ret = vb2_start_streaming(q); in vb2_core_qbuf()
1858 q->queued_count--; in vb2_core_qbuf()
1864 dprintk(q, 2, "qbuf of buffer %d succeeded\n", vb->index); in vb2_core_qbuf()
1875 static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) in __vb2_wait_for_done_vb() argument
1889 if (q->waiting_in_dqbuf) { in __vb2_wait_for_done_vb()
1890 dprintk(q, 1, "another dup()ped fd is waiting for a buffer\n"); in __vb2_wait_for_done_vb()
1894 if (!q->streaming) { in __vb2_wait_for_done_vb()
1895 dprintk(q, 1, "streaming off, will not wait for buffers\n"); in __vb2_wait_for_done_vb()
1899 if (q->error) { in __vb2_wait_for_done_vb()
1900 dprintk(q, 1, "Queue in error state, will not wait for buffers\n"); in __vb2_wait_for_done_vb()
1904 if (q->last_buffer_dequeued) { in __vb2_wait_for_done_vb()
1905 dprintk(q, 3, "last buffer dequeued already, will not wait for buffers\n"); in __vb2_wait_for_done_vb()
1909 if (!list_empty(&q->done_list)) { in __vb2_wait_for_done_vb()
1917 dprintk(q, 3, "nonblocking and no buffers to dequeue, will not wait\n"); in __vb2_wait_for_done_vb()
1921 q->waiting_in_dqbuf = 1; in __vb2_wait_for_done_vb()
1927 call_void_qop(q, wait_prepare, q); in __vb2_wait_for_done_vb()
1932 dprintk(q, 3, "will sleep waiting for buffers\n"); in __vb2_wait_for_done_vb()
1933 ret = wait_event_interruptible(q->done_wq, in __vb2_wait_for_done_vb()
1934 !list_empty(&q->done_list) || !q->streaming || in __vb2_wait_for_done_vb()
1935 q->error); in __vb2_wait_for_done_vb()
1941 call_void_qop(q, wait_finish, q); in __vb2_wait_for_done_vb()
1942 q->waiting_in_dqbuf = 0; in __vb2_wait_for_done_vb()
1944 dprintk(q, 1, "sleep was interrupted\n"); in __vb2_wait_for_done_vb()
1956 static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, in __vb2_get_done_vb() argument
1965 ret = __vb2_wait_for_done_vb(q, nonblocking); in __vb2_get_done_vb()
1973 spin_lock_irqsave(&q->done_lock, flags); in __vb2_get_done_vb()
1974 *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry); in __vb2_get_done_vb()
1981 ret = call_bufop(q, verify_planes_array, *vb, pb); in __vb2_get_done_vb()
1984 spin_unlock_irqrestore(&q->done_lock, flags); in __vb2_get_done_vb()
1989 int vb2_wait_for_all_buffers(struct vb2_queue *q) in vb2_wait_for_all_buffers() argument
1991 if (!q->streaming) { in vb2_wait_for_all_buffers()
1992 dprintk(q, 1, "streaming off, will not wait for buffers\n"); in vb2_wait_for_all_buffers()
1996 if (q->start_streaming_called) in vb2_wait_for_all_buffers()
1997 wait_event(q->done_wq, !atomic_read(&q->owned_by_drv_count)); in vb2_wait_for_all_buffers()
2007 struct vb2_queue *q = vb->vb2_queue; in __vb2_dqbuf() local
2015 call_void_bufop(q, init_buffer, vb); in __vb2_dqbuf()
2018 int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb, in vb2_core_dqbuf() argument
2024 ret = __vb2_get_done_vb(q, &vb, pb, nonblocking); in vb2_core_dqbuf()
2030 dprintk(q, 3, "returning done buffer\n"); in vb2_core_dqbuf()
2033 dprintk(q, 3, "returning done buffer with errors\n"); in vb2_core_dqbuf()
2036 dprintk(q, 1, "invalid buffer state %s\n", in vb2_core_dqbuf()
2049 call_void_bufop(q, fill_user_buffer, vb, pb); in vb2_core_dqbuf()
2053 q->queued_count--; in vb2_core_dqbuf()
2055 trace_vb2_dqbuf(q, vb); in vb2_core_dqbuf()
2068 dprintk(q, 2, "dqbuf of buffer %d, state: %s\n", in vb2_core_dqbuf()
2082 static void __vb2_queue_cancel(struct vb2_queue *q) in __vb2_queue_cancel() argument
2090 if (q->start_streaming_called) in __vb2_queue_cancel()
2091 call_void_qop(q, stop_streaming, q); in __vb2_queue_cancel()
2093 if (q->streaming) in __vb2_queue_cancel()
2094 call_void_qop(q, unprepare_streaming, q); in __vb2_queue_cancel()
2102 if (WARN_ON(atomic_read(&q->owned_by_drv_count))) { in __vb2_queue_cancel()
2103 for (i = 0; i < vb2_get_num_buffers(q); i++) { in __vb2_queue_cancel()
2104 struct vb2_buffer *vb = vb2_get_buffer(q, i); in __vb2_queue_cancel()
2116 WARN_ON(atomic_read(&q->owned_by_drv_count)); in __vb2_queue_cancel()
2119 q->streaming = 0; in __vb2_queue_cancel()
2120 q->start_streaming_called = 0; in __vb2_queue_cancel()
2121 q->queued_count = 0; in __vb2_queue_cancel()
2122 q->error = 0; in __vb2_queue_cancel()
2123 q->uses_requests = 0; in __vb2_queue_cancel()
2124 q->uses_qbuf = 0; in __vb2_queue_cancel()
2129 INIT_LIST_HEAD(&q->queued_list); in __vb2_queue_cancel()
2134 INIT_LIST_HEAD(&q->done_list); in __vb2_queue_cancel()
2135 atomic_set(&q->owned_by_drv_count, 0); in __vb2_queue_cancel()
2136 wake_up_all(&q->done_wq); in __vb2_queue_cancel()
2147 for (i = 0; i < vb2_get_num_buffers(q); i++) { in __vb2_queue_cancel()
2151 vb = vb2_get_buffer(q, i); in __vb2_queue_cancel()
2193 int vb2_core_streamon(struct vb2_queue *q, unsigned int type) in vb2_core_streamon() argument
2195 unsigned int q_num_bufs = vb2_get_num_buffers(q); in vb2_core_streamon()
2198 if (type != q->type) { in vb2_core_streamon()
2199 dprintk(q, 1, "invalid stream type\n"); in vb2_core_streamon()
2203 if (q->streaming) { in vb2_core_streamon()
2204 dprintk(q, 3, "already streaming\n"); in vb2_core_streamon()
2209 dprintk(q, 1, "no buffers have been allocated\n"); in vb2_core_streamon()
2213 if (q_num_bufs < q->min_queued_buffers) { in vb2_core_streamon()
2214 dprintk(q, 1, "need at least %u queued buffers\n", in vb2_core_streamon()
2215 q->min_queued_buffers); in vb2_core_streamon()
2219 ret = call_qop(q, prepare_streaming, q); in vb2_core_streamon()
2227 if (q->queued_count >= q->min_queued_buffers) { in vb2_core_streamon()
2228 ret = vb2_start_streaming(q); in vb2_core_streamon()
2233 q->streaming = 1; in vb2_core_streamon()
2235 dprintk(q, 3, "successful\n"); in vb2_core_streamon()
2239 call_void_qop(q, unprepare_streaming, q); in vb2_core_streamon()
2244 void vb2_queue_error(struct vb2_queue *q) in vb2_queue_error() argument
2246 q->error = 1; in vb2_queue_error()
2248 wake_up_all(&q->done_wq); in vb2_queue_error()
2252 int vb2_core_streamoff(struct vb2_queue *q, unsigned int type) in vb2_core_streamoff() argument
2254 if (type != q->type) { in vb2_core_streamoff()
2255 dprintk(q, 1, "invalid stream type\n"); in vb2_core_streamoff()
2263 * Note that we do this even if q->streaming == 0: if you prepare or in vb2_core_streamoff()
2268 __vb2_queue_cancel(q); in vb2_core_streamoff()
2269 q->waiting_for_buffers = !q->is_output; in vb2_core_streamoff()
2270 q->last_buffer_dequeued = false; in vb2_core_streamoff()
2272 dprintk(q, 3, "successful\n"); in vb2_core_streamoff()
2280 static int __find_plane_by_offset(struct vb2_queue *q, unsigned long offset, in __find_plane_by_offset() argument
2289 lockdep_assert_held(&q->mmap_lock); in __find_plane_by_offset()
2291 if (q->memory != VB2_MEMORY_MMAP) { in __find_plane_by_offset()
2292 dprintk(q, 1, "queue is not currently set up for mmap\n"); in __find_plane_by_offset()
2296 if (vb2_fileio_is_active(q)) { in __find_plane_by_offset()
2297 dprintk(q, 1, "file io in progress\n"); in __find_plane_by_offset()
2305 *vb = vb2_get_buffer(q, buffer); in __find_plane_by_offset()
2314 int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type, in vb2_core_expbuf() argument
2321 if (q->memory != VB2_MEMORY_MMAP) { in vb2_core_expbuf()
2322 dprintk(q, 1, "queue is not currently set up for mmap\n"); in vb2_core_expbuf()
2326 if (!q->mem_ops->get_dmabuf) { in vb2_core_expbuf()
2327 dprintk(q, 1, "queue does not support DMA buffer exporting\n"); in vb2_core_expbuf()
2332 dprintk(q, 1, "queue does support only O_CLOEXEC and access mode flags\n"); in vb2_core_expbuf()
2336 if (type != q->type) { in vb2_core_expbuf()
2337 dprintk(q, 1, "invalid buffer type\n"); in vb2_core_expbuf()
2342 dprintk(q, 1, "buffer plane out of range\n"); in vb2_core_expbuf()
2346 if (vb2_fileio_is_active(q)) { in vb2_core_expbuf()
2347 dprintk(q, 1, "expbuf: file io in progress\n"); in vb2_core_expbuf()
2358 dprintk(q, 1, "failed to export buffer %d, plane %d\n", in vb2_core_expbuf()
2365 dprintk(q, 3, "buffer %d, plane %d failed to export (%d)\n", in vb2_core_expbuf()
2371 dprintk(q, 3, "buffer %d, plane %d exported as %d descriptor\n", in vb2_core_expbuf()
2379 int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma) in vb2_mmap() argument
2391 dprintk(q, 1, "invalid vma flags, VM_SHARED needed\n"); in vb2_mmap()
2394 if (q->is_output) { in vb2_mmap()
2396 dprintk(q, 1, "invalid vma flags, VM_WRITE needed\n"); in vb2_mmap()
2401 dprintk(q, 1, "invalid vma flags, VM_READ needed\n"); in vb2_mmap()
2406 mutex_lock(&q->mmap_lock); in vb2_mmap()
2412 ret = __find_plane_by_offset(q, offset, &vb, &plane); in vb2_mmap()
2423 dprintk(q, 1, in vb2_mmap()
2439 mutex_unlock(&q->mmap_lock); in vb2_mmap()
2443 dprintk(q, 3, "buffer %u, plane %d successfully mapped\n", vb->index, plane); in vb2_mmap()
2449 unsigned long vb2_get_unmapped_area(struct vb2_queue *q, in vb2_get_unmapped_area() argument
2461 mutex_lock(&q->mmap_lock); in vb2_get_unmapped_area()
2467 ret = __find_plane_by_offset(q, offset, &vb, &plane); in vb2_get_unmapped_area()
2472 mutex_unlock(&q->mmap_lock); in vb2_get_unmapped_area()
2476 mutex_unlock(&q->mmap_lock); in vb2_get_unmapped_area()
2482 int vb2_core_queue_init(struct vb2_queue *q) in vb2_core_queue_init() argument
2491 if (!q->max_num_buffers) in vb2_core_queue_init()
2492 q->max_num_buffers = VB2_MAX_FRAME; in vb2_core_queue_init()
2495 q->max_num_buffers = min_t(unsigned int, q->max_num_buffers, MAX_BUFFER_INDEX); in vb2_core_queue_init()
2497 if (WARN_ON(!q) || in vb2_core_queue_init()
2498 WARN_ON(!q->ops) || in vb2_core_queue_init()
2499 WARN_ON(!q->mem_ops) || in vb2_core_queue_init()
2500 WARN_ON(!q->type) || in vb2_core_queue_init()
2501 WARN_ON(!q->io_modes) || in vb2_core_queue_init()
2502 WARN_ON(!q->ops->queue_setup) || in vb2_core_queue_init()
2503 WARN_ON(!q->ops->buf_queue)) in vb2_core_queue_init()
2506 if (WARN_ON(q->max_num_buffers > MAX_BUFFER_INDEX) || in vb2_core_queue_init()
2507 WARN_ON(q->min_queued_buffers > q->max_num_buffers)) in vb2_core_queue_init()
2510 if (WARN_ON(q->requires_requests && !q->supports_requests)) in vb2_core_queue_init()
2515 * q->min_queued_buffers can cause vb2_core_qbuf() to fail if in vb2_core_queue_init()
2521 if (WARN_ON(q->supports_requests && q->min_queued_buffers)) in vb2_core_queue_init()
2524 INIT_LIST_HEAD(&q->queued_list); in vb2_core_queue_init()
2525 INIT_LIST_HEAD(&q->done_list); in vb2_core_queue_init()
2526 spin_lock_init(&q->done_lock); in vb2_core_queue_init()
2527 mutex_init(&q->mmap_lock); in vb2_core_queue_init()
2528 init_waitqueue_head(&q->done_wq); in vb2_core_queue_init()
2530 q->memory = VB2_MEMORY_UNKNOWN; in vb2_core_queue_init()
2532 if (q->buf_struct_size == 0) in vb2_core_queue_init()
2533 q->buf_struct_size = sizeof(struct vb2_buffer); in vb2_core_queue_init()
2535 if (q->bidirectional) in vb2_core_queue_init()
2536 q->dma_dir = DMA_BIDIRECTIONAL; in vb2_core_queue_init()
2538 q->dma_dir = q->is_output ? DMA_TO_DEVICE : DMA_FROM_DEVICE; in vb2_core_queue_init()
2540 if (q->name[0] == '\0') in vb2_core_queue_init()
2541 snprintf(q->name, sizeof(q->name), "%s-%p", in vb2_core_queue_init()
2542 q->is_output ? "out" : "cap", q); in vb2_core_queue_init()
2548 static int __vb2_init_fileio(struct vb2_queue *q, int read);
2549 static int __vb2_cleanup_fileio(struct vb2_queue *q);
2550 void vb2_core_queue_release(struct vb2_queue *q) in vb2_core_queue_release() argument
2552 __vb2_cleanup_fileio(q); in vb2_core_queue_release()
2553 __vb2_queue_cancel(q); in vb2_core_queue_release()
2554 mutex_lock(&q->mmap_lock); in vb2_core_queue_release()
2555 __vb2_queue_free(q, vb2_get_num_buffers(q)); in vb2_core_queue_release()
2556 kfree(q->bufs); in vb2_core_queue_release()
2557 q->bufs = NULL; in vb2_core_queue_release()
2558 mutex_unlock(&q->mmap_lock); in vb2_core_queue_release()
2562 __poll_t vb2_core_poll(struct vb2_queue *q, struct file *file, in vb2_core_poll() argument
2576 poll_wait(file, &q->done_wq, wait); in vb2_core_poll()
2578 if (!q->is_output && !(req_events & (EPOLLIN | EPOLLRDNORM))) in vb2_core_poll()
2580 if (q->is_output && !(req_events & (EPOLLOUT | EPOLLWRNORM))) in vb2_core_poll()
2586 if (vb2_get_num_buffers(q) == 0 && !vb2_fileio_is_active(q)) { in vb2_core_poll()
2587 if (!q->is_output && (q->io_modes & VB2_READ) && in vb2_core_poll()
2589 if (__vb2_init_fileio(q, 1)) in vb2_core_poll()
2592 if (q->is_output && (q->io_modes & VB2_WRITE) && in vb2_core_poll()
2594 if (__vb2_init_fileio(q, 0)) in vb2_core_poll()
2607 if (!vb2_is_streaming(q) || q->error) in vb2_core_poll()
2616 if (q->quirk_poll_must_check_waiting_for_buffers && in vb2_core_poll()
2617 q->waiting_for_buffers && (req_events & (EPOLLIN | EPOLLRDNORM))) in vb2_core_poll()
2624 if (q->is_output && q->fileio && q->queued_count < vb2_get_num_buffers(q)) in vb2_core_poll()
2627 if (list_empty(&q->done_list)) { in vb2_core_poll()
2632 if (q->last_buffer_dequeued) in vb2_core_poll()
2639 spin_lock_irqsave(&q->done_lock, flags); in vb2_core_poll()
2640 if (!list_empty(&q->done_list)) in vb2_core_poll()
2641 vb = list_first_entry(&q->done_list, struct vb2_buffer, in vb2_core_poll()
2643 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_core_poll()
2647 return (q->is_output) ? in vb2_core_poll()
2708 * @q: videobuf2 queue
2711 static int __vb2_init_fileio(struct vb2_queue *q, int read) in __vb2_init_fileio() argument
2721 if (WARN_ON((read && !(q->io_modes & VB2_READ)) || in __vb2_init_fileio()
2722 (!read && !(q->io_modes & VB2_WRITE)))) in __vb2_init_fileio()
2728 if (!q->mem_ops->vaddr) in __vb2_init_fileio()
2734 if (q->streaming || vb2_get_num_buffers(q) > 0) in __vb2_init_fileio()
2738 * Start with q->min_queued_buffers + 1, driver can increase it in in __vb2_init_fileio()
2745 count = max(2, q->min_queued_buffers + 1); in __vb2_init_fileio()
2747 dprintk(q, 3, "setting up file io: mode %s, count %d, read_once %d, write_immediately %d\n", in __vb2_init_fileio()
2748 (read) ? "read" : "write", count, q->fileio_read_once, in __vb2_init_fileio()
2749 q->fileio_write_immediately); in __vb2_init_fileio()
2755 fileio->read_once = q->fileio_read_once; in __vb2_init_fileio()
2756 fileio->write_immediately = q->fileio_write_immediately; in __vb2_init_fileio()
2764 fileio->type = q->type; in __vb2_init_fileio()
2765 q->fileio = fileio; in __vb2_init_fileio()
2766 ret = vb2_core_reqbufs(q, fileio->memory, 0, &fileio->count); in __vb2_init_fileio()
2772 * will never be holes. It is safe to assume that vb2_get_buffer(q, 0) in __vb2_init_fileio()
2775 vb = vb2_get_buffer(q, 0); in __vb2_init_fileio()
2789 for (i = 0; i < vb2_get_num_buffers(q); i++) { in __vb2_init_fileio()
2791 vb = vb2_get_buffer(q, i); in __vb2_init_fileio()
2808 for (i = 0; i < vb2_get_num_buffers(q); i++) { in __vb2_init_fileio()
2809 struct vb2_buffer *vb2 = vb2_get_buffer(q, i); in __vb2_init_fileio()
2814 ret = vb2_core_qbuf(q, vb2, NULL, NULL); in __vb2_init_fileio()
2823 fileio->initial_index = vb2_get_num_buffers(q); in __vb2_init_fileio()
2830 ret = vb2_core_streamon(q, q->type); in __vb2_init_fileio()
2838 vb2_core_reqbufs(q, fileio->memory, 0, &fileio->count); in __vb2_init_fileio()
2841 q->fileio = NULL; in __vb2_init_fileio()
2848 * @q: videobuf2 queue
2850 static int __vb2_cleanup_fileio(struct vb2_queue *q) in __vb2_cleanup_fileio() argument
2852 struct vb2_fileio_data *fileio = q->fileio; in __vb2_cleanup_fileio()
2855 vb2_core_streamoff(q, q->type); in __vb2_cleanup_fileio()
2856 q->fileio = NULL; in __vb2_cleanup_fileio()
2858 vb2_core_reqbufs(q, fileio->memory, 0, &fileio->count); in __vb2_cleanup_fileio()
2860 dprintk(q, 3, "file io emulator closed\n"); in __vb2_cleanup_fileio()
2867 * @q: videobuf2 queue
2874 static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_t count, in __vb2_perform_fileio() argument
2879 bool is_multiplanar = q->is_multiplanar; in __vb2_perform_fileio()
2885 bool copy_timestamp = !read && q->copy_timestamp; in __vb2_perform_fileio()
2889 dprintk(q, 3, "mode %s, offset %ld, count %zd, %sblocking\n", in __vb2_perform_fileio()
2896 if (q->waiting_in_dqbuf) { in __vb2_perform_fileio()
2897 dprintk(q, 3, "another dup()ped fd is %s\n", in __vb2_perform_fileio()
2905 if (!vb2_fileio_is_active(q)) { in __vb2_perform_fileio()
2906 ret = __vb2_init_fileio(q, read); in __vb2_perform_fileio()
2907 dprintk(q, 3, "vb2_init_fileio result: %d\n", ret); in __vb2_perform_fileio()
2911 fileio = q->fileio; in __vb2_perform_fileio()
2917 if (index >= vb2_get_num_buffers(q)) { in __vb2_perform_fileio()
2923 ret = vb2_core_dqbuf(q, &index, NULL, nonblock); in __vb2_perform_fileio()
2924 dprintk(q, 5, "vb2_dqbuf result: %d\n", ret); in __vb2_perform_fileio()
2933 b = vb2_get_buffer(q, index); in __vb2_perform_fileio()
2957 dprintk(q, 5, "reducing read count: %zd\n", count); in __vb2_perform_fileio()
2963 dprintk(q, 3, "copying %zd bytes - buffer %d, offset %u\n", in __vb2_perform_fileio()
2970 dprintk(q, 3, "error copying data\n"); in __vb2_perform_fileio()
2985 struct vb2_buffer *b = vb2_get_buffer(q, index); in __vb2_perform_fileio()
2991 dprintk(q, 3, "read limit reached\n"); in __vb2_perform_fileio()
2992 return __vb2_cleanup_fileio(q); in __vb2_perform_fileio()
3002 ret = vb2_core_qbuf(q, b, NULL, NULL); in __vb2_perform_fileio()
3003 dprintk(q, 5, "vb2_qbuf result: %d\n", ret); in __vb2_perform_fileio()
3018 if (fileio->initial_index < vb2_get_num_buffers(q)) in __vb2_perform_fileio()
3038 size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count, in vb2_read() argument
3041 return __vb2_perform_fileio(q, data, count, ppos, nonblocking, 1); in vb2_read()
3045 size_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count, in vb2_write() argument
3048 return __vb2_perform_fileio(q, (char __user *) data, count, in vb2_write()
3062 struct vb2_queue *q = data; in vb2_thread() local
3063 struct vb2_threadio_data *threadio = q->threadio; in vb2_thread()
3069 if (q->is_output) { in vb2_thread()
3070 prequeue = vb2_get_num_buffers(q); in vb2_thread()
3071 copy_timestamp = q->copy_timestamp; in vb2_thread()
3083 vb = vb2_get_buffer(q, index++); in vb2_thread()
3088 call_void_qop(q, wait_finish, q); in vb2_thread()
3090 ret = vb2_core_dqbuf(q, &index, NULL, 0); in vb2_thread()
3091 call_void_qop(q, wait_prepare, q); in vb2_thread()
3092 dprintk(q, 5, "file io: vb2_dqbuf result: %d\n", ret); in vb2_thread()
3094 vb = vb2_get_buffer(q, index); in vb2_thread()
3103 call_void_qop(q, wait_finish, q); in vb2_thread()
3107 ret = vb2_core_qbuf(q, vb, NULL, NULL); in vb2_thread()
3108 call_void_qop(q, wait_prepare, q); in vb2_thread()
3126 int vb2_thread_start(struct vb2_queue *q, vb2_thread_fnc fnc, void *priv, in vb2_thread_start() argument
3132 if (q->threadio) in vb2_thread_start()
3134 if (vb2_is_busy(q)) in vb2_thread_start()
3136 if (WARN_ON(q->fileio)) in vb2_thread_start()
3145 ret = __vb2_init_fileio(q, !q->is_output); in vb2_thread_start()
3146 dprintk(q, 3, "file io: vb2_init_fileio result: %d\n", ret); in vb2_thread_start()
3149 q->threadio = threadio; in vb2_thread_start()
3150 threadio->thread = kthread_run(vb2_thread, q, "vb2-%s", thread_name); in vb2_thread_start()
3159 __vb2_cleanup_fileio(q); in vb2_thread_start()
3166 int vb2_thread_stop(struct vb2_queue *q) in vb2_thread_stop() argument
3168 struct vb2_threadio_data *threadio = q->threadio; in vb2_thread_stop()
3175 vb2_queue_error(q); in vb2_thread_stop()
3177 __vb2_cleanup_fileio(q); in vb2_thread_stop()
3180 q->threadio = NULL; in vb2_thread_stop()