/[gxemul]/trunk/src/include/ps2_dmacreg.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/src/include/ps2_dmacreg.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (show annotations)
Mon Oct 8 16:18:00 2007 UTC (16 years, 6 months ago) by dpavlin
File MIME type: text/plain
File size: 18138 byte(s)
++ trunk/HISTORY	(local)
$Id: HISTORY,v 1.707 2005/04/27 16:37:33 debug Exp $
20050408	Some minor updates to the wdc. Linux now doesn't complain
		anymore if a disk is non-present.
20050409	Various minor fixes (a bintrans bug, and some other things).
		The wdc seems to work with Playstation2 emulation, but there
		is a _long_ annoying delay when disks are detected.
		Fixing a really important bintrans bug (when devices and RAM
		are mixed within 4KB pages), which was triggered with
		NetBSD/playstation2 kernels.
20050410	Adding a dummy dev_ps2_ether (just so that NetBSD doesn't
		complain as much during bootup).
		Symbols starting with '$' are now ignored.
		Renaming dev_ps2_ohci.c to dev_ohci.c, etc.
20050411	Moving the bintrans-cache-isolation check from cpu_mips.c to
		cpu_mips_coproc.c. (I thought this would give a speedup, but
		it's not noticable.)
		Better playstation2 sbus interrupt code.
		Skip ahead many ticks if the count register is read manually.
		(This increases the speed of delay-loops that simply read
		the count register.)
20050412	Updates to the playstation2 timer/interrupt code.
		Some other minor updates.
20050413	NetBSD/cobalt runs from a disk image :-) including userland;
		updating the documentation on how to install NetBSD/cobalt
		using NetBSD/pmax (!).
		Some minor bintrans updates (no real speed improvement) and
		other minor updates (playstation2 now uses the -o options).
20050414	Adding a dummy x86 (and AMD64) mode.
20050415	Adding some (32-bit and 16-bit) x86 instructions.
		Adding some initial support for non-SCSI, non-IDE floppy
		images. (The x86 mode can boot from these, more or less.)
		Moving the devices/ and include/ directories to src/devices/
		and src/include/, respectively.
20050416	Continuing on the x86 stuff. (Adding pc_bios.c and some simple
		support for software interrupts in 16-bit mode.)
20050417	Ripping out most of the x86 instruction decoding stuff, trying
		to rewrite it in a cleaner way.
		Disabling some of the least working CPU families in the
		configure script (sparc, x86, alpha, hppa), so that they are
		not enabled by default.
20050418	Trying to fix the bug which caused problems when turning on
		and off bintrans interactively, by flushing the bintrans cache
		whenever bintrans is manually (re)enabled.
20050419	Adding the 'lswi' ppc instruction.
		Minor updates to the x86 instruction decoding.
20050420	Renaming x86 register name indices from R_xx to X86_R_xx (this
		makes building on Tru64 nicer).
20050422	Adding a check for duplicate MIPS TLB entries on tlbwr/tlbwi.
20050427	Adding screenshots to guestoses.html.
		Some minor fixes and testing for the next release.

==============  RELEASE 0.3.2  ==============


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

  ViewVC Help
Powered by ViewVC 1.1.26