hc
2024-08-16 a24a44ff9ca902811b99aa9663d697cf452e08ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
 * (C) Copyright 2015
 *     Texas Instruments Incorporated, <www.ti.com>
 *
 * SPDX-License-Identifier:     GPL-2.0+
 */
 
#ifndef _DMA_H_
#define _DMA_H_
 
/*
 * enum dma_direction - dma transfer direction indicator
 * @DMA_MEM_TO_MEM: Memcpy mode
 * @DMA_MEM_TO_DEV: From Memory to Device
 * @DMA_DEV_TO_MEM: From Device to Memory
 * @DMA_DEV_TO_DEV: From Device to Device
 */
enum dma_direction {
   DMA_MEM_TO_MEM,
   DMA_MEM_TO_DEV,
   DMA_DEV_TO_MEM,
   DMA_DEV_TO_DEV,
};
 
#define DMA_SUPPORTS_MEM_TO_MEM    BIT(0)
#define DMA_SUPPORTS_MEM_TO_DEV    BIT(1)
#define DMA_SUPPORTS_DEV_TO_MEM    BIT(2)
#define DMA_SUPPORTS_DEV_TO_DEV    BIT(3)
 
/*
 * struct dma_ops - Driver model DMA operations
 *
 * The uclass interface is implemented by all DMA devices which use
 * driver model.
 */
struct dma_ops {
   /*
    * Get the current timer count
    *
    * @dev: The DMA device
    * @direction: direction of data transfer should be one from
              enum dma_direction
    * @dst: Destination pointer
    * @src: Source pointer
    * @len: Length of the data to be copied.
    * @return: 0 if OK, -ve on error
    */
   int (*transfer)(struct udevice *dev, int direction, void *dst,
           void *src, size_t len);
};
 
/*
 * struct dma_dev_priv - information about a device used by the uclass
 *
 * @supported: mode of transfers that DMA can support, should be
 *           one/multiple of DMA_SUPPORTS_*
 */
struct dma_dev_priv {
   u32 supported;
};
 
/*
 * dma_get_device - get a DMA device which supports transfer
 * type of transfer_type
 *
 * @transfer_type - transfer type should be one/multiple of
 *            DMA_SUPPORTS_*
 * @devp - udevice pointer to return the found device
 * @return - will return on success and devp will hold the
 *         pointer to the device
 */
int dma_get_device(u32 transfer_type, struct udevice **devp);
 
/*
 * dma_memcpy - try to use DMA to do a mem copy which will be
 *        much faster than CPU mem copy
 *
 * @dst - destination pointer
 * @src - souce pointer
 * @len - data length to be copied
 * @return - on successful transfer returns no of bytes
        transferred and on failure return error code.
 */
int dma_memcpy(void *dst, void *src, size_t len);
 
#endif    /* _DMA_H_ */