Merge drm/drm-next into drm-misc-next
[sfrench/cifs-2.6.git] / include / uapi / linux / dma-buf.h
index b1523cb8ab307d7454160a5d5b3f1d1c0fc1b596..5a6fda66d9adf01438619e7e67fa69f0fec2d88d 100644 (file)
@@ -85,6 +85,88 @@ struct dma_buf_sync {
 
 #define DMA_BUF_NAME_LEN       32
 
+/**
+ * struct dma_buf_export_sync_file - Get a sync_file from a dma-buf
+ *
+ * Userspace can perform a DMA_BUF_IOCTL_EXPORT_SYNC_FILE to retrieve the
+ * current set of fences on a dma-buf file descriptor as a sync_file.  CPU
+ * waits via poll() or other driver-specific mechanisms typically wait on
+ * whatever fences are on the dma-buf at the time the wait begins.  This
+ * is similar except that it takes a snapshot of the current fences on the
+ * dma-buf for waiting later instead of waiting immediately.  This is
+ * useful for modern graphics APIs such as Vulkan which assume an explicit
+ * synchronization model but still need to inter-operate with dma-buf.
+ *
+ * The intended usage pattern is the following:
+ *
+ *  1. Export a sync_file with flags corresponding to the expected GPU usage
+ *     via DMA_BUF_IOCTL_EXPORT_SYNC_FILE.
+ *
+ *  2. Submit rendering work which uses the dma-buf.  The work should wait on
+ *     the exported sync file before rendering and produce another sync_file
+ *     when complete.
+ *
+ *  3. Import the rendering-complete sync_file into the dma-buf with flags
+ *     corresponding to the GPU usage via DMA_BUF_IOCTL_IMPORT_SYNC_FILE.
+ *
+ * Unlike doing implicit synchronization via a GPU kernel driver's exec ioctl,
+ * the above is not a single atomic operation.  If userspace wants to ensure
+ * ordering via these fences, it is the respnosibility of userspace to use
+ * locks or other mechanisms to ensure that no other context adds fences or
+ * submits work between steps 1 and 3 above.
+ */
+struct dma_buf_export_sync_file {
+       /**
+        * @flags: Read/write flags
+        *
+        * Must be DMA_BUF_SYNC_READ, DMA_BUF_SYNC_WRITE, or both.
+        *
+        * If DMA_BUF_SYNC_READ is set and DMA_BUF_SYNC_WRITE is not set,
+        * the returned sync file waits on any writers of the dma-buf to
+        * complete.  Waiting on the returned sync file is equivalent to
+        * poll() with POLLIN.
+        *
+        * If DMA_BUF_SYNC_WRITE is set, the returned sync file waits on
+        * any users of the dma-buf (read or write) to complete.  Waiting
+        * on the returned sync file is equivalent to poll() with POLLOUT.
+        * If both DMA_BUF_SYNC_WRITE and DMA_BUF_SYNC_READ are set, this
+        * is equivalent to just DMA_BUF_SYNC_WRITE.
+        */
+       __u32 flags;
+       /** @fd: Returned sync file descriptor */
+       __s32 fd;
+};
+
+/**
+ * struct dma_buf_import_sync_file - Insert a sync_file into a dma-buf
+ *
+ * Userspace can perform a DMA_BUF_IOCTL_IMPORT_SYNC_FILE to insert a
+ * sync_file into a dma-buf for the purposes of implicit synchronization
+ * with other dma-buf consumers.  This allows clients using explicitly
+ * synchronized APIs such as Vulkan to inter-op with dma-buf consumers
+ * which expect implicit synchronization such as OpenGL or most media
+ * drivers/video.
+ */
+struct dma_buf_import_sync_file {
+       /**
+        * @flags: Read/write flags
+        *
+        * Must be DMA_BUF_SYNC_READ, DMA_BUF_SYNC_WRITE, or both.
+        *
+        * If DMA_BUF_SYNC_READ is set and DMA_BUF_SYNC_WRITE is not set,
+        * this inserts the sync_file as a read-only fence.  Any subsequent
+        * implicitly synchronized writes to this dma-buf will wait on this
+        * fence but reads will not.
+        *
+        * If DMA_BUF_SYNC_WRITE is set, this inserts the sync_file as a
+        * write fence.  All subsequent implicitly synchronized access to
+        * this dma-buf will wait on this fence.
+        */
+       __u32 flags;
+       /** @fd: Sync file descriptor */
+       __s32 fd;
+};
+
 #define DMA_BUF_BASE           'b'
 #define DMA_BUF_IOCTL_SYNC     _IOW(DMA_BUF_BASE, 0, struct dma_buf_sync)
 
@@ -94,5 +176,7 @@ struct dma_buf_sync {
 #define DMA_BUF_SET_NAME       _IOW(DMA_BUF_BASE, 1, const char *)
 #define DMA_BUF_SET_NAME_A     _IOW(DMA_BUF_BASE, 1, __u32)
 #define DMA_BUF_SET_NAME_B     _IOW(DMA_BUF_BASE, 1, __u64)
+#define DMA_BUF_IOCTL_EXPORT_SYNC_FILE _IOWR(DMA_BUF_BASE, 2, struct dma_buf_export_sync_file)
+#define DMA_BUF_IOCTL_IMPORT_SYNC_FILE _IOW(DMA_BUF_BASE, 3, struct dma_buf_import_sync_file)
 
 #endif