videobuf-core.c 24.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * generic helper functions for handling video4linux capture buffers
 *
 * (c) 2007 Mauro Carvalho Chehab, <mchehab@infradead.org>
 *
 * Highly based on video-buf written originally by:
 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
 * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org>
 * (c) 2006 Ted Walther and John Sokol
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/interrupt.h>

#include <media/videobuf-core.h>

#define MAGIC_BUFFER 0x20070728
25 26 27 28
#define MAGIC_CHECK(is, should) do {					   \
	if (unlikely((is) != (should))) {				   \
	printk(KERN_ERR "magic mismatch: %x (expected %x)\n", is, should); \
	BUG(); } } while (0)
29

30
static int debug;
31 32 33 34 35 36
module_param(debug, int, 0644);

MODULE_DESCRIPTION("helper module to manage video4linux buffers");
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
MODULE_LICENSE("GPL");

37 38 39
#define dprintk(level, fmt, arg...) do {			\
	if (debug >= level) 					\
	printk(KERN_DEBUG "vbuf: " fmt , ## arg); } while (0)
40 41 42 43

/* --------------------------------------------------------------------- */

#define CALL(q, f, arg...)						\
44
	((q->int_ops->f) ? q->int_ops->f(arg) : 0)
45

46
void *videobuf_alloc(struct videobuf_queue *q)
47 48 49
{
	struct videobuf_buffer *vb;

50
	BUG_ON(q->msize < sizeof(*vb));
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

	if (!q->int_ops || !q->int_ops->alloc) {
		printk(KERN_ERR "No specific ops defined!\n");
		BUG();
	}

	vb = q->int_ops->alloc(q->msize);

	if (NULL != vb) {
		init_waitqueue_head(&vb->done);
		vb->magic     = MAGIC_BUFFER;
	}

	return vb;
}

67 68
#define WAITON_CONDITION (vb->state != VIDEOBUF_ACTIVE &&\
				vb->state != VIDEOBUF_QUEUED)
69 70
int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
{
71
	MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
72 73 74 75 76 77

	if (non_blocking) {
		if (WAITON_CONDITION)
			return 0;
		else
			return -EAGAIN;
78
	}
79 80 81 82 83 84 85

	if (intr)
		return wait_event_interruptible(vb->done, WAITON_CONDITION);
	else
		wait_event(vb->done, WAITON_CONDITION);

	return 0;
86 87
}

88
int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb,
89 90
		    struct v4l2_framebuffer *fbuf)
{
91 92
	MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
93

94
	return CALL(q, iolock, q, vb, fbuf);
95 96 97 98 99
}

/* --------------------------------------------------------------------- */


100
void videobuf_queue_core_init(struct videobuf_queue *q,
101
			 struct videobuf_queue_ops *ops,
102
			 struct device *dev,
103 104 105 106
			 spinlock_t *irqlock,
			 enum v4l2_buf_type type,
			 enum v4l2_field field,
			 unsigned int msize,
107 108
			 void *priv,
			 struct videobuf_qtype_ops *int_ops)
109
{
110
	memset(q, 0, sizeof(*q));
111 112 113 114 115 116
	q->irqlock   = irqlock;
	q->dev       = dev;
	q->type      = type;
	q->field     = field;
	q->msize     = msize;
	q->ops       = ops;
117
	q->priv_data = priv;
118
	q->int_ops   = int_ops;
119 120

	/* All buffer operations are mandatory */
121 122 123 124
	BUG_ON(!q->ops->buf_setup);
	BUG_ON(!q->ops->buf_prepare);
	BUG_ON(!q->ops->buf_queue);
	BUG_ON(!q->ops->buf_release);
125

126 127 128
	/* Lock is mandatory for queue_cancel to work */
	BUG_ON(!irqlock);

129
	/* Having implementations for abstract methods are mandatory */
130
	BUG_ON(!q->int_ops);
131

132
	mutex_init(&q->vb_lock);
133
	init_waitqueue_head(&q->wait);
134 135 136
	INIT_LIST_HEAD(&q->stream);
}

