]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - include/linux/dma-buf.h
dma-buf: Reorganize device dma access docs
[mirror_ubuntu-bionic-kernel.git] / include / linux / dma-buf.h
index e0b0741ae67199d48045d97a0adbffdab1c894ca..6df170fb243fe1a9bdd72045fa4792395e9e34b2 100644 (file)
@@ -30,7 +30,7 @@
 #include <linux/list.h>
 #include <linux/dma-mapping.h>
 #include <linux/fs.h>
-#include <linux/fence.h>
+#include <linux/dma-fence.h>
 #include <linux/wait.h>
 
 struct device;
@@ -39,19 +39,6 @@ struct dma_buf_attachment;
 
 /**
  * struct dma_buf_ops - operations possible on struct dma_buf
- * @attach: [optional] allows different devices to 'attach' themselves to the
- *         given buffer. It might return -EBUSY to signal that backing storage
- *         is already allocated and incompatible with the requirements
- *         of requesting device.
- * @detach: [optional] detach a given device from this buffer.
- * @map_dma_buf: returns list of scatter pages allocated, increases usecount
- *              of the buffer. Requires atleast one attach to be called
- *              before. Returned sg list should already be mapped into
- *              _device_ address space. This call may sleep. May also return
- *              -EINTR. Should return -EINVAL if attach hasn't been called yet.
- * @unmap_dma_buf: decreases usecount of buffer, might deallocate scatter
- *                pages.
- * @release: release this buffer; to be called after the last dma_buf_put.
  * @begin_cpu_access: [optional] called before cpu access to invalidate cpu
  *                   caches and allocate backing storage (if not yet done)
  *                   respectively pin the object into memory.
@@ -72,25 +59,109 @@ struct dma_buf_attachment;
  * @vunmap: [optional] unmaps a vmap from the buffer
  */
 struct dma_buf_ops {
+       /**
+        * @attach:
+        *
+        * This is called from dma_buf_attach() to make sure that a given
+        * &device can access the provided &dma_buf. Exporters which support
+        * buffer objects in special locations like VRAM or device-specific
+        * carveout areas should check whether the buffer could be move to
+        * system memory (or directly accessed by the provided device), and
+        * otherwise need to fail the attach operation.
+        *
+        * The exporter should also in general check whether the current
+        * allocation fullfills the DMA constraints of the new device. If this
+        * is not the case, and the allocation cannot be moved, it should also
+        * fail the attach operation.
+        *
+        * Any exporter-private housekeeping data can be stored in the priv
+        * pointer of &dma_buf_attachment structure.
+        *
+        * This callback is optional.
+        *
+        * Returns:
+        *
+        * 0 on success, negative error code on failure. It might return -EBUSY
+        * to signal that backing storage is already allocated and incompatible
+        * with the requirements of requesting device.
+        */
        int (*attach)(struct dma_buf *, struct device *,
-                       struct dma_buf_attachment *);
+                     struct dma_buf_attachment *);
 
+       /**
+        * @detach:
+        *
+        * This is called by dma_buf_detach() to release a &dma_buf_attachment.
+        * Provided so that exporters can clean up any housekeeping for an
+        * &dma_buf_attachment.
+        *
+        * This callback is optional.
+        */
        void (*detach)(struct dma_buf *, struct dma_buf_attachment *);
 
