Lines Matching refs:q
92 #define log_qop(q, op) \ argument
93 dprintk(2, "call_qop(%p, %s)%s\n", q, #op, \
94 (q)->ops->op ? "" : " (nop)")
96 #define call_qop(q, op, args...) \ argument
100 log_qop(q, op); \
101 err = (q)->ops->op ? (q)->ops->op(args) : 0; \
103 (q)->cnt_ ## op++; \
107 #define call_void_qop(q, op, args...) \ argument
109 log_qop(q, op); \
110 if ((q)->ops->op) \
111 (q)->ops->op(args); \
112 (q)->cnt_ ## op++; \
156 #define call_qop(q, op, args...) \ argument
157 ((q)->ops->op ? (q)->ops->op(args) : 0)
159 #define call_void_qop(q, op, args...) \ argument
161 if ((q)->ops->op) \
162 (q)->ops->op(args); \
176 #define call_bufop(q, op, args...) \ argument
179 if (q && q->buf_ops && q->buf_ops->op) \
180 ret = q->buf_ops->op(args); \
184 #define call_void_bufop(q, op, args...) \ argument
186 if (q && q->buf_ops && q->buf_ops->op) \
187 q->buf_ops->op(args); \
190 static void __vb2_queue_cancel(struct vb2_queue *q);
198 struct vb2_queue *q = vb->vb2_queue; in __vb2_buf_mem_alloc() local
211 q->alloc_devs[plane] ? : q->dev, in __vb2_buf_mem_alloc()
212 q->dma_attrs, size, q->dma_dir, q->gfp_flags); in __vb2_buf_mem_alloc()
300 struct vb2_queue *q = vb->vb2_queue; in __setup_offsets() local
305 struct vb2_buffer *prev = q->bufs[vb->index - 1]; in __setup_offsets()
329 static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory, in __vb2_queue_alloc() argument
339 VB2_MAX_FRAME - q->num_buffers); in __vb2_queue_alloc()
343 vb = kzalloc(q->buf_struct_size, GFP_KERNEL); in __vb2_queue_alloc()
350 vb->vb2_queue = q; in __vb2_queue_alloc()
352 vb->index = q->num_buffers + buffer; in __vb2_queue_alloc()
353 vb->type = q->type; in __vb2_queue_alloc()
359 q->bufs[vb->index] = vb; in __vb2_queue_alloc()
367 q->bufs[vb->index] = NULL; in __vb2_queue_alloc()
382 q->bufs[vb->index] = NULL; in __vb2_queue_alloc()
398 static void __vb2_free_mem(struct vb2_queue *q, unsigned int buffers) in __vb2_free_mem() argument
403 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_free_mem()
405 vb = q->bufs[buffer]; in __vb2_free_mem()
410 if (q->memory == VB2_MEMORY_MMAP) in __vb2_free_mem()
412 else if (q->memory == VB2_MEMORY_DMABUF) in __vb2_free_mem()
424 static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers) in __vb2_queue_free() argument
436 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_queue_free()
438 if (q->bufs[buffer] == NULL) in __vb2_queue_free()
440 if (q->bufs[buffer]->state == VB2_BUF_STATE_PREPARING) { in __vb2_queue_free()
447 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_queue_free()
449 struct vb2_buffer *vb = q->bufs[buffer]; in __vb2_queue_free()
456 __vb2_free_mem(q, buffers); in __vb2_queue_free()
464 if (q->num_buffers) { in __vb2_queue_free()
465 bool unbalanced = q->cnt_start_streaming != q->cnt_stop_streaming || in __vb2_queue_free()
466 q->cnt_wait_prepare != q->cnt_wait_finish; in __vb2_queue_free()
469 pr_info("counters for queue %p:%s\n", q, in __vb2_queue_free()
472 q->cnt_queue_setup, q->cnt_start_streaming, in __vb2_queue_free()
473 q->cnt_stop_streaming); in __vb2_queue_free()
475 q->cnt_wait_prepare, q->cnt_wait_finish); in __vb2_queue_free()
477 q->cnt_queue_setup = 0; in __vb2_queue_free()
478 q->cnt_wait_prepare = 0; in __vb2_queue_free()
479 q->cnt_wait_finish = 0; in __vb2_queue_free()
480 q->cnt_start_streaming = 0; in __vb2_queue_free()
481 q->cnt_stop_streaming = 0; in __vb2_queue_free()
483 for (buffer = 0; buffer < q->num_buffers; ++buffer) { in __vb2_queue_free()
484 struct vb2_buffer *vb = q->bufs[buffer]; in __vb2_queue_free()
496 q, buffer, unbalanced ? " UNBALANCED!" : ""); in __vb2_queue_free()
521 for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; in __vb2_queue_free()
523 kfree(q->bufs[buffer]); in __vb2_queue_free()
524 q->bufs[buffer] = NULL; in __vb2_queue_free()
527 q->num_buffers -= buffers; in __vb2_queue_free()
528 if (!q->num_buffers) { in __vb2_queue_free()
529 q->memory = VB2_MEMORY_UNKNOWN; in __vb2_queue_free()
530 INIT_LIST_HEAD(&q->queued_list); in __vb2_queue_free()
535 bool vb2_buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb) in vb2_buffer_in_use() argument
557 static bool __buffers_in_use(struct vb2_queue *q) in __buffers_in_use() argument
560 for (buffer = 0; buffer < q->num_buffers; ++buffer) { in __buffers_in_use()
561 if (vb2_buffer_in_use(q, q->bufs[buffer])) in __buffers_in_use()
567 void vb2_core_querybuf(struct vb2_queue *q, unsigned int index, void *pb) in vb2_core_querybuf() argument
569 call_void_bufop(q, fill_user_buffer, q->bufs[index], pb); in vb2_core_querybuf()
577 static int __verify_userptr_ops(struct vb2_queue *q) in __verify_userptr_ops() argument
579 if (!(q->io_modes & VB2_USERPTR) || !q->mem_ops->get_userptr || in __verify_userptr_ops()
580 !q->mem_ops->put_userptr) in __verify_userptr_ops()
590 static int __verify_mmap_ops(struct vb2_queue *q) in __verify_mmap_ops() argument
592 if (!(q->io_modes & VB2_MMAP) || !q->mem_ops->alloc || in __verify_mmap_ops()
593 !q->mem_ops->put || !q->mem_ops->mmap) in __verify_mmap_ops()
603 static int __verify_dmabuf_ops(struct vb2_queue *q) in __verify_dmabuf_ops() argument
605 if (!(q->io_modes & VB2_DMABUF) || !q->mem_ops->attach_dmabuf || in __verify_dmabuf_ops()
606 !q->mem_ops->detach_dmabuf || !q->mem_ops->map_dmabuf || in __verify_dmabuf_ops()
607 !q->mem_ops->unmap_dmabuf) in __verify_dmabuf_ops()
613 int vb2_verify_memory_type(struct vb2_queue *q, in vb2_verify_memory_type() argument
622 if (type != q->type) { in vb2_verify_memory_type()
631 if (memory == VB2_MEMORY_MMAP && __verify_mmap_ops(q)) { in vb2_verify_memory_type()
636 if (memory == VB2_MEMORY_USERPTR && __verify_userptr_ops(q)) { in vb2_verify_memory_type()
641 if (memory == VB2_MEMORY_DMABUF && __verify_dmabuf_ops(q)) { in vb2_verify_memory_type()
651 if (vb2_fileio_is_active(q)) { in vb2_verify_memory_type()
659 int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory, in vb2_core_reqbufs() argument
666 if (q->streaming) { in vb2_core_reqbufs()
671 if (*count == 0 || q->num_buffers != 0 || in vb2_core_reqbufs()
672 (q->memory != VB2_MEMORY_UNKNOWN && q->memory != memory)) { in vb2_core_reqbufs()
677 mutex_lock(&q->mmap_lock); in vb2_core_reqbufs()
678 if (q->memory == VB2_MEMORY_MMAP && __buffers_in_use(q)) { in vb2_core_reqbufs()
679 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
689 __vb2_queue_cancel(q); in vb2_core_reqbufs()
690 ret = __vb2_queue_free(q, q->num_buffers); in vb2_core_reqbufs()
691 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
706 WARN_ON(q->min_buffers_needed > VB2_MAX_FRAME); in vb2_core_reqbufs()
707 num_buffers = max_t(unsigned int, *count, q->min_buffers_needed); in vb2_core_reqbufs()
709 memset(q->alloc_devs, 0, sizeof(q->alloc_devs)); in vb2_core_reqbufs()
710 q->memory = memory; in vb2_core_reqbufs()
716 ret = call_qop(q, queue_setup, q, &num_buffers, &num_planes, in vb2_core_reqbufs()
717 plane_sizes, q->alloc_devs); in vb2_core_reqbufs()
723 __vb2_queue_alloc(q, memory, num_buffers, num_planes, plane_sizes); in vb2_core_reqbufs()
733 if (allocated_buffers < q->min_buffers_needed) in vb2_core_reqbufs()
749 ret = call_qop(q, queue_setup, q, &num_buffers, in vb2_core_reqbufs()
750 &num_planes, plane_sizes, q->alloc_devs); in vb2_core_reqbufs()
761 mutex_lock(&q->mmap_lock); in vb2_core_reqbufs()
762 q->num_buffers = allocated_buffers; in vb2_core_reqbufs()
769 __vb2_queue_free(q, allocated_buffers); in vb2_core_reqbufs()
770 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
773 mutex_unlock(&q->mmap_lock); in vb2_core_reqbufs()
780 q->waiting_for_buffers = !q->is_output; in vb2_core_reqbufs()
786 int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory, in vb2_core_create_bufs() argument
794 if (q->num_buffers == VB2_MAX_FRAME) { in vb2_core_create_bufs()
799 if (!q->num_buffers) { in vb2_core_create_bufs()
800 memset(q->alloc_devs, 0, sizeof(q->alloc_devs)); in vb2_core_create_bufs()
801 q->memory = memory; in vb2_core_create_bufs()
802 q->waiting_for_buffers = !q->is_output; in vb2_core_create_bufs()
805 num_buffers = min(*count, VB2_MAX_FRAME - q->num_buffers); in vb2_core_create_bufs()
816 ret = call_qop(q, queue_setup, q, &num_buffers, in vb2_core_create_bufs()
817 &num_planes, plane_sizes, q->alloc_devs); in vb2_core_create_bufs()
822 allocated_buffers = __vb2_queue_alloc(q, memory, num_buffers, in vb2_core_create_bufs()
839 ret = call_qop(q, queue_setup, q, &num_buffers, in vb2_core_create_bufs()
840 &num_planes, plane_sizes, q->alloc_devs); in vb2_core_create_bufs()
851 mutex_lock(&q->mmap_lock); in vb2_core_create_bufs()
852 q->num_buffers += allocated_buffers; in vb2_core_create_bufs()
859 __vb2_queue_free(q, allocated_buffers); in vb2_core_create_bufs()
860 mutex_unlock(&q->mmap_lock); in vb2_core_create_bufs()
863 mutex_unlock(&q->mmap_lock); in vb2_core_create_bufs()
896 struct vb2_queue *q = vb->vb2_queue; in vb2_buffer_done() local
926 spin_lock_irqsave(&q->done_lock, flags); in vb2_buffer_done()
932 list_add_tail(&vb->done_entry, &q->done_list); in vb2_buffer_done()
935 atomic_dec(&q->owned_by_drv_count); in vb2_buffer_done()
936 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_buffer_done()
938 trace_vb2_buf_done(q, vb); in vb2_buffer_done()
944 if (q->start_streaming_called) in vb2_buffer_done()
949 wake_up(&q->done_wq); in vb2_buffer_done()
955 void vb2_discard_done(struct vb2_queue *q) in vb2_discard_done() argument
960 spin_lock_irqsave(&q->done_lock, flags); in vb2_discard_done()
961 list_for_each_entry(vb, &q->done_list, done_entry) in vb2_discard_done()
963 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_discard_done()
986 struct vb2_queue *q = vb->vb2_queue; in __prepare_userptr() local
1038 q->alloc_devs[plane] ? : q->dev, in __prepare_userptr()
1040 planes[plane].length, q->dma_dir); in __prepare_userptr()
1102 struct vb2_queue *q = vb->vb2_queue; in __prepare_dmabuf() local
1163 q->alloc_devs[plane] ? : q->dev, in __prepare_dmabuf()
1164 dbuf, planes[plane].length, q->dma_dir); in __prepare_dmabuf()
1234 struct vb2_queue *q = vb->vb2_queue; in __enqueue_in_driver() local
1237 atomic_inc(&q->owned_by_drv_count); in __enqueue_in_driver()
1239 trace_vb2_buf_queue(q, vb); in __enqueue_in_driver()
1246 struct vb2_queue *q = vb->vb2_queue; in __buf_prepare() local
1250 if (q->error) { in __buf_prepare()
1257 switch (q->memory) { in __buf_prepare()
1287 int vb2_core_prepare_buf(struct vb2_queue *q, unsigned int index, void *pb) in vb2_core_prepare_buf() argument
1292 vb = q->bufs[index]; in vb2_core_prepare_buf()
1304 call_void_bufop(q, fill_user_buffer, vb, pb); in vb2_core_prepare_buf()
1323 static int vb2_start_streaming(struct vb2_queue *q) in vb2_start_streaming() argument
1332 list_for_each_entry(vb, &q->queued_list, queued_entry) in vb2_start_streaming()
1336 q->start_streaming_called = 1; in vb2_start_streaming()
1337 ret = call_qop(q, start_streaming, q, in vb2_start_streaming()
1338 atomic_read(&q->owned_by_drv_count)); in vb2_start_streaming()
1342 q->start_streaming_called = 0; in vb2_start_streaming()
1351 if (WARN_ON(atomic_read(&q->owned_by_drv_count))) { in vb2_start_streaming()
1358 for (i = 0; i < q->num_buffers; ++i) { in vb2_start_streaming()
1359 vb = q->bufs[i]; in vb2_start_streaming()
1364 WARN_ON(atomic_read(&q->owned_by_drv_count)); in vb2_start_streaming()
1371 WARN_ON(!list_empty(&q->done_list)); in vb2_start_streaming()
1375 int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb) in vb2_core_qbuf() argument
1380 if (q->error) { in vb2_core_qbuf()
1385 vb = q->bufs[index]; in vb2_core_qbuf()
1407 list_add_tail(&vb->queued_entry, &q->queued_list); in vb2_core_qbuf()
1408 q->queued_count++; in vb2_core_qbuf()
1409 q->waiting_for_buffers = false; in vb2_core_qbuf()
1413 call_void_bufop(q, copy_timestamp, vb, pb); in vb2_core_qbuf()
1415 trace_vb2_qbuf(q, vb); in vb2_core_qbuf()
1421 if (q->start_streaming_called) in vb2_core_qbuf()
1426 call_void_bufop(q, fill_user_buffer, vb, pb); in vb2_core_qbuf()
1434 if (q->streaming && !q->start_streaming_called && in vb2_core_qbuf()
1435 q->queued_count >= q->min_buffers_needed) { in vb2_core_qbuf()
1436 ret = vb2_start_streaming(q); in vb2_core_qbuf()
1452 static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) in __vb2_wait_for_done_vb() argument
1466 if (!q->streaming) { in __vb2_wait_for_done_vb()
1471 if (q->error) { in __vb2_wait_for_done_vb()
1476 if (q->last_buffer_dequeued) { in __vb2_wait_for_done_vb()
1481 if (!list_empty(&q->done_list)) { in __vb2_wait_for_done_vb()
1498 call_void_qop(q, wait_prepare, q); in __vb2_wait_for_done_vb()
1504 ret = wait_event_interruptible(q->done_wq, in __vb2_wait_for_done_vb()
1505 !list_empty(&q->done_list) || !q->streaming || in __vb2_wait_for_done_vb()
1506 q->error); in __vb2_wait_for_done_vb()
1512 call_void_qop(q, wait_finish, q); in __vb2_wait_for_done_vb()
1526 static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, in __vb2_get_done_vb() argument
1535 ret = __vb2_wait_for_done_vb(q, nonblocking); in __vb2_get_done_vb()
1543 spin_lock_irqsave(&q->done_lock, flags); in __vb2_get_done_vb()
1544 *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry); in __vb2_get_done_vb()
1551 ret = call_bufop(q, verify_planes_array, *vb, pb); in __vb2_get_done_vb()
1554 spin_unlock_irqrestore(&q->done_lock, flags); in __vb2_get_done_vb()
1559 int vb2_wait_for_all_buffers(struct vb2_queue *q) in vb2_wait_for_all_buffers() argument
1561 if (!q->streaming) { in vb2_wait_for_all_buffers()
1566 if (q->start_streaming_called) in vb2_wait_for_all_buffers()
1567 wait_event(q->done_wq, !atomic_read(&q->owned_by_drv_count)); in vb2_wait_for_all_buffers()
1577 struct vb2_queue *q = vb->vb2_queue; in __vb2_dqbuf() local
1587 if (q->memory == VB2_MEMORY_DMABUF) in __vb2_dqbuf()
1596 int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb, in vb2_core_dqbuf() argument
1602 ret = __vb2_get_done_vb(q, &vb, pb, nonblocking); in vb2_core_dqbuf()
1625 call_void_bufop(q, fill_user_buffer, vb, pb); in vb2_core_dqbuf()
1629 q->queued_count--; in vb2_core_dqbuf()
1631 trace_vb2_dqbuf(q, vb); in vb2_core_dqbuf()
1650 static void __vb2_queue_cancel(struct vb2_queue *q) in __vb2_queue_cancel() argument
1658 if (q->start_streaming_called) in __vb2_queue_cancel()
1659 call_void_qop(q, stop_streaming, q); in __vb2_queue_cancel()
1667 if (WARN_ON(atomic_read(&q->owned_by_drv_count))) { in __vb2_queue_cancel()
1668 for (i = 0; i < q->num_buffers; ++i) in __vb2_queue_cancel()
1669 if (q->bufs[i]->state == VB2_BUF_STATE_ACTIVE) { in __vb2_queue_cancel()
1671 q->bufs[i]); in __vb2_queue_cancel()
1672 vb2_buffer_done(q->bufs[i], VB2_BUF_STATE_ERROR); in __vb2_queue_cancel()
1675 WARN_ON(atomic_read(&q->owned_by_drv_count)); in __vb2_queue_cancel()
1678 q->streaming = 0; in __vb2_queue_cancel()
1679 q->start_streaming_called = 0; in __vb2_queue_cancel()
1680 q->queued_count = 0; in __vb2_queue_cancel()
1681 q->error = 0; in __vb2_queue_cancel()
1686 INIT_LIST_HEAD(&q->queued_list); in __vb2_queue_cancel()
1691 INIT_LIST_HEAD(&q->done_list); in __vb2_queue_cancel()
1692 atomic_set(&q->owned_by_drv_count, 0); in __vb2_queue_cancel()
1693 wake_up_all(&q->done_wq); in __vb2_queue_cancel()
1704 for (i = 0; i < q->num_buffers; ++i) { in __vb2_queue_cancel()
1705 struct vb2_buffer *vb = q->bufs[i]; in __vb2_queue_cancel()
1724 int vb2_core_streamon(struct vb2_queue *q, unsigned int type) in vb2_core_streamon() argument
1728 if (type != q->type) { in vb2_core_streamon()
1733 if (q->streaming) { in vb2_core_streamon()
1738 if (!q->num_buffers) { in vb2_core_streamon()
1743 if (q->num_buffers < q->min_buffers_needed) { in vb2_core_streamon()
1745 q->min_buffers_needed); in vb2_core_streamon()
1753 if (q->queued_count >= q->min_buffers_needed) { in vb2_core_streamon()
1754 ret = v4l_vb2q_enable_media_source(q); in vb2_core_streamon()
1757 ret = vb2_start_streaming(q); in vb2_core_streamon()
1759 __vb2_queue_cancel(q); in vb2_core_streamon()
1764 q->streaming = 1; in vb2_core_streamon()
1771 void vb2_queue_error(struct vb2_queue *q) in vb2_queue_error() argument
1773 q->error = 1; in vb2_queue_error()
1775 wake_up_all(&q->done_wq); in vb2_queue_error()
1779 int vb2_core_streamoff(struct vb2_queue *q, unsigned int type) in vb2_core_streamoff() argument
1781 if (type != q->type) { in vb2_core_streamoff()
1795 __vb2_queue_cancel(q); in vb2_core_streamoff()
1796 q->waiting_for_buffers = !q->is_output; in vb2_core_streamoff()
1797 q->last_buffer_dequeued = false; in vb2_core_streamoff()
1807 static int __find_plane_by_offset(struct vb2_queue *q, unsigned long off, in __find_plane_by_offset() argument
1818 for (buffer = 0; buffer < q->num_buffers; ++buffer) { in __find_plane_by_offset()
1819 vb = q->bufs[buffer]; in __find_plane_by_offset()
1833 int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type, in vb2_core_expbuf() argument
1841 if (q->memory != VB2_MEMORY_MMAP) { in vb2_core_expbuf()
1846 if (!q->mem_ops->get_dmabuf) { in vb2_core_expbuf()
1856 if (type != q->type) { in vb2_core_expbuf()
1861 if (index >= q->num_buffers) { in vb2_core_expbuf()
1866 vb = q->bufs[index]; in vb2_core_expbuf()
1873 if (vb2_fileio_is_active(q)) { in vb2_core_expbuf()
1904 int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma) in vb2_mmap() argument
1912 if (q->memory != VB2_MEMORY_MMAP) { in vb2_mmap()
1924 if (q->is_output) { in vb2_mmap()
1935 if (vb2_fileio_is_active(q)) { in vb2_mmap()
1943 ret = __find_plane_by_offset(q, off, &buffer, &plane); in vb2_mmap()
1947 vb = q->bufs[buffer]; in vb2_mmap()
1961 mutex_lock(&q->mmap_lock); in vb2_mmap()
1963 mutex_unlock(&q->mmap_lock); in vb2_mmap()
1973 unsigned long vb2_get_unmapped_area(struct vb2_queue *q, in vb2_get_unmapped_area() argument
1985 if (q->memory != VB2_MEMORY_MMAP) { in vb2_get_unmapped_area()
1993 ret = __find_plane_by_offset(q, off, &buffer, &plane); in vb2_get_unmapped_area()
1997 vb = q->bufs[buffer]; in vb2_get_unmapped_area()
2005 int vb2_core_queue_init(struct vb2_queue *q) in vb2_core_queue_init() argument
2010 if (WARN_ON(!q) || in vb2_core_queue_init()
2011 WARN_ON(!q->ops) || in vb2_core_queue_init()
2012 WARN_ON(!q->mem_ops) || in vb2_core_queue_init()
2013 WARN_ON(!q->type) || in vb2_core_queue_init()
2014 WARN_ON(!q->io_modes) || in vb2_core_queue_init()
2015 WARN_ON(!q->ops->queue_setup) || in vb2_core_queue_init()
2016 WARN_ON(!q->ops->buf_queue)) in vb2_core_queue_init()
2019 INIT_LIST_HEAD(&q->queued_list); in vb2_core_queue_init()
2020 INIT_LIST_HEAD(&q->done_list); in vb2_core_queue_init()
2021 spin_lock_init(&q->done_lock); in vb2_core_queue_init()
2022 mutex_init(&q->mmap_lock); in vb2_core_queue_init()
2023 init_waitqueue_head(&q->done_wq); in vb2_core_queue_init()
2025 q->memory = VB2_MEMORY_UNKNOWN; in vb2_core_queue_init()
2027 if (q->buf_struct_size == 0) in vb2_core_queue_init()
2028 q->buf_struct_size = sizeof(struct vb2_buffer); in vb2_core_queue_init()
2030 if (q->bidirectional) in vb2_core_queue_init()
2031 q->dma_dir = DMA_BIDIRECTIONAL; in vb2_core_queue_init()
2033 q->dma_dir = q->is_output ? DMA_TO_DEVICE : DMA_FROM_DEVICE; in vb2_core_queue_init()
2039 static int __vb2_init_fileio(struct vb2_queue *q, int read);
2040 static int __vb2_cleanup_fileio(struct vb2_queue *q);
2041 void vb2_core_queue_release(struct vb2_queue *q) in vb2_core_queue_release() argument
2043 __vb2_cleanup_fileio(q); in vb2_core_queue_release()
2044 __vb2_queue_cancel(q); in vb2_core_queue_release()
2045 mutex_lock(&q->mmap_lock); in vb2_core_queue_release()
2046 __vb2_queue_free(q, q->num_buffers); in vb2_core_queue_release()
2047 mutex_unlock(&q->mmap_lock); in vb2_core_queue_release()
2051 __poll_t vb2_core_poll(struct vb2_queue *q, struct file *file, in vb2_core_poll() argument
2058 if (!q->is_output && !(req_events & (EPOLLIN | EPOLLRDNORM))) in vb2_core_poll()
2060 if (q->is_output && !(req_events & (EPOLLOUT | EPOLLWRNORM))) in vb2_core_poll()
2066 if (q->num_buffers == 0 && !vb2_fileio_is_active(q)) { in vb2_core_poll()
2067 if (!q->is_output && (q->io_modes & VB2_READ) && in vb2_core_poll()
2069 if (__vb2_init_fileio(q, 1)) in vb2_core_poll()
2072 if (q->is_output && (q->io_modes & VB2_WRITE) && in vb2_core_poll()
2074 if (__vb2_init_fileio(q, 0)) in vb2_core_poll()
2087 if (!vb2_is_streaming(q) || q->error) in vb2_core_poll()
2096 if (q->quirk_poll_must_check_waiting_for_buffers && in vb2_core_poll()
2097 q->waiting_for_buffers && (req_events & (EPOLLIN | EPOLLRDNORM))) in vb2_core_poll()
2104 if (q->is_output && q->fileio && q->queued_count < q->num_buffers) in vb2_core_poll()
2107 if (list_empty(&q->done_list)) { in vb2_core_poll()
2112 if (q->last_buffer_dequeued) in vb2_core_poll()
2115 poll_wait(file, &q->done_wq, wait); in vb2_core_poll()
2121 spin_lock_irqsave(&q->done_lock, flags); in vb2_core_poll()
2122 if (!list_empty(&q->done_list)) in vb2_core_poll()
2123 vb = list_first_entry(&q->done_list, struct vb2_buffer, in vb2_core_poll()
2125 spin_unlock_irqrestore(&q->done_lock, flags); in vb2_core_poll()
2129 return (q->is_output) ? in vb2_core_poll()
2193 static int __vb2_init_fileio(struct vb2_queue *q, int read) in __vb2_init_fileio() argument
2202 if (WARN_ON((read && !(q->io_modes & VB2_READ)) || in __vb2_init_fileio()
2203 (!read && !(q->io_modes & VB2_WRITE)))) in __vb2_init_fileio()
2209 if (!q->mem_ops->vaddr) in __vb2_init_fileio()
2215 if (q->streaming || q->num_buffers > 0) in __vb2_init_fileio()
2224 (read) ? "read" : "write", count, q->fileio_read_once, in __vb2_init_fileio()
2225 q->fileio_write_immediately); in __vb2_init_fileio()
2231 fileio->read_once = q->fileio_read_once; in __vb2_init_fileio()
2232 fileio->write_immediately = q->fileio_write_immediately; in __vb2_init_fileio()
2240 fileio->type = q->type; in __vb2_init_fileio()
2241 q->fileio = fileio; in __vb2_init_fileio()
2242 ret = vb2_core_reqbufs(q, fileio->memory, &fileio->count); in __vb2_init_fileio()
2250 if (q->bufs[0]->num_planes != 1) { in __vb2_init_fileio()
2258 for (i = 0; i < q->num_buffers; i++) { in __vb2_init_fileio()
2259 fileio->bufs[i].vaddr = vb2_plane_vaddr(q->bufs[i], 0); in __vb2_init_fileio()
2264 fileio->bufs[i].size = vb2_plane_size(q->bufs[i], 0); in __vb2_init_fileio()
2274 for (i = 0; i < q->num_buffers; i++) { in __vb2_init_fileio()
2275 ret = vb2_core_qbuf(q, i, NULL); in __vb2_init_fileio()
2284 fileio->initial_index = q->num_buffers; in __vb2_init_fileio()
2285 fileio->cur_index = q->num_buffers; in __vb2_init_fileio()
2291 ret = vb2_core_streamon(q, q->type); in __vb2_init_fileio()
2299 vb2_core_reqbufs(q, fileio->memory, &fileio->count); in __vb2_init_fileio()
2302 q->fileio = NULL; in __vb2_init_fileio()
2311 static int __vb2_cleanup_fileio(struct vb2_queue *q) in __vb2_cleanup_fileio() argument
2313 struct vb2_fileio_data *fileio = q->fileio; in __vb2_cleanup_fileio()
2316 vb2_core_streamoff(q, q->type); in __vb2_cleanup_fileio()
2317 q->fileio = NULL; in __vb2_cleanup_fileio()
2319 vb2_core_reqbufs(q, fileio->memory, &fileio->count); in __vb2_cleanup_fileio()
2335 static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_t count, in __vb2_perform_fileio() argument
2340 bool is_multiplanar = q->is_multiplanar; in __vb2_perform_fileio()
2346 bool copy_timestamp = !read && q->copy_timestamp; in __vb2_perform_fileio()
2360 if (!vb2_fileio_is_active(q)) { in __vb2_perform_fileio()
2361 ret = __vb2_init_fileio(q, read); in __vb2_perform_fileio()
2366 fileio = q->fileio; in __vb2_perform_fileio()
2372 if (index >= q->num_buffers) { in __vb2_perform_fileio()
2378 ret = vb2_core_dqbuf(q, &index, NULL, nonblock); in __vb2_perform_fileio()
2386 b = q->bufs[index]; in __vb2_perform_fileio()
2393 buf->size = read ? vb2_get_plane_payload(q->bufs[index], 0) in __vb2_perform_fileio()
2394 : vb2_plane_size(q->bufs[index], 0); in __vb2_perform_fileio()
2437 struct vb2_buffer *b = q->bufs[index]; in __vb2_perform_fileio()
2444 return __vb2_cleanup_fileio(q); in __vb2_perform_fileio()
2454 ret = vb2_core_qbuf(q, index, NULL); in __vb2_perform_fileio()
2464 buf->size = vb2_plane_size(q->bufs[index], 0); in __vb2_perform_fileio()
2470 if (fileio->initial_index < q->num_buffers) in __vb2_perform_fileio()
2490 size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count, in vb2_read() argument
2493 return __vb2_perform_fileio(q, data, count, ppos, nonblocking, 1); in vb2_read()
2497 size_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count, in vb2_write() argument
2500 return __vb2_perform_fileio(q, (char __user *) data, count, in vb2_write()
2514 struct vb2_queue *q = data; in vb2_thread() local
2515 struct vb2_threadio_data *threadio = q->threadio; in vb2_thread()
2521 if (q->is_output) { in vb2_thread()
2522 prequeue = q->num_buffers; in vb2_thread()
2523 copy_timestamp = q->copy_timestamp; in vb2_thread()
2535 vb = q->bufs[index++]; in vb2_thread()
2538 call_void_qop(q, wait_finish, q); in vb2_thread()
2540 ret = vb2_core_dqbuf(q, &index, NULL, 0); in vb2_thread()
2541 call_void_qop(q, wait_prepare, q); in vb2_thread()
2544 vb = q->bufs[index]; in vb2_thread()
2553 call_void_qop(q, wait_finish, q); in vb2_thread()
2557 ret = vb2_core_qbuf(q, vb->index, NULL); in vb2_thread()
2558 call_void_qop(q, wait_prepare, q); in vb2_thread()
2576 int vb2_thread_start(struct vb2_queue *q, vb2_thread_fnc fnc, void *priv, in vb2_thread_start() argument
2582 if (q->threadio) in vb2_thread_start()
2584 if (vb2_is_busy(q)) in vb2_thread_start()
2586 if (WARN_ON(q->fileio)) in vb2_thread_start()
2595 ret = __vb2_init_fileio(q, !q->is_output); in vb2_thread_start()
2599 q->threadio = threadio; in vb2_thread_start()
2600 threadio->thread = kthread_run(vb2_thread, q, "vb2-%s", thread_name); in vb2_thread_start()
2609 __vb2_cleanup_fileio(q); in vb2_thread_start()
2616 int vb2_thread_stop(struct vb2_queue *q) in vb2_thread_stop() argument
2618 struct vb2_threadio_data *threadio = q->threadio; in vb2_thread_stop()
2625 vb2_queue_error(q); in vb2_thread_stop()
2627 __vb2_cleanup_fileio(q); in vb2_thread_stop()
2630 q->threadio = NULL; in vb2_thread_stop()