137
/* Locking: Only usage in bttv unsafe find way to remove */
138 139 140 141
int videobuf_queue_is_busy(struct videobuf_queue *q)
{
	int i;

142
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
143 144

	if (q->streaming) {
145
		dprintk(1, "busy: streaming active\n");
146 147 148
		return 1;
	}
	if (q->reading) {
149
		dprintk(1, "busy: pending read #1\n");
150 151 152
		return 1;
	}
	if (q->read_buf) {
153
		dprintk(1, "busy: pending read #2\n");
154 155 156 157 158
		return 1;
	}
	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
159
		if (q->bufs[i]->map) {
160
			dprintk(1, "busy: buffer #%d mapped\n", i);
161 162
			return 1;
		}
163
		if (q->bufs[i]->state == VIDEOBUF_QUEUED) {
164
			dprintk(1, "busy: buffer #%d queued\n", i);
165 166
			return 1;
		}
167
		if (q->bufs[i]->state == VIDEOBUF_ACTIVE) {
168
			dprintk(1, "busy: buffer #%d avtive\n", i);
169 170 171 172 173 174
			return 1;
		}
	}
	return 0;
}

175
/* Locking: Caller holds q->vb_lock */
176 177
void videobuf_queue_cancel(struct videobuf_queue *q)
{
178
	unsigned long flags = 0;
179 180
	int i;

181 182 183 184
	q->streaming = 0;
	q->reading  = 0;
	wake_up_interruptible_sync(&q->wait);

185
	/* remove queued buffers from list */
186
	spin_lock_irqsave(q->irqlock, flags);
187 188 189
	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
190
		if (q->bufs[i]->state == VIDEOBUF_QUEUED) {
191
			list_del(&q->bufs[i]->queue);
192
			q->bufs[i]->state = VIDEOBUF_ERROR;
193
			wake_up_all(&q->bufs[i]->done);
194 195
		}
	}
196
	spin_unlock_irqrestore(q->irqlock, flags);
197 198 199 200 201

	/* free all buffers + clear queue */
	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
202
		q->ops->buf_release(q, q->bufs[i]);
203 204 205 206 207 208
	}
	INIT_LIST_HEAD(&q->stream);
}

/* --------------------------------------------------------------------- */

209
/* Locking: Caller holds q->vb_lock */
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
{
	enum v4l2_field field = q->field;

	BUG_ON(V4L2_FIELD_ANY == field);

	if (V4L2_FIELD_ALTERNATE == field) {
		if (V4L2_FIELD_TOP == q->last) {
			field   = V4L2_FIELD_BOTTOM;
			q->last = V4L2_FIELD_BOTTOM;
		} else {
			field   = V4L2_FIELD_TOP;
			q->last = V4L2_FIELD_TOP;
		}
	}
	return field;
}

228
/* Locking: Caller holds q->vb_lock */
229 230 231
static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
			    struct videobuf_buffer *vb, enum v4l2_buf_type type)
{
232 233
	MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253

	b->index    = vb->i;
	b->type     = type;

	b->memory   = vb->memory;
	switch (b->memory) {
	case V4L2_MEMORY_MMAP:
		b->m.offset  = vb->boff;
		b->length    = vb->bsize;
		break;
	case V4L2_MEMORY_USERPTR:
		b->m.userptr = vb->baddr;
		b->length    = vb->bsize;
		break;
	case V4L2_MEMORY_OVERLAY:
		b->m.offset  = vb->boff;
		break;
	}

	b->flags    = 0;
254
	if (vb->map)
255 256 257
		b->flags |= V4L2_BUF_FLAG_MAPPED;

	switch (vb->state) {
258 259 260
	case VIDEOBUF_PREPARED:
	case VIDEOBUF_QUEUED:
	case VIDEOBUF_ACTIVE:
261 262
		b->flags |= V4L2_BUF_FLAG_QUEUED;
		break;
263 264
	case VIDEOBUF_DONE:
	case VIDEOBUF_ERROR:
265 266
		b->flags |= V4L2_BUF_FLAG_DONE;
		break;
267 268
	case VIDEOBUF_NEEDS_INIT:
	case VIDEOBUF_IDLE:
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
		/* nothing */
		break;
	}

	if (vb->input != UNSET) {
		b->flags |= V4L2_BUF_FLAG_INPUT;
		b->input  = vb->input;
	}

	b->field     = vb->field;
	b->timestamp = vb->ts;
	b->bytesused = vb->size;
	b->sequence  = vb->field_count >> 1;
}

284
/* Locking: Caller holds q->vb_lock */
285 286 287 288 289 290 291 292
static int __videobuf_mmap_free(struct videobuf_queue *q)
{
	int i;
	int rc;

	if (!q)
		return 0;

293
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
294

295

296
	rc  = CALL(q, mmap_free, q);
297 298 299

	q->is_mmapped = 0;

300
	if (rc < 0)
301 302 303 304 305
		return rc;

	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
306
		q->ops->buf_release(q, q->bufs[i]);
307 308 309 310 311 312 313 314 315 316
		kfree(q->bufs[i]);
		q->bufs[i] = NULL;
	}

	return rc;
}

