xref: /netbsd/sys/arch/playstation2/ee/dmacreg.h (revision 32409e06)
1 /*	$NetBSD: dmacreg.h,v 1.5 2016/04/03 10:03:34 martin Exp $	*/
2 
3 /*-
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by UCHIYAMA Yasushi.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <mips/cpuregs.h>
33 
34 typedef u_int64_t dmatag_t;
35 
36 #define DMAC_BLOCK_SIZE		16
37 #define DMAC_SLICE_SIZE		128
38 #define DMAC_TRANSFER_QWCMAX	0xffff
39 
40 /* all register length are 32bit */
41 #define DMAC_REGBASE		MIPS_PHYS_TO_KSEG1(0x10008000)
42 #define DMAC_REGSIZE		0x00010000
43 
44 /*
45  * DMAC common registers.
46  */
47 #define D_CTRL_REG	MIPS_PHYS_TO_KSEG1(0x1000e000) /* DMA control */
48 #define D_STAT_REG	MIPS_PHYS_TO_KSEG1(0x1000e010) /* interrupt status */
49 #define D_PCR_REG	MIPS_PHYS_TO_KSEG1(0x1000e020) /* priority control */
50 #define D_SQWC_REG	MIPS_PHYS_TO_KSEG1(0x1000e030) /* interleave size */
51 #define D_RBOR_REG	MIPS_PHYS_TO_KSEG1(0x1000e040) /* ring buffer addr */
52 #define D_RBSR_REG	MIPS_PHYS_TO_KSEG1(0x1000e050) /* ring buffer size */
53 #define D_STADR_REG	MIPS_PHYS_TO_KSEG1(0x1000e060) /* stall address */
54 #define D_ENABLER_REG	MIPS_PHYS_TO_KSEG1(0x1000f520) /* DMA enable (r) */
55 #define D_ENABLEW_REG	MIPS_PHYS_TO_KSEG1(0x1000f590) /* DMA enable (w) */
56 
57 /*
58  * Channel registers. (10ch)
59  */
60 #define	DMA_CH_VIF0			0 /* to (priority 0) */
61 #define	DMA_CH_VIF1			1 /* both */
62 #define	DMA_CH_GIF			2 /* to */
63 #define	DMA_CH_FROMIPU			3
64 #define	DMA_CH_TOIPU			4
65 #define	DMA_CH_SIF0			5 /* from */
66 #define	DMA_CH_SIF1			6 /* to */
67 #define	DMA_CH_SIF2			7 /* both (priority 1) */
68 #define	DMA_CH_FROMSPR			8 /* burst channel */
69 #define	DMA_CH_TOSPR			9 /* burst channel */
70 #define DMA_CH_VALID(x)	(((x) >= 0) && ((x) <= 9))
71 
72 #define D_CHCR_OFS		0x00
73 #define D_MADR_OFS		0x10
74 #define D_QWC_OFS		0x20
75 #define D_TADR_OFS		0x30
76 #define D_ASR0_OFS		0x40
77 #define D_ASR1_OFS		0x50
78 #define D_SADR_OFS		0x80
79 
80 #define D0_REGBASE		MIPS_PHYS_TO_KSEG1(0x10008000)
81 #define D1_REGBASE		MIPS_PHYS_TO_KSEG1(0x10009000)
82 #define D2_REGBASE		MIPS_PHYS_TO_KSEG1(0x1000a000)
83 #define D3_REGBASE		MIPS_PHYS_TO_KSEG1(0x1000b000)
84 #define D4_REGBASE		MIPS_PHYS_TO_KSEG1(0x1000b400)
85 #define D5_REGBASE		MIPS_PHYS_TO_KSEG1(0x1000c000)
86 #define D6_REGBASE		MIPS_PHYS_TO_KSEG1(0x1000c400)
87 #define D7_REGBASE		MIPS_PHYS_TO_KSEG1(0x1000c800)
88 #define D8_REGBASE		MIPS_PHYS_TO_KSEG1(0x1000d000)
89 #define D9_REGBASE		MIPS_PHYS_TO_KSEG1(0x1000d400)
90 
91 #define D_CHCR_REG(base)	(base)
92 #define D_MADR_REG(base)	(base + D_MADR_OFS)
93 #define D_QWC_REG(base)		(base + D_QWC_OFS)
94 #define D_TADR_REG(base)	(base + D_TADR_OFS)
95 #define D_ASR0_REG(base)	(base + D_ASR0_OFS)
96 #define D_ASR1_REG(base)	(base + D_ASR1_OFS)
97 #define D_SADR_REG(base)	(base + D_SADR_OFS)
98 
99 #define D0_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x10008000)
100 #define D0_MADR_REG		MIPS_PHYS_TO_KSEG1(0x10008010)
101 #define D0_QWC_REG		MIPS_PHYS_TO_KSEG1(0x10008020)
102 #define D0_TADR_REG		MIPS_PHYS_TO_KSEG1(0x10008030)
103 #define D0_ASR0_REG		MIPS_PHYS_TO_KSEG1(0x10008040)
104 #define D0_ASR1_REG		MIPS_PHYS_TO_KSEG1(0x10008050)
105 
106 #define D1_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x10009000)
107 #define D1_MADR_REG		MIPS_PHYS_TO_KSEG1(0x10009010)
108 #define D1_QWC_REG		MIPS_PHYS_TO_KSEG1(0x10009020)
109 #define D1_TADR_REG		MIPS_PHYS_TO_KSEG1(0x10009030)
110 #define D1_ASR0_REG		MIPS_PHYS_TO_KSEG1(0x10009040)
111 #define D1_ASR1_REG		MIPS_PHYS_TO_KSEG1(0x10009050)
112 
113 #define D2_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x1000a000)
114 #define D2_MADR_REG		MIPS_PHYS_TO_KSEG1(0x1000a010)
115 #define D2_QWC_REG		MIPS_PHYS_TO_KSEG1(0x1000a020)
116 #define D2_TADR_REG		MIPS_PHYS_TO_KSEG1(0x1000a030)
117 #define D2_ASR0_REG		MIPS_PHYS_TO_KSEG1(0x1000a040)
118 #define D2_ASR1_REG		MIPS_PHYS_TO_KSEG1(0x1000a050)
119 
120 #define D3_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x1000b000)
121 #define D3_MADR_REG		MIPS_PHYS_TO_KSEG1(0x1000b010)
122 #define D3_QWC_REG		MIPS_PHYS_TO_KSEG1(0x1000b020)
123 
124 #define D4_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x1000b400)
125 #define D4_MADR_REG		MIPS_PHYS_TO_KSEG1(0x1000b410)
126 #define D4_QWC_REG		MIPS_PHYS_TO_KSEG1(0x1000b420)
127 #define D4_TADR_REG		MIPS_PHYS_TO_KSEG1(0x1000b430)
128 
129 #define D5_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x1000c000)
130 #define D5_MADR_REG		MIPS_PHYS_TO_KSEG1(0x1000c010)
131 #define D5_QWC_REG		MIPS_PHYS_TO_KSEG1(0x1000c020)
132 
133 #define D6_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x1000c400)
134 #define D6_MADR_REG		MIPS_PHYS_TO_KSEG1(0x1000c410)
135 #define D6_QWC_REG		MIPS_PHYS_TO_KSEG1(0x1000c420)
136 #define D6_TADR_REG		MIPS_PHYS_TO_KSEG1(0x1000c430)
137 
138 #define D7_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x1000c800)
139 #define D7_MADR_REG		MIPS_PHYS_TO_KSEG1(0x1000c810)
140 #define D7_QWC_REG		MIPS_PHYS_TO_KSEG1(0x1000c820)
141 
142 #define D8_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x1000d000)
143 #define D8_MADR_REG		MIPS_PHYS_TO_KSEG1(0x1000d010)
144 #define D8_QWC_REG		MIPS_PHYS_TO_KSEG1(0x1000d020)
145 #define D8_SADR_REG		MIPS_PHYS_TO_KSEG1(0x1000d080)
146 
147 #define D9_CHCR_REG		MIPS_PHYS_TO_KSEG1(0x1000d400)
148 #define D9_MADR_REG		MIPS_PHYS_TO_KSEG1(0x1000d410)
149 #define D9_QWC_REG		MIPS_PHYS_TO_KSEG1(0x1000d420)
150 #define D9_TADR_REG		MIPS_PHYS_TO_KSEG1(0x1000d430)
151 #define D9_SADR_REG		MIPS_PHYS_TO_KSEG1(0x1000d480)
152 
153 /*
154  * DMA control
155  */
156 #define D_CTRL_DMAE		0x00000001 /* all DMA enable/disable */
157 #define D_CTRL_RELE		0x00000002 /* Cycle stealing on/off */
158 /* Memory FIFO drain control */
159 #define D_CTRL_MFD_MASK		0x3
160 #define D_CTRL_MFD_SHIFT	2
161 #define D_CTRL_MFD(x)							\
162 	(((x) >> D_CTRL_MFD_SHIFT) & D_CTRL_MFD_MASK)
163 #define D_CTRL_MFD_CLR(x)						\
164 	((x) & ~(D_CTRL_MFD_MASK << D_CTRL_MFD_SHIFT))
165 #define D_CTRL_MFD_SET(x, val)						\
166 	((x) | (((val) << D_CTRL_MFD_SHIFT) &				\
167 	(D_CTRL_MFD_MASK << D_CTRL_MFD_SHIFT)))
168 #define D_CTRL_MFD_DISABLE	0
169 #define D_CTRL_MFD_VIF1		2
170 #define D_CTRL_MFD_GIF		3
171 
172 /* Stall control source channel */
173 #define D_CTRL_STS_MASK		0x3
174 #define D_CTRL_STS_SHIFT	4
175 #define D_CTRL_STS(x)							\
176 	(((x) >> D_CTRL_STS_SHIFT) & D_CTRL_STS_MASK)
177 #define D_CTRL_STS_CLR(x)						\
178 	((x) & ~(D_CTRL_STS_MASK << D_CTRL_STS_SHIFT))
179 #define D_CTRL_STS_SET(x, val)						\
180 	((x) | (((val) << D_CTRL_STS_SHIFT) &				\
181 	(D_CTRL_STS_MASK << D_CTRL_STS_SHIFT)))
182 #define D_CTRL_STS_NONE		0
183 #define D_CTRL_STS_SIF0		1
184 #define D_CTRL_STS_FROMSPR	2
185 #define D_CTRL_STS_FROMIPU	3
186 
187 /* Stall control drain channel */
188 #define D_CTRL_STD_MASK		0x3
189 #define D_CTRL_STD_SHIFT	6
190 #define D_CTRL_STD(x)							\
191 	(((x) >> D_CTRL_STD_SHIFT) & D_CTRL_STD_MASK)
192 #define D_CTRL_STD_CLR(x)						\
193 	((x) & ~(D_CTRL_STD_MASK << D_CTRL_STD_SHIFT))
194 #define D_CTRL_STD_SET(x, val)						\
195 	((x) | (((val) << D_CTRL_STD_SHIFT) &				\
196 	(D_CTRL_STD_MASK << D_CTRL_STD_SHIFT)))
197 #define D_CTRL_STD_NONE		0
198 #define D_CTRL_STD_VIF1		1
199 #define D_CTRL_STD_GIF		2
200 #define D_CTRL_STD_SIF1		3
201 
202 /*
203  * Release cycle
204  *   for burst channel Cycle steanling on mode only.
205  */
206 #define D_CTRL_RCYC_MASK		0x7
207 #define D_CTRL_RCYC_SHIFT		8
208 #define D_CTRL_RCYC(x)							\
209 	(((x) >> D_CTRL_RCYC_SHIFT) & D_CTRL_RCYC_MASK)
210 #define D_CTRL_RCYC_CLR(x)						\
211 	((x) & ~(D_CTRL_RCYC_MASK << D_CTRL_RCYC_SHIFT))
212 #define D_CTRL_RCYC_SET(x, val)						\
213 	((x) | (((val) << D_CTRL_RCYC_SHIFT) &				\
214 	(D_CTRL_RCYC_MASK << D_CTRL_RCYC_SHIFT)))
215 #define D_CTRL_RCYC_CYCLE(x)		(8 << (x))
216 
217 /*
218  * Interrupt status register (write clear/invert)
219  *   DMAC interrupt line connected to MIPS HwINT1
220  */
221 /* MFIFO empty interrupt enable */
222 #define D_STAT_MEIM		0x40000000
223 /* DMA stall interrupt enable */
224 #define D_STAT_SIM		0x20000000
225 /* Channel interrupt enable */
226 #define D_STAT_CIM_MASK		0x3ff
227 #define D_STAT_CIM_SHIFT	16
228 #define D_STAT_CIM(x)		(((x) >> D_STAT_CIM_SHIFT) & D_STAT_CIM_MASK)
229 #define D_STAT_CIM_BIT(x)	((1 << (x)) << D_STAT_CIM_SHIFT)
230 #define D_STAT_CIM9		0x02000000
231 #define D_STAT_CIM8		0x01000000
232 #define D_STAT_CIM7		0x00800000
233 #define D_STAT_CIM6		0x00400000
234 #define D_STAT_CIM5		0x00200000
235 #define D_STAT_CIM4		0x00100000
236 #define D_STAT_CIM3		0x00080000
237 #define D_STAT_CIM2		0x00040000
238 #define D_STAT_CIM1		0x00020000
239 #define D_STAT_CIM0		0x00010000
240 /* BUSERR interrupt status */
241 #define D_STAT_BEIS		0x00008000
242 /* MFIFO empty interrupt status */
243 #define D_STAT_MEIS		0x00004000
244 /* DMA stall interrupt status */
245 #define D_STAT_SIS		0x00002000
246 /* Channel interrupt status */
247 #define D_STAT_CIS_MASK		0x3ff
248 #define D_STAT_CIS_SHIFT	0
249 #define D_STAT_CIS_BIT(x)	(1 << (x))
250 #define D_STAT_CIS9		0x00000200
251 #define D_STAT_CIS8		0x00000100
252 #define D_STAT_CIS7		0x00000080
253 #define D_STAT_CIS6		0x00000040
254 #define D_STAT_CIS5		0x00000020
255 #define D_STAT_CIS4		0x00000010
256 #define D_STAT_CIS3		0x00000008
257 #define D_STAT_CIS2		0x00000004
258 #define D_STAT_CIS1		0x00000002
259 #define D_STAT_CIS0		0x00000001
260 
261 /*
262  * Priority control register.
263  */
264 /* Priority control enable */
265 #define D_PCR_PCE		0x80000000
266 /* Channel DMA enable (packet priority control enable) */
267 #define D_PCR_CDE_MASK		0x3ff
268 #define D_PCR_CDE_SHIFT		16
269 #define D_PCR_CDE(x)							\
270 	(((x) >> D_PCR_CDE_SHIFT) & D_PCR_CDE_MASK)
271 #define D_PCR_CDE_CLR(x)						\
272 	((x) & ~(D_PCR_CDE_MASK << D_PCR_CDE_SHIFT))
273 #define D_PCR_CDE_SET(x, val)						\
274 	((x) | (((val) << D_PCR_CDE_SHIFT) &				\
275 	(D_PCR_CDE_MASK << D_PCR_CDE_SHIFT)))
276 #define D_PCR_CDE9		0x02000000
277 #define D_PCR_CDE8		0x01000000
278 #define D_PCR_CDE7		0x00800000
279 #define D_PCR_CDE6		0x00400000
280 #define D_PCR_CDE5		0x00200000
281 #define D_PCR_CDE4		0x00100000
282 #define D_PCR_CDE3		0x00080000
283 #define D_PCR_CDE2		0x00040000
284 #define D_PCR_CDE1		0x00020000
285 #define D_PCR_CDE0		0x00010000
286 /* COP control (interrupt status connect to CPCOND[0] or not) */
287 #define D_PCR_CPC_MASK		0x3ff
288 #define D_PCR_CPC_SHIFT		0
289 #define D_PCR_CPC(x)		((x) & D_PCR_CPC_MASK)
290 #define D_PCR_CPC_CLR(x)	((x) & ~D_PCR_CPC_MASK)
291 #define D_PCR_CPC_SET(x, val)	((x) | ((val) & D_PCR_CPC_MASK))
292 #define D_PCR_CPC_BIT(x)	(1 << (x))
293 #define D_PCR_CPC9		0x00000200
294 #define D_PCR_CPC8		0x00000100
295 #define D_PCR_CPC7		0x00000080
296 #define D_PCR_CPC6		0x00000040
297 #define D_PCR_CPC5		0x00000020
298 #define D_PCR_CPC4		0x00000010
299 #define D_PCR_CPC3		0x00000008
300 #define D_PCR_CPC2		0x00000004
301 #define D_PCR_CPC1		0x00000002
302 #define D_PCR_CPC0		0x00000001
303 
304 /*
305  * Interleave size register
306  */
307 /* Transfer quadword counter */
308 #define D_SQWC_TQWC_MASK		0xff
309 #define D_SQWC_TQWC_SHIFT		16
310 #define D_SQWC_TQWC(x)							\
311 	(((x) >> D_SQWC_TQWC_SHIFT) & D_SQWC_TQWC_MASK)
312 #define D_SQWC_TQWC_CLR(x)						\
313 	((x) & ~(D_SQWC_TQWC_MASK << D_SQWC_TQWC_SHIFT))
314 #define D_SQWC_TQWC_SET(x, val)						\
315 	((x) | (((val) << D_SQWC_TQWC_SHIFT) &				\
316 	(D_SQWC_TQWC_MASK << D_SQWC_TQWC_SHIFT)))
317 /* Skip quadword counter */
318 #define D_SQWC_SQWC_MASK		0xff
319 #define D_SQWC_SQWC_SHIFT		0
320 #define D_SQWC_SQWC(x)							\
321 	(((x) >> D_SQWC_SQWC_SHIFT) & D_SQWC_SQWC_MASK)
322 #define D_SQWC_SQWC_CLR(x)						\
323 	((x) & ~(D_SQWC_SQWC_MASK << D_SQWC_SQWC_SHIFT))
324 #define D_SQWC_SQWC_SET(x, val)						\
325 	((x) | (((val) << D_SQWC_SQWC_SHIFT) &				\
326 	(D_SQWC_SQWC_MASK << D_SQWC_SQWC_SHIFT)))
327 
328 /*
329  * Ring buffer address register
330  *   16byte alignment address [30:4]
331  */
332 
333 /*
334  * Ring buffer size register
335  *   must be 2 ** n qword. [30:4]
336  */
337 
338 /*
339  * Stall address register
340  *   [30:0] (qword alignment)
341  */
342 
343 /*
344  * DMA suspend register
345  */
346 #define	D_ENABLE_SUSPEND		0x00010000
347 
348 
349 /*
350  *	Channel specific register.
351  */
352 
353 /* CHANNEL CONTROL REGISTER */
354 /* upper 16bit of DMA tag last read. */
355 #define D_CHCR_TAG_MASK		0xff
356 #define D_CHCR_TAG_SHIFT	16
357 #define D_CHCR_TAG(x)							\
358 	(((x) >> D_CHCR_TAG_SHIFT) & D_CHCR_TAG_MASK)
359 #define D_CHCR_TAG_CLR(x)						\
360 	((x) & ~(D_CHCR_TAG_MASK << D_CHCR_TAG_SHIFT))
361 #define D_CHCR_TAG_SET(x, val)						\
362 	((x) | (((val) << D_CHCR_TAG_SHIFT) &				\
363 	(D_CHCR_TAG_MASK << D_CHCR_TAG_SHIFT)))
364 /* DMA start */
365 #define D_CHCR_STR			0x00000100
366 /* Tag interrupt enable (IRQ bit of DMAtag) */
367 #define D_CHCR_TIE			0x00000080
368 /* Tag transfer enable (Source chain mode only) */
369 #define D_CHCR_TTE			0x00000040
370 /* Address stack pointer */
371 #define D_CHCR_ASP_MASK		0x3
372 #define D_CHCR_ASP_SHIFT	4
373 #define D_CHCR_ASP(x)							\
374 	(((x) >> D_CHCR_ASP_SHIFT) & D_CHCR_ASP_MASK)
375 #define D_CHCR_ASP_CLR(x)						\
376 	((x) & ~(D_CHCR_ASP_MASK << D_CHCR_ASP_SHIFT))
377 #define D_CHCR_ASP_SET(x, val)						\
378 	((x) | (((val) << D_CHCR_ASP_SHIFT) &				\
379 	(D_CHCR_ASP_MASK << D_CHCR_ASP_SHIFT)))
380 #define D_CHCR_ASP_PUSHED_NONE	0
381 #define D_CHCR_ASP_PUSHED_1	1
382 #define D_CHCR_ASP_PUSHED_2	2
383 /* Logical transfer mode */
384 #define D_CHCR_MOD_MASK		0x3
385 #define D_CHCR_MOD_SHIFT	2
386 #define D_CHCR_MOD(x)							\
387 	(((x) >> D_CHCR_MOD_SHIFT) & D_CHCR_MOD_MASK)
388 #define D_CHCR_MOD_CLR(x)						\
389 	((x) & ~(D_CHCR_MOD_MASK << D_CHCR_MOD_SHIFT))
390 #define D_CHCR_MOD_SET(x, val)						\
391 	((x) | (((val) << D_CHCR_MOD_SHIFT) &				\
392 	(D_CHCR_MOD_MASK << D_CHCR_MOD_SHIFT)))
393 #define D_CHCR_MOD_NORMAL	0
394 #define D_CHCR_MOD_CHAIN	1
395 #define D_CHCR_MOD_INTERLEAVE	2
396 /*
397  * DMA transfer direction (1 ... from Memory, 0 ... to Memory)
398  *   (VIF1, SIF2 only. i.e. `both'-direction channel requires this)
399  */
400 #define D_CHCR_DIR			0x00000001
401 
402 /*
403  * TRANSFER ADDRESS REGISTER (D-RAM address)
404  *   16 byte alignment. In FROMSPR, TOSPR channel, D_MADR_SPR always 0
405  */
406 #define D_MADR_SPR			0x80000000
407 
408 /*
409  * TAG ADDRESS REGISTER (next tag address)
410  *   16 byte alignment.
411  */
412 #define D_TADR_SPR			0x80000000
413 
414 /*
415  * TAG ADDRESS STACK REGISTER (2 stage)
416  *   16 byte alignment.
417  */
418 #define D_ASR_SPR			0x80000000
419 
420 /*
421  * SPR TRANSFER ADDRESS REGISTER (SPR address)
422  *   16 byte alignment. FROMSPR, TOSPR only.
423  */
424 #define D_SADR_MASK		0x3fff
425 #define D_SADR_SHIFT		0
426 #define D_SADR(x)							\
427 	((u_int32_t)(x) & D_SADR_MASK)
428 /*
429  * TRANSFER SIZE REGISTER
430  *   min 16 byte to max 1 Mbyte.
431  */
432 #define D_QWC_MASK		0xffff
433 #define D_QWC_SHIFT		0
434 #define D_QWC(x)	(((x) >> D_QWC_SHIFT) & D_QWC_MASK)
435 #define D_QWC_CLR(x)	((x) & ~(D_QWC_MASK << D_QWC_SHIFT))
436 #define D_QWC_SET(x, val)						\
437 	((x) | (((val) << D_QWC_SHIFT) & D_QWC_MASK << D_QWC_SHIFT))
438 
439 /*
440  * Source/Destination Chain Tag definition.
441  *  SC ... VIF0, VIF1, GIF, toIPU, SIF1, toSPR
442  *  DC ... SIF0, fromSPR
443  */
444 /*
445  * DMA address
446  *  At least, 16byte align.
447  *  but 64byte align is recommended. because EE D-cash line size is 64byte.
448  *  To gain maximum DMA speed, use 128 byte align.
449  */
450 #define DMATAG_ADDR_MASK		0xffffffff
451 #define DMATAG_ADDR_SHIFT		32
452 #define DMATAG_ADDR(x)							\
453 	((u_int32_t)(((x) >> DMATAG_ADDR_SHIFT) & DMATAG_ADDR_MASK))
454 #define DMATAG_ADDR_SET(x, val)						\
455 	((dmatag_t)(x) | (((dmatag_t)(val)) << DMATAG_ADDR_SHIFT))
456 
457 #define DMATAG_ADDR32_INVALID(x)	((x) & 0xf) /* 16byte alignment */
458 
459 /*
460  * DMA controller command
461  */
462 #define DMATAG_CMD_MASK			0xffffffff
463 #define DMATAG_CMD_SHIFT		0
464 #define DMATAG_CMD(x)							\
465 	((u_int32_t)((x) & DMATAG_CMD_MASK))
466 
467 #define DMATAG_CMD_IRQ			0x80000000
468 
469 #define DMATAG_CMD_ID_MASK		0x7
470 #define DMATAG_CMD_ID_SHIFT		28
471 #define DMATAG_CMD_ID(x)						\
472 	(((x) >> DMATAG_CMD_ID_SHIFT) & DMATAG_CMD_ID_MASK)
473 #define DMATAG_CMD_ID_CLR(x)						\
474 	((x) & ~(DMATAG_CMD_ID_MASK <<	DMATAG_CMD_ID_SHIFT))
475 #define DMATAG_CMD_ID_SET(x, val)					\
476 	((x) | (((val) << DMATAG_CMD_ID_SHIFT) &			\
477 	(DMATAG_CMD_ID_MASK << DMATAG_CMD_ID_SHIFT)))
478 #define DMATAG_CMD_SCID_REFE		0
479 #define DMATAG_CMD_SCID_CNT		1
480 #define DMATAG_CMD_SCID_NEXT		2
481 #define DMATAG_CMD_SCID_REF		3
482 #define DMATAG_CMD_SCID_REFS		4 /* VIF1, GIF, SIF1 only */
483 #define DMATAG_CMD_SCID_CALL		5 /* VIF0, VIF1, GIF only */
484 #define DMATAG_CMD_SCID_RET		6 /* VIF0, VIF1, GIF only */
485 #define DMATAG_CMD_SCID_END		7
486 
487 #define DMATAG_CMD_DCID_CNTS		0 /* SIF0, fromSPR only */
488 #define DMATAG_CMD_DCID_CNT		1
489 #define DMATAG_CMD_DCID_END		7
490 
491 #define DMATAG_CMD_PCE_MASK		0x3
492 #define DMATAG_CMD_PCE_SHIFT		26
493 #define DMATAG_CMD_PCE(x)						\
494 	(((x) >> DMATAG_CMD_PCE_SHIFT) & DMATAG_CMD_PCE_MASK)
495 #define DMATAG_CMD_PCE_CLR(x)						\
496 	((x) & ~(DMATAG_CMD_PCE_MASK <<	DMATAG_CMD_PCE_SHIFT))
497 #define DMATAG_CMD_PCE_SET(x, val)					\
498 	((x) | (((val) << DMATAG_CMD_PCE_SHIFT) &			\
499 	(DMATAG_CMD_PCE_MASK << DMATAG_CMD_PCE_SHIFT)))
500 #define DMATAG_CMD_PCE_NONE		0
501 #define DMATAG_CMD_PCE_DISABLE		2
502 #define DMATAG_CMD_PCE_ENABLE		3
503 
504 #define DMATAG_CMD_QWC_MASK		0xffff
505 #define DMATAG_CMD_QWC_SHIFT		0
506 #define DMATAG_CMD_QWC(x)						\
507 	(((x) >> DMATAG_CMD_QWC_SHIFT) & DMATAG_CMD_QWC_MASK)
508 #define DMATAG_CMD_QWC_CLR(x)						\
509 	((x) & ~(DMATAG_CMD_QWC_MASK <<	DMATAG_CMD_QWC_SHIFT))
510 #define DMATAG_CMD_QWC_SET(x, val)					\
511 	((x) | (((val) << DMATAG_CMD_QWC_SHIFT) &			\
512 	(DMATAG_CMD_QWC_MASK << DMATAG_CMD_QWC_SHIFT)))
513