linux/include/media/v4l2-mem2mem.h
<<
>>
Prefs
   1/*
   2 * Memory-to-memory device framework for Video for Linux 2.
   3 *
   4 * Helper functions for devices that use memory buffers for both source
   5 * and destination.
   6 *
   7 * Copyright (c) 2009 Samsung Electronics Co., Ltd.
   8 * Pawel Osciak, <pawel@osciak.com>
   9 * Marek Szyprowski, <m.szyprowski@samsung.com>
  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 the
  13 * Free Software Foundation; either version 2 of the
  14 * License, or (at your option) any later version
  15 */
  16
  17#ifndef _MEDIA_V4L2_MEM2MEM_H
  18#define _MEDIA_V4L2_MEM2MEM_H
  19
  20#include <media/videobuf2-v4l2.h>
  21
  22/**
  23 * struct v4l2_m2m_ops - mem-to-mem device driver callbacks
  24 * @device_run: required. Begin the actual job (transaction) inside this
  25 *              callback.
  26 *              The job does NOT have to end before this callback returns
  27 *              (and it will be the usual case). When the job finishes,
  28 *              v4l2_m2m_job_finish() has to be called.
  29 * @job_ready:  optional. Should return 0 if the driver does not have a job
  30 *              fully prepared to run yet (i.e. it will not be able to finish a
  31 *              transaction without sleeping). If not provided, it will be
  32 *              assumed that one source and one destination buffer are all
  33 *              that is required for the driver to perform one full transaction.
  34 *              This method may not sleep.
  35 * @job_abort:  required. Informs the driver that it has to abort the currently
  36 *              running transaction as soon as possible (i.e. as soon as it can
  37 *              stop the device safely; e.g. in the next interrupt handler),
  38 *              even if the transaction would not have been finished by then.
  39 *              After the driver performs the necessary steps, it has to call
  40 *              v4l2_m2m_job_finish() (as if the transaction ended normally).
  41 *              This function does not have to (and will usually not) wait
  42 *              until the device enters a state when it can be stopped.
  43 * @lock:       optional. Define a driver's own lock callback, instead of using
  44 *              &v4l2_m2m_ctx->q_lock.
  45 * @unlock:     optional. Define a driver's own unlock callback, instead of
  46 *              using &v4l2_m2m_ctx->q_lock.
  47 */
  48struct v4l2_m2m_ops {
  49        void (*device_run)(void *priv);
  50        int (*job_ready)(void *priv);
  51        void (*job_abort)(void *priv);
  52        void (*lock)(void *priv);
  53        void (*unlock)(void *priv);
  54};
  55
  56struct v4l2_m2m_dev;
  57
  58/**
  59 * struct v4l2_m2m_queue_ctx - represents a queue for buffers ready to be
  60 *      processed
  61 *
  62 * @q:          pointer to struct &vb2_queue
  63 * @rdy_queue:  List of V4L2 mem-to-mem queues
  64 * @rdy_spinlock: spin lock to protect the struct usage
  65 * @num_rdy:    number of buffers ready to be processed
  66 * @buffered:   is the queue buffered?
  67 *
  68 * Queue for buffers ready to be processed as soon as this
  69 * instance receives access to the device.
  70 */
  71
  72struct v4l2_m2m_queue_ctx {
  73        struct vb2_queue        q;
  74
  75        struct list_head        rdy_queue;
  76        spinlock_t              rdy_spinlock;
  77        u8                      num_rdy;
  78        bool                    buffered;
  79};
  80
  81/**
  82 * struct v4l2_m2m_ctx - Memory to memory context structure
  83 *
  84 * @q_lock: struct &mutex lock
  85 * @m2m_dev: opaque pointer to the internal data to handle M2M context
  86 * @cap_q_ctx: Capture (output to memory) queue context
  87 * @out_q_ctx: Output (input from memory) queue context
  88 * @queue: List of memory to memory contexts
  89 * @job_flags: Job queue flags, used internally by v4l2-mem2mem.c:
  90 *              %TRANS_QUEUED, %TRANS_RUNNING and %TRANS_ABORT.
  91 * @finished: Wait queue used to signalize when a job queue finished.
  92 * @priv: Instance private data
  93 */
  94struct v4l2_m2m_ctx {
  95        /* optional cap/out vb2 queues lock */
  96        struct mutex                    *q_lock;
  97
  98        /* internal use only */
  99        struct v4l2_m2m_dev             *m2m_dev;
 100
 101        struct v4l2_m2m_queue_ctx       cap_q_ctx;
 102
 103        struct v4l2_m2m_queue_ctx       out_q_ctx;
 104
 105        /* For device job queue */
 106        struct list_head                queue;
 107        unsigned long                   job_flags;
 108        wait_queue_head_t               finished;
 109
 110        void                            *priv;
 111};
 112
 113/**
 114 * struct v4l2_m2m_buffer - Memory to memory buffer
 115 *
 116 * @vb: pointer to struct &vb2_v4l2_buffer
 117 * @list: list of m2m buffers
 118 */
 119struct v4l2_m2m_buffer {
 120        struct vb2_v4l2_buffer  vb;
 121        struct list_head        list;
 122};
 123
 124/**
 125 * v4l2_m2m_get_curr_priv() - return driver private data for the currently
 126 * running instance or NULL if no instance is running
 127 *
 128 * @m2m_dev: opaque pointer to the internal data to handle M2M context
 129 */
 130void *v4l2_m2m_get_curr_priv(struct v4l2_m2m_dev *m2m_dev);
 131
 132/**
 133 * v4l2_m2m_get_vq() - return vb2_queue for the given type
 134 *
 135 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 136 * @type: type of the V4L2 buffer, as defined by enum &v4l2_buf_type
 137 */
 138struct vb2_queue *v4l2_m2m_get_vq(struct v4l2_m2m_ctx *m2m_ctx,
 139                                       enum v4l2_buf_type type);
 140
 141/**
 142 * v4l2_m2m_try_schedule() - check whether an instance is ready to be added to
 143 * the pending job queue and add it if so.
 144 *
 145 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 146 *
 147 * There are three basic requirements an instance has to meet to be able to run:
 148 * 1) at least one source buffer has to be queued,
 149 * 2) at least one destination buffer has to be queued,
 150 * 3) streaming has to be on.
 151 *
 152 * If a queue is buffered (for example a decoder hardware ringbuffer that has
 153 * to be drained before doing streamoff), allow scheduling without v4l2 buffers
 154 * on that queue.
 155 *
 156 * There may also be additional, custom requirements. In such case the driver
 157 * should supply a custom callback (job_ready in v4l2_m2m_ops) that should
 158 * return 1 if the instance is ready.
 159 * An example of the above could be an instance that requires more than one
 160 * src/dst buffer per transaction.
 161 */
 162void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx);
 163
 164/**
 165 * v4l2_m2m_job_finish() - inform the framework that a job has been finished
 166 * and have it clean up
 167 *
 168 * @m2m_dev: opaque pointer to the internal data to handle M2M context
 169 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 170 *
 171 * Called by a driver to yield back the device after it has finished with it.
 172 * Should be called as soon as possible after reaching a state which allows
 173 * other instances to take control of the device.
 174 *
 175 * This function has to be called only after &v4l2_m2m_ops->device_run
 176 * callback has been called on the driver. To prevent recursion, it should
 177 * not be called directly from the &v4l2_m2m_ops->device_run callback though.
 178 */
 179void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev,
 180                         struct v4l2_m2m_ctx *m2m_ctx);
 181
 182static inline void
 183v4l2_m2m_buf_done(struct vb2_v4l2_buffer *buf, enum vb2_buffer_state state)
 184{
 185        vb2_buffer_done(&buf->vb2_buf, state);
 186}
 187
 188/**
 189 * v4l2_m2m_reqbufs() - multi-queue-aware REQBUFS multiplexer
 190 *
 191 * @file: pointer to struct &file
 192 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 193 * @reqbufs: pointer to struct &v4l2_requestbuffers
 194 */
 195int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 196                     struct v4l2_requestbuffers *reqbufs);
 197
 198/**
 199 * v4l2_m2m_querybuf() - multi-queue-aware QUERYBUF multiplexer
 200 *
 201 * @file: pointer to struct &file
 202 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 203 * @buf: pointer to struct &v4l2_buffer
 204 *
 205 * See v4l2_m2m_mmap() documentation for details.
 206 */
 207int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 208                      struct v4l2_buffer *buf);
 209
 210/**
 211 * v4l2_m2m_qbuf() - enqueue a source or destination buffer, depending on
 212 * the type
 213 *
 214 * @file: pointer to struct &file
 215 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 216 * @buf: pointer to struct &v4l2_buffer
 217 */
 218int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 219                  struct v4l2_buffer *buf);
 220
 221/**
 222 * v4l2_m2m_dqbuf() - dequeue a source or destination buffer, depending on
 223 * the type
 224 *
 225 * @file: pointer to struct &file
 226 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 227 * @buf: pointer to struct &v4l2_buffer
 228 */
 229int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 230                   struct v4l2_buffer *buf);
 231
 232/**
 233 * v4l2_m2m_prepare_buf() - prepare a source or destination buffer, depending on
 234 * the type
 235 *
 236 * @file: pointer to struct &file
 237 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 238 * @buf: pointer to struct &v4l2_buffer
 239 */
 240int v4l2_m2m_prepare_buf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 241                         struct v4l2_buffer *buf);
 242
 243/**
 244 * v4l2_m2m_create_bufs() - create a source or destination buffer, depending
 245 * on the type
 246 *
 247 * @file: pointer to struct &file
 248 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 249 * @create: pointer to struct &v4l2_create_buffers
 250 */
 251int v4l2_m2m_create_bufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 252                         struct v4l2_create_buffers *create);
 253
 254/**
 255 * v4l2_m2m_expbuf() - export a source or destination buffer, depending on
 256 * the type
 257 *
 258 * @file: pointer to struct &file
 259 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 260 * @eb: pointer to struct &v4l2_exportbuffer
 261 */
 262int v4l2_m2m_expbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 263                   struct v4l2_exportbuffer *eb);
 264
 265/**
 266 * v4l2_m2m_streamon() - turn on streaming for a video queue
 267 *
 268 * @file: pointer to struct &file
 269 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 270 * @type: type of the V4L2 buffer, as defined by enum &v4l2_buf_type
 271 */
 272int v4l2_m2m_streamon(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 273                      enum v4l2_buf_type type);
 274
 275/**
 276 * v4l2_m2m_streamoff() - turn off streaming for a video queue
 277 *
 278 * @file: pointer to struct &file
 279 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 280 * @type: type of the V4L2 buffer, as defined by enum &v4l2_buf_type
 281 */
 282int v4l2_m2m_streamoff(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 283                       enum v4l2_buf_type type);
 284
 285/**
 286 * v4l2_m2m_poll() - poll replacement, for destination buffers only
 287 *
 288 * @file: pointer to struct &file
 289 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 290 * @wait: pointer to struct &poll_table_struct
 291 *
 292 * Call from the driver's poll() function. Will poll both queues. If a buffer
 293 * is available to dequeue (with dqbuf) from the source queue, this will
 294 * indicate that a non-blocking write can be performed, while read will be
 295 * returned in case of the destination queue.
 296 */
 297unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 298                           struct poll_table_struct *wait);
 299
 300/**
 301 * v4l2_m2m_mmap() - source and destination queues-aware mmap multiplexer
 302 *
 303 * @file: pointer to struct &file
 304 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 305 * @vma: pointer to struct &vm_area_struct
 306 *
 307 * Call from driver's mmap() function. Will handle mmap() for both queues
 308 * seamlessly for videobuffer, which will receive normal per-queue offsets and
 309 * proper videobuf queue pointers. The differentiation is made outside videobuf
 310 * by adding a predefined offset to buffers from one of the queues and
 311 * subtracting it before passing it back to videobuf. Only drivers (and
 312 * thus applications) receive modified offsets.
 313 */
 314int v4l2_m2m_mmap(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 315                  struct vm_area_struct *vma);
 316
 317/**
 318 * v4l2_m2m_init() - initialize per-driver m2m data
 319 *
 320 * @m2m_ops: pointer to struct v4l2_m2m_ops
 321 *
 322 * Usually called from driver's ``probe()`` function.
 323 *
 324 * Return: returns an opaque pointer to the internal data to handle M2M context
 325 */
 326struct v4l2_m2m_dev *v4l2_m2m_init(const struct v4l2_m2m_ops *m2m_ops);
 327
 328/**
 329 * v4l2_m2m_release() - cleans up and frees a m2m_dev structure
 330 *
 331 * @m2m_dev: opaque pointer to the internal data to handle M2M context
 332 *
 333 * Usually called from driver's ``remove()`` function.
 334 */
 335void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev);
 336
 337/**
 338 * v4l2_m2m_ctx_init() - allocate and initialize a m2m context
 339 *
 340 * @m2m_dev: opaque pointer to the internal data to handle M2M context
 341 * @drv_priv: driver's instance private data
 342 * @queue_init: a callback for queue type-specific initialization function
 343 *      to be used for initializing videobuf_queues
 344 *
 345 * Usually called from driver's ``open()`` function.
 346 */
 347struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev,
 348                void *drv_priv,
 349                int (*queue_init)(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq));
 350
 351static inline void v4l2_m2m_set_src_buffered(struct v4l2_m2m_ctx *m2m_ctx,
 352                                             bool buffered)
 353{
 354        m2m_ctx->out_q_ctx.buffered = buffered;
 355}
 356
 357static inline void v4l2_m2m_set_dst_buffered(struct v4l2_m2m_ctx *m2m_ctx,
 358                                             bool buffered)
 359{
 360        m2m_ctx->cap_q_ctx.buffered = buffered;
 361}
 362
 363/**
 364 * v4l2_m2m_ctx_release() - release m2m context
 365 *
 366 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 367 *
 368 * Usually called from driver's release() function.
 369 */
 370void v4l2_m2m_ctx_release(struct v4l2_m2m_ctx *m2m_ctx);
 371
 372/**
 373 * v4l2_m2m_buf_queue() - add a buffer to the proper ready buffers list.
 374 *
 375 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 376 * @vbuf: pointer to struct &vb2_v4l2_buffer
 377 *
 378 * Call from videobuf_queue_ops->ops->buf_queue, videobuf_queue_ops callback.
 379 */
 380void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx,
 381                        struct vb2_v4l2_buffer *vbuf);
 382
 383/**
 384 * v4l2_m2m_num_src_bufs_ready() - return the number of source buffers ready for
 385 * use
 386 *
 387 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 388 */
 389static inline
 390unsigned int v4l2_m2m_num_src_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
 391{
 392        return m2m_ctx->out_q_ctx.num_rdy;
 393}
 394
 395/**
 396 * v4l2_m2m_num_dst_bufs_ready() - return the number of destination buffers
 397 * ready for use
 398 *
 399 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 400 */
 401static inline
 402unsigned int v4l2_m2m_num_dst_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
 403{
 404        return m2m_ctx->cap_q_ctx.num_rdy;
 405}
 406
 407/**
 408 * v4l2_m2m_next_buf() - return next buffer from the list of ready buffers
 409 *
 410 * @q_ctx: pointer to struct @v4l2_m2m_queue_ctx
 411 */
 412void *v4l2_m2m_next_buf(struct v4l2_m2m_queue_ctx *q_ctx);
 413
 414/**
 415 * v4l2_m2m_next_src_buf() - return next source buffer from the list of ready
 416 * buffers
 417 *
 418 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 419 */
 420static inline void *v4l2_m2m_next_src_buf(struct v4l2_m2m_ctx *m2m_ctx)
 421{
 422        return v4l2_m2m_next_buf(&m2m_ctx->out_q_ctx);
 423}
 424
 425/**
 426 * v4l2_m2m_next_dst_buf() - return next destination buffer from the list of
 427 * ready buffers
 428 *
 429 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 430 */
 431static inline void *v4l2_m2m_next_dst_buf(struct v4l2_m2m_ctx *m2m_ctx)
 432{
 433        return v4l2_m2m_next_buf(&m2m_ctx->cap_q_ctx);
 434}
 435
 436/**
 437 * v4l2_m2m_get_src_vq() - return vb2_queue for source buffers
 438 *
 439 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 440 */
 441static inline
 442struct vb2_queue *v4l2_m2m_get_src_vq(struct v4l2_m2m_ctx *m2m_ctx)
 443{
 444        return &m2m_ctx->out_q_ctx.q;
 445}
 446
 447/**
 448 * v4l2_m2m_get_dst_vq() - return vb2_queue for destination buffers
 449 *
 450 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 451 */
 452static inline
 453struct vb2_queue *v4l2_m2m_get_dst_vq(struct v4l2_m2m_ctx *m2m_ctx)
 454{
 455        return &m2m_ctx->cap_q_ctx.q;
 456}
 457
 458/**
 459 * v4l2_m2m_buf_remove() - take off a buffer from the list of ready buffers and
 460 * return it
 461 *
 462 * @q_ctx: pointer to struct @v4l2_m2m_queue_ctx
 463 */
 464void *v4l2_m2m_buf_remove(struct v4l2_m2m_queue_ctx *q_ctx);
 465
 466/**
 467 * v4l2_m2m_src_buf_remove() - take off a source buffer from the list of ready
 468 * buffers and return it
 469 *
 470 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 471 */
 472static inline void *v4l2_m2m_src_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)
 473{
 474        return v4l2_m2m_buf_remove(&m2m_ctx->out_q_ctx);
 475}
 476
 477/**
 478 * v4l2_m2m_dst_buf_remove() - take off a destination buffer from the list of
 479 * ready buffers and return it
 480 *
 481 * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx
 482 */
 483static inline void *v4l2_m2m_dst_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)
 484{
 485        return v4l2_m2m_buf_remove(&m2m_ctx->cap_q_ctx);
 486}
 487
 488/* v4l2 ioctl helpers */
 489
 490int v4l2_m2m_ioctl_reqbufs(struct file *file, void *priv,
 491                                struct v4l2_requestbuffers *rb);
 492int v4l2_m2m_ioctl_create_bufs(struct file *file, void *fh,
 493                                struct v4l2_create_buffers *create);
 494int v4l2_m2m_ioctl_querybuf(struct file *file, void *fh,
 495                                struct v4l2_buffer *buf);
 496int v4l2_m2m_ioctl_expbuf(struct file *file, void *fh,
 497                                struct v4l2_exportbuffer *eb);
 498int v4l2_m2m_ioctl_qbuf(struct file *file, void *fh,
 499                                struct v4l2_buffer *buf);
 500int v4l2_m2m_ioctl_dqbuf(struct file *file, void *fh,
 501                                struct v4l2_buffer *buf);
 502int v4l2_m2m_ioctl_prepare_buf(struct file *file, void *fh,
 503                               struct v4l2_buffer *buf);
 504int v4l2_m2m_ioctl_streamon(struct file *file, void *fh,
 505                                enum v4l2_buf_type type);
 506int v4l2_m2m_ioctl_streamoff(struct file *file, void *fh,
 507                                enum v4l2_buf_type type);
 508int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma);
 509unsigned int v4l2_m2m_fop_poll(struct file *file, poll_table *wait);
 510
 511#endif /* _MEDIA_V4L2_MEM2MEM_H */
 512
 513