diff mbox

[RFD] dmaengine: add new sleepy alloc descriptor and slave sg APIs

Message ID 1487894916-5765-1-git-send-email-vinod.koul@intel.com (mailing list archive)
State RFC
Headers show

Commit Message

Vinod Koul Feb. 24, 2017, 12:08 a.m. UTC
There have been discussions on need for change of dmaengine API for
a) allow sleepy invocation of the prepare descriptor so that drivers can
do the runtime pm (maybe move into core as well)
b) split the prepare operation to allocate and new prepare methods

TBD: Should the new prepare be atomic or not
TBD: Should we move the pm calls to core
TBA: Documentaion and wrappers for these calls

Signed-off-by: Vinod Koul <vinod.koul@intel.com>
---
 include/linux/dmaengine.h | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
diff mbox

Patch

diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
index 533680860865..33edcc5bc723 100644
--- a/include/linux/dmaengine.h
+++ b/include/linux/dmaengine.h
@@ -658,6 +658,11 @@  struct dma_filter {
 	const struct dma_slave_map *map;
 };
 
+enum dmaengine_operation {
+	DMAENGINE_SLAVE_SG = 1,
+	DMAENGINE_SLAVE_LAST = DMAENGINE_SLAVE_SG,
+};
+
 /**
  * struct dma_device - info on the entity supplying DMA services
  * @chancnt: how many DMA channels are supported
@@ -700,6 +705,10 @@  struct dma_filter {
  *	be called after period_len bytes have been transferred.
  * @device_prep_interleaved_dma: Transfer expression in a generic way.
  * @device_prep_dma_imm_data: DMA's 8 byte immediate data to the dst address
+ * @device_alloc_descriptor: Allocate a dma descriptor for dmaengine operation
+ * 	specfied. Can by invoked from sleepy context.
+ * 	Cannot be called from callback context.
+ * @device_desc_prep_slave_sg: Prepare a slave sg txn for a given descriptor
  * @device_config: Pushes a new configuration to a channel, return 0 or an error
  *	code
  * @device_pause: Pauses any transfer happening on a channel. Returns
@@ -792,6 +801,12 @@  struct dma_device {
 		struct dma_chan *chan, dma_addr_t dst, u64 data,
 		unsigned long flags);
 
+	struct dma_async_tx_descriptor *(*device_alloc_descriptor)(
+		struct dma_chan *chan, enum dmaengine_operation op);
+	int (*device_desc_prep_slave_sg)(struct dma_chan *chan,
+		struct scatterlist *sgl, unsigned int sg_len,
+		enum dma_transfer_direction direction, unsigned long flags);
+
 	int (*device_config)(struct dma_chan *chan,
 			     struct dma_slave_config *config);
 	int (*device_pause)(struct dma_chan *chan);