linux/drivers/media/v4l2-core/videobuf-core.c
<<
>>
Prefs
   1/*
   2 * generic helper functions for handling video4linux capture buffers
   3 *
   4 * (c) 2007 Mauro Carvalho Chehab, <mchehab@infradead.org>
   5 *
   6 * Highly based on video-buf written originally by:
   7 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
   8 * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org>
   9 * (c) 2006 Ted Walther and John Sokol
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; either version 2
  14 */
  15
  16#include <linux/init.h>
  17#include <linux/module.h>
  18#include <linux/moduleparam.h>
  19#include <linux/mm.h>
  20#include <linux/sched.h>
  21#include <linux/slab.h>
  22#include <linux/interrupt.h>
  23
  24#include <media/videobuf-core.h>
  25
  26#define MAGIC_BUFFER 0x20070728
  27#define MAGIC_CHECK(is, should)                                         \
  28        do {                                                            \
  29                if (unlikely((is) != (should))) {                       \
  30                        printk(KERN_ERR                                 \
  31                                "magic mismatch: %x (expected %x)\n",   \
  32                                        is, should);                    \
  33                        BUG();                                          \
  34                }                                                       \
  35        } while (0)
  36
  37static int debug;
  38module_param(debug, int, 0644);
  39
  40MODULE_DESCRIPTION("helper module to manage video4linux buffers");
  41MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
  42MODULE_LICENSE("GPL");
  43
  44#define dprintk(level, fmt, arg...)                                     \
  45        do {                                                            \
  46                if (debug >= level)                                     \
  47                        printk(KERN_DEBUG "vbuf: " fmt, ## arg);        \
  48        } while (0)
  49
  50/* --------------------------------------------------------------------- */
  51
  52#define CALL(q, f, arg...)                                              \
  53        ((q->int_ops->f) ? q->int_ops->f(arg) : 0)
  54
  55struct videobuf_buffer *videobuf_alloc_vb(struct videobuf_queue *q)
  56{
  57        struct videobuf_buffer *vb;
  58
  59        BUG_ON(q->msize < sizeof(*vb));
  60
  61        if (!q->int_ops || !q->int_ops->alloc_vb) {
  62                printk(KERN_ERR "No specific ops defined!\n");
  63                BUG();
  64        }
  65
  66        vb = q->int_ops->alloc_vb(q->msize);
  67        if (NULL != vb) {
  68                init_waitqueue_head(&vb->done);
  69                vb->magic = MAGIC_BUFFER;
  70        }
  71
  72        return vb;
  73}
  74EXPORT_SYMBOL_GPL(videobuf_alloc_vb);
  75
  76static int is_state_active_or_queued(struct videobuf_queue *q, struct videobuf_buffer *vb)
  77{
  78        unsigned long flags;
  79        bool rc;
  80
  81        spin_lock_irqsave(q->irqlock, flags);
  82        rc = vb->state != VIDEOBUF_ACTIVE && vb->state != VIDEOBUF_QUEUED;
  83        spin_unlock_irqrestore(q->irqlock, flags);
  84        return rc;
  85};
  86
  87int videobuf_waiton(struct videobuf_queue *q, struct videobuf_buffer *vb,
  88                int non_blocking, int intr)
  89{
  90        bool is_ext_locked;
  91        int ret = 0;
  92
  93        MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
  94
  95        if (non_blocking) {
  96                if (is_state_active_or_queued(q, vb))
  97                        return 0;
  98                return -EAGAIN;
  99        }
 100
 101        is_ext_locked = q->ext_lock && mutex_is_locked(q->ext_lock);
 102
 103        /* Release vdev lock to prevent this wait from blocking outside access to
 104           the device. */
 105        if (is_ext_locked)
 106                mutex_unlock(q->ext_lock);
 107        if (intr)
 108                ret = wait_event_interruptible(vb->done, is_state_active_or_queued(q, vb));
 109        else
 110                wait_event(vb->done, is_state_active_or_queued(q, vb));
 111        /* Relock */
 112        if (is_ext_locked)
 113                mutex_lock(q->ext_lock);
 114
 115        return ret;
 116}
 117EXPORT_SYMBOL_GPL(videobuf_waiton);
 118
 119int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb,
 120                    struct v4l2_framebuffer *fbuf)
 121{
 122        MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
 123        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 124
 125        return CALL(q, iolock, q, vb, fbuf);
 126}
 127EXPORT_SYMBOL_GPL(videobuf_iolock);
 128
 129void *videobuf_queue_to_vaddr(struct videobuf_queue *q,
 130                              struct videobuf_buffer *buf)
 131{
 132        if (q->int_ops->vaddr)
 133                return q->int_ops->vaddr(buf);
 134        return NULL;
 135}
 136EXPORT_SYMBOL_GPL(videobuf_queue_to_vaddr);
 137
 138/* --------------------------------------------------------------------- */
 139
 140
 141void videobuf_queue_core_init(struct videobuf_queue *q,
 142                         const struct videobuf_queue_ops *ops,
 143                         struct device *dev,
 144                         spinlock_t *irqlock,
 145                         enum v4l2_buf_type type,
 146                         enum v4l2_field field,
 147                         unsigned int msize,
 148                         void *priv,
 149                         struct videobuf_qtype_ops *int_ops,
 150                         struct mutex *ext_lock)
 151{
 152        BUG_ON(!q);
 153        memset(q, 0, sizeof(*q));
 154        q->irqlock   = irqlock;
 155        q->ext_lock  = ext_lock;
 156        q->dev       = dev;
 157        q->type      = type;
 158        q->field     = field;
 159        q->msize     = msize;
 160        q->ops       = ops;
 161        q->priv_data = priv;
 162        q->int_ops   = int_ops;
 163
 164        /* All buffer operations are mandatory */
 165        BUG_ON(!q->ops->buf_setup);
 166        BUG_ON(!q->ops->buf_prepare);
 167        BUG_ON(!q->ops->buf_queue);
 168        BUG_ON(!q->ops->buf_release);
 169
 170        /* Lock is mandatory for queue_cancel to work */
 171        BUG_ON(!irqlock);
 172
 173        /* Having implementations for abstract methods are mandatory */
 174        BUG_ON(!q->int_ops);
 175
 176        mutex_init(&q->vb_lock);
 177        init_waitqueue_head(&q->wait);
 178        INIT_LIST_HEAD(&q->stream);
 179}
 180EXPORT_SYMBOL_GPL(videobuf_queue_core_init);
 181
 182/* Locking: Only usage in bttv unsafe find way to remove */
 183int videobuf_queue_is_busy(struct videobuf_queue *q)
 184{
 185        int i;
 186
 187        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 188
 189        if (q->streaming) {
 190                dprintk(1, "busy: streaming active\n");
 191                return 1;
 192        }
 193        if (q->reading) {
 194                dprintk(1, "busy: pending read #1\n");
 195                return 1;
 196        }
 197        if (q->read_buf) {
 198                dprintk(1, "busy: pending read #2\n");
 199                return 1;
 200        }
 201        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
 202                if (NULL == q->bufs[i])
 203                        continue;
 204                if (q->bufs[i]->map) {
 205                        dprintk(1, "busy: buffer #%d mapped\n", i);
 206                        return 1;
 207                }
 208                if (q->bufs[i]->state == VIDEOBUF_QUEUED) {
 209                        dprintk(1, "busy: buffer #%d queued\n", i);
 210                        return 1;
 211                }
 212                if (q->bufs[i]->state == VIDEOBUF_ACTIVE) {
 213                        dprintk(1, "busy: buffer #%d avtive\n", i);
 214                        return 1;
 215                }
 216        }
 217        return 0;
 218}
 219EXPORT_SYMBOL_GPL(videobuf_queue_is_busy);
 220
 221/**
 222 * __videobuf_free() - free all the buffers and their control structures
 223 *
 224 * This function can only be called if streaming/reading is off, i.e. no buffers
 225 * are under control of the driver.
 226 */
 227/* Locking: Caller holds q->vb_lock */
 228static int __videobuf_free(struct videobuf_queue *q)
 229{
 230        int i;
 231
 232        dprintk(1, "%s\n", __func__);
 233        if (!q)
 234                return 0;
 235
 236        if (q->streaming || q->reading) {
 237                dprintk(1, "Cannot free buffers when streaming or reading\n");
 238                return -EBUSY;
 239        }
 240
 241        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 242
 243        for (i = 0; i < VIDEO_MAX_FRAME; i++)
 244                if (q->bufs[i] && q->bufs[i]->map) {
 245                        dprintk(1, "Cannot free mmapped buffers\n");
 246                        return -EBUSY;
 247                }
 248
 249        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
 250                if (NULL == q->bufs[i])
 251                        continue;
 252                q->ops->buf_release(q, q->bufs[i]);
 253                kfree(q->bufs[i]);
 254                q->bufs[i] = NULL;
 255        }
 256
 257        return 0;
 258}
 259
 260/* Locking: Caller holds q->vb_lock */
 261void videobuf_queue_cancel(struct videobuf_queue *q)
 262{
 263        unsigned long flags = 0;
 264        int i;
 265
 266        q->streaming = 0;
 267        q->reading  = 0;
 268        wake_up_interruptible_sync(&q->wait);
 269
 270        /* remove queued buffers from list */
 271        spin_lock_irqsave(q->irqlock, flags);
 272        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
 273                if (NULL == q->bufs[i])
 274                        continue;
 275                if (q->bufs[i]->state == VIDEOBUF_QUEUED) {
 276                        list_del(&q->bufs[i]->queue);
 277                        q->bufs[i]->state = VIDEOBUF_ERROR;
 278                        wake_up_all(&q->bufs[i]->done);
 279                }
 280        }
 281        spin_unlock_irqrestore(q->irqlock, flags);
 282
 283        /* free all buffers + clear queue */
 284        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
 285                if (NULL == q->bufs[i])
 286                        continue;
 287                q->ops->buf_release(q, q->bufs[i]);
 288        }
 289        INIT_LIST_HEAD(&q->stream);
 290}
 291EXPORT_SYMBOL_GPL(videobuf_queue_cancel);
 292
 293/* --------------------------------------------------------------------- */
 294
 295/* Locking: Caller holds q->vb_lock */
 296enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
 297{
 298        enum v4l2_field field = q->field;
 299
 300        BUG_ON(V4L2_FIELD_ANY == field);
 301
 302        if (V4L2_FIELD_ALTERNATE == field) {
 303                if (V4L2_FIELD_TOP == q->last) {
 304                        field   = V4L2_FIELD_BOTTOM;
 305                        q->last = V4L2_FIELD_BOTTOM;
 306                } else {
 307                        field   = V4L2_FIELD_TOP;
 308                        q->last = V4L2_FIELD_TOP;
 309                }
 310        }
 311        return field;
 312}
 313EXPORT_SYMBOL_GPL(videobuf_next_field);
 314
 315/* Locking: Caller holds q->vb_lock */
 316static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
 317                            struct videobuf_buffer *vb, enum v4l2_buf_type type)
 318{
 319        MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
 320        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 321
 322        b->index    = vb->i;
 323        b->type     = type;
 324
 325        b->memory   = vb->memory;
 326        switch (b->memory) {
 327        case V4L2_MEMORY_MMAP:
 328                b->m.offset  = vb->boff;
 329                b->length    = vb->bsize;
 330                break;
 331        case V4L2_MEMORY_USERPTR:
 332                b->m.userptr = vb->baddr;
 333                b->length    = vb->bsize;
 334                break;
 335        case V4L2_MEMORY_OVERLAY:
 336                b->m.offset  = vb->boff;
 337                break;
 338        case V4L2_MEMORY_DMABUF:
 339                /* DMABUF is not handled in videobuf framework */
 340                break;
 341        }
 342
 343        b->flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 344        if (vb->map)
 345                b->flags |= V4L2_BUF_FLAG_MAPPED;
 346
 347        switch (vb->state) {
 348        case VIDEOBUF_PREPARED:
 349        case VIDEOBUF_QUEUED:
 350        case VIDEOBUF_ACTIVE:
 351                b->flags |= V4L2_BUF_FLAG_QUEUED;
 352                break;
 353        case VIDEOBUF_ERROR:
 354                b->flags |= V4L2_BUF_FLAG_ERROR;
 355                /* fall through */
 356        case VIDEOBUF_DONE:
 357                b->flags |= V4L2_BUF_FLAG_DONE;
 358                break;
 359        case VIDEOBUF_NEEDS_INIT:
 360        case VIDEOBUF_IDLE:
 361                /* nothing */
 362                break;
 363        }
 364
 365        b->field     = vb->field;
 366        b->timestamp = vb->ts;
 367        b->bytesused = vb->size;
 368        b->sequence  = vb->field_count >> 1;
 369}
 370
 371int videobuf_mmap_free(struct videobuf_queue *q)
 372{
 373        int ret;
 374        videobuf_queue_lock(q);
 375        ret = __videobuf_free(q);
 376        videobuf_queue_unlock(q);
 377        return ret;
 378}
 379EXPORT_SYMBOL_GPL(videobuf_mmap_free);
 380
 381/* Locking: Caller holds q->vb_lock */
 382int __videobuf_mmap_setup(struct videobuf_queue *q,
 383                        unsigned int bcount, unsigned int bsize,
 384                        enum v4l2_memory memory)
 385{
 386        unsigned int i;
 387        int err;
 388
 389        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 390
 391        err = __videobuf_free(q);
 392        if (0 != err)
 393                return err;
 394
 395        /* Allocate and initialize buffers */
 396        for (i = 0; i < bcount; i++) {
 397                q->bufs[i] = videobuf_alloc_vb(q);
 398
 399                if (NULL == q->bufs[i])
 400                        break;
 401
 402                q->bufs[i]->i      = i;
 403                q->bufs[i]->memory = memory;
 404                q->bufs[i]->bsize  = bsize;
 405                switch (memory) {
 406                case V4L2_MEMORY_MMAP:
 407                        q->bufs[i]->boff = PAGE_ALIGN(bsize) * i;
 408                        break;
 409                case V4L2_MEMORY_USERPTR:
 410                case V4L2_MEMORY_OVERLAY:
 411                case V4L2_MEMORY_DMABUF:
 412                        /* nothing */
 413                        break;
 414                }
 415        }
 416
 417        if (!i)
 418                return -ENOMEM;
 419
 420        dprintk(1, "mmap setup: %d buffers, %d bytes each\n", i, bsize);
 421
 422        return i;
 423}
 424EXPORT_SYMBOL_GPL(__videobuf_mmap_setup);
 425
 426int videobuf_mmap_setup(struct videobuf_queue *q,
 427                        unsigned int bcount, unsigned int bsize,
 428                        enum v4l2_memory memory)
 429{
 430        int ret;
 431        videobuf_queue_lock(q);
 432        ret = __videobuf_mmap_setup(q, bcount, bsize, memory);
 433        videobuf_queue_unlock(q);
 434        return ret;
 435}
 436EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
 437
 438int videobuf_reqbufs(struct videobuf_queue *q,
 439                 struct v4l2_requestbuffers *req)
 440{
 441        unsigned int size, count;
 442        int retval;
 443
 444        if (req->count < 1) {
 445                dprintk(1, "reqbufs: count invalid (%d)\n", req->count);
 446                return -EINVAL;
 447        }
 448
 449        if (req->memory != V4L2_MEMORY_MMAP     &&
 450            req->memory != V4L2_MEMORY_USERPTR  &&
 451            req->memory != V4L2_MEMORY_OVERLAY) {
 452                dprintk(1, "reqbufs: memory type invalid\n");
 453                return -EINVAL;
 454        }
 455
 456        videobuf_queue_lock(q);
 457        if (req->type != q->type) {
 458                dprintk(1, "reqbufs: queue type invalid\n");
 459                retval = -EINVAL;
 460                goto done;
 461        }
 462
 463        if (q->streaming) {
 464                dprintk(1, "reqbufs: streaming already exists\n");
 465                retval = -EBUSY;
 466                goto done;
 467        }
 468        if (!list_empty(&q->stream)) {
 469                dprintk(1, "reqbufs: stream running\n");
 470                retval = -EBUSY;
 471                goto done;
 472        }
 473
 474        count = req->count;
 475        if (count > VIDEO_MAX_FRAME)
 476                count = VIDEO_MAX_FRAME;
 477        size = 0;
 478        q->ops->buf_setup(q, &count, &size);
 479        dprintk(1, "reqbufs: bufs=%d, size=0x%x [%u pages total]\n",
 480                count, size,
 481                (unsigned int)((count * PAGE_ALIGN(size)) >> PAGE_SHIFT));
 482
 483        retval = __videobuf_mmap_setup(q, count, size, req->memory);
 484        if (retval < 0) {
 485                dprintk(1, "reqbufs: mmap setup returned %d\n", retval);
 486                goto done;
 487        }
 488
 489        req->count = retval;
 490        retval = 0;
 491
 492 done:
 493        videobuf_queue_unlock(q);
 494        return retval;
 495}
 496EXPORT_SYMBOL_GPL(videobuf_reqbufs);
 497
 498int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
 499{
 500        int ret = -EINVAL;
 501
 502        videobuf_queue_lock(q);
 503        if (unlikely(b->type != q->type)) {
 504                dprintk(1, "querybuf: Wrong type.\n");
 505                goto done;
 506        }
 507        if (unlikely(b->index >= VIDEO_MAX_FRAME)) {
 508                dprintk(1, "querybuf: index out of range.\n");
 509                goto done;
 510        }
 511        if (unlikely(NULL == q->bufs[b->index])) {
 512                dprintk(1, "querybuf: buffer is null.\n");
 513                goto done;
 514        }
 515
 516        videobuf_status(q, b, q->bufs[b->index], q->type);
 517
 518        ret = 0;
 519done:
 520        videobuf_queue_unlock(q);
 521        return ret;
 522}
 523EXPORT_SYMBOL_GPL(videobuf_querybuf);
 524
 525int videobuf_qbuf(struct videobuf_queue *q, struct v4l2_buffer *b)
 526{
 527        struct videobuf_buffer *buf;
 528        enum v4l2_field field;
 529        unsigned long flags = 0;
 530        int retval;
 531
 532        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 533
 534        if (b->memory == V4L2_MEMORY_MMAP)
 535                down_read(&current->mm->mmap_sem);
 536
 537        videobuf_queue_lock(q);
 538        retval = -EBUSY;
 539        if (q->reading) {
 540                dprintk(1, "qbuf: Reading running...\n");
 541                goto done;
 542        }
 543        retval = -EINVAL;
 544        if (b->type != q->type) {
 545                dprintk(1, "qbuf: Wrong type.\n");
 546                goto done;
 547        }
 548        if (b->index >= VIDEO_MAX_FRAME) {
 549                dprintk(1, "qbuf: index out of range.\n");
 550                goto done;
 551        }
 552        buf = q->bufs[b->index];
 553        if (NULL == buf) {
 554                dprintk(1, "qbuf: buffer is null.\n");
 555                goto done;
 556        }
 557        MAGIC_CHECK(buf->magic, MAGIC_BUFFER);
 558        if (buf->memory != b->memory) {
 559                dprintk(1, "qbuf: memory type is wrong.\n");
 560                goto done;
 561        }
 562        if (buf->state != VIDEOBUF_NEEDS_INIT && buf->state != VIDEOBUF_IDLE) {
 563                dprintk(1, "qbuf: buffer is already queued or active.\n");
 564                goto done;
 565        }
 566
 567        switch (b->memory) {
 568        case V4L2_MEMORY_MMAP:
 569                if (0 == buf->baddr) {
 570                        dprintk(1, "qbuf: mmap requested "
 571                                   "but buffer addr is zero!\n");
 572                        goto done;
 573                }
 574                if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT
 575                    || q->type == V4L2_BUF_TYPE_VBI_OUTPUT
 576                    || q->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
 577                        buf->size = b->bytesused;
 578                        buf->field = b->field;
 579                        buf->ts = b->timestamp;
 580                }
 581                break;
 582        case V4L2_MEMORY_USERPTR:
 583                if (b->length < buf->bsize) {
 584                        dprintk(1, "qbuf: buffer length is not enough\n");
 585                        goto done;
 586                }
 587                if (VIDEOBUF_NEEDS_INIT != buf->state &&
 588                    buf->baddr != b->m.userptr)
 589                        q->ops->buf_release(q, buf);
 590                buf->baddr = b->m.userptr;
 591                break;
 592        case V4L2_MEMORY_OVERLAY:
 593                buf->boff = b->m.offset;
 594                break;
 595        default:
 596                dprintk(1, "qbuf: wrong memory type\n");
 597                goto done;
 598        }
 599
 600        dprintk(1, "qbuf: requesting next field\n");
 601        field = videobuf_next_field(q);
 602        retval = q->ops->buf_prepare(q, buf, field);
 603        if (0 != retval) {
 604                dprintk(1, "qbuf: buffer_prepare returned %d\n", retval);
 605                goto done;
 606        }
 607
 608        list_add_tail(&buf->stream, &q->stream);
 609        if (q->streaming) {
 610                spin_lock_irqsave(q->irqlock, flags);
 611                q->ops->buf_queue(q, buf);
 612                spin_unlock_irqrestore(q->irqlock, flags);
 613        }
 614        dprintk(1, "qbuf: succeeded\n");
 615        retval = 0;
 616        wake_up_interruptible_sync(&q->wait);
 617
 618done:
 619        videobuf_queue_unlock(q);
 620
 621        if (b->memory == V4L2_MEMORY_MMAP)
 622                up_read(&current->mm->mmap_sem);
 623
 624        return retval;
 625}
 626EXPORT_SYMBOL_GPL(videobuf_qbuf);
 627
 628/* Locking: Caller holds q->vb_lock */
 629static int stream_next_buffer_check_queue(struct videobuf_queue *q, int noblock)
 630{
 631        int retval;
 632
 633checks:
 634        if (!q->streaming) {
 635                dprintk(1, "next_buffer: Not streaming\n");
 636                retval = -EINVAL;
 637                goto done;
 638        }
 639
 640        if (list_empty(&q->stream)) {
 641                if (noblock) {
 642                        retval = -EAGAIN;
 643                        dprintk(2, "next_buffer: no buffers to dequeue\n");
 644                        goto done;
 645                } else {
 646                        dprintk(2, "next_buffer: waiting on buffer\n");
 647
 648                        /* Drop lock to avoid deadlock with qbuf */
 649                        videobuf_queue_unlock(q);
 650
 651                        /* Checking list_empty and streaming is safe without
 652                         * locks because we goto checks to validate while
 653                         * holding locks before proceeding */
 654                        retval = wait_event_interruptible(q->wait,
 655                                !list_empty(&q->stream) || !q->streaming);
 656                        videobuf_queue_lock(q);
 657
 658                        if (retval)
 659                                goto done;
 660
 661                        goto checks;
 662                }
 663        }
 664
 665        retval = 0;
 666
 667done:
 668        return retval;
 669}
 670
 671/* Locking: Caller holds q->vb_lock */
 672static int stream_next_buffer(struct videobuf_queue *q,
 673                        struct videobuf_buffer **vb, int nonblocking)
 674{
 675        int retval;
 676        struct videobuf_buffer *buf = NULL;
 677
 678        retval = stream_next_buffer_check_queue(q, nonblocking);
 679        if (retval)
 680                goto done;
 681
 682        buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
 683        retval = videobuf_waiton(q, buf, nonblocking, 1);
 684        if (retval < 0)
 685                goto done;
 686
 687        *vb = buf;
 688done:
 689        return retval;
 690}
 691
 692int videobuf_dqbuf(struct videobuf_queue *q,
 693                   struct v4l2_buffer *b, int nonblocking)
 694{
 695        struct videobuf_buffer *buf = NULL;
 696        int retval;
 697
 698        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 699
 700        memset(b, 0, sizeof(*b));
 701        videobuf_queue_lock(q);
 702
 703        retval = stream_next_buffer(q, &buf, nonblocking);
 704        if (retval < 0) {
 705                dprintk(1, "dqbuf: next_buffer error: %i\n", retval);
 706                goto done;
 707        }
 708
 709        switch (buf->state) {
 710        case VIDEOBUF_ERROR:
 711                dprintk(1, "dqbuf: state is error\n");
 712                break;
 713        case VIDEOBUF_DONE:
 714                dprintk(1, "dqbuf: state is done\n");
 715                break;
 716        default:
 717                dprintk(1, "dqbuf: state invalid\n");
 718                retval = -EINVAL;
 719                goto done;
 720        }
 721        CALL(q, sync, q, buf);
 722        videobuf_status(q, b, buf, q->type);
 723        list_del(&buf->stream);
 724        buf->state = VIDEOBUF_IDLE;
 725        b->flags &= ~V4L2_BUF_FLAG_DONE;
 726done:
 727        videobuf_queue_unlock(q);
 728        return retval;
 729}
 730EXPORT_SYMBOL_GPL(videobuf_dqbuf);
 731
 732int videobuf_streamon(struct videobuf_queue *q)
 733{
 734        struct videobuf_buffer *buf;
 735        unsigned long flags = 0;
 736        int retval;
 737
 738        videobuf_queue_lock(q);
 739        retval = -EBUSY;
 740        if (q->reading)
 741                goto done;
 742        retval = 0;
 743        if (q->streaming)
 744                goto done;
 745        q->streaming = 1;
 746        spin_lock_irqsave(q->irqlock, flags);
 747        list_for_each_entry(buf, &q->stream, stream)
 748                if (buf->state == VIDEOBUF_PREPARED)
 749                        q->ops->buf_queue(q, buf);
 750        spin_unlock_irqrestore(q->irqlock, flags);
 751
 752        wake_up_interruptible_sync(&q->wait);
 753done:
 754        videobuf_queue_unlock(q);
 755        return retval;
 756}
 757EXPORT_SYMBOL_GPL(videobuf_streamon);
 758
 759/* Locking: Caller holds q->vb_lock */
 760static int __videobuf_streamoff(struct videobuf_queue *q)
 761{
 762        if (!q->streaming)
 763                return -EINVAL;
 764
 765        videobuf_queue_cancel(q);
 766
 767        return 0;
 768}
 769
 770int videobuf_streamoff(struct videobuf_queue *q)
 771{
 772        int retval;
 773
 774        videobuf_queue_lock(q);
 775        retval = __videobuf_streamoff(q);
 776        videobuf_queue_unlock(q);
 777
 778        return retval;
 779}
 780EXPORT_SYMBOL_GPL(videobuf_streamoff);
 781
 782/* Locking: Caller holds q->vb_lock */
 783static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
 784                                      char __user *data,
 785                                      size_t count, loff_t *ppos)
 786{
 787        enum v4l2_field field;
 788        unsigned long flags = 0;
 789        int retval;
 790
 791        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 792
 793        /* setup stuff */
 794        q->read_buf = videobuf_alloc_vb(q);
 795        if (NULL == q->read_buf)
 796                return -ENOMEM;
 797
 798        q->read_buf->memory = V4L2_MEMORY_USERPTR;
 799        q->read_buf->baddr  = (unsigned long)data;
 800        q->read_buf->bsize  = count;
 801
 802        field = videobuf_next_field(q);
 803        retval = q->ops->buf_prepare(q, q->read_buf, field);
 804        if (0 != retval)
 805                goto done;
 806
 807        /* start capture & wait */
 808        spin_lock_irqsave(q->irqlock, flags);
 809        q->ops->buf_queue(q, q->read_buf);
 810        spin_unlock_irqrestore(q->irqlock, flags);
 811        retval = videobuf_waiton(q, q->read_buf, 0, 0);
 812        if (0 == retval) {
 813                CALL(q, sync, q, q->read_buf);
 814                if (VIDEOBUF_ERROR == q->read_buf->state)
 815                        retval = -EIO;
 816                else
 817                        retval = q->read_buf->size;
 818        }
 819
 820done:
 821        /* cleanup */
 822        q->ops->buf_release(q, q->read_buf);
 823        kfree(q->read_buf);
 824        q->read_buf = NULL;
 825        return retval;
 826}
 827
 828static int __videobuf_copy_to_user(struct videobuf_queue *q,
 829                                   struct videobuf_buffer *buf,
 830                                   char __user *data, size_t count,
 831                                   int nonblocking)
 832{
 833        void *vaddr = CALL(q, vaddr, buf);
 834
 835        /* copy to userspace */
 836        if (count > buf->size - q->read_off)
 837                count = buf->size - q->read_off;
 838
 839        if (copy_to_user(data, vaddr + q->read_off, count))
 840                return -EFAULT;
 841
 842        return count;
 843}
 844
 845static int __videobuf_copy_stream(struct videobuf_queue *q,
 846                                  struct videobuf_buffer *buf,
 847                                  char __user *data, size_t count, size_t pos,
 848                                  int vbihack, int nonblocking)
 849{
 850        unsigned int *fc = CALL(q, vaddr, buf);
 851
 852        if (vbihack) {
 853                /* dirty, undocumented hack -- pass the frame counter
 854                        * within the last four bytes of each vbi data block.
 855                        * We need that one to maintain backward compatibility
 856                        * to all vbi decoding software out there ... */
 857                fc += (buf->size >> 2) - 1;
 858                *fc = buf->field_count >> 1;
 859                dprintk(1, "vbihack: %d\n", *fc);
 860        }
 861
 862        /* copy stuff using the common method */
 863        count = __videobuf_copy_to_user(q, buf, data, count, nonblocking);
 864
 865        if ((count == -EFAULT) && (pos == 0))
 866                return -EFAULT;
 867
 868        return count;
 869}
 870
 871ssize_t videobuf_read_one(struct videobuf_queue *q,
 872                          char __user *data, size_t count, loff_t *ppos,
 873                          int nonblocking)
 874{
 875        enum v4l2_field field;
 876        unsigned long flags = 0;
 877        unsigned size = 0, nbufs = 1;
 878        int retval;
 879
 880        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
 881
 882        videobuf_queue_lock(q);
 883
 884        q->ops->buf_setup(q, &nbufs, &size);
 885
 886        if (NULL == q->read_buf  &&
 887            count >= size        &&
 888            !nonblocking) {
 889                retval = videobuf_read_zerocopy(q, data, count, ppos);
 890                if (retval >= 0  ||  retval == -EIO)
 891                        /* ok, all done */
 892                        goto done;
 893                /* fallback to kernel bounce buffer on failures */
 894        }
 895
 896        if (NULL == q->read_buf) {
 897                /* need to capture a new frame */
 898                retval = -ENOMEM;
 899                q->read_buf = videobuf_alloc_vb(q);
 900
 901                dprintk(1, "video alloc=0x%p\n", q->read_buf);
 902                if (NULL == q->read_buf)
 903                        goto done;
 904                q->read_buf->memory = V4L2_MEMORY_USERPTR;
 905                q->read_buf->bsize = count; /* preferred size */
 906                field = videobuf_next_field(q);
 907                retval = q->ops->buf_prepare(q, q->read_buf, field);
 908
 909                if (0 != retval) {
 910                        kfree(q->read_buf);
 911                        q->read_buf = NULL;
 912                        goto done;
 913                }
 914
 915                spin_lock_irqsave(q->irqlock, flags);
 916                q->ops->buf_queue(q, q->read_buf);
 917                spin_unlock_irqrestore(q->irqlock, flags);
 918
 919                q->read_off = 0;
 920        }
 921
 922        /* wait until capture is done */
 923        retval = videobuf_waiton(q, q->read_buf, nonblocking, 1);
 924        if (0 != retval)
 925                goto done;
 926
 927        CALL(q, sync, q, q->read_buf);
 928
 929        if (VIDEOBUF_ERROR == q->read_buf->state) {
 930                /* catch I/O errors */
 931                q->ops->buf_release(q, q->read_buf);
 932                kfree(q->read_buf);
 933                q->read_buf = NULL;
 934                retval = -EIO;
 935                goto done;
 936        }
 937
 938        /* Copy to userspace */
 939        retval = __videobuf_copy_to_user(q, q->read_buf, data, count, nonblocking);
 940        if (retval < 0)
 941                goto done;
 942
 943        q->read_off += retval;
 944        if (q->read_off == q->read_buf->size) {
 945                /* all data copied, cleanup */
 946                q->ops->buf_release(q, q->read_buf);
 947                kfree(q->read_buf);
 948                q->read_buf = NULL;
 949        }
 950
 951done:
 952        videobuf_queue_unlock(q);
 953        return retval;
 954}
 955EXPORT_SYMBOL_GPL(videobuf_read_one);
 956
 957/* Locking: Caller holds q->vb_lock */
 958static int __videobuf_read_start(struct videobuf_queue *q)
 959{
 960        enum v4l2_field field;
 961        unsigned long flags = 0;
 962        unsigned int count = 0, size = 0;
 963        int err, i;
 964
 965        q->ops->buf_setup(q, &count, &size);
 966        if (count < 2)
 967                count = 2;
 968        if (count > VIDEO_MAX_FRAME)
 969                count = VIDEO_MAX_FRAME;
 970        size = PAGE_ALIGN(size);
 971
 972        err = __videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR);
 973        if (err < 0)
 974                return err;
 975
 976        count = err;
 977
 978        for (i = 0; i < count; i++) {
 979                field = videobuf_next_field(q);
 980                err = q->ops->buf_prepare(q, q->bufs[i], field);
 981                if (err)
 982                        return err;
 983                list_add_tail(&q->bufs[i]->stream, &q->stream);
 984        }
 985        spin_lock_irqsave(q->irqlock, flags);
 986        for (i = 0; i < count; i++)
 987                q->ops->buf_queue(q, q->bufs[i]);
 988        spin_unlock_irqrestore(q->irqlock, flags);
 989        q->reading = 1;
 990        return 0;
 991}
 992
 993static void __videobuf_read_stop(struct videobuf_queue *q)
 994{
 995        int i;
 996
 997        videobuf_queue_cancel(q);
 998        __videobuf_free(q);
 999        INIT_LIST_HEAD(&q->stream);
1000        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
1001                if (NULL == q->bufs[i])
1002                        continue;
1003                kfree(q->bufs[i]);
1004                q->bufs[i] = NULL;
1005        }
1006        q->read_buf = NULL;
1007}
1008
1009int videobuf_read_start(struct videobuf_queue *q)
1010{
1011        int rc;
1012
1013        videobuf_queue_lock(q);
1014        rc = __videobuf_read_start(q);
1015        videobuf_queue_unlock(q);
1016
1017        return rc;
1018}
1019EXPORT_SYMBOL_GPL(videobuf_read_start);
1020
1021void videobuf_read_stop(struct videobuf_queue *q)
1022{
1023        videobuf_queue_lock(q);
1024        __videobuf_read_stop(q);
1025        videobuf_queue_unlock(q);
1026}
1027EXPORT_SYMBOL_GPL(videobuf_read_stop);
1028
1029void videobuf_stop(struct videobuf_queue *q)
1030{
1031        videobuf_queue_lock(q);
1032
1033        if (q->streaming)
1034                __videobuf_streamoff(q);
1035
1036        if (q->reading)
1037                __videobuf_read_stop(q);
1038
1039        videobuf_queue_unlock(q);
1040}
1041EXPORT_SYMBOL_GPL(videobuf_stop);
1042
1043ssize_t videobuf_read_stream(struct videobuf_queue *q,
1044                             char __user *data, size_t count, loff_t *ppos,
1045                             int vbihack, int nonblocking)
1046{
1047        int rc, retval;
1048        unsigned long flags = 0;
1049
1050        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
1051
1052        dprintk(2, "%s\n", __func__);
1053        videobuf_queue_lock(q);
1054        retval = -EBUSY;
1055        if (q->streaming)
1056                goto done;
1057        if (!q->reading) {
1058                retval = __videobuf_read_start(q);
1059                if (retval < 0)
1060                        goto done;
1061        }
1062
1063        retval = 0;
1064        while (count > 0) {
1065                /* get / wait for data */
1066                if (NULL == q->read_buf) {
1067                        q->read_buf = list_entry(q->stream.next,
1068                                                 struct videobuf_buffer,
1069                                                 stream);
1070                        list_del(&q->read_buf->stream);
1071                        q->read_off = 0;
1072                }
1073                rc = videobuf_waiton(q, q->read_buf, nonblocking, 1);
1074                if (rc < 0) {
1075                        if (0 == retval)
1076                                retval = rc;
1077                        break;
1078                }
1079
1080                if (q->read_buf->state == VIDEOBUF_DONE) {
1081                        rc = __videobuf_copy_stream(q, q->read_buf, data + retval, count,
1082                                        retval, vbihack, nonblocking);
1083                        if (rc < 0) {
1084                                retval = rc;
1085                                break;
1086                        }
1087                        retval      += rc;
1088                        count       -= rc;
1089                        q->read_off += rc;
1090                } else {
1091                        /* some error */
1092                        q->read_off = q->read_buf->size;
1093                        if (0 == retval)
1094                                retval = -EIO;
1095                }
1096
1097                /* requeue buffer when done with copying */
1098                if (q->read_off == q->read_buf->size) {
1099                        list_add_tail(&q->read_buf->stream,
1100                                      &q->stream);
1101                        spin_lock_irqsave(q->irqlock, flags);
1102                        q->ops->buf_queue(q, q->read_buf);
1103                        spin_unlock_irqrestore(q->irqlock, flags);
1104                        q->read_buf = NULL;
1105                }
1106                if (retval < 0)
1107                        break;
1108        }
1109
1110done:
1111        videobuf_queue_unlock(q);
1112        return retval;
1113}
1114EXPORT_SYMBOL_GPL(videobuf_read_stream);
1115
1116unsigned int videobuf_poll_stream(struct file *file,
1117                                  struct videobuf_queue *q,
1118                                  poll_table *wait)
1119{
1120        unsigned long req_events = poll_requested_events(wait);
1121        struct videobuf_buffer *buf = NULL;
1122        unsigned int rc = 0;
1123
1124        videobuf_queue_lock(q);
1125        if (q->streaming) {
1126                if (!list_empty(&q->stream))
1127                        buf = list_entry(q->stream.next,
1128                                         struct videobuf_buffer, stream);
1129        } else if (req_events & (POLLIN | POLLRDNORM)) {
1130                if (!q->reading)
1131                        __videobuf_read_start(q);
1132                if (!q->reading) {
1133                        rc = POLLERR;
1134                } else if (NULL == q->read_buf) {
1135                        q->read_buf = list_entry(q->stream.next,
1136                                                 struct videobuf_buffer,
1137                                                 stream);
1138                        list_del(&q->read_buf->stream);
1139                        q->read_off = 0;
1140                }
1141                buf = q->read_buf;
1142        }
1143        if (!buf)
1144                rc = POLLERR;
1145
1146        if (0 == rc) {
1147                poll_wait(file, &buf->done, wait);
1148                if (buf->state == VIDEOBUF_DONE ||
1149                    buf->state == VIDEOBUF_ERROR) {
1150                        switch (q->type) {
1151                        case V4L2_BUF_TYPE_VIDEO_OUTPUT:
1152                        case V4L2_BUF_TYPE_VBI_OUTPUT:
1153                        case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
1154                                rc = POLLOUT | POLLWRNORM;
1155                                break;
1156                        default:
1157                                rc = POLLIN | POLLRDNORM;
1158                                break;
1159                        }
1160                }
1161        }
1162        videobuf_queue_unlock(q);
1163        return rc;
1164}
1165EXPORT_SYMBOL_GPL(videobuf_poll_stream);
1166
1167int videobuf_mmap_mapper(struct videobuf_queue *q, struct vm_area_struct *vma)
1168{
1169        int rc = -EINVAL;
1170        int i;
1171
1172        MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
1173
1174        if (!(vma->vm_flags & VM_WRITE) || !(vma->vm_flags & VM_SHARED)) {
1175                dprintk(1, "mmap appl bug: PROT_WRITE and MAP_SHARED are required\n");
1176                return -EINVAL;
1177        }
1178
1179        videobuf_queue_lock(q);
1180        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
1181                struct videobuf_buffer *buf = q->bufs[i];
1182
1183                if (buf && buf->memory == V4L2_MEMORY_MMAP &&
1184                                buf->boff == (vma->vm_pgoff << PAGE_SHIFT)) {
1185                        rc = CALL(q, mmap_mapper, q, buf, vma);
1186                        break;
1187                }
1188        }
1189        videobuf_queue_unlock(q);
1190
1191        return rc;
1192}
1193EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);
1194