65
65
static struct v4l2_m2m_queue_ctx *get_queue_ctx(struct v4l2_m2m_ctx *m2m_ctx,
66
66
enum v4l2_buf_type type)
69
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
68
if (V4L2_TYPE_IS_OUTPUT(type))
69
return &m2m_ctx->out_q_ctx;
70
71
return &m2m_ctx->cap_q_ctx;
71
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
72
return &m2m_ctx->out_q_ctx;
74
printk(KERN_ERR "Invalid buffer type\n");
80
* v4l2_m2m_get_vq() - return videobuf_queue for the given type
75
* v4l2_m2m_get_vq() - return vb2_queue for the given type
82
struct videobuf_queue *v4l2_m2m_get_vq(struct v4l2_m2m_ctx *m2m_ctx,
77
struct vb2_queue *v4l2_m2m_get_vq(struct v4l2_m2m_ctx *m2m_ctx,
83
78
enum v4l2_buf_type type)
85
80
struct v4l2_m2m_queue_ctx *q_ctx;
96
91
* v4l2_m2m_next_buf() - return next buffer from the list of ready buffers
98
void *v4l2_m2m_next_buf(struct v4l2_m2m_ctx *m2m_ctx, enum v4l2_buf_type type)
93
void *v4l2_m2m_next_buf(struct v4l2_m2m_queue_ctx *q_ctx)
100
struct v4l2_m2m_queue_ctx *q_ctx;
101
struct videobuf_buffer *vb = NULL;
95
struct v4l2_m2m_buffer *b = NULL;
102
96
unsigned long flags;
104
q_ctx = get_queue_ctx(m2m_ctx, type);
108
spin_lock_irqsave(q_ctx->q.irqlock, flags);
98
spin_lock_irqsave(&q_ctx->rdy_spinlock, flags);
110
100
if (list_empty(&q_ctx->rdy_queue))
113
vb = list_entry(q_ctx->rdy_queue.next, struct videobuf_buffer, queue);
114
vb->state = VIDEOBUF_ACTIVE;
103
b = list_entry(q_ctx->rdy_queue.next, struct v4l2_m2m_buffer, list);
117
spin_unlock_irqrestore(q_ctx->q.irqlock, flags);
105
spin_unlock_irqrestore(&q_ctx->rdy_spinlock, flags);
120
108
EXPORT_SYMBOL_GPL(v4l2_m2m_next_buf);
123
111
* v4l2_m2m_buf_remove() - take off a buffer from the list of ready buffers and
126
void *v4l2_m2m_buf_remove(struct v4l2_m2m_ctx *m2m_ctx, enum v4l2_buf_type type)
114
void *v4l2_m2m_buf_remove(struct v4l2_m2m_queue_ctx *q_ctx)
128
struct v4l2_m2m_queue_ctx *q_ctx;
129
struct videobuf_buffer *vb = NULL;
116
struct v4l2_m2m_buffer *b = NULL;
130
117
unsigned long flags;
132
q_ctx = get_queue_ctx(m2m_ctx, type);
136
spin_lock_irqsave(q_ctx->q.irqlock, flags);
119
spin_lock_irqsave(&q_ctx->rdy_spinlock, flags);
137
120
if (!list_empty(&q_ctx->rdy_queue)) {
138
vb = list_entry(q_ctx->rdy_queue.next, struct videobuf_buffer,
140
list_del(&vb->queue);
121
b = list_entry(q_ctx->rdy_queue.next, struct v4l2_m2m_buffer,
141
124
q_ctx->num_rdy--;
143
spin_unlock_irqrestore(q_ctx->q.irqlock, flags);
126
spin_unlock_irqrestore(&q_ctx->rdy_spinlock, flags);
147
130
EXPORT_SYMBOL_GPL(v4l2_m2m_buf_remove);
238
spin_lock_irqsave(m2m_ctx->out_q_ctx.q.irqlock, flags);
221
spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags);
239
222
if (list_empty(&m2m_ctx->out_q_ctx.rdy_queue)) {
240
spin_unlock_irqrestore(m2m_ctx->out_q_ctx.q.irqlock, flags);
223
spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags);
241
224
spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job);
242
225
dprintk("No input buffers available\n");
245
228
if (list_empty(&m2m_ctx->cap_q_ctx.rdy_queue)) {
246
spin_unlock_irqrestore(m2m_ctx->out_q_ctx.q.irqlock, flags);
229
spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags);
247
230
spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job);
248
231
dprintk("No output buffers available\n");
251
spin_unlock_irqrestore(m2m_ctx->out_q_ctx.q.irqlock, flags);
234
spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags);
253
236
if (m2m_dev->m2m_ops->job_ready
254
237
&& (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) {
324
308
int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
325
309
struct v4l2_buffer *buf)
327
struct videobuf_queue *vq;
311
struct vb2_queue *vq;
330
315
vq = v4l2_m2m_get_vq(m2m_ctx, buf->type);
331
ret = videobuf_querybuf(vq, buf);
316
ret = vb2_querybuf(vq, buf);
333
if (buf->memory == V4L2_MEMORY_MMAP
334
&& vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
335
buf->m.offset += DST_QUEUE_OFF_BASE;
318
/* Adjust MMAP memory offsets for the CAPTURE queue */
319
if (buf->memory == V4L2_MEMORY_MMAP && !V4L2_TYPE_IS_OUTPUT(vq->type)) {
320
if (V4L2_TYPE_IS_MULTIPLANAR(vq->type)) {
321
for (i = 0; i < buf->length; ++i)
322
buf->m.planes[i].m.mem_offset
323
+= DST_QUEUE_OFF_BASE;
325
buf->m.offset += DST_QUEUE_OFF_BASE;
414
405
unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
415
406
struct poll_table_struct *wait)
417
struct videobuf_queue *src_q, *dst_q;
418
struct videobuf_buffer *src_vb = NULL, *dst_vb = NULL;
408
struct vb2_queue *src_q, *dst_q;
409
struct vb2_buffer *src_vb = NULL, *dst_vb = NULL;
419
410
unsigned int rc = 0;
421
413
src_q = v4l2_m2m_get_src_vq(m2m_ctx);
422
414
dst_q = v4l2_m2m_get_dst_vq(m2m_ctx);
424
videobuf_queue_lock(src_q);
425
videobuf_queue_lock(dst_q);
427
if (src_q->streaming && !list_empty(&src_q->stream))
428
src_vb = list_first_entry(&src_q->stream,
429
struct videobuf_buffer, stream);
430
if (dst_q->streaming && !list_empty(&dst_q->stream))
431
dst_vb = list_first_entry(&dst_q->stream,
432
struct videobuf_buffer, stream);
434
if (!src_vb && !dst_vb) {
417
* There has to be at least one buffer queued on each queued_list, which
418
* means either in driver already or waiting for driver to claim it
419
* and start processing.
421
if ((!src_q->streaming || list_empty(&src_q->queued_list))
422
&& (!dst_q->streaming || list_empty(&dst_q->queued_list))) {
440
poll_wait(file, &src_vb->done, wait);
441
if (src_vb->state == VIDEOBUF_DONE
442
|| src_vb->state == VIDEOBUF_ERROR)
443
rc |= POLLOUT | POLLWRNORM;
446
poll_wait(file, &dst_vb->done, wait);
447
if (dst_vb->state == VIDEOBUF_DONE
448
|| dst_vb->state == VIDEOBUF_ERROR)
449
rc |= POLLIN | POLLRDNORM;
427
if (m2m_ctx->m2m_dev->m2m_ops->unlock)
428
m2m_ctx->m2m_dev->m2m_ops->unlock(m2m_ctx->priv);
430
poll_wait(file, &src_q->done_wq, wait);
431
poll_wait(file, &dst_q->done_wq, wait);
433
if (m2m_ctx->m2m_dev->m2m_ops->lock)
434
m2m_ctx->m2m_dev->m2m_ops->lock(m2m_ctx->priv);
436
spin_lock_irqsave(&src_q->done_lock, flags);
437
if (!list_empty(&src_q->done_list))
438
src_vb = list_first_entry(&src_q->done_list, struct vb2_buffer,
440
if (src_vb && (src_vb->state == VB2_BUF_STATE_DONE
441
|| src_vb->state == VB2_BUF_STATE_ERROR))
442
rc |= POLLOUT | POLLWRNORM;
443
spin_unlock_irqrestore(&src_q->done_lock, flags);
445
spin_lock_irqsave(&dst_q->done_lock, flags);
446
if (!list_empty(&dst_q->done_list))
447
dst_vb = list_first_entry(&dst_q->done_list, struct vb2_buffer,
449
if (dst_vb && (dst_vb->state == VB2_BUF_STATE_DONE
450
|| dst_vb->state == VB2_BUF_STATE_ERROR))
451
rc |= POLLIN | POLLRDNORM;
452
spin_unlock_irqrestore(&dst_q->done_lock, flags);
453
videobuf_queue_unlock(dst_q);
454
videobuf_queue_unlock(src_q);
457
457
EXPORT_SYMBOL_GPL(v4l2_m2m_poll);
532
532
* Usually called from driver's open() function.
534
struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(void *priv, struct v4l2_m2m_dev *m2m_dev,
535
void (*vq_init)(void *priv, struct videobuf_queue *,
534
struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev,
536
int (*queue_init)(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq))
538
538
struct v4l2_m2m_ctx *m2m_ctx;
539
539
struct v4l2_m2m_queue_ctx *out_q_ctx, *cap_q_ctx;
542
return ERR_PTR(-EINVAL);
544
542
m2m_ctx = kzalloc(sizeof *m2m_ctx, GFP_KERNEL);
546
544
return ERR_PTR(-ENOMEM);
548
m2m_ctx->priv = priv;
546
m2m_ctx->priv = drv_priv;
549
547
m2m_ctx->m2m_dev = m2m_dev;
548
init_waitqueue_head(&m2m_ctx->finished);
551
out_q_ctx = get_queue_ctx(m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
552
cap_q_ctx = get_queue_ctx(m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
550
out_q_ctx = &m2m_ctx->out_q_ctx;
551
cap_q_ctx = &m2m_ctx->cap_q_ctx;
554
553
INIT_LIST_HEAD(&out_q_ctx->rdy_queue);
555
554
INIT_LIST_HEAD(&cap_q_ctx->rdy_queue);
555
spin_lock_init(&out_q_ctx->rdy_spinlock);
556
spin_lock_init(&cap_q_ctx->rdy_spinlock);
557
558
INIT_LIST_HEAD(&m2m_ctx->queue);
559
vq_init(priv, &out_q_ctx->q, V4L2_BUF_TYPE_VIDEO_OUTPUT);
560
vq_init(priv, &cap_q_ctx->q, V4L2_BUF_TYPE_VIDEO_CAPTURE);
561
out_q_ctx->q.priv_data = cap_q_ctx->q.priv_data = priv;
560
ret = queue_init(drv_priv, &out_q_ctx->q, &cap_q_ctx->q);
565
570
EXPORT_SYMBOL_GPL(v4l2_m2m_ctx_init);
582
586
spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
583
587
m2m_dev->m2m_ops->job_abort(m2m_ctx->priv);
584
588
dprintk("m2m_ctx %p running, will wait to complete", m2m_ctx);
585
vb = v4l2_m2m_next_dst_buf(m2m_ctx);
587
wait_event(vb->done, vb->state != VIDEOBUF_ACTIVE
588
&& vb->state != VIDEOBUF_QUEUED);
589
wait_event(m2m_ctx->finished, !(m2m_ctx->job_flags & TRANS_RUNNING));
589
590
} else if (m2m_ctx->job_flags & TRANS_QUEUED) {
590
591
list_del(&m2m_ctx->queue);
591
592
m2m_ctx->job_flags &= ~(TRANS_QUEUED | TRANS_RUNNING);
611
609
* v4l2_m2m_buf_queue() - add a buffer to the proper ready buffers list.
613
611
* Call from buf_queue(), videobuf_queue_ops callback.
615
* Locking: Caller holds q->irqlock (taken by videobuf before calling buf_queue
616
* callback in the driver).
618
void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx, struct videobuf_queue *vq,
619
struct videobuf_buffer *vb)
613
void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_buffer *vb)
615
struct v4l2_m2m_buffer *b = container_of(vb, struct v4l2_m2m_buffer, vb);
621
616
struct v4l2_m2m_queue_ctx *q_ctx;
623
q_ctx = get_queue_ctx(m2m_ctx, vq->type);
619
q_ctx = get_queue_ctx(m2m_ctx, vb->vb2_queue->type);
627
list_add_tail(&vb->queue, &q_ctx->rdy_queue);
623
spin_lock_irqsave(&q_ctx->rdy_spinlock, flags);
624
list_add_tail(&b->list, &q_ctx->rdy_queue);
628
625
q_ctx->num_rdy++;
630
vb->state = VIDEOBUF_QUEUED;
626
spin_unlock_irqrestore(&q_ctx->rdy_spinlock, flags);
632
628
EXPORT_SYMBOL_GPL(v4l2_m2m_buf_queue);