int videobuf_mmap_free(struct videobuf_queue *q)
{
	int ret;
317
	mutex_lock(&q->vb_lock);
318
	ret = __videobuf_mmap_free(q);
319
	mutex_unlock(&q->vb_lock);
320 321 322
	return ret;
}

323
/* Locking: Caller holds q->vb_lock */
324 325 326 327 328 329 330
static int __videobuf_mmap_setup(struct videobuf_queue *q,
			unsigned int bcount, unsigned int bsize,
			enum v4l2_memory memory)
{
	unsigned int i;
	int err;

331
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361

	err = __videobuf_mmap_free(q);
	if (0 != err)
		return err;

	/* Allocate and initialize buffers */
	for (i = 0; i < bcount; i++) {
		q->bufs[i] = videobuf_alloc(q);

		if (q->bufs[i] == NULL)
			break;

		q->bufs[i]->i      = i;
		q->bufs[i]->input  = UNSET;
		q->bufs[i]->memory = memory;
		q->bufs[i]->bsize  = bsize;
		switch (memory) {
		case V4L2_MEMORY_MMAP:
			q->bufs[i]->boff  = bsize * i;
			break;
		case V4L2_MEMORY_USERPTR:
		case V4L2_MEMORY_OVERLAY:
			/* nothing */
			break;
		}
	}

	if (!i)
		return -ENOMEM;

362
	dprintk(1, "mmap setup: %d buffers, %d bytes each\n",
363 364 365 366 367 368 369 370 371 372
		i, bsize);

	return i;
}

int videobuf_mmap_setup(struct videobuf_queue *q,
			unsigned int bcount, unsigned int bsize,
			enum v4l2_memory memory)
{
	int ret;
373
	mutex_lock(&q->vb_lock);
374
	ret = __videobuf_mmap_setup(q, bcount, bsize, memory);
375
	mutex_unlock(&q->vb_lock);
376 377 378
	return ret;
}

379 380 381
int videobuf_reqbufs(struct videobuf_queue *q,
		 struct v4l2_requestbuffers *req)
{
382
	unsigned int size, count;
383 384 385
	int retval;

	if (req->count < 1) {
386
		dprintk(1, "reqbufs: count invalid (%d)\n", req->count);
387 388
		return -EINVAL;
	}
389

390 391 392
	if (req->memory != V4L2_MEMORY_MMAP     &&
	    req->memory != V4L2_MEMORY_USERPTR  &&
	    req->memory != V4L2_MEMORY_OVERLAY) {
393
		dprintk(1, "reqbufs: memory type invalid\n");
394 395 396
		return -EINVAL;
	}

397
	mutex_lock(&q->vb_lock);
398
	if (req->type != q->type) {
399
		dprintk(1, "reqbufs: queue type invalid\n");
400 401 402 403
		retval = -EINVAL;
		goto done;
	}

404
	if (q->streaming) {
405
		dprintk(1, "reqbufs: streaming already exists\n");
406 407
		retval = -EBUSY;
		goto done;
408 409
	}
	if (!list_empty(&q->stream)) {
410
		dprintk(1, "reqbufs: stream running\n");
411 412
		retval = -EBUSY;
		goto done;
413 414 415 416 417 418
	}

	count = req->count;
	if (count > VIDEO_MAX_FRAME)
		count = VIDEO_MAX_FRAME;
	size = 0;
419
	q->ops->buf_setup(q, &count, &size);
420
	size = PAGE_ALIGN(size);
421
	dprintk(1, "reqbufs: bufs=%d, size=0x%x [%d pages total]\n",
422 423
		count, size, (count*size)>>PAGE_SHIFT);

424
	retval = __videobuf_mmap_setup(q, count, size, req->memory);
425
	if (retval < 0) {
426
		dprintk(1, "reqbufs: mmap setup returned %d\n", retval);
427 428 429
		goto done;
	}

430
	req->count = retval;
431 432

 done:
433
	mutex_unlock(&q->vb_lock);
434 435 436 437 438
	return retval;
}

