|
@@ -130,3 +130,139 @@ dma_map_single(struct device *dev, void *cpu_addr, size_t size,
|
|
|
*
|
|
|
* Unmap a single streaming mode DMA translation. The handle and size
|
|
|
* must match what was provided in the previous dma_map_single() call.
|
|
|
+ * All other usages are undefined.
|
|
|
+ *
|
|
|
+ * After this call, reads by the CPU to the buffer are guaranteed to see
|
|
|
+ * whatever the device wrote there.
|
|
|
+ */
|
|
|
+static inline void
|
|
|
+dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
|
|
+ enum dma_data_direction direction)
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * dma_map_page - map a portion of a page for streaming DMA
|
|
|
+ * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
|
|
+ * @page: page that buffer resides in
|
|
|
+ * @offset: offset into page for start of buffer
|
|
|
+ * @size: size of buffer to map
|
|
|
+ * @dir: DMA transfer direction
|
|
|
+ *
|
|
|
+ * Ensure that any data held in the cache is appropriately discarded
|
|
|
+ * or written back.
|
|
|
+ *
|
|
|
+ * The device owns this memory once this call has completed. The CPU
|
|
|
+ * can regain ownership by calling dma_unmap_page() or dma_sync_single().
|
|
|
+ */
|
|
|
+static inline dma_addr_t
|
|
|
+dma_map_page(struct device *dev, struct page *page,
|
|
|
+ unsigned long offset, size_t size,
|
|
|
+ enum dma_data_direction direction)
|
|
|
+{
|
|
|
+ return dma_map_single(dev, page_address(page) + offset,
|
|
|
+ size, direction);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * dma_unmap_page - unmap a buffer previously mapped through dma_map_page()
|
|
|
+ * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
|
|
+ * @handle: DMA address of buffer
|
|
|
+ * @size: size of buffer to map
|
|
|
+ * @dir: DMA transfer direction
|
|
|
+ *
|
|
|
+ * Unmap a single streaming mode DMA translation. The handle and size
|
|
|
+ * must match what was provided in the previous dma_map_single() call.
|
|
|
+ * All other usages are undefined.
|
|
|
+ *
|
|
|
+ * After this call, reads by the CPU to the buffer are guaranteed to see
|
|
|
+ * whatever the device wrote there.
|
|
|
+ */
|
|
|
+static inline void
|
|
|
+dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
|
|
|
+ enum dma_data_direction direction)
|
|
|
+{
|
|
|
+ dma_unmap_single(dev, dma_address, size, direction);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * dma_map_sg - map a set of SG buffers for streaming mode DMA
|
|
|
+ * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
|
|
+ * @sg: list of buffers
|
|
|
+ * @nents: number of buffers to map
|
|
|
+ * @dir: DMA transfer direction
|
|
|
+ *
|
|
|
+ * Map a set of buffers described by scatterlist in streaming
|
|
|
+ * mode for DMA. This is the scatter-gather version of the
|
|
|
+ * above pci_map_single interface. Here the scatter gather list
|
|
|
+ * elements are each tagged with the appropriate dma address
|
|
|
+ * and length. They are obtained via sg_dma_{address,length}(SG).
|
|
|
+ *
|
|
|
+ * NOTE: An implementation may be able to use a smaller number of
|
|
|
+ * DMA address/length pairs than there are SG table elements.
|
|
|
+ * (for example via virtual mapping capabilities)
|
|
|
+ * The routine returns the number of addr/length pairs actually
|
|
|
+ * used, at most nents.
|
|
|
+ *
|
|
|
+ * Device ownership issues as mentioned above for pci_map_single are
|
|
|
+ * the same here.
|
|
|
+ */
|
|
|
+static inline int
|
|
|
+dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|
|
+ enum dma_data_direction direction)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < nents; i++) {
|
|
|
+ char *virt;
|
|
|
+
|
|
|
+ sg[i].dma_address = page_to_bus(sg_page(&sg[i])) + sg[i].offset;
|
|
|
+ virt = sg_virt(&sg[i]);
|
|
|
+ dma_cache_sync(dev, virt, sg[i].length, direction);
|
|
|
+ }
|
|
|
+
|
|
|
+ return nents;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * dma_unmap_sg - unmap a set of SG buffers mapped by dma_map_sg
|
|
|
+ * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
|
|
+ * @sg: list of buffers
|
|
|
+ * @nents: number of buffers to map
|
|
|
+ * @dir: DMA transfer direction
|
|
|
+ *
|
|
|
+ * Unmap a set of streaming mode DMA translations.
|
|
|
+ * Again, CPU read rules concerning calls here are the same as for
|
|
|
+ * pci_unmap_single() above.
|
|
|
+ */
|
|
|
+static inline void
|
|
|
+dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
|
|
|
+ enum dma_data_direction direction)
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * dma_sync_single_for_cpu
|
|
|
+ * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
|
|
|
+ * @handle: DMA address of buffer
|
|
|
+ * @size: size of buffer to map
|
|
|
+ * @dir: DMA transfer direction
|
|
|
+ *
|
|
|
+ * Make physical memory consistent for a single streaming mode DMA
|
|
|
+ * translation after a transfer.
|
|
|
+ *
|
|
|
+ * If you perform a dma_map_single() but wish to interrogate the
|
|
|
+ * buffer using the cpu, yet do not wish to teardown the DMA mapping,
|
|
|
+ * you must call this function before doing so. At the next point you
|
|
|
+ * give the DMA address back to the card, you must first perform a
|
|
|
+ * dma_sync_single_for_device, and then the device again owns the
|
|
|
+ * buffer.
|
|
|
+ */
|
|
|
+static inline void
|
|
|
+dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
|
|
|
+ size_t size, enum dma_data_direction direction)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * No need to do anything since the CPU isn't supposed to
|