Merge branch 'asoc-5.3' into asoc-5.4
[linux-2.6-microblaze.git] / include / linux / dma-buf.h
index 9b84114..bae060f 100644 (file)
@@ -28,18 +28,20 @@ struct dma_buf_attachment;
 
 /**
  * struct dma_buf_ops - operations possible on struct dma_buf
- * @map_atomic: [optional] maps a page from the buffer into kernel address
- *             space, users may not block until the subsequent unmap call.
- *             This callback must not sleep.
- * @unmap_atomic: [optional] unmaps a atomically mapped page from the buffer.
- *               This Callback must not sleep.
- * @map: [optional] maps a page from the buffer into kernel address space.
- * @unmap: [optional] unmaps a page from the buffer.
  * @vmap: [optional] creates a virtual mapping for the buffer into kernel
  *       address space. Same restrictions as for vmap and friends apply.
  * @vunmap: [optional] unmaps a vmap from the buffer
  */
 struct dma_buf_ops {
+       /**
+         * @cache_sgt_mapping:
+         *
+         * If true the framework will cache the first mapping made for each
+         * attachment. This avoids creating mappings for attachments multiple
+         * times.
+         */
+       bool cache_sgt_mapping;
+
        /**
         * @attach:
         *
@@ -194,8 +196,6 @@ struct dma_buf_ops {
         * to be restarted.
         */
        int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction);
-       void *(*map)(struct dma_buf *, unsigned long);
-       void (*unmap)(struct dma_buf *, unsigned long, void *);
 
        /**
         * @mmap:
@@ -234,6 +234,31 @@ struct dma_buf_ops {
         */
        int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
 
+       /**
+        * @map:
+        *
+        * Maps a page from the buffer into kernel address space. The page is
+        * specified by offset into the buffer in PAGE_SIZE units.
+        *
+        * This callback is optional.
+        *
+        * Returns:
+        *
+        * Virtual address pointer where requested page can be accessed. NULL
+        * on error or when this function is unimplemented by the exporter.
+        */
+       void *(*map)(struct dma_buf *, unsigned long);
+
+       /**
+        * @unmap:
+        *
+        * Unmaps a page from the buffer. Page offset and address pointer should
+        * be the same as the one passed to and returned by matching call to map.
+        *
+        * This callback is optional.
+        */
+       void (*unmap)(struct dma_buf *, unsigned long, void *);
+
        void *(*vmap)(struct dma_buf *);
        void (*vunmap)(struct dma_buf *, void *vaddr);
 };
@@ -244,10 +269,12 @@ struct dma_buf_ops {
  * @file: file pointer used for sharing buffers across, and for refcounting.
  * @attachments: list of dma_buf_attachment that denotes all devices attached.
  * @ops: dma_buf_ops associated with this buffer object.
- * @lock: used internally to serialize list manipulation, attach/detach and vmap/unmap
+ * @lock: used internally to serialize list manipulation, attach/detach and
+ *        vmap/unmap, and accesses to name
  * @vmapping_counter: used internally to refcnt the vmaps
  * @vmap_ptr: the current vmap ptr if vmapping_counter > 0
  * @exp_name: name of the exporter; useful for debugging.
+ * @name: userspace-provided name; useful for accounting and debugging.
  * @owner: pointer to exporter module; used for refcounting when exporter is a
  *         kernel module.
  * @list_node: node for dma_buf accounting and debugging.
@@ -275,6 +302,7 @@ struct dma_buf {
        unsigned vmapping_counter;
        void *vmap_ptr;
        const char *exp_name;
+       const char *name;
        struct module *owner;
        struct list_head list_node;
        void *priv;
@@ -296,6 +324,8 @@ struct dma_buf {
  * @dmabuf: buffer for this attachment.
  * @dev: device attached to the buffer.
  * @node: list of dma_buf_attachment.
+ * @sgt: cached mapping.
+ * @dir: direction of cached mapping.
  * @priv: exporter specific attachment data.
  *
  * This structure holds the attachment information between the dma_buf buffer
@@ -311,6 +341,8 @@ struct dma_buf_attachment {
        struct dma_buf *dmabuf;
        struct device *dev;
        struct list_head node;
+       struct sg_table *sgt;
+       enum dma_data_direction dir;
        void *priv;
 };