int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
{
439 440
	int ret = -EINVAL;

441
	mutex_lock(&q->vb_lock);
442
	if (unlikely(b->type != q->type)) {
443
		dprintk(1, "querybuf: Wrong type.\n");
444
		goto done;
445 446
	}
	if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) {
447
		dprintk(1, "querybuf: index out of range.\n");
448
		goto done;
449 450
	}
	if (unlikely(NULL == q->bufs[b->index])) {
451
		dprintk(1, "querybuf: buffer is null.\n");
452
		goto done;
453
	}
454

455
	videobuf_status(q, b, q->bufs[b->index], q->type);
456 457 458

	ret = 0;
done:
459
	mutex_unlock(&q->vb_lock);
460
	return ret;
461 462 463 464 465 466 467
}

int videobuf_qbuf(struct videobuf_queue *q,
	      struct v4l2_buffer *b)
{
	struct videobuf_buffer *buf;
	enum v4l2_field field;
468
	unsigned long flags = 0;
469 470
	int retval;

471
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
472

473 474 475
	if (b->memory == V4L2_MEMORY_MMAP)
		down_read(&current->mm->mmap_sem);

476
	mutex_lock(&q->vb_lock);
477 478
	retval = -EBUSY;
	if (q->reading) {
479
		dprintk(1, "qbuf: Reading running...\n");
480 481 482 483
		goto done;
	}
	retval = -EINVAL;
	if (b->type != q->type) {
484
		dprintk(1, "qbuf: Wrong type.\n");
485 486 487
		goto done;
	}
	if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) {
488
		dprintk(1, "qbuf: index out of range.\n");
489 490 491 492
		goto done;
	}
	buf = q->bufs[b->index];
	if (NULL == buf) {
493
		dprintk(1, "qbuf: buffer is null.\n");
494 495
		goto done;
	}
496
	MAGIC_CHECK(buf->magic, MAGIC_BUFFER);
497
	if (buf->memory != b->memory) {
498
		dprintk(1, "qbuf: memory type is wrong.\n");
499 500
		goto done;
	}
501
	if (buf->state != VIDEOBUF_NEEDS_INIT && buf->state != VIDEOBUF_IDLE) {
502
		dprintk(1, "qbuf: buffer is already queued or active.\n");
503 504 505 506 507
		goto done;
	}

	if (b->flags & V4L2_BUF_FLAG_INPUT) {
		if (b->input >= q->inputs) {
508
			dprintk(1, "qbuf: wrong input.\n");
509 510 511 512 513 514 515 516 517 518
			goto done;
		}
		buf->input = b->input;
	} else {
		buf->input = UNSET;
	}

	switch (b->memory) {
	case V4L2_MEMORY_MMAP:
		if (0 == buf->baddr) {
519 520
			dprintk(1, "qbuf: mmap requested "
				   "but buffer addr is zero!\n");
521 522 523 524 525
			goto done;
		}
		break;
	case V4L2_MEMORY_USERPTR:
		if (b->length < buf->bsize) {
526
			dprintk(1, "qbuf: buffer length is not enough\n");
527 528
			goto done;
		}
529 530 531
		if (VIDEOBUF_NEEDS_INIT != buf->state &&
		    buf->baddr != b->m.userptr)
			q->ops->buf_release(q, buf);
532 533 534 535 536 537
		buf->baddr = b->m.userptr;
		break;
	case V4L2_MEMORY_OVERLAY:
		buf->boff = b->m.offset;
		break;
	default:
538
		dprintk(1, "qbuf: wrong memory type\n");
539 540 541
		goto done;
	}

542
	dprintk(1, "qbuf: requesting next field\n");
543
	field = videobuf_next_field(q);
544
	retval = q->ops->buf_prepare(q, buf, field);
545
	if (0 != retval) {
546
		dprintk(1, "qbuf: buffer_prepare returned %d\n", retval);
547 548 549
		goto done;
	}

550
	list_add_tail(&buf->stream, &q->stream);
551
	if (q->streaming) {
552
		spin_lock_irqsave(q->irqlock, flags);
553
		q->ops->buf_queue(q, buf);
554
		spin_unlock_irqrestore(q->irqlock, flags);
555
	}
556
	dprintk(1, "qbuf: succeded\n");
557
	retval = 0;
558
	wake_up_interruptible_sync(&q->wait);
559 560

 done:
561
	mutex_unlock(&q->vb_lock);
562 563 564 565

	if (b->memory == V4L2_MEMORY_MMAP)
		up_read(&current->mm->mmap_sem);

566 567 568
	return retval;
}

569 570 571

