xref: /openbmc/u-boot/include/dma.h (revision d94604d5)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
2a0594cefSMugunthan V N /*
3*27ab27f8SÁlvaro Fernández Rojas  * Copyright (C) 2018 Álvaro Fernández Rojas <noltari@gmail.com>
4*27ab27f8SÁlvaro Fernández Rojas  * Copyright (C) 2015 - 2018 Texas Instruments Incorporated <www.ti.com>
5*27ab27f8SÁlvaro Fernández Rojas  * Written by Mugunthan V N <mugunthanvnm@ti.com>
6*27ab27f8SÁlvaro Fernández Rojas  *
7a0594cefSMugunthan V N  */
8a0594cefSMugunthan V N 
9a0594cefSMugunthan V N #ifndef _DMA_H_
10a0594cefSMugunthan V N #define _DMA_H_
11a0594cefSMugunthan V N 
12*27ab27f8SÁlvaro Fernández Rojas #include <linux/errno.h>
13*27ab27f8SÁlvaro Fernández Rojas #include <linux/types.h>
14*27ab27f8SÁlvaro Fernández Rojas 
15a0594cefSMugunthan V N /*
16a0594cefSMugunthan V N  * enum dma_direction - dma transfer direction indicator
17a0594cefSMugunthan V N  * @DMA_MEM_TO_MEM: Memcpy mode
18a0594cefSMugunthan V N  * @DMA_MEM_TO_DEV: From Memory to Device
19a0594cefSMugunthan V N  * @DMA_DEV_TO_MEM: From Device to Memory
20a0594cefSMugunthan V N  * @DMA_DEV_TO_DEV: From Device to Device
21a0594cefSMugunthan V N  */
22a0594cefSMugunthan V N enum dma_direction {
23a0594cefSMugunthan V N 	DMA_MEM_TO_MEM,
24a0594cefSMugunthan V N 	DMA_MEM_TO_DEV,
25a0594cefSMugunthan V N 	DMA_DEV_TO_MEM,
26a0594cefSMugunthan V N 	DMA_DEV_TO_DEV,
27a0594cefSMugunthan V N };
28a0594cefSMugunthan V N 
29a0594cefSMugunthan V N #define DMA_SUPPORTS_MEM_TO_MEM	BIT(0)
30a0594cefSMugunthan V N #define DMA_SUPPORTS_MEM_TO_DEV	BIT(1)
31a0594cefSMugunthan V N #define DMA_SUPPORTS_DEV_TO_MEM	BIT(2)
32a0594cefSMugunthan V N #define DMA_SUPPORTS_DEV_TO_DEV	BIT(3)
33a0594cefSMugunthan V N 
34a0594cefSMugunthan V N /*
35a0594cefSMugunthan V N  * struct dma_dev_priv - information about a device used by the uclass
36a0594cefSMugunthan V N  *
37a0594cefSMugunthan V N  * @supported: mode of transfers that DMA can support, should be
38a0594cefSMugunthan V N  *	       one/multiple of DMA_SUPPORTS_*
39a0594cefSMugunthan V N  */
40a0594cefSMugunthan V N struct dma_dev_priv {
41a0594cefSMugunthan V N 	u32 supported;
42a0594cefSMugunthan V N };
43a0594cefSMugunthan V N 
44*27ab27f8SÁlvaro Fernández Rojas #ifdef CONFIG_DMA_CHANNELS
45*27ab27f8SÁlvaro Fernández Rojas /**
46*27ab27f8SÁlvaro Fernández Rojas  * A DMA is a feature of computer systems that allows certain hardware
47*27ab27f8SÁlvaro Fernández Rojas  * subsystems to access main system memory, independent of the CPU.
48*27ab27f8SÁlvaro Fernández Rojas  * DMA channels are typically generated externally to the HW module
49*27ab27f8SÁlvaro Fernández Rojas  * consuming them, by an entity this API calls a DMA provider. This API
50*27ab27f8SÁlvaro Fernández Rojas  * provides a standard means for drivers to enable and disable DMAs, and to
51*27ab27f8SÁlvaro Fernández Rojas  * copy, send and receive data using DMA.
52*27ab27f8SÁlvaro Fernández Rojas  *
53*27ab27f8SÁlvaro Fernández Rojas  * A driver that implements UCLASS_DMA is a DMA provider. A provider will
54*27ab27f8SÁlvaro Fernández Rojas  * often implement multiple separate DMAs, since the hardware it manages
55*27ab27f8SÁlvaro Fernández Rojas  * often has this capability. dma_uclass.h describes the interface which
56*27ab27f8SÁlvaro Fernández Rojas  * DMA providers must implement.
57*27ab27f8SÁlvaro Fernández Rojas  *
58*27ab27f8SÁlvaro Fernández Rojas  * DMA consumers/clients are the HW modules driven by the DMA channels. This
59*27ab27f8SÁlvaro Fernández Rojas  * header file describes the API used by drivers for those HW modules.
60*27ab27f8SÁlvaro Fernández Rojas  *
61*27ab27f8SÁlvaro Fernández Rojas  * DMA consumer DMA_MEM_TO_DEV (transmit) usage example (based on networking).
62*27ab27f8SÁlvaro Fernández Rojas  * Note. dma_send() is sync operation always -  it'll start transfer and will
63*27ab27f8SÁlvaro Fernández Rojas  * poll for it to complete:
64*27ab27f8SÁlvaro Fernández Rojas  *	- get/request dma channel
65*27ab27f8SÁlvaro Fernández Rojas  *	struct dma dma_tx;
66*27ab27f8SÁlvaro Fernández Rojas  *	ret = dma_get_by_name(common->dev, "tx0", &dma_tx);
67*27ab27f8SÁlvaro Fernández Rojas  *	if (ret) ...
68*27ab27f8SÁlvaro Fernández Rojas  *
69*27ab27f8SÁlvaro Fernández Rojas  *	- enable dma channel
70*27ab27f8SÁlvaro Fernández Rojas  *	ret = dma_enable(&dma_tx);
71*27ab27f8SÁlvaro Fernández Rojas  *	if (ret) ...
72*27ab27f8SÁlvaro Fernández Rojas  *
73*27ab27f8SÁlvaro Fernández Rojas  *	- dma transmit DMA_MEM_TO_DEV.
74*27ab27f8SÁlvaro Fernández Rojas  *	struct ti_drv_packet_data packet_data;
75*27ab27f8SÁlvaro Fernández Rojas  *
76*27ab27f8SÁlvaro Fernández Rojas  *	packet_data.opt1 = val1;
77*27ab27f8SÁlvaro Fernández Rojas  *	packet_data.opt2 = val2;
78*27ab27f8SÁlvaro Fernández Rojas  *	ret = dma_send(&dma_tx, packet, length, &packet_data);
79*27ab27f8SÁlvaro Fernández Rojas  *	if (ret) ..
80*27ab27f8SÁlvaro Fernández Rojas  *
81*27ab27f8SÁlvaro Fernández Rojas  * DMA consumer DMA_DEV_TO_MEM (receive) usage example (based on networking).
82*27ab27f8SÁlvaro Fernández Rojas  * Note. dma_receive() is sync operation always - it'll start transfer
83*27ab27f8SÁlvaro Fernández Rojas  * (if required) and will poll for it to complete (or for any previously
84*27ab27f8SÁlvaro Fernández Rojas  * configured dev2mem transfer to complete):
85*27ab27f8SÁlvaro Fernández Rojas  *	- get/request dma channel
86*27ab27f8SÁlvaro Fernández Rojas  *	struct dma dma_rx;
87*27ab27f8SÁlvaro Fernández Rojas  *	ret = dma_get_by_name(common->dev, "rx0", &dma_rx);
88*27ab27f8SÁlvaro Fernández Rojas  *	if (ret) ...
89*27ab27f8SÁlvaro Fernández Rojas  *
90*27ab27f8SÁlvaro Fernández Rojas  *	- enable dma channel
91*27ab27f8SÁlvaro Fernández Rojas  *	ret = dma_enable(&dma_rx);
92*27ab27f8SÁlvaro Fernández Rojas  *	if (ret) ...
93*27ab27f8SÁlvaro Fernández Rojas  *
94*27ab27f8SÁlvaro Fernández Rojas  *	- dma receive DMA_DEV_TO_MEM.
95*27ab27f8SÁlvaro Fernández Rojas  *	struct ti_drv_packet_data packet_data;
96*27ab27f8SÁlvaro Fernández Rojas  *
97*27ab27f8SÁlvaro Fernández Rojas  *	len = dma_receive(&dma_rx, (void **)packet, &packet_data);
98*27ab27f8SÁlvaro Fernández Rojas  *	if (ret < 0) ...
99*27ab27f8SÁlvaro Fernández Rojas  *
100*27ab27f8SÁlvaro Fernández Rojas  * DMA consumer DMA_DEV_TO_MEM (receive) zero-copy usage example (based on
101*27ab27f8SÁlvaro Fernández Rojas  * networking). Networking subsystem allows to configure and use few receive
102*27ab27f8SÁlvaro Fernández Rojas  * buffers (dev2mem), as Networking RX DMA channels usually implemented
103*27ab27f8SÁlvaro Fernández Rojas  * as streaming interface
104*27ab27f8SÁlvaro Fernández Rojas  *	- get/request dma channel
105*27ab27f8SÁlvaro Fernández Rojas  *	struct dma dma_rx;
106*27ab27f8SÁlvaro Fernández Rojas  *	ret = dma_get_by_name(common->dev, "rx0", &dma_rx);
107*27ab27f8SÁlvaro Fernández Rojas  *	if (ret) ...
108*27ab27f8SÁlvaro Fernández Rojas  *
109*27ab27f8SÁlvaro Fernández Rojas  *	for (i = 0; i < RX_DESC_NUM; i++) {
110*27ab27f8SÁlvaro Fernández Rojas  *		ret = dma_prepare_rcv_buf(&dma_rx,
111*27ab27f8SÁlvaro Fernández Rojas  *					  net_rx_packets[i],
112*27ab27f8SÁlvaro Fernández Rojas  *					  RX_BUF_SIZE);
113*27ab27f8SÁlvaro Fernández Rojas  *		if (ret) ...
114*27ab27f8SÁlvaro Fernández Rojas  *	}
115*27ab27f8SÁlvaro Fernández Rojas  *
116*27ab27f8SÁlvaro Fernández Rojas  *	- enable dma channel
117*27ab27f8SÁlvaro Fernández Rojas  *	ret = dma_enable(&dma_rx);
118*27ab27f8SÁlvaro Fernández Rojas  *	if (ret) ...
119*27ab27f8SÁlvaro Fernández Rojas  *
120*27ab27f8SÁlvaro Fernández Rojas  *	- dma receive DMA_DEV_TO_MEM.
121*27ab27f8SÁlvaro Fernández Rojas  *	struct ti_drv_packet_data packet_data;
122*27ab27f8SÁlvaro Fernández Rojas  *
123*27ab27f8SÁlvaro Fernández Rojas  *	len = dma_receive(&dma_rx, (void **)packet, &packet_data);
124*27ab27f8SÁlvaro Fernández Rojas  *	if (ret < 0) ..
125*27ab27f8SÁlvaro Fernández Rojas  *
126*27ab27f8SÁlvaro Fernández Rojas  *	-- process packet --
127*27ab27f8SÁlvaro Fernández Rojas  *
128*27ab27f8SÁlvaro Fernández Rojas  *	- return buffer back to DAM channel
129*27ab27f8SÁlvaro Fernández Rojas  *	ret = dma_prepare_rcv_buf(&dma_rx,
130*27ab27f8SÁlvaro Fernández Rojas  *				  net_rx_packets[rx_next],
131*27ab27f8SÁlvaro Fernández Rojas  *				  RX_BUF_SIZE);
132*27ab27f8SÁlvaro Fernández Rojas  */
133*27ab27f8SÁlvaro Fernández Rojas 
134*27ab27f8SÁlvaro Fernández Rojas struct udevice;
135*27ab27f8SÁlvaro Fernández Rojas 
136*27ab27f8SÁlvaro Fernández Rojas /**
137*27ab27f8SÁlvaro Fernández Rojas  * struct dma - A handle to (allowing control of) a single DMA.
138*27ab27f8SÁlvaro Fernández Rojas  *
139*27ab27f8SÁlvaro Fernández Rojas  * Clients provide storage for DMA handles. The content of the structure is
140*27ab27f8SÁlvaro Fernández Rojas  * managed solely by the DMA API and DMA drivers. A DMA struct is
141*27ab27f8SÁlvaro Fernández Rojas  * initialized by "get"ing the DMA struct. The DMA struct is passed to all
142*27ab27f8SÁlvaro Fernández Rojas  * other DMA APIs to identify which DMA channel to operate upon.
143*27ab27f8SÁlvaro Fernández Rojas  *
144*27ab27f8SÁlvaro Fernández Rojas  * @dev: The device which implements the DMA channel.
145*27ab27f8SÁlvaro Fernández Rojas  * @id: The DMA channel ID within the provider.
146*27ab27f8SÁlvaro Fernández Rojas  *
147*27ab27f8SÁlvaro Fernández Rojas  * Currently, the DMA API assumes that a single integer ID is enough to
148*27ab27f8SÁlvaro Fernández Rojas  * identify and configure any DMA channel for any DMA provider. If this
149*27ab27f8SÁlvaro Fernández Rojas  * assumption becomes invalid in the future, the struct could be expanded to
150*27ab27f8SÁlvaro Fernández Rojas  * either (a) add more fields to allow DMA providers to store additional
151*27ab27f8SÁlvaro Fernández Rojas  * information, or (b) replace the id field with an opaque pointer, which the
152*27ab27f8SÁlvaro Fernández Rojas  * provider would dynamically allocated during its .of_xlate op, and process
153*27ab27f8SÁlvaro Fernández Rojas  * during is .request op. This may require the addition of an extra op to clean
154*27ab27f8SÁlvaro Fernández Rojas  * up the allocation.
155*27ab27f8SÁlvaro Fernández Rojas  */
156*27ab27f8SÁlvaro Fernández Rojas struct dma {
157*27ab27f8SÁlvaro Fernández Rojas 	struct udevice *dev;
158*27ab27f8SÁlvaro Fernández Rojas 	/*
159*27ab27f8SÁlvaro Fernández Rojas 	 * Written by of_xlate. We assume a single id is enough for now. In the
160*27ab27f8SÁlvaro Fernández Rojas 	 * future, we might add more fields here.
161*27ab27f8SÁlvaro Fernández Rojas 	 */
162*27ab27f8SÁlvaro Fernández Rojas 	unsigned long id;
163*27ab27f8SÁlvaro Fernández Rojas };
164*27ab27f8SÁlvaro Fernández Rojas 
165*27ab27f8SÁlvaro Fernández Rojas # if CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(DMA)
166*27ab27f8SÁlvaro Fernández Rojas /**
167*27ab27f8SÁlvaro Fernández Rojas  * dma_get_by_index - Get/request a DMA by integer index.
168*27ab27f8SÁlvaro Fernández Rojas  *
169*27ab27f8SÁlvaro Fernández Rojas  * This looks up and requests a DMA. The index is relative to the client
170*27ab27f8SÁlvaro Fernández Rojas  * device; each device is assumed to have n DMAs associated with it somehow,
171*27ab27f8SÁlvaro Fernández Rojas  * and this function finds and requests one of them. The mapping of client
172*27ab27f8SÁlvaro Fernández Rojas  * device DMA indices to provider DMAs may be via device-tree properties,
173*27ab27f8SÁlvaro Fernández Rojas  * board-provided mapping tables, or some other mechanism.
174*27ab27f8SÁlvaro Fernández Rojas  *
175*27ab27f8SÁlvaro Fernández Rojas  * @dev:	The client device.
176*27ab27f8SÁlvaro Fernández Rojas  * @index:	The index of the DMA to request, within the client's list of
177*27ab27f8SÁlvaro Fernández Rojas  *		DMA channels.
178*27ab27f8SÁlvaro Fernández Rojas  * @dma:	A pointer to a DMA struct to initialize.
179*27ab27f8SÁlvaro Fernández Rojas  * @return 0 if OK, or a negative error code.
180*27ab27f8SÁlvaro Fernández Rojas  */
181*27ab27f8SÁlvaro Fernández Rojas int dma_get_by_index(struct udevice *dev, int index, struct dma *dma);
182*27ab27f8SÁlvaro Fernández Rojas 
183*27ab27f8SÁlvaro Fernández Rojas /**
184*27ab27f8SÁlvaro Fernández Rojas  * dma_get_by_name - Get/request a DMA by name.
185*27ab27f8SÁlvaro Fernández Rojas  *
186*27ab27f8SÁlvaro Fernández Rojas  * This looks up and requests a DMA. The name is relative to the client
187*27ab27f8SÁlvaro Fernández Rojas  * device; each device is assumed to have n DMAs associated with it somehow,
188*27ab27f8SÁlvaro Fernández Rojas  * and this function finds and requests one of them. The mapping of client
189*27ab27f8SÁlvaro Fernández Rojas  * device DMA names to provider DMAs may be via device-tree properties,
190*27ab27f8SÁlvaro Fernández Rojas  * board-provided mapping tables, or some other mechanism.
191*27ab27f8SÁlvaro Fernández Rojas  *
192*27ab27f8SÁlvaro Fernández Rojas  * @dev:	The client device.
193*27ab27f8SÁlvaro Fernández Rojas  * @name:	The name of the DMA to request, within the client's list of
194*27ab27f8SÁlvaro Fernández Rojas  *		DMA channels.
195*27ab27f8SÁlvaro Fernández Rojas  * @dma:	A pointer to a DMA struct to initialize.
196*27ab27f8SÁlvaro Fernández Rojas  * @return 0 if OK, or a negative error code.
197*27ab27f8SÁlvaro Fernández Rojas  */
198*27ab27f8SÁlvaro Fernández Rojas int dma_get_by_name(struct udevice *dev, const char *name, struct dma *dma);
199*27ab27f8SÁlvaro Fernández Rojas # else
dma_get_by_index(struct udevice * dev,int index,struct dma * dma)200*27ab27f8SÁlvaro Fernández Rojas static inline int dma_get_by_index(struct udevice *dev, int index,
201*27ab27f8SÁlvaro Fernández Rojas 				   struct dma *dma)
202*27ab27f8SÁlvaro Fernández Rojas {
203*27ab27f8SÁlvaro Fernández Rojas 	return -ENOSYS;
204*27ab27f8SÁlvaro Fernández Rojas }
205*27ab27f8SÁlvaro Fernández Rojas 
dma_get_by_name(struct udevice * dev,const char * name,struct dma * dma)206*27ab27f8SÁlvaro Fernández Rojas static inline int dma_get_by_name(struct udevice *dev, const char *name,
207*27ab27f8SÁlvaro Fernández Rojas 				  struct dma *dma)
208*27ab27f8SÁlvaro Fernández Rojas {
209*27ab27f8SÁlvaro Fernández Rojas 	return -ENOSYS;
210*27ab27f8SÁlvaro Fernández Rojas }
211*27ab27f8SÁlvaro Fernández Rojas # endif
212*27ab27f8SÁlvaro Fernández Rojas 
213*27ab27f8SÁlvaro Fernández Rojas /**
214*27ab27f8SÁlvaro Fernández Rojas  * dma_request - Request a DMA by provider-specific ID.
215*27ab27f8SÁlvaro Fernández Rojas  *
216*27ab27f8SÁlvaro Fernández Rojas  * This requests a DMA using a provider-specific ID. Generally, this function
217*27ab27f8SÁlvaro Fernández Rojas  * should not be used, since dma_get_by_index/name() provide an interface that
218*27ab27f8SÁlvaro Fernández Rojas  * better separates clients from intimate knowledge of DMA providers.
219*27ab27f8SÁlvaro Fernández Rojas  * However, this function may be useful in core SoC-specific code.
220*27ab27f8SÁlvaro Fernández Rojas  *
221*27ab27f8SÁlvaro Fernández Rojas  * @dev: The DMA provider device.
222*27ab27f8SÁlvaro Fernández Rojas  * @dma: A pointer to a DMA struct to initialize. The caller must
223*27ab27f8SÁlvaro Fernández Rojas  *	 have already initialized any field in this struct which the
224*27ab27f8SÁlvaro Fernández Rojas  *	 DMA provider uses to identify the DMA channel.
225*27ab27f8SÁlvaro Fernández Rojas  * @return 0 if OK, or a negative error code.
226*27ab27f8SÁlvaro Fernández Rojas  */
227*27ab27f8SÁlvaro Fernández Rojas int dma_request(struct udevice *dev, struct dma *dma);
228*27ab27f8SÁlvaro Fernández Rojas 
229*27ab27f8SÁlvaro Fernández Rojas /**
230*27ab27f8SÁlvaro Fernández Rojas  * dma_free - Free a previously requested DMA.
231*27ab27f8SÁlvaro Fernández Rojas  *
232*27ab27f8SÁlvaro Fernández Rojas  * @dma: A DMA struct that was previously successfully requested by
233*27ab27f8SÁlvaro Fernández Rojas  *	 dma_request/get_by_*().
234*27ab27f8SÁlvaro Fernández Rojas  * @return 0 if OK, or a negative error code.
235*27ab27f8SÁlvaro Fernández Rojas  */
236*27ab27f8SÁlvaro Fernández Rojas int dma_free(struct dma *dma);
237*27ab27f8SÁlvaro Fernández Rojas 
238*27ab27f8SÁlvaro Fernández Rojas /**
239*27ab27f8SÁlvaro Fernández Rojas  * dma_enable() - Enable (turn on) a DMA channel.
240*27ab27f8SÁlvaro Fernández Rojas  *
241*27ab27f8SÁlvaro Fernández Rojas  * @dma: A DMA struct that was previously successfully requested by
242*27ab27f8SÁlvaro Fernández Rojas  *	 dma_request/get_by_*().
243*27ab27f8SÁlvaro Fernández Rojas  * @return zero on success, or -ve error code.
244*27ab27f8SÁlvaro Fernández Rojas  */
245*27ab27f8SÁlvaro Fernández Rojas int dma_enable(struct dma *dma);
246*27ab27f8SÁlvaro Fernández Rojas 
247*27ab27f8SÁlvaro Fernández Rojas /**
248*27ab27f8SÁlvaro Fernández Rojas  * dma_disable() - Disable (turn off) a DMA channel.
249*27ab27f8SÁlvaro Fernández Rojas  *
250*27ab27f8SÁlvaro Fernández Rojas  * @dma: A DMA struct that was previously successfully requested by
251*27ab27f8SÁlvaro Fernández Rojas  *	 dma_request/get_by_*().
252*27ab27f8SÁlvaro Fernández Rojas  * @return zero on success, or -ve error code.
253*27ab27f8SÁlvaro Fernández Rojas  */
254*27ab27f8SÁlvaro Fernández Rojas int dma_disable(struct dma *dma);
255*27ab27f8SÁlvaro Fernández Rojas 
256*27ab27f8SÁlvaro Fernández Rojas /**
257*27ab27f8SÁlvaro Fernández Rojas  * dma_prepare_rcv_buf() - Prepare/add receive DMA buffer.
258*27ab27f8SÁlvaro Fernández Rojas  *
259*27ab27f8SÁlvaro Fernández Rojas  * It allows to implement zero-copy async DMA_DEV_TO_MEM (receive) transactions
260*27ab27f8SÁlvaro Fernández Rojas  * if supported by DMA providers.
261*27ab27f8SÁlvaro Fernández Rojas  *
262*27ab27f8SÁlvaro Fernández Rojas  * @dma: A DMA struct that was previously successfully requested by
263*27ab27f8SÁlvaro Fernández Rojas  *	 dma_request/get_by_*().
264*27ab27f8SÁlvaro Fernández Rojas  * @dst: The receive buffer pointer.
265*27ab27f8SÁlvaro Fernández Rojas  * @size: The receive buffer size
266*27ab27f8SÁlvaro Fernández Rojas  * @return zero on success, or -ve error code.
267*27ab27f8SÁlvaro Fernández Rojas  */
268*27ab27f8SÁlvaro Fernández Rojas int dma_prepare_rcv_buf(struct dma *dma, void *dst, size_t size);
269*27ab27f8SÁlvaro Fernández Rojas 
270*27ab27f8SÁlvaro Fernández Rojas /**
271*27ab27f8SÁlvaro Fernández Rojas  * dma_receive() - Receive a DMA transfer.
272*27ab27f8SÁlvaro Fernández Rojas  *
273*27ab27f8SÁlvaro Fernández Rojas  * @dma: A DMA struct that was previously successfully requested by
274*27ab27f8SÁlvaro Fernández Rojas  *	 dma_request/get_by_*().
275*27ab27f8SÁlvaro Fernández Rojas  * @dst: The destination pointer.
276*27ab27f8SÁlvaro Fernández Rojas  * @metadata: DMA driver's channel specific data
277*27ab27f8SÁlvaro Fernández Rojas  * @return length of received data on success, or zero - no data,
278*27ab27f8SÁlvaro Fernández Rojas  * or -ve error code.
279*27ab27f8SÁlvaro Fernández Rojas  */
280*27ab27f8SÁlvaro Fernández Rojas int dma_receive(struct dma *dma, void **dst, void *metadata);
281*27ab27f8SÁlvaro Fernández Rojas 
282*27ab27f8SÁlvaro Fernández Rojas /**
283*27ab27f8SÁlvaro Fernández Rojas  * dma_send() - Send a DMA transfer.
284*27ab27f8SÁlvaro Fernández Rojas  *
285*27ab27f8SÁlvaro Fernández Rojas  * @dma: A DMA struct that was previously successfully requested by
286*27ab27f8SÁlvaro Fernández Rojas  *	 dma_request/get_by_*().
287*27ab27f8SÁlvaro Fernández Rojas  * @src: The source pointer.
288*27ab27f8SÁlvaro Fernández Rojas  * @len: Length of the data to be sent (number of bytes).
289*27ab27f8SÁlvaro Fernández Rojas  * @metadata: DMA driver's channel specific data
290*27ab27f8SÁlvaro Fernández Rojas  * @return zero on success, or -ve error code.
291*27ab27f8SÁlvaro Fernández Rojas  */
292*27ab27f8SÁlvaro Fernández Rojas int dma_send(struct dma *dma, void *src, size_t len, void *metadata);
293*27ab27f8SÁlvaro Fernández Rojas #endif /* CONFIG_DMA_CHANNELS */
294*27ab27f8SÁlvaro Fernández Rojas 
295a0594cefSMugunthan V N /*
296a0594cefSMugunthan V N  * dma_get_device - get a DMA device which supports transfer
297a0594cefSMugunthan V N  * type of transfer_type
298a0594cefSMugunthan V N  *
299a0594cefSMugunthan V N  * @transfer_type - transfer type should be one/multiple of
300a0594cefSMugunthan V N  *		    DMA_SUPPORTS_*
301a0594cefSMugunthan V N  * @devp - udevice pointer to return the found device
302a0594cefSMugunthan V N  * @return - will return on success and devp will hold the
303a0594cefSMugunthan V N  *	     pointer to the device
304a0594cefSMugunthan V N  */
305a0594cefSMugunthan V N int dma_get_device(u32 transfer_type, struct udevice **devp);
306a0594cefSMugunthan V N 
307a0594cefSMugunthan V N /*
308a0594cefSMugunthan V N  * dma_memcpy - try to use DMA to do a mem copy which will be
309a0594cefSMugunthan V N  *		much faster than CPU mem copy
310a0594cefSMugunthan V N  *
311a0594cefSMugunthan V N  * @dst - destination pointer
312a0594cefSMugunthan V N  * @src - souce pointer
313a0594cefSMugunthan V N  * @len - data length to be copied
314a0594cefSMugunthan V N  * @return - on successful transfer returns no of bytes
315a0594cefSMugunthan V N 	     transferred and on failure return error code.
316a0594cefSMugunthan V N  */
317a0594cefSMugunthan V N int dma_memcpy(void *dst, void *src, size_t len);
318a0594cefSMugunthan V N 
319a0594cefSMugunthan V N #endif	/* _DMA_H_ */
320