1 /*
2  * Copyright 2020 Broadcom
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef DMA_IPROC_PAX
8 #define DMA_IPROC_PAX
9 
10 /* Broadcom PAX-DMA RM register defines */
11 #define PAX_DMA_REG_ADDR(_base, _offs)	((_base) + (_offs))
12 #define PAX_DMA_RING_ADDR_OFFSET(_ring)		(0x10000 * (_ring))
13 
14 /* Per-Ring register offsets */
15 #define RING_VER			0x000
16 #define RING_BD_START_ADDR		0x004
17 #define RING_BD_READ_PTR		0x008
18 #define RING_BD_WRITE_PTR		0x00c
19 #define RING_BD_READ_PTR_DDR_LS		0x010
20 #define RING_BD_READ_PTR_DDR_MS		0x014
21 #define RING_CMPL_START_ADDR		0x018
22 #define RING_CMPL_WRITE_PTR		0x01c
23 #define RING_NUM_REQ_RECV_LS		0x020
24 #define RING_NUM_REQ_RECV_MS		0x024
25 #define RING_NUM_REQ_TRANS_LS		0x028
26 #define RING_NUM_REQ_TRANS_MS		0x02c
27 #define RING_NUM_REQ_OUTSTAND		0x030
28 #define RING_CONTROL			0x034
29 #define RING_FLUSH_DONE			0x038
30 #define RING_MSI_ADDR_LS		0x03c
31 #define RING_MSI_ADDR_MS		0x040
32 #define RING_CMPL_WR_PTR_DDR_CONTROL	0x048
33 #define RING_BD_READ_PTR_DDR_CONTROL	0x04c
34 #define RING_WRITE_SEQ_NUM		0x050
35 #define RING_READ_SEQ_NUM		0x054
36 #define RING_BD_MEM_WRITE_ADDRESS	0x058
37 #define RING_AXI_BEAT_CNT		0x05c
38 #define RING_AXI_BURST_CNT		0x060
39 #define RING_MSI_DATA_VALUE		0x064
40 #define RING_PACKET_ALIGNMENT_STATUS0	0x068
41 #define RING_PACKET_ALIGNMENT_STATUS1	0x06c
42 #define RING_PACKET_ALIGNMENT_STATUS2	0x070
43 #define RING_DOORBELL_BD_WRITE_COUNT	0x074
44 
45 /* RING Manager Common Registers */
46 #define RM_COMM_CTRL_REG(_ring)		(0x100 * (_ring))
47 #define RM_MSI_DEVID_REG(_ring)		(0x100 * (_ring) + 0x4)
48 
49 #define RM_AE0_AE_CONTROL				0x2000
50 #define RM_AE0_NUMBER_OF_PACKETS_RECEIVED_LS_BITS	0x2004
51 #define RM_AE0_NUMBER_OF_PACKETS_RECEIVED_MS_BITS	0x2008
52 #define RM_AE0_NUMBER_OF_PACKETS_TRANSMITTED_LS_BITS	0x200c
53 #define RM_AE0_NUMBER_OF_PACKETS_TRANSMITTED_MS_BITS	0x2010
54 #define RM_AE0_OUTSTANDING_PACKET			0x2014
55 #define RM_AE0_AE_FLUSH_STATUS				0x2018
56 #define RM_AE0_AE_FIFO_WRITE_POINTER			0x201c
57 #define RM_AE0_AE_FIFO_READ_POINTER			0x2020
58 #define RM_AE1_AE_CONTROL				0x2100
59 #define RM_AE1_NUMBER_OF_PACKETS_RECEIVED_LS_BITS	0x2104
60 #define RM_AE1_NUMBER_OF_PACKETS_RECEIVED_MS_BITS	0x2108
61 #define RM_AE1_NUMBER_OF_PACKETS_TRANSMITTED_LS_BITS	0x210c
62 #define RM_AE1_NUMBER_OF_PACKETS_TRANSMITTED_MS_BITS	0x2110
63 #define RM_AE1_OUTSTANDING_PACKET			0x2114
64 #define RM_AE1_AE_FLUSH_STATUS				0x2118
65 #define RM_AE1_AE_FIFO_WRITE_POINTER			0x211c
66 #define RM_AE1_AE_FIFO_READ_POINTER			0x2120
67 
68 #define RM_COMM_RING_SECURITY_SETTING			0x3000
69 #define RM_COMM_CONTROL					0x3008
70 #define RM_COMM_TIMER_CONTROL_0				0x300c
71 #define RM_COMM_TIMER_CONTROL_1				0x3010
72 #define RM_COMM_BD_THRESHOLD				0x3014
73 #define RM_COMM_BURST_LENGTH				0x3018
74 #define RM_COMM_FIFO_FULL_THRESHOLD			0x301c
75 #define RM_COMM_MASK_SEQUENCE_MAX_COUNT			0x3020
76 #define RM_COMM_AE_TIMEOUT				0x3024
77 #define RM_COMM_RING_OR_AE_STATUS_LOG_ENABLE		0x3028
78 #define RM_COMM_RING_FLUSH_TIMEOUT			0x302c
79 #define RM_COMM_MEMORY_CONFIGURATION			0x3030
80 #define RM_COMM_AXI_CONTROL				0x3034
81 #define RM_COMM_GENERAL_MSI_DEVICE_ID			0x3038
82 #define RM_COMM_GENERAL_MSI_ADDRESS_LS			0x303c
83 #define RM_COMM_GENERAL_MSI_ADDRESS_MS			0x3040
84 #define RM_COMM_CONFIG_INTERRUPT_STATUS_MASK		0x3044
85 #define RM_COMM_CONFIG_INTERRUPT_STATUS_CLEAR		0x3048
86 #define RM_COMM_TOGGLE_INTERRUPT_STATUS_MASK		0x304c
87 #define RM_COMM_TOGGLE_INTERRUPT_STATUS_CLEAR		0x3050
88 #define RM_COMM_DDR_ADDR_GEN_INTERRUPT_STATUS_MASK	0x3054
89 #define RM_COMM_DDR_ADDR_GEN_INTERRUPT_STATUS_CLEAR	0x3058
90 #define RM_COMM_PACKET_ALIGNMENT_INTERRUPT_STATUS_MASK	0x305c
91 #define RM_COMM_PACKET_ALIGNMENT_INTERRUPT_STATUS_CLEAR	0x3060
92 #define RM_COMM_AE_INTERFACE_GROUP_0_INTERRUPT_MASK	0x3064
93 #define RM_COMM_AE_INTERFACE_GROUP_0_INTERRUPT_CLEAR	0x3068
94 #define RM_COMM_AE_INTERFACE_GROUP_1_INTERRUPT_MASK	0x306c
95 #define RM_COMM_AE_INTERFACE_GROUP_1_INTERRUPT_CLEAR	0x3070
96 #define RM_COMM_AE_INTERFACE_GROUP_2_INTERRUPT_MASK	0x3074
97 #define RM_COMM_AE_INTERFACE_GROUP_2_INTERRUPT_CLEAR	0x3078
98 #define RM_COMM_AE_INTERFACE_GROUP_3_INTERRUPT_MASK	0x307c
99 #define RM_COMM_AE_INTERFACE_GROUP_3_INTERRUPT_CLEAR	0x3080
100 #define RM_COMM_AE_INTERFACE_GROUP_4_INTERRUPT_MASK	0x3084
101 #define RM_COMM_AE_INTERFACE_GROUP_4_INTERRUPT_CLEAR	0x3088
102 #define RM_COMM_AE_INTERFACE_GROUP_5_INTERRUPT_MASK	0x308c
103 #define RM_COMM_AE_INTERFACE_GROUP_5_INTERRUPT_CLEAR	0x3090
104 #define RM_COMM_AE_INTERFACE_GROUP_6_INTERRUPT_MASK	0x3094
105 #define RM_COMM_AE_INTERFACE_GROUP_6_INTERRUPT_CLEAR	0x3098
106 #define RM_COMM_AE_INTERFACE_GROUP_7_INTERRUPT_MASK	0x309c
107 #define RM_COMM_AE_INTERFACE_GROUP_7_INTERRUPT_CLEAR	0x30a0
108 #define RM_COMM_AE_INTERFACE_TOP_INTERRUPT_STATUS_MASK	0x30a4
109 #define RM_COMM_AE_INTERFACE_TOP_INTERRUPT_STATUS_CLEAR	0x30a8
110 #define RM_COMM_REORDER_INTERRUPT_STATUS_MASK		0x30ac
111 #define RM_COMM_REORDER_INTERRUPT_STATUS_CLEAR		0x30b0
112 #define RM_COMM_DME_INTERRUPT_STATUS_MASK		0x30b4
113 #define RM_COMM_DME_INTERRUPT_STATUS_CLEAR		0x30b8
114 #define RM_COMM_REORDER_FIFO_PROG_THRESHOLD		0x30bc
115 #define RM_COMM_GROUP_PKT_EXTENSION_SUPPORT		0x30c0
116 #define RM_COMM_GENERAL_MSI_DATA_VALUE			0x30c4
117 #define RM_COMM_AXI_READ_BURST_THRESHOLD		0x30c8
118 #define RM_COMM_GROUP_RING_COUNT			0x30cc
119 #define RM_COMM_MSI_DISABLE				0x30d8
120 #define RM_COMM_RESERVE					0x30fc
121 #define RM_COMM_RING_FLUSH_STATUS			0x3100
122 #define RM_COMM_RING_SEQUENCE_NUMBER_OVERFLOW		0x3104
123 #define RM_COMM_AE_SEQUENCE_NUMBER_OVERFLOW		0x3108
124 #define RM_COMM_MAX_SEQUENCE_NUMBER_FOR_ANY_RING	0x310c
125 #define RM_COMM_MAX_SEQUENCE_NUMBER_ON_MONITOR_RING	0x3110
126 #define RM_COMM_MAX_SEQUENCE_NUMBER_ON_ANY_AE		0x3114
127 #define RM_COMM_MAX_SEQUENCE_NUMBER_ON_MONITOR_AE	0x3118
128 #define RM_COMM_MIN_MAX_LATENCY_MONITOR_RING_TOGGLE	0x311c
129 #define RM_COMM_MIN_MAX_LATENCY_MONITOR_RING_ADDRESSGEN 0x3120
130 #define RM_COMM_RING_ACTIVITY				0x3124
131 #define RM_COMM_AE_ACTIVITY				0x3128
132 #define RM_COMM_MAIN_HW_INIT_DONE			0x312c
133 #define RM_COMM_MEMORY_POWER_STATUS			0x3130
134 #define RM_COMM_CONFIG_STATUS_0				0x3134
135 #define RM_COMM_CONFIG_STATUS_1				0x3138
136 #define RM_COMM_TOGGLE_STATUS_0				0x313c
137 #define RM_COMM_TOGGLE_STATUS_1				0x3140
138 #define RM_COMM_DDR_ADDR_GEN_STATUS_0			0x3144
139 #define RM_COMM_DDR_ADDR_GEN_STATUS_1			0x3148
140 #define RM_COMM_PACKET_ALIGNMENT_STATUS_0		0x314c
141 #define RM_COMM_PACKET_ALIGNMENT_STATUS_1		0x3150
142 #define RM_COMM_PACKET_ALIGNMENT_STATUS_2		0x3154
143 #define RM_COMM_PACKET_ALIGNMENT_STATUS_3		0x3158
144 #define RM_COMM_AE_INTERFACE_GROUP_0_STATUS_0		0x315c
145 #define RM_COMM_AE_INTERFACE_GROUP_0_STATUS_1		0x3160
146 #define RM_COMM_AE_INTERFACE_GROUP_1_STATUS_0		0x3164
147 #define RM_COMM_AE_INTERFACE_GROUP_1_STATUS_1		0x3168
148 #define RM_COMM_AE_INTERFACE_GROUP_2_STATUS_0		0x316c
149 #define RM_COMM_AE_INTERFACE_GROUP_2_STATUS_1		0x3170
150 #define RM_COMM_AE_INTERFACE_GROUP_3_STATUS_0		0x3174
151 #define RM_COMM_AE_INTERFACE_GROUP_3_STATUS_1		0x3178
152 #define RM_COMM_AE_INTERFACE_GROUP_4_STATUS_0		0x317c
153 #define RM_COMM_AE_INTERFACE_GROUP_4_STATUS_1		0x3180
154 #define RM_COMM_AE_INTERFACE_GROUP_5_STATUS_0		0x3184
155 #define RM_COMM_AE_INTERFACE_GROUP_5_STATUS_1		0x3188
156 #define RM_COMM_AE_INTERFACE_GROUP_6_STATUS_0		0x318c
157 #define RM_COMM_AE_INTERFACE_GROUP_6_STATUS_1		0x3190
158 #define RM_COMM_AE_INTERFACE_GROUP_7_STATUS_0		0x3194
159 #define RM_COMM_AE_INTERFACE_GROUP_7_STATUS_1		0x3198
160 #define RM_COMM_AE_INTERFACE_TOP_STATUS_0		0x319c
161 #define RM_COMM_AE_INTERFACE_TOP_STATUS_1		0x31a0
162 #define RM_COMM_REORDER_STATUS_0			0x31a4
163 #define RM_COMM_REORDER_STATUS_1			0x31a8
164 #define RM_COMM_REORDER_STATUS_2			0x31ac
165 #define RM_COMM_REORDER_STATUS_3			0x31b0
166 #define RM_COMM_REORDER_STATUS_4			0x31b4
167 #define RM_COMM_REORDER_STATUS_5			0x31b8
168 #define RM_COMM_CONFIG_INTERRUPT_STATUS			0x31bc
169 #define RM_COMM_TOGGLE_INTERRUPT_STATUS			0x31c0
170 #define RM_COMM_DDR_ADDR_GEN_INTERRUPT_STATUS		0x31c4
171 #define RM_COMM_PACKET_ALIGNMENT_INTERRUPT_STATUS	0x31c8
172 #define RM_COMM_AE_INTERFACE_GROUP_0_INTERRUPT_STATUS	0x31cc
173 #define RM_COMM_AE_INTERFACE_GROUP_1_INTERRUPT_STATUS	0x31d0
174 #define RM_COMM_AE_INTERFACE_GROUP_2_INTERRUPT_STATUS	0x31d4
175 #define RM_COMM_AE_INTERFACE_GROUP_3_INTERRUPT_STATUS	0x31d8
176 #define RM_COMM_AE_INTERFACE_GROUP_4_INTERRUPT_STATUS	0x31dc
177 #define RM_COMM_AE_INTERFACE_GROUP_5_INTERRUPT_STATUS	0x31e0
178 #define RM_COMM_AE_INTERFACE_GROUP_6_INTERRUPT_STATUS	0x31e4
179 #define RM_COMM_AE_INTERFACE_GROUP_7_INTERRUPT_STATUS	0x31e8
180 #define RM_COMM_AE_INTERFACE_TOP_INTERRUPT_STATUS	0x31ec
181 #define RM_COMM_REORDER_INTERRUPT_STATUS		0x31f0
182 #define RM_COMM_DME_INTERRUPT_STATUS			0x31f4
183 #define RM_COMM_PACKET_ALIGNMENT_STATUS_4		0x31f8
184 #define RM_COMM_PACKET_ALIGNMENT_STATUS_5		0x31fc
185 #define RM_COMM_PACKET_ALIGNMENT_STATUS_6		0x3200
186 #define RM_COMM_MSI_INTR_INTERRUPT_STATUS		0x3204
187 #define RM_COMM_BD_FETCH_MODE_CONTROL			0x3360
188 
189 #define RM_COMM_THRESHOLD_CFG_RD_FIFO_MAX_THRESHOLD_SHIFT	16
190 #define RM_COMM_THRESHOLD_CFG_RD_FIFO_MAX_THRESHOLD_SHIFT_VAL	32
191 #define RM_COMM_THRESHOLD_CFG_RD_FIFO_MAX_THRESHOLD_MASK	0x1FF
192 
193 #define RM_COMM_PKT_ALIGNMENT_BD_FIFO_FULL_THRESHOLD_SHIFT	25
194 #define RM_COMM_PKT_ALIGNMENT_BD_FIFO_FULL_THRESHOLD_VAL	40
195 #define RM_COMM_PKT_ALIGNMENT_BD_FIFO_FULL_THRESHOLD_MASK	0x7F
196 #define RM_COMM_BD_FIFO_FULL_THRESHOLD_VAL			224
197 #define RM_COMM_BD_FIFO_FULL_THRESHOLD_SHIFT			16
198 #define RM_COMM_BD_FIFO_FULL_THRESHOLD_MASK			0x1FF
199 
200 /* PAX_DMA_RM_COMM_RM_BURST_LENGTH */
201 #define RM_COMM_BD_FETCH_CACHE_ALIGNED_DISABLED	BIT(28)
202 #define RM_COMM_VALUE_FOR_DDR_ADDR_GEN_SHIFT	16
203 #define RM_COMM_VALUE_FOR_TOGGLE_SHIFT		0
204 #define RM_COMM_VALUE_FOR_DDR_ADDR_GEN_VAL	32
205 #define RM_COMM_VALUE_FOR_TOGGLE_VAL		32
206 
207 #define RM_COMM_DISABLE_GRP_BD_FIFO_FLOW_CONTROL_FOR_PKT_ALIGNMENT	BIT(1)
208 #define RM_COMM_DISABLE_PKT_ALIGNMENT_BD_FIFO_FLOW_CONTROL		BIT(0)
209 
210 /* RM version */
211 #define RING_VER_MAGIC				0x76303031
212 
213 /* Register RING_CONTROL fields */
214 #define RING_CONTROL_MASK_DISABLE_CONTROL	6
215 #define RING_CONTROL_FLUSH			BIT(5)
216 #define RING_CONTROL_ACTIVE			BIT(4)
217 
218 /* Register RING_FLUSH_DONE fields */
219 #define RING_FLUSH_DONE_MASK			0x1
220 
221 #define RING_MASK_SEQ_MAX_COUNT_MASK		0x3ff
222 
223 /* RM_COMM_MAIN_HW_INIT_DONE DONE fields */
224 #define RM_COMM_MAIN_HW_INIT_DONE_MASK		0x1
225 
226 /* Register RING_CMPL_WR_PTR_DDR_CONTROL fields */
227 #define RING_BD_READ_PTR_DDR_TIMER_VAL_SHIFT	16
228 #define RING_BD_READ_PTR_DDR_TIMER_VAL_MASK	0xffff
229 #define RING_BD_READ_PTR_DDR_ENABLE_SHIFT	15
230 #define RING_BD_READ_PTR_DDR_ENABLE_MASK	0x1
231 
232 /* Register RING_BD_READ_PTR_DDR_CONTROL fields */
233 #define RING_BD_CMPL_WR_PTR_DDR_TIMER_VAL_SHIFT	16
234 #define RING_BD_CMPL_WR_PTR_DDR_TIMER_VAL_MASK	0xffff
235 #define RING_BD_CMPL_WR_PTR_DDR_ENABLE_SHIFT	15
236 #define RING_BD_CMPL_WR_PTR_DDR_ENABLE_MASK	0x1
237 
238 /*
239  * AE_TIMEOUT is  (2^AE_TIMEOUT_BITS) - (2 * NumOfAEs * 2^FIFO_DEPTH_BITS)
240  * AE_TIMEOUT_BITS=32, NumOfAEs=2, FIFO_DEPTH_BITS=5
241  * timeout val =  2^32 - 2*2*2^5
242  */
243 #define RM_COMM_AE_TIMEOUT_VAL			0xffffff80
244 
245 /* RM timer control fields for 4 rings */
246 #define RM_COMM_TIMER_CONTROL_FAST		0xaf
247 #define RM_COMM_TIMER_CONTROL_FAST_SHIFT	16
248 #define RM_COMM_TIMER_CONTROL_MEDIUM		0x15e
249 #define RM_COMM_TIMER_CONTROL0_VAL		\
250 	((RM_COMM_TIMER_CONTROL_FAST << RM_COMM_TIMER_CONTROL_FAST_SHIFT) | \
251 	 (RM_COMM_TIMER_CONTROL_MEDIUM))
252 #define RM_COMM_TIMER_CONTROL_SLOW		0x2bc
253 #define RM_COMM_TIMER_CONTROL_SLOW_SHIFT	16
254 #define RM_COMM_TIMER_CONTROL_IDLE		0x578
255 #define RM_COMM_TIMER_CONTROL1_VAL		\
256 	((RM_COMM_TIMER_CONTROL_SLOW << RM_COMM_TIMER_CONTROL_SLOW_SHIFT) | \
257 	 (RM_COMM_TIMER_CONTROL_IDLE))
258 #define RM_COMM_RM_BURST_LENGTH			0x80008
259 
260 /* Register RM_COMM_AXI_CONTROL fields */
261 #define RM_COMM_AXI_CONTROL_RD_CH_EN_SHIFT	24
262 #define RM_COMM_AXI_CONTROL_RD_CH_EN		\
263 	BIT(RM_COMM_AXI_CONTROL_RD_CH_EN_SHIFT)
264 #define RM_COMM_AXI_CONTROL_WR_CH_EN_SHIFT	28
265 #define RM_COMM_AXI_CONTROL_WR_CH_EN		\
266 	BIT(RM_COMM_AXI_CONTROL_WR_CH_EN_SHIFT)
267 
268 /* Register Per-ring RING_COMMON_CONTROL fields */
269 #define RING_COMM_CTRL_AE_GROUP_SHIFT	0
270 #define RING_COMM_CTRL_AE_GROUP_MASK	(0x7 << RING_COMM_CTRL_AE_GROUP_SHIFT)
271 
272 /* Register AE0_AE_CONTROL/AE1_AE_CONTROL fields */
273 #define RM_AE_CONTROL_ACTIVE	BIT(4)
274 #define RM_AE_CTRL_AE_GROUP_SHIFT	0
275 #define RM_AE_CTRL_AE_GROUP_MASK	(0x7 << RM_AE_CTRL_AE_GROUP_SHIFT)
276 
277 /* Register RING_CMPL_WR_PTR_DDR_CONTROL fields */
278 #define RING_DDR_CONTROL_COUNT_SHIFT	0
279 #define RING_DDR_CONTROL_COUNT_MASK	0x3ff
280 #define RING_DDR_CONTROL_COUNT(x)	(((x) & RING_DDR_CONTROL_COUNT_MASK) \
281 					  << RING_DDR_CONTROL_COUNT_SHIFT)
282 #define RING_DDR_CONTROL_COUNT_VAL	0x1U
283 #define RING_DDR_CONTROL_ENABLE_SHIFT	15
284 #define RING_DDR_CONTROL_ENABLE		BIT(RING_DDR_CONTROL_ENABLE_SHIFT)
285 #define RING_DDR_CONTROL_TIMER_SHIFT	16
286 #define RING_DDR_CONTROL_TIMER_MASK	0xffff
287 #define RING_DDR_CONTROL_TIMER(x)	(((x) & RING_DDR_CONTROL_TIMER_MASK) \
288 					  << RING_DDR_CONTROL_TIMER_SHIFT)
289 
290 /*
291  * Set no timeout value for completion write path as it would generate
292  * multiple interrupts during large transfers. And if timeout value is
293  * set, completion write pointers has to be checked on each interrupt
294  * to ensure that transfer is actually done.
295  */
296 #define RING_DDR_CONTROL_TIMER_VAL	(0xFFFF)
297 
298 /* completion DME status code */
299 #define PAX_DMA_STATUS_AXI_RRESP_ERR		BIT(0)
300 #define PAX_DMA_STATUS_AXI_BRESP_ERR		BIT(1)
301 #define PAX_DMA_STATUS_PCIE_CA_ERR		BIT(2)
302 #define PAX_DMA_STATUS_PCIE_UR_ERR		BIT(3)
303 #define PAX_DMA_STATUS_PCIE_CMPL_TOUT_ERR	BIT(4)
304 #define PAX_DMA_STATUS_PCIE_RX_POISON		BIT(5)
305 #define PAX_DMA_STATUS_ERROR_MASK	(		\
306 					 PAX_DMA_STATUS_AXI_RRESP_ERR | \
307 					 PAX_DMA_STATUS_AXI_BRESP_ERR | \
308 					 PAX_DMA_STATUS_PCIE_CA_ERR | \
309 					 PAX_DMA_STATUS_PCIE_UR_ERR | \
310 					 PAX_DMA_STATUS_PCIE_CMPL_TOUT_ERR | \
311 					 PAX_DMA_STATUS_PCIE_RX_POISON \
312 					)
313 /* completion RM status code */
314 #define RM_COMPLETION_SUCCESS		0x0
315 #define RM_COMPLETION_AE_TIMEOUT	0x3FF
316 
317 #define RM_COMM_MSI_CONFIG_INTERRUPT_ACCESS_ERR_MASK	BIT(9)
318 #define RM_COMM_MSI_CONFIG_INTERRUPT_BRESP_ERR_MASK	BIT(8)
319 #define RM_COMM_MSI_DISABLE_MASK			BIT(0)
320 
321 /* Buffer Descriptor definitions */
322 #define PAX_DMA_TYPE_RM_HEADER		0x1
323 #define PAX_DMA_TYPE_NEXT_PTR		0x5
324 
325 /* one desc ring size( is 4K, 4K aligned */
326 #define PAX_DMA_RM_DESC_RING_SIZE	4096
327 #define PAX_DMA_RING_BD_ALIGN_ORDER	12
328 /* completion ring size(bytes) is 8K, 8K aligned */
329 #define PAX_DMA_RM_CMPL_RING_SIZE	8192
330 #define PAX_DMA_RING_CMPL_ALIGN_ORDER	13
331 
332 #define PAX_DMA_RING_BD_ALIGN_CHECK(addr) \
333 	(!((addr) & ((0x1 << RING_BD_ALIGN_ORDER) - 1)))
334 #define RING_CMPL_ALIGN_CHECK(addr) \
335 	(!((addr) & ((0x1 << RING_CMPL_ALIGN_ORDER) - 1)))
336 
337 /* RM descriptor width: 8 bytes */
338 #define PAX_DMA_RM_DESC_BDWIDTH		8
339 /* completion msg desc takes 1 BD */
340 #define PAX_DMA_CMPL_DESC_SIZE		PAX_DMA_RM_DESC_BDWIDTH
341 /* Next table desc takes 1 BD */
342 #define PAX_DMA_NEXT_TBL_DESC_SIZE	PAX_DMA_RM_DESC_BDWIDTH
343 /* Header desc takes 1 BD */
344 #define PAX_DMA_HEADER_DESC_SIZE	PAX_DMA_RM_DESC_BDWIDTH
345 /* Total BDs in ring: 4K/8bytes = 512 BDs */
346 #define PAX_DMA_RM_RING_BD_COUNT	(PAX_DMA_RM_DESC_RING_SIZE / \
347 					 PAX_DMA_RM_DESC_BDWIDTH)
348 
349 /* Initial RM header is first BD in ring */
350 #define PAX_DMA_HEADER_INDEX		0
351 #define PAX_DMA_HEADER_ADDR(_ring)	(void *)((uintptr_t)(_ring) + \
352 	PAX_DMA_HEADER_INDEX * PAX_DMA_RM_DESC_BDWIDTH)
353 
354 /* NEXT TABLE desc offset is last BD in ring */
355 #define PAX_DMA_NEXT_TBL_INDEX		(PAX_DMA_RM_RING_BD_COUNT - 1)
356 #define PAX_DMA_NEXT_TBL_ADDR(_ring)	(void *)((uintptr_t)(_ring) + \
357 	PAX_DMA_NEXT_TBL_INDEX * PAX_DMA_RM_DESC_BDWIDTH)
358 
359 /* DMA transfers supported from 4 bytes thru 16M, size aligned to 4 bytes */
360 #define PAX_DMA_MIN_SIZE	4
361 #define PAX_DMA_MAX_SIZE	(16 * 1024 * 1024)
362 
363 /* Host and Card address need 4-byte alignment */
364 #define PAX_DMA_ADDR_ALIGN 4
365 
366 #define RM_RING_REG(_pd, _r, _write_ptr) \
367 	((_pd)->ring[_r].ring_base + (_write_ptr))
368 #define RM_COMM_REG(_pd, _write_ptr) ((_pd)->rm_comm_base + (_write_ptr))
369 #define PAX_DMA_REG(_pd, _write_ptr) ((_pd)->dma_base + (_write_ptr))
370 
371 #define PAX_DMA_MAX_CMPL_COUNT		1024
372 #define PAX_DMA_LAST_CMPL_IDX		(PAX_DMA_MAX_CMPL_COUNT - 1)
373 
374 #define PAX_DMA_RING_ALIGN		BIT(PAX_DMA_RING_CMPL_ALIGN_ORDER)
375 /* num of completions received, circular buffer */
376 #define PAX_DMA_GET_CMPL_COUNT(wptr, rptr) (((wptr) >= (rptr)) ? \
377 	((wptr) - (rptr)) : (PAX_DMA_MAX_CMPL_COUNT - (rptr) + (wptr)))
378 
379 /* location of current cmpl pkt, take care of pointer wrap-around */
380 #define PAX_DMA_CURR_CMPL_IDX(wptr)	\
381 	(((wptr) == 0) ? PAX_DMA_LAST_CMPL_IDX : (wptr) - 1)
382 
383 /* Timeout (milliseconds) for completion alert in interrupt mode */
384 #define PAX_DMA_TIMEOUT			10000
385 
386 /* TODO: add macro to enable data memory barrier, to ensure writes to memory */
387 #define dma_mb()
388 
389 /* Max polling cycles for completion wait, >= 1 second */
390 #define PAX_DMA_MAX_POLL_WAIT		1000000
391 /* Max polling cycles for posted write sync >= 1 second */
392 #define PAX_DMA_MAX_SYNC_WAIT		1000000
393 
394 enum ring_idx {
395 	PAX_DMA_RING0 = 0,
396 	PAX_DMA_RING1,
397 	PAX_DMA_RING2,
398 	PAX_DMA_RING3,
399 	PAX_DMA_RINGS_MAX
400 };
401 
402 /*
403  * DMA direction
404  */
405 enum pax_dma_dir {
406 	CARD_TO_HOST = 0x1,
407 	HOST_TO_CARD = 0x2
408 };
409 
410 /* Completion packet */
411 struct cmpl_pkt {
412 	uint64_t opq : 16; /*pkt_id 15:0*/
413 	uint64_t res : 16; /*reserved 16:31*/
414 	uint64_t dma_status : 16; /*PAX DMA status 32:47*/
415 	uint64_t ae_num : 6; /*RM status[47:53] processing AE number */
416 	uint64_t rm_status : 10; /*RM status[54:63] completion/timeout status*/
417 } __attribute__ ((__packed__));
418 
419 /* Driver internal structures */
420 
421 struct dma_iproc_pax_addr64 {
422 	uint32_t addr_lo;
423 	uint32_t addr_hi;
424 } __attribute__((__packed__));
425 
426 /* DMA payload for RM internal API */
427 struct dma_iproc_pax_payload {
428 	uint64_t pci_addr;
429 	uint64_t axi_addr;
430 	uint32_t xfer_sz;
431 	enum pax_dma_dir direction;
432 };
433 
434 /* magic to sync completion of posted writes to host */
435 struct dma_iproc_pax_write_sync_data {
436 	/* sglist count, max 254 */
437 	uint32_t total_pkts:9;
438 	/* ring-id 0-3 */
439 	uint32_t ring:2;
440 	/* opaque-id 0-31 */
441 	uint32_t opaque:5;
442 	/* magic pattern */
443 	uint32_t signature:16;
444 };
445 
446 /* BD ring status */
447 struct dma_iproc_pax_ring_status {
448 	/* current desc write_ptret, write pointer */
449 	void *write_ptr;
450 	/* current valid toggle  */
451 	uint32_t toggle;
452 	/* completion queue read offset */
453 	uint32_t cmpl_rd_offs;
454 	/* opaque value for current payload */
455 	uint32_t opq;
456 	/* posted write sync data */
457 	struct dma_iproc_pax_write_sync_data sync_data;
458 };
459 
460 struct dma_iproc_pax_ring_data {
461 	/* ring index */
462 	uint32_t idx;
463 	/* Per-Ring register base */
464 	uint32_t ring_base;
465 	/* Allocated mem for BD and CMPL */
466 	void *ring_mem;
467 	/* Buffer descriptors, 4K aligned */
468 	void *bd;
469 	/* Completion descriptors, 8K aligned */
470 	void *cmpl;
471 	/* payload struct for internal API */
472 	struct dma_iproc_pax_payload *payload;
473 	/* ring current status */
474 	struct dma_iproc_pax_ring_status curr;
475 	/* assigned packet id upto 32 values */
476 	uint32_t pkt_id;
477 	/* per-ring lock */
478 	struct k_mutex lock;
479 	/* alert for the ring */
480 	struct k_sem alert;
481 	/* posted write sync src location */
482 	struct dma_iproc_pax_write_sync_data *sync_loc;
483 	/* posted write sync pci dst address */
484 	struct dma_iproc_pax_addr64 sync_pci;
485 	/* ring status */
486 	int ring_active;
487 	/* dma callback and argument */
488 	dma_callback_t dma_callback;
489 	void *callback_arg;
490 	uint32_t descs_inflight;
491 	uint32_t non_hdr_bd_count;
492 	uint32_t total_pkt_count;
493 	uintptr_t current_hdr;
494 };
495 
496 struct dma_iproc_pax_data {
497 	/* PAXB0 PAX DMA registers */
498 	uint32_t dma_base;
499 	/* Ring manager common registers */
500 	uint32_t rm_comm_base;
501 	/* Num of rings to use in s/w */
502 	int used_rings;
503 	/* DMA lock */
504 	struct k_mutex dma_lock;
505 	/* Per-Ring data */
506 	struct dma_iproc_pax_ring_data ring[PAX_DMA_RINGS_MAX];
507 };
508 
509 /* PAX DMA config */
510 struct dma_iproc_pax_cfg {
511 	/* PAXB0 PAX DMA registers */
512 	uint32_t dma_base;
513 	/* Per-Ring register base addr */
514 	uint32_t rm_base;
515 	/* Ring manager common registers */
516 	uint32_t rm_comm_base;
517 	/* Num of rings to be used */
518 	int use_rings;
519 	void *bd_memory_base;
520 	uint32_t scr_addr_loc;
521 	char *pcie_dev_name;
522 };
523 
524 #endif
525