/* Locking: Caller holds q->vb_lock */
static int stream_next_buffer_check_queue(struct videobuf_queue *q, int noblock)
572 573 574
{
	int retval;

575 576 577 578
checks:
	if (!q->streaming) {
		dprintk(1, "next_buffer: Not streaming\n");
		retval = -EINVAL;
579 580
		goto done;
	}
581

582
	if (list_empty(&q->stream)) {
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
		if (noblock) {
			retval = -EAGAIN;
			dprintk(2, "next_buffer: no buffers to dequeue\n");
			goto done;
		} else {
			dprintk(2, "next_buffer: waiting on buffer\n");

			/* Drop lock to avoid deadlock with qbuf */
			mutex_unlock(&q->vb_lock);

			/* Checking list_empty and streaming is safe without
			 * locks because we goto checks to validate while
			 * holding locks before proceeding */
			retval = wait_event_interruptible(q->wait,
				!list_empty(&q->stream) || !q->streaming);
			mutex_lock(&q->vb_lock);

			if (retval)
				goto done;

			goto checks;
		}
605
	}
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624

	retval = 0;

done:
	return retval;
}


/* Locking: Caller holds q->vb_lock */
static int stream_next_buffer(struct videobuf_queue *q,
			struct videobuf_buffer **vb, int nonblocking)
{
	int retval;
	struct videobuf_buffer *buf = NULL;

	retval = stream_next_buffer_check_queue(q, nonblocking);
	if (retval)
		goto done;

625 626
	buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
	retval = videobuf_waiton(buf, nonblocking, 1);
627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642
	if (retval < 0)
		goto done;

	*vb = buf;
done:
	return retval;
}

int videobuf_dqbuf(struct videobuf_queue *q,
	       struct v4l2_buffer *b, int nonblocking)
{
	struct videobuf_buffer *buf = NULL;
	int retval;

	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);

643
	mutex_lock(&q->vb_lock);
644 645

	retval = stream_next_buffer(q, &buf, nonblocking);
646
	if (retval < 0) {
647
		dprintk(1, "dqbuf: next_buffer error: %i\n", retval);
648 649
		goto done;
	}
650

651
	switch (buf->state) {
652
	case VIDEOBUF_ERROR:
653
		dprintk(1, "dqbuf: state is error\n");
654
		retval = -EIO;
655
		CALL(q, sync, q, buf);
656
		buf->state = VIDEOBUF_IDLE;
657
		break;
658
	case VIDEOBUF_DONE:
659 660
		dprintk(1, "dqbuf: state is done\n");
		CALL(q, sync, q, buf);
661
		buf->state = VIDEOBUF_IDLE;
662 663
		break;
	default:
664
		dprintk(1, "dqbuf: state invalid\n");
665 666 667 668
		retval = -EINVAL;
		goto done;
	}
	list_del(&buf->stream);
669 670
	memset(b, 0, sizeof(*b));
	videobuf_status(q, b, buf, q->type);
671 672

 done:
673
	mutex_unlock(&q->vb_lock);
674 675 676 677 678 679
	return retval;
}

int videobuf_streamon(struct videobuf_queue *q)
{
	struct videobuf_buffer *buf;
680
	unsigned long flags = 0;
681 682
	int retval;

683
	mutex_lock(&q->vb_lock);
684 685 686 687 688 689 690
	retval = -EBUSY;
	if (q->reading)
		goto done;
	retval = 0;
	if (q->streaming)
		goto done;
	q->streaming = 1;
691
	spin_lock_irqsave(q->irqlock, flags);
692
	list_for_each_entry(buf, &q->stream, stream)
693
		if (buf->state == VIDEOBUF_PREPARED)
694
			q->ops->buf_queue(q, buf);
695
	spin_unlock_irqrestore(q->irqlock, flags);
696

697
	wake_up_interruptible_sync(&q->wait);
698
 done:
699
	mutex_unlock(&q->vb_lock);
700 701 702
	return retval;
}

703
/* Locking: Caller holds q->vb_lock */
704
static int __videobuf_streamoff(struct videobuf_queue *q)
705 706
{
	if (!q->streaming)
707 708
		return -EINVAL;

709 710
	videobuf_queue_cancel(q);

711 712 713 714 715 716 717
	return 0;
}

int videobuf_streamoff(struct videobuf_queue *q)
{
	int retval;

718
	mutex_lock(&q->vb_lock);
719
	retval = __videobuf_streamoff(q);
720
	mutex_unlock(&q->vb_lock);
721

722 723 724
	return retval;
}

