xref: /rk3399_rockchip-uboot/arch/arm/include/asm/ti-common/ti-edma3.h (revision 952bd79b53f002740634977edfc0c4d744908032)
1e165b1d3SKhoronzhuk, Ivan /*
2e165b1d3SKhoronzhuk, Ivan  * Enhanced Direct Memory Access (EDMA3) Controller
3e165b1d3SKhoronzhuk, Ivan  *
4e165b1d3SKhoronzhuk, Ivan  * (C) Copyright 2014
5e165b1d3SKhoronzhuk, Ivan  *     Texas Instruments Incorporated, <www.ti.com>
6e165b1d3SKhoronzhuk, Ivan  *
7e165b1d3SKhoronzhuk, Ivan  * SPDX-License-Identifier:     GPL-2.0+
8e165b1d3SKhoronzhuk, Ivan  */
9e165b1d3SKhoronzhuk, Ivan 
10e165b1d3SKhoronzhuk, Ivan #ifndef _EDMA3_H_
11e165b1d3SKhoronzhuk, Ivan #define _EDMA3_H_
12e165b1d3SKhoronzhuk, Ivan 
13e165b1d3SKhoronzhuk, Ivan #include <linux/stddef.h>
14e165b1d3SKhoronzhuk, Ivan 
15e165b1d3SKhoronzhuk, Ivan #define EDMA3_PARSET_NULL_LINK			0xffff
16e165b1d3SKhoronzhuk, Ivan 
17e165b1d3SKhoronzhuk, Ivan /*
18e165b1d3SKhoronzhuk, Ivan  * All parameter RAM set options
19e165b1d3SKhoronzhuk, Ivan  * opt field in edma3_param_set_config structure
20e165b1d3SKhoronzhuk, Ivan  */
21e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_PRIV_LEVEL			BIT(31)
22e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_PRIV_ID(id)			((0xf & (id)) << 24)
23e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_INTERM_COMP_CHAIN_ENB	BIT(23)
24e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_TRANS_COMP_CHAIN_ENB	BIT(22)
25e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_INTERM_COMP_INT_ENB		BIT(21)
26e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_TRANS_COMP_INT_ENB		BIT(20)
27e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_COMP_CODE(code)		((0x3f & (code)) << 12)
28e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_8		0
29e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_16		(1 << 8)
30e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_32		(2 << 8)
31e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_64		(3 << 8)
32e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_128		(4 << 8)
33e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_256		(5 << 8)
34e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_FIFO_WIDTH_SET(w)		((w & 0x7) << 8)
35e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_STATIC			BIT(3)
36e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_AB_SYNC			BIT(2)
37e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_DST_ADDR_CONST_MODE		BIT(1)
38e165b1d3SKhoronzhuk, Ivan #define EDMA3_SLOPT_SRC_ADDR_CONST_MODE		BIT(0)
39e165b1d3SKhoronzhuk, Ivan 
40e165b1d3SKhoronzhuk, Ivan enum edma3_address_mode {
41e165b1d3SKhoronzhuk, Ivan 	INCR = 0,
42e165b1d3SKhoronzhuk, Ivan 	FIFO = 1
43e165b1d3SKhoronzhuk, Ivan };
44e165b1d3SKhoronzhuk, Ivan 
45e165b1d3SKhoronzhuk, Ivan enum edma3_fifo_width {
46e165b1d3SKhoronzhuk, Ivan 	W8BIT = 0,
47e165b1d3SKhoronzhuk, Ivan 	W16BIT = 1,
48e165b1d3SKhoronzhuk, Ivan 	W32BIT = 2,
49e165b1d3SKhoronzhuk, Ivan 	W64BIT = 3,
50e165b1d3SKhoronzhuk, Ivan 	W128BIT = 4,
51e165b1d3SKhoronzhuk, Ivan 	W256BIT = 5
52e165b1d3SKhoronzhuk, Ivan };
53e165b1d3SKhoronzhuk, Ivan 
54e165b1d3SKhoronzhuk, Ivan enum edma3_sync_dimension {
55e165b1d3SKhoronzhuk, Ivan 	ASYNC = 0,
56e165b1d3SKhoronzhuk, Ivan 	ABSYNC = 1
57e165b1d3SKhoronzhuk, Ivan };
58e165b1d3SKhoronzhuk, Ivan 
59e165b1d3SKhoronzhuk, Ivan /* PaRAM slots are laid out like this */
60e165b1d3SKhoronzhuk, Ivan struct edma3_slot_layout {
61e165b1d3SKhoronzhuk, Ivan 	u32 opt;
62e165b1d3SKhoronzhuk, Ivan 	u32 src;
63e165b1d3SKhoronzhuk, Ivan 	u32 a_b_cnt;
64e165b1d3SKhoronzhuk, Ivan 	u32 dst;
65e165b1d3SKhoronzhuk, Ivan 	u32 src_dst_bidx;
66e165b1d3SKhoronzhuk, Ivan 	u32 link_bcntrld;
67e165b1d3SKhoronzhuk, Ivan 	u32 src_dst_cidx;
68e165b1d3SKhoronzhuk, Ivan 	u32 ccnt;
69e165b1d3SKhoronzhuk, Ivan } __packed;
70e165b1d3SKhoronzhuk, Ivan 
71e165b1d3SKhoronzhuk, Ivan /*
72e165b1d3SKhoronzhuk, Ivan  * Use this to assign trigger word number of edma3_slot_layout struct.
73e165b1d3SKhoronzhuk, Ivan  * trigger_word_name - is the exact name from edma3_slot_layout.
74e165b1d3SKhoronzhuk, Ivan  */
75e165b1d3SKhoronzhuk, Ivan #define EDMA3_TWORD(trigger_word_name)\
76e165b1d3SKhoronzhuk, Ivan 		(offsetof(struct edma3_slot_layout, trigger_word_name) / 4)
77e165b1d3SKhoronzhuk, Ivan 
78e165b1d3SKhoronzhuk, Ivan struct edma3_slot_config {
79e165b1d3SKhoronzhuk, Ivan 	u32 opt;
80e165b1d3SKhoronzhuk, Ivan 	u32 src;
81e165b1d3SKhoronzhuk, Ivan 	u32 dst;
82e165b1d3SKhoronzhuk, Ivan 	int bcnt;
83e165b1d3SKhoronzhuk, Ivan 	int acnt;
84e165b1d3SKhoronzhuk, Ivan 	int ccnt;
85e165b1d3SKhoronzhuk, Ivan 	int src_bidx;
86e165b1d3SKhoronzhuk, Ivan 	int dst_bidx;
87e165b1d3SKhoronzhuk, Ivan 	int src_cidx;
88e165b1d3SKhoronzhuk, Ivan 	int dst_cidx;
89e165b1d3SKhoronzhuk, Ivan 	int bcntrld;
90e165b1d3SKhoronzhuk, Ivan 	int link;
91e165b1d3SKhoronzhuk, Ivan };
92e165b1d3SKhoronzhuk, Ivan 
93e165b1d3SKhoronzhuk, Ivan struct edma3_channel_config {
94e165b1d3SKhoronzhuk, Ivan 	int slot;
95e165b1d3SKhoronzhuk, Ivan 	int chnum;
96e165b1d3SKhoronzhuk, Ivan 	int complete_code;	/* indicate pending complete interrupt */
97e165b1d3SKhoronzhuk, Ivan 	int trigger_slot_word;	/* only used for qedma */
98e165b1d3SKhoronzhuk, Ivan };
99e165b1d3SKhoronzhuk, Ivan 
100e165b1d3SKhoronzhuk, Ivan void qedma3_start(u32 base, struct edma3_channel_config *cfg);
101e165b1d3SKhoronzhuk, Ivan void qedma3_stop(u32 base, struct edma3_channel_config *cfg);
102e165b1d3SKhoronzhuk, Ivan void edma3_slot_configure(u32 base, int slot, struct edma3_slot_config *cfg);
103e165b1d3SKhoronzhuk, Ivan int edma3_check_for_transfer(u32 base, struct edma3_channel_config *cfg);
104e165b1d3SKhoronzhuk, Ivan void edma3_write_slot(u32 base, int slot, struct edma3_slot_layout *param);
105e165b1d3SKhoronzhuk, Ivan void edma3_read_slot(u32 base, int slot, struct edma3_slot_layout *param);
106e165b1d3SKhoronzhuk, Ivan 
107e165b1d3SKhoronzhuk, Ivan void edma3_set_dest(u32 base, int slot, u32 dst, enum edma3_address_mode mode,
108e165b1d3SKhoronzhuk, Ivan 		    enum edma3_fifo_width width);
109e165b1d3SKhoronzhuk, Ivan void edma3_set_dest_index(u32 base, unsigned slot, int bidx, int cidx);
110e165b1d3SKhoronzhuk, Ivan void edma3_set_dest_addr(u32 base, int slot, u32 dst);
111e165b1d3SKhoronzhuk, Ivan 
112e165b1d3SKhoronzhuk, Ivan void edma3_set_src(u32 base, int slot, u32 src, enum edma3_address_mode mode,
113e165b1d3SKhoronzhuk, Ivan 		   enum edma3_fifo_width width);
114e165b1d3SKhoronzhuk, Ivan void edma3_set_src_index(u32 base, unsigned slot, int bidx, int cidx);
115e165b1d3SKhoronzhuk, Ivan void edma3_set_src_addr(u32 base, int slot, u32 src);
116e165b1d3SKhoronzhuk, Ivan 
117e165b1d3SKhoronzhuk, Ivan void edma3_set_transfer_params(u32 base, int slot, int acnt,
118e165b1d3SKhoronzhuk, Ivan 			       int bcnt, int ccnt, u16 bcnt_rld,
119e165b1d3SKhoronzhuk, Ivan 			       enum edma3_sync_dimension sync_mode);
120*664ab2c9SVignesh R void edma3_transfer(unsigned long edma3_base_addr, unsigned int
121*664ab2c9SVignesh R 		edma_slot_num, void *dst, void *src, size_t len);
122e165b1d3SKhoronzhuk, Ivan 
123e165b1d3SKhoronzhuk, Ivan #endif
124