-       /* For {map,unmap}_dma_buf below, any specific buffer attributes
-        * required should get added to device_dma_parameters accessible
-        * via dev->dma_params.
+       /**
+        * @map_dma_buf:
+        *
+        * This is called by dma_buf_map_attachment() and is used to map a
+        * shared &dma_buf into device address space, and it is mandatory. It
+        * can only be called if @attach has been called successfully. This
+        * essentially pins the DMA buffer into place, and it cannot be moved
+        * any more
+        *
+        * This call may sleep, e.g. when the backing storage first needs to be
+        * allocated, or moved to a location suitable for all currently attached
+        * devices.
+        *
+        * Note that any specific buffer attributes required for this function
+        * should get added to device_dma_parameters accessible via
+        * device->dma_params from the &dma_buf_attachment. The @attach callback
+        * should also check these constraints.
+        *
+        * If this is being called for the first time, the exporter can now
+        * choose to scan through the list of attachments for this buffer,
+        * collate the requirements of the attached devices, and choose an
+        * appropriate backing storage for the buffer.
+        *
+        * Based on enum dma_data_direction, it might be possible to have
+        * multiple users accessing at the same time (for reading, maybe), or
+        * any other kind of sharing that the exporter might wish to make
+        * available to buffer-users.
+        *
+        * Returns:
+        *
+        * A &sg_table scatter list of or the backing storage of the DMA buffer,
+        * already mapped into the device address space of the &device attached
+        * with the provided &dma_buf_attachment.
+        *
+        * On failure, returns a negative error value wrapped into a pointer.
+        * May also return -EINTR when a signal was received while being
+        * blocked.
         */
        struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,
-                                               enum dma_data_direction);
+                                        enum dma_data_direction);
+       /**
+        * @unmap_dma_buf:
+        *
+        * This is called by dma_buf_unmap_attachment() and should unmap and
+        * release the &sg_table allocated in @map_dma_buf, and it is mandatory.
+        * It should also unpin the backing storage if this is the last mapping
+        * of the DMA buffer, it the exporter supports backing storage
+        * migration.
+        */
        void (*unmap_dma_buf)(struct dma_buf_attachment *,
-                                               struct sg_table *,
-                                               enum dma_data_direction);
+                             struct sg_table *,
+                             enum dma_data_direction);
+
        /* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
         * if the call would block.
         */
 
-       /* after final dma_buf_put() */
+       /**
+        * @release:
+        *
+        * Called after the last dma_buf_put to release the &dma_buf, and
+        * mandatory.
+        */
        void (*release)(struct dma_buf *);
 
        int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction);
@@ -124,6 +195,15 @@ struct dma_buf_ops {
  * @poll: for userspace poll support
  * @cb_excl: for userspace poll support
  * @cb_shared: for userspace poll support
+ *
+ * This represents a shared buffer, created by calling dma_buf_export(). The
+ * userspace representation is a normal file descriptor, which can be created by
+ * calling dma_buf_fd().
+ *
+ * Shared dma buffers are reference counted using dma_buf_put() and
+ * get_dma_buf().
+ *
+ * Device DMA access is handled by the separate struct &dma_buf_attachment.
  */
 struct dma_buf {
        size_t size;
@@ -143,7 +223,7 @@ struct dma_buf {
        wait_queue_head_t poll;
 
        struct dma_buf_poll_cb_t {
-               struct fence_cb cb;
+               struct dma_fence_cb cb;
                wait_queue_head_t *poll;
 
                unsigned long active;
@@ -160,6 +240,11 @@ struct dma_buf {
  * This structure holds the attachment information between the dma_buf buffer
  * and its user device(s). The list contains one attachment struct per device
  * attached to the buffer.
+ *
+ * An attachment is created by calling dma_buf_attach(), and released again by
+ * calling dma_buf_detach(). The DMA mapping itself needed to initiate a
+ * transfer is created by dma_buf_map_attachment() and freed again by calling
+ * dma_buf_unmap_attachment().
  */
 struct dma_buf_attachment {
        struct dma_buf *dmabuf;
@@ -192,9 +277,11 @@ struct dma_buf_export_info {
 };
 
 /**
- * helper macro for exporters; zeros and fills in most common values
- *
+ * DEFINE_DMA_BUF_EXPORT_INFO - helper macro for exporters
  * @name: export-info name
+ *
+ * DEFINE_DMA_BUF_EXPORT_INFO macro defines the struct &dma_buf_export_info,
+ * zeroes it out and pre-populates exp_name in it.
  */
 #define DEFINE_DMA_BUF_EXPORT_INFO(name)       \
        struct dma_buf_export_info name = { .exp_name = KBUILD_MODNAME, \