725
/* Locking: Caller holds q->vb_lock */
726 727 728 729 730
static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
				      char __user *data,
				      size_t count, loff_t *ppos)
{
	enum v4l2_field field;
731
	unsigned long flags = 0;
732 733
	int retval;

734
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
735 736 737 738 739 740 741 742 743 744 745

	/* setup stuff */
	q->read_buf = videobuf_alloc(q);
	if (NULL == q->read_buf)
		return -ENOMEM;

	q->read_buf->memory = V4L2_MEMORY_USERPTR;
	q->read_buf->baddr  = (unsigned long)data;
	q->read_buf->bsize  = count;

	field = videobuf_next_field(q);
746
	retval = q->ops->buf_prepare(q, q->read_buf, field);
747 748 749 750
	if (0 != retval)
		goto done;

	/* start capture & wait */
751
	spin_lock_irqsave(q->irqlock, flags);
752
	q->ops->buf_queue(q, q->read_buf);
753
	spin_unlock_irqrestore(q->irqlock, flags);
754
	retval = videobuf_waiton(q->read_buf, 0, 0);
755
	if (0 == retval) {
756
		CALL(q, sync, q, q->read_buf);
757
		if (VIDEOBUF_ERROR == q->read_buf->state)
758 759 760 761 762 763 764
			retval = -EIO;
		else
			retval = q->read_buf->size;
	}

 done:
	/* cleanup */
765
	q->ops->buf_release(q, q->read_buf);
766 767 768 769 770 771 772 773 774 775
	kfree(q->read_buf);
	q->read_buf = NULL;
	return retval;
}

ssize_t videobuf_read_one(struct videobuf_queue *q,
			  char __user *data, size_t count, loff_t *ppos,
			  int nonblocking)
{
	enum v4l2_field field;
776
	unsigned long flags = 0;
777
	unsigned size = 0, nbufs = 1;
778 779
	int retval;

780
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
781

782
	mutex_lock(&q->vb_lock);
783

784
	q->ops->buf_setup(q, &nbufs, &size);
785 786 787 788

	if (NULL == q->read_buf  &&
	    count >= size        &&
	    !nonblocking) {
789
		retval = videobuf_read_zerocopy(q, data, count, ppos);
790 791 792 793 794 795 796 797 798 799 800
		if (retval >= 0  ||  retval == -EIO)
			/* ok, all done */
			goto done;
		/* fallback to kernel bounce buffer on failures */
	}

	if (NULL == q->read_buf) {
		/* need to capture a new frame */
		retval = -ENOMEM;
		q->read_buf = videobuf_alloc(q);

801
		dprintk(1, "video alloc=0x%p\n", q->read_buf);
802 803 804 805 806
		if (NULL == q->read_buf)
			goto done;
		q->read_buf->memory = V4L2_MEMORY_USERPTR;
		q->read_buf->bsize = count; /* preferred size */
		field = videobuf_next_field(q);
807
		retval = q->ops->buf_prepare(q, q->read_buf, field);
808 809

		if (0 != retval) {
810
			kfree(q->read_buf);
811 812 813 814
			q->read_buf = NULL;
			goto done;
		}

815
		spin_lock_irqsave(q->irqlock, flags);
816
		q->ops->buf_queue(q, q->read_buf);
817 818
		spin_unlock_irqrestore(q->irqlock, flags);

819 820 821 822 823 824 825 826
		q->read_off = 0;
	}

	/* wait until capture is done */
	retval = videobuf_waiton(q->read_buf, nonblocking, 1);
	if (0 != retval)
		goto done;

827
	CALL(q, sync, q, q->read_buf);
828

829
	if (VIDEOBUF_ERROR == q->read_buf->state) {
830
		/* catch I/O errors */
831
		q->ops->buf_release(q, q->read_buf);
832 833 834 835 836 837 838
		kfree(q->read_buf);
		q->read_buf = NULL;
		retval = -EIO;
		goto done;
	}

	/* Copy to userspace */
839 840
	retval = CALL(q, video_copy_to_user, q, data, count, nonblocking);
	if (retval < 0)
841 842 843 844 845
		goto done;

	q->read_off += retval;
	if (q->read_off == q->read_buf->size) {
		/* all data copied, cleanup */
846
		q->ops->buf_release(q, q->read_buf);
847 848 849 850 851
		kfree(q->read_buf);
		q->read_buf = NULL;
	}

 done:
852
	mutex_unlock(&q->vb_lock);
853 854 855
	return retval;
}

