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