diff options
Diffstat (limited to 'include/linux/async_tx.h')
| -rw-r--r-- | include/linux/async_tx.h | 84 | 
1 files changed, 54 insertions, 30 deletions
diff --git a/include/linux/async_tx.h b/include/linux/async_tx.h index 9f14cd540cd..00cfb637ddf 100644 --- a/include/linux/async_tx.h +++ b/include/linux/async_tx.h @@ -65,6 +65,22 @@ enum async_tx_flags {  	ASYNC_TX_ACK		 = (1 << 2),  }; +/** + * struct async_submit_ctl - async_tx submission/completion modifiers + * @flags: submission modifiers + * @depend_tx: parent dependency of the current operation being submitted + * @cb_fn: callback routine to run at operation completion + * @cb_param: parameter for the callback routine + * @scribble: caller provided space for dma/page address conversions + */ +struct async_submit_ctl { +	enum async_tx_flags flags; +	struct dma_async_tx_descriptor *depend_tx; +	dma_async_tx_callback cb_fn; +	void *cb_param; +	void *scribble; +}; +  #ifdef CONFIG_DMA_ENGINE  #define async_tx_issue_pending_all dma_issue_pending_all  #ifdef CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL @@ -73,8 +89,8 @@ enum async_tx_flags {  #define async_tx_find_channel(dep, type, dst, dst_count, src, src_count, len) \  	 __async_tx_find_channel(dep, type)  struct dma_chan * -__async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx, -	enum dma_transaction_type tx_type); +__async_tx_find_channel(struct async_submit_ctl *submit, +			enum dma_transaction_type tx_type);  #endif /* CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL */  #else  static inline void async_tx_issue_pending_all(void) @@ -83,9 +99,10 @@ static inline void async_tx_issue_pending_all(void)  }  static inline struct dma_chan * -async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx, -	enum dma_transaction_type tx_type, struct page **dst, int dst_count, -	struct page **src, int src_count, size_t len) +async_tx_find_channel(struct async_submit_ctl *submit, +		      enum dma_transaction_type tx_type, struct page **dst, +		      int dst_count, struct page **src, int src_count, +		      size_t len)  {  	return NULL;  } @@ -97,46 +114,53 @@ async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx,   * @cb_fn_param: parameter to pass to the callback routine   */  static inline void -async_tx_sync_epilog(dma_async_tx_callback cb_fn, void *cb_fn_param) +async_tx_sync_epilog(struct async_submit_ctl *submit) +{ +	if (submit->cb_fn) +		submit->cb_fn(submit->cb_param); +} + +typedef union { +	unsigned long addr; +	struct page *page; +	dma_addr_t dma; +} addr_conv_t; + +static inline void +init_async_submit(struct async_submit_ctl *args, enum async_tx_flags flags, +		  struct dma_async_tx_descriptor *tx, +		  dma_async_tx_callback cb_fn, void *cb_param, +		  addr_conv_t *scribble)  { -	if (cb_fn) -		cb_fn(cb_fn_param); +	args->flags = flags; +	args->depend_tx = tx; +	args->cb_fn = cb_fn; +	args->cb_param = cb_param; +	args->scribble = scribble;  } -void -async_tx_submit(struct dma_chan *chan, struct dma_async_tx_descriptor *tx, -	enum async_tx_flags flags, struct dma_async_tx_descriptor *depend_tx, -	dma_async_tx_callback cb_fn, void *cb_fn_param); +void async_tx_submit(struct dma_chan *chan, struct dma_async_tx_descriptor *tx, +		     struct async_submit_ctl *submit);  struct dma_async_tx_descriptor *  async_xor(struct page *dest, struct page **src_list, unsigned int offset, -	int src_cnt, size_t len, enum async_tx_flags flags, -	struct dma_async_tx_descriptor *depend_tx, -	dma_async_tx_callback cb_fn, void *cb_fn_param); +	  int src_cnt, size_t len, struct async_submit_ctl *submit);  struct dma_async_tx_descriptor * -async_xor_val(struct page *dest, struct page **src_list, -	unsigned int offset, int src_cnt, size_t len, -	u32 *result, enum async_tx_flags flags, -	struct dma_async_tx_descriptor *depend_tx, -	dma_async_tx_callback cb_fn, void *cb_fn_param); +async_xor_val(struct page *dest, struct page **src_list, unsigned int offset, +	      int src_cnt, size_t len, u32 *result, +	      struct async_submit_ctl *submit);  struct dma_async_tx_descriptor *  async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset, -	unsigned int src_offset, size_t len, enum async_tx_flags flags, -	struct dma_async_tx_descriptor *depend_tx, -	dma_async_tx_callback cb_fn, void *cb_fn_param); +	     unsigned int src_offset, size_t len, +	     struct async_submit_ctl *submit);  struct dma_async_tx_descriptor *  async_memset(struct page *dest, int val, unsigned int offset, -	size_t len, enum async_tx_flags flags, -	struct dma_async_tx_descriptor *depend_tx, -	dma_async_tx_callback cb_fn, void *cb_fn_param); +	     size_t len, struct async_submit_ctl *submit); -struct dma_async_tx_descriptor * -async_trigger_callback(enum async_tx_flags flags, -	struct dma_async_tx_descriptor *depend_tx, -	dma_async_tx_callback cb_fn, void *cb_fn_param); +struct dma_async_tx_descriptor *async_trigger_callback(struct async_submit_ctl *submit);  void async_tx_quiesce(struct dma_async_tx_descriptor **tx);  #endif /* _ASYNC_TX_H_ */  |