856
/* Locking: Caller holds q->vb_lock */
857
static int __videobuf_read_start(struct videobuf_queue *q)
858 859
{
	enum v4l2_field field;
860
	unsigned long flags = 0;
861
	unsigned int count = 0, size = 0;
862 863
	int err, i;

864
	q->ops->buf_setup(q, &count, &size);
865 866 867 868 869 870
	if (count < 2)
		count = 2;
	if (count > VIDEO_MAX_FRAME)
		count = VIDEO_MAX_FRAME;
	size = PAGE_ALIGN(size);

871
	err = __videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR);
872
	if (err < 0)
873 874
		return err;

875 876
	count = err;

877 878
	for (i = 0; i < count; i++) {
		field = videobuf_next_field(q);
879
		err = q->ops->buf_prepare(q, q->bufs[i], field);
880 881 882 883
		if (err)
			return err;
		list_add_tail(&q->bufs[i]->stream, &q->stream);
	}
884
	spin_lock_irqsave(q->irqlock, flags);
885
	for (i = 0; i < count; i++)
886
		q->ops->buf_queue(q, q->bufs[i]);
887
	spin_unlock_irqrestore(q->irqlock, flags);
888 889 890 891
	q->reading = 1;
	return 0;
}

892
static void __videobuf_read_stop(struct videobuf_queue *q)
893 894 895 896
{
	int i;

	videobuf_queue_cancel(q);
897
	__videobuf_mmap_free(q);
898 899 900 901 902 903 904 905
	INIT_LIST_HEAD(&q->stream);
	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
		kfree(q->bufs[i]);
		q->bufs[i] = NULL;
	}
	q->read_buf = NULL;
906

907 908
}

909 910 911 912
int videobuf_read_start(struct videobuf_queue *q)
{
	int rc;

913
	mutex_lock(&q->vb_lock);
914
	rc = __videobuf_read_start(q);
915
	mutex_unlock(&q->vb_lock);
916 917 918 919

	return rc;
}

920 921
void videobuf_read_stop(struct videobuf_queue *q)
{
922
	mutex_lock(&q->vb_lock);
923
	__videobuf_read_stop(q);
924
	mutex_unlock(&q->vb_lock);
925 926 927 928
}

void videobuf_stop(struct videobuf_queue *q)
{
929
	mutex_lock(&q->vb_lock);
930 931 932 933 934 935 936

	if (q->streaming)
		__videobuf_streamoff(q);

	if (q->reading)
		__videobuf_read_stop(q);

937
	mutex_unlock(&q->vb_lock);
938 939
}

940

941 942 943 944 945
ssize_t videobuf_read_stream(struct videobuf_queue *q,
			     char __user *data, size_t count, loff_t *ppos,
			     int vbihack, int nonblocking)
{
	int rc, retval;
946
	unsigned long flags = 0;
947

948
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
949

950
	dprintk(2, "%s\n", __func__);
951
	mutex_lock(&q->vb_lock);
952 953 954 955
	retval = -EBUSY;
	if (q->streaming)
		goto done;
	if (!q->reading) {
956
		retval = __videobuf_read_start(q);
957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977
		if (retval < 0)
			goto done;
	}

	retval = 0;
	while (count > 0) {
		/* get / wait for data */
		if (NULL == q->read_buf) {
			q->read_buf = list_entry(q->stream.next,
						 struct videobuf_buffer,
						 stream);
			list_del(&q->read_buf->stream);
			q->read_off = 0;
		}
		rc = videobuf_waiton(q->read_buf, nonblocking, 1);
		if (rc < 0) {
			if (0 == retval)
				retval = rc;
			break;
		}

978
		if (q->read_buf->state == VIDEOBUF_DONE) {
979
			rc = CALL(q, copy_stream, q, data + retval, count,
980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998
					retval, vbihack, nonblocking);
			if (rc < 0) {
				retval = rc;
				break;
			}
			retval      += rc;
			count       -= rc;
			q->read_off += rc;
		} else {
			/* some error */
			q->read_off = q->read_buf->size;
			if (0 == retval)
				retval = -EIO;
		}

		/* requeue buffer when done with copying */
		if (q->read_off == q->read_buf->size) {
			list_add_tail(&q->read_buf->stream,
				      &q->stream);
999
			spin_lock_irqsave(q->irqlock, flags);
1000
			q->ops->buf_queue(q, q->read_buf);
1001
			spin_unlock_irqrestore(q->irqlock, flags);
1002 1003 1004 1005 1006 1007 1008
			q->read_buf = NULL;
		}
		if (retval < 0)
			break;
	}

 done:
1009
	mutex_unlock(&q->vb_lock);
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
	return retval;
}

