diff --git a/Documentation/DocBook/media/v4l/compat.xml b/Documentation/DocBook/media/v4l/compat.xml
index 4fdf6b562d1c..50eb63024eb7 100644
--- a/Documentation/DocBook/media/v4l/compat.xml
+++ b/Documentation/DocBook/media/v4l/compat.xml
@@ -2586,6 +2586,10 @@ ioctls.
Vendor and device specific media bus pixel formats.
.
+
+ Importing DMABUF file descriptors as a new IO method described
+ in .
+
diff --git a/Documentation/DocBook/media/v4l/io.xml b/Documentation/DocBook/media/v4l/io.xml
index 7e2f3d7d78ad..be0fad7e1209 100644
--- a/Documentation/DocBook/media/v4l/io.xml
+++ b/Documentation/DocBook/media/v4l/io.xml
@@ -331,7 +331,7 @@ application until one or more buffers can be dequeued. By default
outgoing queue. When the O_NONBLOCK flag was
given to the &func-open; function, VIDIOC_DQBUF
returns immediately with an &EAGAIN; when no buffer is available. The
-&func-select; or &func-poll; function are always available.
+&func-select; or &func-poll; functions are always available.
To start and stop capturing or output applications call the
&VIDIOC-STREAMON; and &VIDIOC-STREAMOFF; ioctl. Note
@@ -472,6 +472,162 @@ rest should be evident.
+
+ Streaming I/O (DMA buffer importing)
+
+
+ Experimental
+ This is an experimental
+ interface and may change in the future.
+
+
+The DMABUF framework provides a generic method for sharing buffers
+between multiple devices. Device drivers that support DMABUF can export a DMA
+buffer to userspace as a file descriptor (known as the exporter role), import a
+DMA buffer from userspace using a file descriptor previously exported for a
+different or the same device (known as the importer role), or both. This
+section describes the DMABUF importer role API in V4L2.
+
+Input and output devices support the streaming I/O method when the
+V4L2_CAP_STREAMING flag in the
+capabilities field of &v4l2-capability; returned by
+the &VIDIOC-QUERYCAP; ioctl is set. Whether importing DMA buffers through
+DMABUF file descriptors is supported is determined by calling the
+&VIDIOC-REQBUFS; ioctl with the memory type set to
+V4L2_MEMORY_DMABUF.
+
+ This I/O method is dedicated to sharing DMA buffers between different
+devices, which may be V4L devices or other video-related devices (e.g. DRM).
+Buffers (planes) are allocated by a driver on behalf of an application. Next,
+these buffers are exported to the application as file descriptors using an API
+which is specific for an allocator driver. Only such file descriptor are
+exchanged. The descriptors and meta-information are passed in &v4l2-buffer; (or
+in &v4l2-plane; in the multi-planar API case). The driver must be switched
+into DMABUF I/O mode by calling the &VIDIOC-REQBUFS; with the desired buffer
+type.
+
+
+ Initiating streaming I/O with DMABUF file descriptors
+
+
+&v4l2-requestbuffers; reqbuf;
+
+memset(&reqbuf, 0, sizeof (reqbuf));
+reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+reqbuf.memory = V4L2_MEMORY_DMABUF;
+reqbuf.count = 1;
+
+if (ioctl(fd, &VIDIOC-REQBUFS;, &reqbuf) == -1) {
+ if (errno == EINVAL)
+ printf("Video capturing or DMABUF streaming is not supported\n");
+ else
+ perror("VIDIOC_REQBUFS");
+
+ exit(EXIT_FAILURE);
+}
+
+
+
+ The buffer (plane) file descriptor is passed on the fly with the
+&VIDIOC-QBUF; ioctl. In case of multiplanar buffers, every plane can be
+associated with a different DMABUF descriptor. Although buffers are commonly
+cycled, applications can pass a different DMABUF descriptor at each
+VIDIOC_QBUF call.
+
+
+ Queueing DMABUF using single plane API
+
+
+int buffer_queue(int v4lfd, int index, int dmafd)
+{
+ &v4l2-buffer; buf;
+
+ memset(&buf, 0, sizeof buf);
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ buf.memory = V4L2_MEMORY_DMABUF;
+ buf.index = index;
+ buf.m.fd = dmafd;
+
+ if (ioctl(v4lfd, &VIDIOC-QBUF;, &buf) == -1) {
+ perror("VIDIOC_QBUF");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+
+
+ Queueing DMABUF using multi plane API
+
+
+int buffer_queue_mp(int v4lfd, int index, int dmafd[], int n_planes)
+{
+ &v4l2-buffer; buf;
+ &v4l2-plane; planes[VIDEO_MAX_PLANES];
+ int i;
+
+ memset(&buf, 0, sizeof buf);
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ buf.memory = V4L2_MEMORY_DMABUF;
+ buf.index = index;
+ buf.m.planes = planes;
+ buf.length = n_planes;
+
+ memset(&planes, 0, sizeof planes);
+
+ for (i = 0; i < n_planes; ++i)
+ buf.m.planes[i].m.fd = dmafd[i];
+
+ if (ioctl(v4lfd, &VIDIOC-QBUF;, &buf) == -1) {
+ perror("VIDIOC_QBUF");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+
+ Captured or displayed buffers are dequeued with the
+&VIDIOC-DQBUF; ioctl. The driver can unlock the buffer at any
+time between the completion of the DMA and this ioctl. The memory is
+also unlocked when &VIDIOC-STREAMOFF; is called, &VIDIOC-REQBUFS;, or
+when the device is closed.
+
+ For capturing applications it is customary to enqueue a
+number of empty buffers, to start capturing and enter the read loop.
+Here the application waits until a filled buffer can be dequeued, and
+re-enqueues the buffer when the data is no longer needed. Output
+applications fill and enqueue buffers, when enough buffers are stacked
+up output is started. In the write loop, when the application
+runs out of free buffers it must wait until an empty buffer can be
+dequeued and reused. Two methods exist to suspend execution of the
+application until one or more buffers can be dequeued. By default
+VIDIOC_DQBUF blocks when no buffer is in the
+outgoing queue. When the O_NONBLOCK flag was
+given to the &func-open; function, VIDIOC_DQBUF
+returns immediately with an &EAGAIN; when no buffer is available. The
+&func-select; and &func-poll; functions are always available.
+
+ To start and stop capturing or displaying applications call the
+&VIDIOC-STREAMON; and &VIDIOC-STREAMOFF; ioctls. Note that
+VIDIOC_STREAMOFF removes all buffers from both queues and
+unlocks all buffers as a side effect. Since there is no notion of doing
+anything "now" on a multitasking system, if an application needs to synchronize
+with another event it should examine the &v4l2-buffer;
+timestamp of captured buffers, or set the field
+before enqueuing buffers for output.
+
+ Drivers implementing DMABUF importing I/O must support the
+VIDIOC_REQBUFS, VIDIOC_QBUF,
+VIDIOC_DQBUF, VIDIOC_STREAMON and
+VIDIOC_STREAMOFF ioctls, and the
+select() and poll() functions.
+
+
+
Asynchronous I/O
@@ -672,6 +828,14 @@ memory, set by the application. See for details.
in the length field of this
v4l2_buffer structure.
+
+
+ int
+ fd
+ For the single-plane API and when
+memory is V4L2_MEMORY_DMABUF this
+is the file descriptor associated with a DMABUF buffer.
+ __u32length
@@ -743,6 +907,15 @@ should set this to 0.
pointer to the memory allocated for this plane by an application.
+
+
+ int
+ fd
+ When the memory type in the containing &v4l2-buffer; is
+ V4L2_MEMORY_DMABUF, this is a file
+ descriptor associated with a DMABUF buffer, similar to the
+ fd field in &v4l2-buffer;.
+ __u32data_offset
@@ -964,6 +1137,12 @@ pointer I/O.
3[to do]
+
+ V4L2_MEMORY_DMABUF
+ 4
+ The buffer is used for DMA shared
+buffer I/O.
+
diff --git a/Documentation/DocBook/media/v4l/vidioc-create-bufs.xml b/Documentation/DocBook/media/v4l/vidioc-create-bufs.xml
index a8cda1acacd9..cd9943672434 100644
--- a/Documentation/DocBook/media/v4l/vidioc-create-bufs.xml
+++ b/Documentation/DocBook/media/v4l/vidioc-create-bufs.xml
@@ -6,7 +6,8 @@
VIDIOC_CREATE_BUFS
- Create buffers for Memory Mapped or User Pointer I/O
+ Create buffers for Memory Mapped or User Pointer or DMA Buffer
+ I/O
@@ -55,11 +56,11 @@
This ioctl is used to create buffers for memory
-mapped or user pointer
-I/O. It can be used as an alternative or in addition to the
-VIDIOC_REQBUFS ioctl, when a tighter control over buffers
-is required. This ioctl can be called multiple times to create buffers of
-different sizes.
+mapped or user pointer or DMA buffer I/O. It can be used as an alternative or in
+addition to the VIDIOC_REQBUFS ioctl, when a tighter
+control over buffers is required. This ioctl can be called multiple times to
+create buffers of different sizes.
To allocate device buffers applications initialize relevant fields of
the v4l2_create_buffers structure. They set the
@@ -109,7 +110,8 @@ information.__u32memoryApplications set this field to
-V4L2_MEMORY_MMAP or
+V4L2_MEMORY_MMAP,
+V4L2_MEMORY_DMABUF or
V4L2_MEMORY_USERPTR. See
diff --git a/Documentation/DocBook/media/v4l/vidioc-qbuf.xml b/Documentation/DocBook/media/v4l/vidioc-qbuf.xml
index 2d37abefce13..3504a7f2f382 100644
--- a/Documentation/DocBook/media/v4l/vidioc-qbuf.xml
+++ b/Documentation/DocBook/media/v4l/vidioc-qbuf.xml
@@ -109,6 +109,23 @@ they cannot be swapped out to disk. Buffers remain locked until
dequeued, until the &VIDIOC-STREAMOFF; or &VIDIOC-REQBUFS; ioctl is
called, or until the device is closed.
+ To enqueue a DMABUF buffer applications
+set the memory field to
+V4L2_MEMORY_DMABUF and the m.fd
+field to a file descriptor associated with a DMABUF buffer. When the
+multi-planar API is used the m.fd fields of the
+passed array of &v4l2-plane; have to be used instead. When
+VIDIOC_QBUF is called with a pointer to this structure the
+driver sets the V4L2_BUF_FLAG_QUEUED flag and clears the
+V4L2_BUF_FLAG_MAPPED and
+V4L2_BUF_FLAG_DONE flags in the
+flags field, or it returns an error code. This
+ioctl locks the buffer. Locking a buffer means passing it to a driver for a
+hardware access (usually DMA). If an application accesses (reads/writes) a
+locked buffer then the result is undefined. Buffers remain locked until
+dequeued, until the &VIDIOC-STREAMOFF; or &VIDIOC-REQBUFS; ioctl is called, or
+until the device is closed.
+
Applications call the VIDIOC_DQBUF
ioctl to dequeue a filled (capturing) or displayed (output) buffer
from the driver's outgoing queue. They just set the
diff --git a/Documentation/DocBook/media/v4l/vidioc-reqbufs.xml b/Documentation/DocBook/media/v4l/vidioc-reqbufs.xml
index 2b50ef2007f3..78a06a9a5ece 100644
--- a/Documentation/DocBook/media/v4l/vidioc-reqbufs.xml
+++ b/Documentation/DocBook/media/v4l/vidioc-reqbufs.xml
@@ -48,28 +48,30 @@
Description
- This ioctl is used to initiate memory
-mapped or user pointer
-I/O. Memory mapped buffers are located in device memory and must be
-allocated with this ioctl before they can be mapped into the
-application's address space. User buffers are allocated by
-applications themselves, and this ioctl is merely used to switch the
-driver into user pointer I/O mode and to setup some internal structures.
+This ioctl is used to initiate memory mapped,
+user pointer or DMABUF based I/O. Memory mapped buffers are located in
+device memory and must be allocated with this ioctl before they can be mapped
+into the application's address space. User buffers are allocated by
+applications themselves, and this ioctl is merely used to switch the driver
+into user pointer I/O mode and to setup some internal structures.
+Similarly, DMABUF buffers are allocated by applications through a device
+driver, and this ioctl only configures the driver into DMABUF I/O mode without
+performing any direct allocation.
- To allocate device buffers applications initialize all
-fields of the v4l2_requestbuffers structure.
-They set the type field to the respective
-stream or buffer type, the count field to
-the desired number of buffers, memory
-must be set to the requested I/O method and the reserved array
-must be zeroed. When the ioctl
-is called with a pointer to this structure the driver will attempt to allocate
-the requested number of buffers and it stores the actual number
-allocated in the count field. It can be
-smaller than the number requested, even zero, when the driver runs out
-of free memory. A larger number is also possible when the driver requires
-more buffers to function correctly. For example video output requires at least two buffers,
-one displayed and one filled by the application.
+ To allocate device buffers applications initialize all fields of the
+v4l2_requestbuffers structure. They set the
+type field to the respective stream or buffer type,
+the count field to the desired number of buffers,
+memory must be set to the requested I/O method and
+the reserved array must be zeroed. When the ioctl is
+called with a pointer to this structure the driver will attempt to allocate the
+requested number of buffers and it stores the actual number allocated in the
+count field. It can be smaller than the number
+requested, even zero, when the driver runs out of free memory. A larger number
+is also possible when the driver requires more buffers to function correctly.
+For example video output requires at least two buffers, one displayed and one
+filled by the application.When the I/O method is not supported the ioctl
returns an &EINVAL;.
@@ -102,7 +104,8 @@ as the &v4l2-format; type field. See __u32
memoryApplications set this field to
-V4L2_MEMORY_MMAP or
+V4L2_MEMORY_MMAP,
+V4L2_MEMORY_DMABUF or
V4L2_MEMORY_USERPTR. See .