unsigned int videobuf_poll_stream(struct file *file,
				  struct videobuf_queue *q,
				  poll_table *wait)
{
	struct videobuf_buffer *buf = NULL;
	unsigned int rc = 0;

1020
	mutex_lock(&q->vb_lock);
1021 1022 1023 1024 1025 1026
	if (q->streaming) {
		if (!list_empty(&q->stream))
			buf = list_entry(q->stream.next,
					 struct videobuf_buffer, stream);
	} else {
		if (!q->reading)
1027
			__videobuf_read_start(q);
1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
		if (!q->reading) {
			rc = POLLERR;
		} else if (NULL == q->read_buf) {
			q->read_buf = list_entry(q->stream.next,
						 struct videobuf_buffer,
						 stream);
			list_del(&q->read_buf->stream);
			q->read_off = 0;
		}
		buf = q->read_buf;
	}
	if (!buf)
		rc = POLLERR;

	if (0 == rc) {
		poll_wait(file, &buf->done, wait);
1044 1045
		if (buf->state == VIDEOBUF_DONE ||
		    buf->state == VIDEOBUF_ERROR)
1046 1047
			rc = POLLIN|POLLRDNORM;
	}
1048
	mutex_unlock(&q->vb_lock);
1049 1050 1051 1052 1053 1054 1055 1056
	return rc;
}

int videobuf_mmap_mapper(struct videobuf_queue *q,
			 struct vm_area_struct *vma)
{
	int retval;

1057
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
1058

1059
	mutex_lock(&q->vb_lock);
1060
	retval = CALL(q, mmap_mapper, q, vma);
1061
	q->is_mmapped = 1;
1062
	mutex_unlock(&q->vb_lock);
1063 1064 1065 1066 1067 1068 1069 1070 1071

	return retval;
}

#ifdef CONFIG_VIDEO_V4L1_COMPAT
int videobuf_cgmbuf(struct videobuf_queue *q,
		    struct video_mbuf *mbuf, int count)
{
	struct v4l2_requestbuffers req;
1072
	int rc, i;
1073

1074
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
1075

1076
	memset(&req, 0, sizeof(req));
1077 1078 1079
	req.type   = q->type;
	req.count  = count;
	req.memory = V4L2_MEMORY_MMAP;
1080
	rc = videobuf_reqbufs(q, &req);
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
	if (rc < 0)
		return rc;

	mbuf->frames = req.count;
	mbuf->size   = 0;
	for (i = 0; i < mbuf->frames; i++) {
		mbuf->offsets[i]  = q->bufs[i]->boff;
		mbuf->size       += q->bufs[i]->bsize;
	}

	return 0;
}
1093
EXPORT_SYMBOL_GPL(videobuf_cgmbuf);
1094 1095 1096 1097 1098 1099 1100 1101 1102
#endif

/* --------------------------------------------------------------------- */

EXPORT_SYMBOL_GPL(videobuf_waiton);
EXPORT_SYMBOL_GPL(videobuf_iolock);

EXPORT_SYMBOL_GPL(videobuf_alloc);

1103
EXPORT_SYMBOL_GPL(videobuf_queue_core_init);
1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
EXPORT_SYMBOL_GPL(videobuf_queue_cancel);
EXPORT_SYMBOL_GPL(videobuf_queue_is_busy);

EXPORT_SYMBOL_GPL(videobuf_next_field);
EXPORT_SYMBOL_GPL(videobuf_reqbufs);
EXPORT_SYMBOL_GPL(videobuf_querybuf);
EXPORT_SYMBOL_GPL(videobuf_qbuf);
EXPORT_SYMBOL_GPL(videobuf_dqbuf);
EXPORT_SYMBOL_GPL(videobuf_streamon);
EXPORT_SYMBOL_GPL(videobuf_streamoff);

1115
EXPORT_SYMBOL_GPL(videobuf_read_start);
1116
EXPORT_SYMBOL_GPL(videobuf_read_stop);
1117
EXPORT_SYMBOL_GPL(videobuf_stop);
1118 1119 1120 1121 1122 1123 1124
EXPORT_SYMBOL_GPL(videobuf_read_stream);
EXPORT_SYMBOL_GPL(videobuf_read_one);
EXPORT_SYMBOL_GPL(videobuf_poll_stream);

EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
EXPORT_SYMBOL_GPL(videobuf_mmap_free);
EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);