Mario Kart 64
Loading...
Searching...
No Matches
rcp.h
Go to the documentation of this file.
1#ifndef _RCP_H_
2#define _RCP_H_
3
4/**************************************************************************
5 * *
6 * Copyright (C) 1995, Silicon Graphics, Inc. *
7 * *
8 * These coded instructions, statements, and computer programs contain *
9 * unpublished proprietary information of Silicon Graphics, Inc., and *
10 * are protected by Federal copyright law. They may not be disclosed *
11 * to third parties or copied or duplicated in any form, in whole or *
12 * in part, without the prior written consent of Silicon Graphics, Inc. *
13 * *
14 **************************************************************************/
15
16/**************************************************************************
17 *
18 * File: rcp.h
19 *
20 * This file contains register and bit definitions for RCP memory map.
21 * $Revision: 1.20 $
22 * $Date: 1997/07/23 08:35:21 $
23 * $Source: /disk6/Master/cvsmdev2/PR/include/rcp.h,v $
24 *
25 **************************************************************************/
26
27#include <PR/R4300.h>
28#include <PR/ultratypes.h>
29
30/**********************************************************************
31 *
32 * Here is a quick overview of the RCP memory map:
33 *
34
350x0000_0000 .. 0x03ef_ffff RDRAM memory
360x03f0_0000 .. 0x03ff_ffff RDRAM registers
37
38 RCP registers (see below)
390x0400_0000 .. 0x040f_ffff SP registers
400x0410_0000 .. 0x041f_ffff DP command registers
410x0420_0000 .. 0x042f_ffff DP span registers
420x0430_0000 .. 0x043f_ffff MI registers
430x0440_0000 .. 0x044f_ffff VI registers
440x0450_0000 .. 0x045f_ffff AI registers
450x0460_0000 .. 0x046f_ffff PI registers
460x0470_0000 .. 0x047f_ffff RI registers
470x0480_0000 .. 0x048f_ffff SI registers
480x0490_0000 .. 0x04ff_ffff unused
49
500x0500_0000 .. 0x05ff_ffff cartridge domain 2
510x0600_0000 .. 0x07ff_ffff cartridge domain 1
520x0800_0000 .. 0x0fff_ffff cartridge domain 2
530x1000_0000 .. 0x1fbf_ffff cartridge domain 1
54
550x1fc0_0000 .. 0x1fc0_07bf PIF Boot Rom (1984 bytes)
560x1fc0_07c0 .. 0x1fc0_07ff PIF (JoyChannel) RAM (64 bytes)
570x1fc0_0800 .. 0x1fcf_ffff Reserved
580x1fd0_0000 .. 0x7fff_ffff cartridge domain 1
590x8000_0000 .. 0xffff_ffff external SysAD device
60
61The Indy development board use cartridge domain 1:
620x1000_0000 .. 0x10ff_ffff RAMROM
630x1800_0000 .. 0x1800_0003 GIO interrupt (6 bits valid in 4 bytes)
640x1800_0400 .. 0x1800_0403 GIO sync (6 bits valid in 4 bytes)
650x1800_0800 .. 0x1800_0803 CART interrupt (6 bits valid in 4 bytes)
66
67
68
69**************************************************************************/
70
71/*************************************************************************
72 * RDRAM Memory (Assumes that maximum size is 4 MB)
73 */
74#define RDRAM_0_START 0x00000000
75#define RDRAM_0_END 0x001FFFFF
76#define RDRAM_1_START 0x00200000
77#define RDRAM_1_END 0x003FFFFF
78
79#define RDRAM_START RDRAM_0_START
80#define RDRAM_END RDRAM_1_END
81
82/*************************************************************************
83 * Address predicates
84 */
85#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
86#define IS_RDRAM(x) ((unsigned) (x) >= RDRAM_START && (unsigned) (x) < RDRAM_END)
87#endif
88
89/*************************************************************************
90 * RDRAM Registers (0x03f0_0000 .. 0x03ff_ffff)
91 */
92#define RDRAM_BASE_REG 0x03F00000
93
94#define RDRAM_CONFIG_REG (RDRAM_BASE_REG + 0x00)
95#define RDRAM_DEVICE_TYPE_REG (RDRAM_BASE_REG + 0x00)
96#define RDRAM_DEVICE_ID_REG (RDRAM_BASE_REG + 0x04)
97#define RDRAM_DELAY_REG (RDRAM_BASE_REG + 0x08)
98#define RDRAM_MODE_REG (RDRAM_BASE_REG + 0x0c)
99#define RDRAM_REF_INTERVAL_REG (RDRAM_BASE_REG + 0x10)
100#define RDRAM_REF_ROW_REG (RDRAM_BASE_REG + 0x14)
101#define RDRAM_RAS_INTERVAL_REG (RDRAM_BASE_REG + 0x18)
102#define RDRAM_MIN_INTERVAL_REG (RDRAM_BASE_REG + 0x1c)
103#define RDRAM_ADDR_SELECT_REG (RDRAM_BASE_REG + 0x20)
104#define RDRAM_DEVICE_MANUF_REG (RDRAM_BASE_REG + 0x24)
105
106#define RDRAM_0_DEVICE_ID 0
107#define RDRAM_1_DEVICE_ID 1
108
109#define RDRAM_RESET_MODE 0
110#define RDRAM_ACTIVE_MODE 1
111#define RDRAM_STANDBY_MODE 2
112
113#define RDRAM_LENGTH (2 * 512 * 2048)
114#define RDRAM_0_BASE_ADDRESS (RDRAM_0_DEVICE_ID * RDRAM_LENGTH)
115#define RDRAM_1_BASE_ADDRESS (RDRAM_1_DEVICE_ID * RDRAM_LENGTH)
116
117#define RDRAM_0_CONFIG 0x00000
118#define RDRAM_1_CONFIG 0x00400
119#define RDRAM_GLOBAL_CONFIG 0x80000
120
121/*************************************************************************
122 * PIF Physical memory map (total size = 2 KB)
123 *
124 * Size Description Mode
125 * 1FC007FF +-------+-----------------+-----+
126 * | 64 B | JoyChannel RAM | R/W |
127 * 1FC007C0 +-------+-----------------+-----+
128 * |1984 B | Boot ROM | * | * = Reserved
129 * 1FC00000 +-------+-----------------+-----+
130 *
131 */
132#define PIF_ROM_START 0x1FC00000
133#define PIF_ROM_END 0x1FC007BF
134#define PIF_RAM_START 0x1FC007C0
135#define PIF_RAM_END 0x1FC007FF
136
137/*************************************************************************
138 * Controller channel
139 * Each game controller channel has 4 error bits that are defined in bit 6-7 of
140 * the Rx and Tx data size area bytes. Programmers need to clear these bits
141 * when setting the Tx/Rx size area values for a channel
142 */
143#define CHNL_ERR_NORESP 0x80 /* Bit 7 (Rx): No response error */
144#define CHNL_ERR_OVERRUN 0x40 /* Bit 6 (Rx): Overrun error */
145#define CHNL_ERR_FRAME 0x80 /* Bit 7 (Tx): Frame error */
146#define CHNL_ERR_COLLISION 0x40 /* Bit 6 (Tx): Collision error */
147
148#define CHNL_ERR_MASK 0xC0 /* Bit 6-7: channel errors */
149
150/*************************************************************************
151 * External device info
152 */
153#define DEVICE_TYPE_CART 0 /* ROM cartridge */
154#define DEVICE_TYPE_BULK 1 /* ROM bulk */
155#define DEVICE_TYPE_64DD 2 /* 64 Disk Drive */
156#define DEVICE_TYPE_SRAM 3 /* SRAM */
157
158/*************************************************************************
159 * SP Memory
160 */
161#define SP_DMEM_START 0x04000000 /* read/write */
162#define SP_DMEM_END 0x04000FFF
163#define SP_IMEM_START 0x04001000 /* read/write */
164#define SP_IMEM_END 0x04001FFF
165
166/*************************************************************************
167 * SP CP0 Registers
168 */
169
170#define SP_BASE_REG 0x04040000
171
172/* SP memory address (R/W): [11:0] DMEM/IMEM address; [12] 0=DMEM,1=IMEM */
173#define SP_MEM_ADDR_REG (SP_BASE_REG + 0x00) /* Master */
174
175/* SP DRAM DMA address (R/W): [23:0] RDRAM address */
176#define SP_DRAM_ADDR_REG (SP_BASE_REG + 0x04) /* Slave */
177
178/* SP read DMA length (R/W): [11:0] length, [19:12] count, [31:20] skip */
179/* direction: I/DMEM <- RDRAM */
180#define SP_RD_LEN_REG (SP_BASE_REG + 0x08) /* R/W: read len */
181
182/* SP write DMA length (R/W): [11:0] length, [19:12] count, [31:20] skip */
183/* direction: I/DMEM -> RDRAM */
184#define SP_WR_LEN_REG (SP_BASE_REG + 0x0C) /* R/W: write len */
185
186/* SP status (R/W): [14:0] valid bits; see below for write/read mode */
187#define SP_STATUS_REG (SP_BASE_REG + 0x10)
188
189/* SP DMA full (R): [0] valid bit; dma full */
190#define SP_DMA_FULL_REG (SP_BASE_REG + 0x14)
191
192/* SP DMA busy (R): [0] valid bit; dma busy */
193#define SP_DMA_BUSY_REG (SP_BASE_REG + 0x18)
194
195/* SP semaphore (R/W): Read: [0] semaphore flag (set on read) */
196/* Write: [] clear semaphore flag */
197#define SP_SEMAPHORE_REG (SP_BASE_REG + 0x1C)
198
199/* SP PC (R/W): [11:0] program counter */
200#define SP_PC_REG 0x04080000
201
202/* SP MEM address: bit 12 specifies if address is IMEM or DMEM */
203#define SP_DMA_DMEM 0x0000 /* Bit 12: 0=DMEM, 1=IMEM */
204#define SP_DMA_IMEM 0x1000 /* Bit 12: 0=DMEM, 1=IMEM */
205
206/*
207 * Values to clear/set bit in status reg (SP_STATUS_REG - write)
208 */
209#define SP_CLR_HALT 0x00001 /* Bit 0: clear halt */
210#define SP_SET_HALT 0x00002 /* Bit 1: set halt */
211#define SP_CLR_BROKE 0x00004 /* Bit 2: clear broke */
212#define SP_CLR_INTR 0x00008 /* Bit 3: clear intr */
213#define SP_SET_INTR 0x00010 /* Bit 4: set intr */
214#define SP_CLR_SSTEP 0x00020 /* Bit 5: clear sstep */
215#define SP_SET_SSTEP 0x00040 /* Bit 6: set sstep */
216#define SP_CLR_INTR_BREAK 0x00080 /* Bit 7: clear intr on break */
217#define SP_SET_INTR_BREAK 0x00100 /* Bit 8: set intr on break */
218#define SP_CLR_SIG0 0x00200 /* Bit 9: clear signal 0 */
219#define SP_SET_SIG0 0x00400 /* Bit 10: set signal 0 */
220#define SP_CLR_SIG1 0x00800 /* Bit 11: clear signal 1 */
221#define SP_SET_SIG1 0x01000 /* Bit 12: set signal 1 */
222#define SP_CLR_SIG2 0x02000 /* Bit 13: clear signal 2 */
223#define SP_SET_SIG2 0x04000 /* Bit 14: set signal 2 */
224#define SP_CLR_SIG3 0x08000 /* Bit 15: clear signal 3 */
225#define SP_SET_SIG3 0x10000 /* Bit 16: set signal 3 */
226#define SP_CLR_SIG4 0x20000 /* Bit 17: clear signal 4 */
227#define SP_SET_SIG4 0x40000 /* Bit 18: set signal 4 */
228#define SP_CLR_SIG5 0x80000 /* Bit 19: clear signal 5 */
229#define SP_SET_SIG5 0x100000 /* Bit 20: set signal 5 */
230#define SP_CLR_SIG6 0x200000 /* Bit 21: clear signal 6 */
231#define SP_SET_SIG6 0x400000 /* Bit 22: set signal 6 */
232#define SP_CLR_SIG7 0x800000 /* Bit 23: clear signal 7 */
233#define SP_SET_SIG7 0x1000000 /* Bit 24: set signal 7 */
234
235/*
236 * Patterns to interpret status reg (SP_STATUS_REG - read)
237 */
238#define SP_STATUS_HALT 0x001 /* Bit 0: halt */
239#define SP_STATUS_BROKE 0x002 /* Bit 1: broke */
240#define SP_STATUS_DMA_BUSY 0x004 /* Bit 2: dma busy */
241#define SP_STATUS_DMA_FULL 0x008 /* Bit 3: dma full */
242#define SP_STATUS_IO_FULL 0x010 /* Bit 4: io full */
243#define SP_STATUS_SSTEP 0x020 /* Bit 5: single step */
244#define SP_STATUS_INTR_BREAK 0x040 /* Bit 6: interrupt on break */
245#define SP_STATUS_SIG0 0x080 /* Bit 7: signal 0 set */
246#define SP_STATUS_SIG1 0x100 /* Bit 8: signal 1 set */
247#define SP_STATUS_SIG2 0x200 /* Bit 9: signal 2 set */
248#define SP_STATUS_SIG3 0x400 /* Bit 10: signal 3 set */
249#define SP_STATUS_SIG4 0x800 /* Bit 11: signal 4 set */
250#define SP_STATUS_SIG5 0x1000 /* Bit 12: signal 5 set */
251#define SP_STATUS_SIG6 0x2000 /* Bit 13: signal 6 set */
252#define SP_STATUS_SIG7 0x4000 /* Bit 14: signal 7 set */
253
254/*
255 * Use of SIG bits
256 */
257#define SP_CLR_YIELD SP_CLR_SIG0
258#define SP_SET_YIELD SP_SET_SIG0
259#define SP_STATUS_YIELD SP_STATUS_SIG0
260#define SP_CLR_YIELDED SP_CLR_SIG1
261#define SP_SET_YIELDED SP_SET_SIG1
262#define SP_STATUS_YIELDED SP_STATUS_SIG1
263#define SP_CLR_TASKDONE SP_CLR_SIG2
264#define SP_SET_TASKDONE SP_SET_SIG2
265#define SP_STATUS_TASKDONE SP_STATUS_SIG2
266#define SP_CLR_RSPSIGNAL SP_CLR_SIG3
267#define SP_SET_RSPSIGNAL SP_SET_SIG3
268#define SP_STATUS_RSPSIGNAL SP_STATUS_SIG3
269#define SP_CLR_CPUSIGNAL SP_CLR_SIG4
270#define SP_SET_CPUSIGNAL SP_SET_SIG4
271#define SP_STATUS_CPUSIGNAL SP_STATUS_SIG4
272
273/* SP IMEM BIST REG (R/W): [6:0] BIST status bits; see below for detail */
274#define SP_IBIST_REG 0x04080004
275
276/*
277 * Patterns to interpret status reg (SP_BIST_REG - write)
278 */
279#define SP_IBIST_CHECK 0x01 /* Bit 0: BIST check */
280#define SP_IBIST_GO 0x02 /* Bit 1: BIST go */
281#define SP_IBIST_CLEAR 0x04 /* Bit 2: BIST clear */
282
283/*
284 * Patterns to interpret status reg (SP_BIST_REG - read)
285 */
286/* First 2 bits are same as in write mode:
287 * Bit 0: BIST check; Bit 1: BIST go
288 */
289#define SP_IBIST_DONE 0x04 /* Bit 2: BIST done */
290#define SP_IBIST_FAILED 0x78 /* Bit [6:3]: BIST fail */
291
292/*************************************************************************
293 * DP Command Registers
294 */
295#define DPC_BASE_REG 0x04100000
296
297/* DP CMD DMA start (R/W): [23:0] DMEM/RDRAM start address */
298#define DPC_START_REG (DPC_BASE_REG + 0x00)
299
300/* DP CMD DMA end (R/W): [23:0] DMEM/RDRAM end address */
301#define DPC_END_REG (DPC_BASE_REG + 0x04)
302
303/* DP CMD DMA end (R): [23:0] DMEM/RDRAM current address */
304#define DPC_CURRENT_REG (DPC_BASE_REG + 0x08)
305
306/* DP CMD status (R/W): [9:0] valid bits - see below for definitions */
307#define DPC_STATUS_REG (DPC_BASE_REG + 0x0C)
308
309/* DP clock counter (R): [23:0] clock counter */
310#define DPC_CLOCK_REG (DPC_BASE_REG + 0x10)
311
312/* DP buffer busy counter (R): [23:0] clock counter */
313#define DPC_BUFBUSY_REG (DPC_BASE_REG + 0x14)
314
315/* DP pipe busy counter (R): [23:0] clock counter */
316#define DPC_PIPEBUSY_REG (DPC_BASE_REG + 0x18)
317
318/* DP TMEM load counter (R): [23:0] clock counter */
319#define DPC_TMEM_REG (DPC_BASE_REG + 0x1C)
320
321/*
322 * Values to clear/set bit in status reg (DPC_STATUS_REG - write)
323 */
324#define DPC_CLR_XBUS_DMEM_DMA 0x0001 /* Bit 0: clear xbus_dmem_dma */
325#define DPC_SET_XBUS_DMEM_DMA 0x0002 /* Bit 1: set xbus_dmem_dma */
326#define DPC_CLR_FREEZE 0x0004 /* Bit 2: clear freeze */
327#define DPC_SET_FREEZE 0x0008 /* Bit 3: set freeze */
328#define DPC_CLR_FLUSH 0x0010 /* Bit 4: clear flush */
329#define DPC_SET_FLUSH 0x0020 /* Bit 5: set flush */
330#define DPC_CLR_TMEM_CTR 0x0040 /* Bit 6: clear tmem ctr */
331#define DPC_CLR_PIPE_CTR 0x0080 /* Bit 7: clear pipe ctr */
332#define DPC_CLR_CMD_CTR 0x0100 /* Bit 8: clear cmd ctr */
333#define DPC_CLR_CLOCK_CTR 0x0200 /* Bit 9: clear clock ctr */
334
335/*
336 * Patterns to interpret status reg (DPC_STATUS_REG - read)
337 */
338#define DPC_STATUS_XBUS_DMEM_DMA 0x001 /* Bit 0: xbus_dmem_dma */
339#define DPC_STATUS_FREEZE 0x002 /* Bit 1: freeze */
340#define DPC_STATUS_FLUSH 0x004 /* Bit 2: flush */
341/*#define DPC_STATUS_FROZEN 0x008*/ /* Bit 3: frozen */
342#define DPC_STATUS_START_GCLK 0x008 /* Bit 3: start gclk */
343#define DPC_STATUS_TMEM_BUSY 0x010 /* Bit 4: tmem busy */
344#define DPC_STATUS_PIPE_BUSY 0x020 /* Bit 5: pipe busy */
345#define DPC_STATUS_CMD_BUSY 0x040 /* Bit 6: cmd busy */
346#define DPC_STATUS_CBUF_READY 0x080 /* Bit 7: cbuf ready */
347#define DPC_STATUS_DMA_BUSY 0x100 /* Bit 8: dma busy */
348#define DPC_STATUS_END_VALID 0x200 /* Bit 9: end valid */
349#define DPC_STATUS_START_VALID 0x400 /* Bit 10: start valid */
350
351/*************************************************************************
352 * DP Span Registers
353 */
354#define DPS_BASE_REG 0x04200000
355
356/* DP tmem bist (R/W): [10:0] BIST status bits; see below for detail */
357#define DPS_TBIST_REG (DPS_BASE_REG + 0x00)
358
359/* DP span test mode (R/W): [0] Span buffer test access enable */
360#define DPS_TEST_MODE_REG (DPS_BASE_REG + 0x04)
361
362/* DP span buffer test address (R/W): [6:0] bits; see below for detail */
363#define DPS_BUFTEST_ADDR_REG (DPS_BASE_REG + 0x08)
364
365/* DP span buffer test data (R/W): [31:0] span buffer data */
366#define DPS_BUFTEST_DATA_REG (DPS_BASE_REG + 0x0C)
367
368/*
369 * Patterns to interpret status reg (DPS_TMEM_BIST_REG - write)
370 */
371#define DPS_TBIST_CHECK 0x01 /* Bit 0: BIST check */
372#define DPS_TBIST_GO 0x02 /* Bit 1: BIST go */
373#define DPS_TBIST_CLEAR 0x04 /* Bit 2: BIST clear */
374
375/*
376 * Patterns to interpret status reg (DPS_TMEM_BIST_REG - read)
377 */
378/* First 2 bits are same as in write mode:
379 * Bit 0: BIST check; Bit 1: BIST go
380 */
381#define DPS_TBIST_DONE 0x004 /* Bit 2: BIST done */
382#define DPS_TBIST_FAILED 0x7F8 /* Bit [10:3]: BIST fail */
383
384/*************************************************************************
385 * MIPS Interface (MI) Registers
386 */
387#define MI_BASE_REG 0x04300000
388
389/*
390 * MI init mode (W): [6:0] init length, [7] clear init mode, [8] set init mode
391 * [9/10] clear/set ebus test mode, [11] clear DP interrupt
392 * (R): [6:0] init length, [7] init mode, [8] ebus test mode
393 */
394#define MI_INIT_MODE_REG (MI_BASE_REG + 0x00)
395#define MI_MODE_REG MI_INIT_MODE_REG
396
397/*
398 * Values to clear/set bit in mode reg (MI_MODE_REG - write)
399 */
400#define MI_CLR_INIT 0x0080 /* Bit 7: clear init mode */
401#define MI_SET_INIT 0x0100 /* Bit 8: set init mode */
402#define MI_CLR_EBUS 0x0200 /* Bit 9: clear ebus test */
403#define MI_SET_EBUS 0x0400 /* Bit 10: set ebus test mode */
404#define MI_CLR_DP_INTR 0x0800 /* Bit 11: clear dp interrupt */
405#define MI_CLR_RDRAM 0x1000 /* Bit 12: clear RDRAM reg */
406#define MI_SET_RDRAM 0x2000 /* Bit 13: set RDRAM reg mode */
407
408/*
409 * Patterns to interpret mode reg (MI_MODE_REG - read)
410 */
411#define MI_MODE_INIT 0x0080 /* Bit 7: init mode */
412#define MI_MODE_EBUS 0x0100 /* Bit 8: ebus test mode */
413#define MI_MODE_RDRAM 0x0200 /* Bit 9: RDRAM reg mode */
414
415/* MI version (R): [7:0] io, [15:8] rac, [23:16] rdp, [31:24] rsp */
416#define MI_VERSION_REG (MI_BASE_REG + 0x04)
417#define MI_NOOP_REG MI_VERSION_REG
418
419/* MI interrupt (R): [5:0] valid bits - see below for bit patterns */
420#define MI_INTR_REG (MI_BASE_REG + 0x08)
421
422/*
423 * MI interrupt mask (W): [11:0] valid bits - see below for bit patterns
424 * (R): [5:0] valid bits - see below for bit patterns
425 */
426#define MI_INTR_MASK_REG (MI_BASE_REG + 0x0C)
427
428/*
429 * The following are values to check for interrupt setting (MI_INTR_REG)
430 */
431#define MI_INTR_SP 0x01 /* Bit 0: SP intr */
432#define MI_INTR_SI 0x02 /* Bit 1: SI intr */
433#define MI_INTR_AI 0x04 /* Bit 2: AI intr */
434#define MI_INTR_VI 0x08 /* Bit 3: VI intr */
435#define MI_INTR_PI 0x10 /* Bit 4: PI intr */
436#define MI_INTR_DP 0x20 /* Bit 5: DP intr */
437
438/*
439 * The following are values to clear/set various interrupt bit mask
440 * They can be ORed together to manipulate multiple bits
441 * (MI_INTR_MASK_REG - write)
442 */
443#define MI_INTR_MASK_CLR_SP 0x0001 /* Bit 0: clear SP mask */
444#define MI_INTR_MASK_SET_SP 0x0002 /* Bit 1: set SP mask */
445#define MI_INTR_MASK_CLR_SI 0x0004 /* Bit 2: clear SI mask */
446#define MI_INTR_MASK_SET_SI 0x0008 /* Bit 3: set SI mask */
447#define MI_INTR_MASK_CLR_AI 0x0010 /* Bit 4: clear AI mask */
448#define MI_INTR_MASK_SET_AI 0x0020 /* Bit 5: set AI mask */
449#define MI_INTR_MASK_CLR_VI 0x0040 /* Bit 6: clear VI mask */
450#define MI_INTR_MASK_SET_VI 0x0080 /* Bit 7: set VI mask */
451#define MI_INTR_MASK_CLR_PI 0x0100 /* Bit 8: clear PI mask */
452#define MI_INTR_MASK_SET_PI 0x0200 /* Bit 9: set PI mask */
453#define MI_INTR_MASK_CLR_DP 0x0400 /* Bit 10: clear DP mask */
454#define MI_INTR_MASK_SET_DP 0x0800 /* Bit 11: set DP mask */
455
456/*
457 * The following are values to check for interrupt mask setting
458 * (MI_INTR_MASK_REG - read)
459 */
460#define MI_INTR_MASK_SP 0x01 /* Bit 0: SP intr mask */
461#define MI_INTR_MASK_SI 0x02 /* Bit 1: SI intr mask */
462#define MI_INTR_MASK_AI 0x04 /* Bit 2: AI intr mask */
463#define MI_INTR_MASK_VI 0x08 /* Bit 3: VI intr mask */
464#define MI_INTR_MASK_PI 0x10 /* Bit 4: PI intr mask */
465#define MI_INTR_MASK_DP 0x20 /* Bit 5: DP intr mask */
466
467/*************************************************************************
468 * Video Interface (VI) Registers
469 */
470#define VI_BASE_REG 0x04400000
471
472/* VI status/control (R/W): [15-0] valid bits:
473 * [1:0] = type[1:0] (pixel size)
474 * 0: blank (no data, no sync)
475 * 1: reserved
476 * 2: 5/5/5/3 ("16" bit)
477 * 3: 8/8/8/8 (32 bit)
478 * [2] = gamma_dither_enable (normally on, unless "special effect")
479 * [3] = gamma_enable (normally on, unless MPEG/JPEG)
480 * [4] = divot_enable (normally on if antialiased, unless decal lines)
481 * [5] = reserved - always off
482 * [6] = serrate (always on if interlaced, off if not)
483 * [7] = reserved - diagnostics only
484 * [9:8] = anti-alias (aa) mode[1:0]
485 * 0: aa & resamp (always fetch extra lines)
486 * 1: aa & resamp (fetch extra lines if needed)
487 * 2: resamp only (treat as all fully covered)
488 * 3: neither (replicate pixels, no interpolate)
489 * [11] = reserved - diagnostics only
490 * [15:12] = reserved
491 *
492 */
493#define VI_STATUS_REG (VI_BASE_REG + 0x00)
494#define VI_CONTROL_REG VI_STATUS_REG
495
496/* VI origin (R/W): [23:0] frame buffer origin in bytes */
497#define VI_ORIGIN_REG (VI_BASE_REG + 0x04)
498#define VI_DRAM_ADDR_REG VI_ORIGIN_REG
499
500/* VI width (R/W): [11:0] frame buffer line width in pixels */
501#define VI_WIDTH_REG (VI_BASE_REG + 0x08)
502#define VI_H_WIDTH_REG VI_WIDTH_REG
503
504/* VI vertical intr (R/W): [9:0] interrupt when current half-line = V_INTR */
505#define VI_INTR_REG (VI_BASE_REG + 0x0C)
506#define VI_V_INTR_REG VI_INTR_REG
507
508/*
509 * VI current vertical line (R/W): [9:0] current half line, sampled once per
510 * line (the lsb of V_CURRENT is constant within a field, and in
511 * interlaced modes gives the field number - which is constant for non-
512 * interlaced modes)
513 * - Any write to this register will clear interrupt line
514 */
515#define VI_CURRENT_REG (VI_BASE_REG + 0x10)
516#define VI_V_CURRENT_LINE_REG VI_CURRENT_REG
517
518/*
519 * VI video timing (R/W): [ 7: 0] horizontal sync width in pixels,
520 * [15: 8] color burst width in pixels,
521 * [19:16] vertical sync width in half lines,
522 * [29:20] start of color burst in pixels from h-sync
523 */
524#define VI_BURST_REG (VI_BASE_REG + 0x14)
525#define VI_TIMING_REG VI_BURST_REG
526
527/* VI vertical sync (R/W): [9:0] number of half-lines per field */
528#define VI_V_SYNC_REG (VI_BASE_REG + 0x18)
529
530/* VI horizontal sync (R/W): [11: 0] total duration of a line in 1/4 pixel
531 * [20:16] a 5-bit leap pattern used for PAL only
532 * (h_sync_period)
533 */
534#define VI_H_SYNC_REG (VI_BASE_REG + 0x1C)
535
536/*
537 * VI horizontal sync leap (R/W): [11: 0] identical to h_sync_period
538 * [27:16] identical to h_sync_period
539 */
540#define VI_LEAP_REG (VI_BASE_REG + 0x20)
541#define VI_H_SYNC_LEAP_REG VI_LEAP_REG
542
543/*
544 * VI horizontal video (R/W): [ 9: 0] end of active video in screen pixels
545 * : [25:16] start of active video in screen pixels
546 */
547#define VI_H_START_REG (VI_BASE_REG + 0x24)
548#define VI_H_VIDEO_REG VI_H_START_REG
549
550/*
551 * VI vertical video (R/W): [ 9: 0] end of active video in screen half-lines
552 * : [25:16] start of active video in screen half-lines
553 */
554#define VI_V_START_REG (VI_BASE_REG + 0x28)
555#define VI_V_VIDEO_REG VI_V_START_REG
556
557/*
558 * VI vertical burst (R/W): [ 9: 0] end of color burst enable in half-lines
559 * : [25:16] start of color burst enable in half-lines
560 */
561#define VI_V_BURST_REG (VI_BASE_REG + 0x2C)
562
563/* VI x-scale (R/W): [11: 0] 1/horizontal scale up factor (2.10 format)
564 * [27:16] horizontal subpixel offset (2.10 format)
565 */
566#define VI_X_SCALE_REG (VI_BASE_REG + 0x30)
567
568/* VI y-scale (R/W): [11: 0] 1/vertical scale up factor (2.10 format)
569 * [27:16] vertical subpixel offset (2.10 format)
570 */
571#define VI_Y_SCALE_REG (VI_BASE_REG + 0x34)
572
573/*
574 * Patterns to interpret VI_CONTROL_REG
575 */
576#define VI_CTRL_TYPE_16 0x00002 /* Bit [1:0] pixel size: 16 bit */
577#define VI_CTRL_TYPE_32 0x00003 /* Bit [1:0] pixel size: 32 bit */
578#define VI_CTRL_GAMMA_DITHER_ON 0x00004 /* Bit 2: default = on */
579#define VI_CTRL_GAMMA_ON 0x00008 /* Bit 3: default = on */
580#define VI_CTRL_DIVOT_ON 0x00010 /* Bit 4: default = on */
581#define VI_CTRL_SERRATE_ON 0x00040 /* Bit 6: on if interlaced */
582#define VI_CTRL_ANTIALIAS_MASK 0x00300 /* Bit [9:8] anti-alias mode */
583#define VI_CTRL_DITHER_FILTER_ON 0x10000 /* Bit 16: dither-filter mode */
584
585/*
586 * Possible video clocks (NTSC or PAL)
587 */
588#define VI_NTSC_CLOCK 48681812 /* Hz = 48.681812 MHz */
589#define VI_PAL_CLOCK 49656530 /* Hz = 49.656530 MHz */
590#define VI_MPAL_CLOCK 48628316 /* Hz = 48.628316 MHz */
591
592/*************************************************************************
593 * Audio Interface (AI) Registers
594 *
595 * The address and length registers are double buffered; that is, they
596 * can be written twice before becoming full.
597 * The address must be written before the length.
598 */
599#define AI_BASE_REG 0x04500000
600
601/* AI DRAM address (W): [23:0] starting RDRAM address (8B-aligned) */
602#define AI_DRAM_ADDR_REG (AI_BASE_REG + 0x00) /* R0: DRAM address */
603
604/* AI length (R/W): [14:0] transfer length (v1.0) - Bottom 3 bits are ignored */
605/* [17:0] transfer length (v2.0) - Bottom 3 bits are ignored */
606#define AI_LEN_REG (AI_BASE_REG + 0x04) /* R1: Length */
607
608/* AI control (W): [0] DMA enable - if LSB == 1, DMA is enabled */
609#define AI_CONTROL_REG (AI_BASE_REG + 0x08) /* R2: DMA Control */
610
611/*
612 * AI status (R): [31]/[0] ai_full (addr & len buffer full), [30] ai_busy
613 * Note that a 1->0 transition in ai_full will set interrupt
614 * (W): clear audio interrupt
615 */
616#define AI_STATUS_REG (AI_BASE_REG + 0x0C) /* R3: Status */
617
618/*
619 * AI DAC sample period register (W): [13:0] dac rate
620 * - vid_clock/(dperiod + 1) is the DAC sample rate
621 * - (dperiod + 1) >= 66 * (aclockhp + 1) must be true
622 */
623#define AI_DACRATE_REG (AI_BASE_REG + 0x10) /* R4: DAC rate 14-lsb*/
624
625/*
626 * AI bit rate (W): [3:0] bit rate (abus clock half period register - aclockhp)
627 * - vid_clock/(2 * (aclockhp + 1)) is the DAC clock rate
628 * - The abus clock stops if aclockhp is zero
629 */
630#define AI_BITRATE_REG (AI_BASE_REG + 0x14) /* R5: Bit rate 4-lsb */
631
632/* Value for control register */
633#define AI_CONTROL_DMA_ON 0x01 /* LSB = 1: DMA enable*/
634#define AI_CONTROL_DMA_OFF 0x00 /* LSB = 1: DMA enable*/
635
636/* Value for status register */
637#define AI_STATUS_FIFO_FULL 0x80000000 /* Bit 31: full */
638#define AI_STATUS_DMA_BUSY 0x40000000 /* Bit 30: busy */
639
640/* DAC rate = video clock / audio frequency
641 * - DAC rate >= (66 * Bit rate) must be true
642 */
643#define AI_MAX_DAC_RATE 16384 /* 14-bit+1 */
644#define AI_MIN_DAC_RATE 132
645
646/* Bit rate <= (DAC rate / 66) */
647#define AI_MAX_BIT_RATE 16 /* 4-bit+1 */
648#define AI_MIN_BIT_RATE 2
649
650/*
651 * Maximum and minimum values for audio frequency based on video clocks
652 * max frequency = (video clock / min dac rate)
653 * min frequency = (video clock / max dac rate)
654 */
655#define AI_NTSC_MAX_FREQ 368000 /* 368 KHz */
656#define AI_NTSC_MIN_FREQ 3000 /* 3 KHz ~ 2971 Hz */
657
658#define AI_PAL_MAX_FREQ 376000 /* 376 KHz */
659#define AI_PAL_MIN_FREQ 3050 /* 3 KHz ~ 3031 Hz */
660
661#define AI_MPAL_MAX_FREQ 368000 /* 368 KHz */
662#define AI_MPAL_MIN_FREQ 3000 /* 3 KHz ~ 2968 Hz */
663
664/*************************************************************************
665 * Peripheral Interface (PI) Registers
666 */
667#define PI_BASE_REG 0x04600000
668
669/* PI DRAM address (R/W): [23:0] starting RDRAM address */
670#define PI_DRAM_ADDR_REG (PI_BASE_REG + 0x00) /* DRAM address */
671
672/* PI pbus (cartridge) address (R/W): [31:0] starting AD16 address */
673#define PI_CART_ADDR_REG (PI_BASE_REG + 0x04)
674
675/* PI read length (R/W): [23:0] read data length */
676#define PI_RD_LEN_REG (PI_BASE_REG + 0x08)
677
678/* PI write length (R/W): [23:0] write data length */
679#define PI_WR_LEN_REG (PI_BASE_REG + 0x0C)
680
681/*
682 * PI status (R): [0] DMA busy, [1] IO busy, [2], error
683 * (W): [0] reset controller (and abort current op), [1] clear intr
684 */
685#define PI_STATUS_REG (PI_BASE_REG + 0x10)
686
687/* PI dom1 latency (R/W): [7:0] domain 1 device latency */
688#define PI_BSD_DOM1_LAT_REG (PI_BASE_REG + 0x14)
689
690/* PI dom1 pulse width (R/W): [7:0] domain 1 device R/W strobe pulse width */
691#define PI_BSD_DOM1_PWD_REG (PI_BASE_REG + 0x18)
692
693/* PI dom1 page size (R/W): [3:0] domain 1 device page size */
694#define PI_BSD_DOM1_PGS_REG (PI_BASE_REG + 0x1C) /* page size */
695
696/* PI dom1 release (R/W): [1:0] domain 1 device R/W release duration */
697#define PI_BSD_DOM1_RLS_REG (PI_BASE_REG + 0x20)
698
699/* PI dom2 latency (R/W): [7:0] domain 2 device latency */
700#define PI_BSD_DOM2_LAT_REG (PI_BASE_REG + 0x24) /* Domain 2 latency */
701
702/* PI dom2 pulse width (R/W): [7:0] domain 2 device R/W strobe pulse width */
703#define PI_BSD_DOM2_PWD_REG (PI_BASE_REG + 0x28) /* pulse width */
704
705/* PI dom2 page size (R/W): [3:0] domain 2 device page size */
706#define PI_BSD_DOM2_PGS_REG (PI_BASE_REG + 0x2C) /* page size */
707
708/* PI dom2 release (R/W): [1:0] domain 2 device R/W release duration */
709#define PI_BSD_DOM2_RLS_REG (PI_BASE_REG + 0x30) /* release duration */
710
711#define PI_DOMAIN1_REG PI_BSD_DOM1_LAT_REG
712#define PI_DOMAIN2_REG PI_BSD_DOM2_LAT_REG
713
714#define PI_DOM_LAT_OFS 0x00
715#define PI_DOM_PWD_OFS 0x04
716#define PI_DOM_PGS_OFS 0x08
717#define PI_DOM_RLS_OFS 0x0C
718
719/*
720 * PI status register has 3 bits active when read from (PI_STATUS_REG - read)
721 * Bit 0: DMA busy - set when DMA is in progress
722 * Bit 1: IO busy - set when IO is in progress
723 * Bit 2: Error - set when CPU issues IO request while DMA is busy
724 */
725#define PI_STATUS_ERROR 0x04
726#define PI_STATUS_IO_BUSY 0x02
727#define PI_STATUS_DMA_BUSY 0x01
728
729/* PI status register has 2 bits active when written to:
730 * Bit 0: When set, reset PIC
731 * Bit 1: When set, clear interrupt flag
732 * The values of the two bits can be ORed together to both reset PIC and
733 * clear interrupt at the same time.
734 *
735 * Note:
736 * - The PIC does generate an interrupt at the end of each DMA. CPU
737 * needs to clear the interrupt flag explicitly (from an interrupt
738 * handler) by writing into the STATUS register with bit 1 set.
739 *
740 * - When a DMA completes, the interrupt flag is set. CPU can issue
741 * another request even while the interrupt flag is set (as long as
742 * PIC is idle). However, it is the CPU's responsibility for
743 * maintaining accurate correspondence between DMA completions and
744 * interrupts.
745 *
746 * - When PIC is reset, if PIC happens to be busy, an interrupt will
747 * be generated as PIC returns to idle. Otherwise, no interrupt will
748 * be generated and PIC remains idle.
749 */
750/*
751 * Values to clear interrupt/reset PIC (PI_STATUS_REG - write)
752 */
753#define PI_STATUS_RESET 0x01
754#define PI_SET_RESET PI_STATUS_RESET
755
756#define PI_STATUS_CLR_INTR 0x02
757#define PI_CLR_INTR PI_STATUS_CLR_INTR
758
759#define PI_DMA_BUFFER_SIZE 128
760
761#define PI_DOM1_ADDR1 0x06000000 /* to 0x07FFFFFF */
762#define PI_DOM1_ADDR2 0x10000000 /* to 0x1FBFFFFF */
763#define PI_DOM1_ADDR3 0x1FD00000 /* to 0x7FFFFFFF */
764#define PI_DOM2_ADDR1 0x05000000 /* to 0x05FFFFFF */
765#define PI_DOM2_ADDR2 0x08000000 /* to 0x0FFFFFFF */
766
767/*************************************************************************
768 * RDRAM Interface (RI) Registers
769 */
770#define RI_BASE_REG 0x04700000
771
772/* RI mode (R/W): [1:0] operating mode, [2] stop T active, [3] stop R active */
773#define RI_MODE_REG (RI_BASE_REG + 0x00)
774
775/* RI config (R/W): [5:0] current control input, [6] current control enable */
776#define RI_CONFIG_REG (RI_BASE_REG + 0x04)
777
778/* RI current load (W): [] any write updates current control register */
779#define RI_CURRENT_LOAD_REG (RI_BASE_REG + 0x08)
780
781/* RI select (R/W): [2:0] receive select, [2:0] transmit select */
782#define RI_SELECT_REG (RI_BASE_REG + 0x0C)
783
784/* RI refresh (R/W): [7:0] clean refresh delay, [15:8] dirty refresh delay,
785 * [16] refresh bank, [17] refresh enable
786 * [18] refresh optimize
787 */
788#define RI_REFRESH_REG (RI_BASE_REG + 0x10)
789#define RI_COUNT_REG RI_REFRESH_REG
790
791/* RI latency (R/W): [3:0] DMA latency/overlap */
792#define RI_LATENCY_REG (RI_BASE_REG + 0x14)
793
794/* RI error (R): [0] nack error, [1] ack error */
795#define RI_RERROR_REG (RI_BASE_REG + 0x18)
796
797/* RI error (W): [] any write clears all error bits */
798#define RI_WERROR_REG (RI_BASE_REG + 0x1C)
799
800/*************************************************************************
801 * Serial Interface (SI) Registers
802 */
803#define SI_BASE_REG 0x04800000
804
805/* SI DRAM address (R/W): [23:0] starting RDRAM address */
806#define SI_DRAM_ADDR_REG (SI_BASE_REG + 0x00) /* R0: DRAM address */
807
808/* SI address read 64B (W): [] any write causes a 64B DMA write */
809#define SI_PIF_ADDR_RD64B_REG (SI_BASE_REG + 0x04) /* R1: 64B PIF->DRAM */
810
811/* Address SI_BASE_REG + (0x08, 0x0c, 0x14) are reserved */
812
813/* SI address write 64B (W): [] any write causes a 64B DMA read */
814#define SI_PIF_ADDR_WR64B_REG (SI_BASE_REG + 0x10) /* R4: 64B DRAM->PIF */
815
816/*
817 * SI status (W): [] any write clears interrupt
818 * (R): [0] DMA busy, [1] IO read busy, [2] reserved
819 * [3] DMA error, [12] interrupt
820 */
821#define SI_STATUS_REG (SI_BASE_REG + 0x18) /* R6: Status */
822
823/* SI status register has the following bits active:
824 * 0: DMA busy - set when DMA is in progress
825 * 1: IO busy - set when IO access is in progress
826 * 3: DMA error - set when there are overlapping DMA requests
827 * 12: Interrupt - Interrupt set
828 */
829#define SI_STATUS_DMA_BUSY 0x0001
830#define SI_STATUS_RD_BUSY 0x0002
831#define SI_STATUS_DMA_ERROR 0x0008
832#define SI_STATUS_INTERRUPT 0x1000
833
834/*************************************************************************
835 * Development Board GIO Control Registers
836 */
837
838#define GIO_BASE_REG 0x18000000
839
840/* Game to Host Interrupt */
841#define GIO_GIO_INTR_REG (GIO_BASE_REG + 0x000)
842
843/* Game to Host SYNC */
844#define GIO_GIO_SYNC_REG (GIO_BASE_REG + 0x400)
845
846/* Host to Game Interrupt */
847#define GIO_CART_INTR_REG (GIO_BASE_REG + 0x800)
848
849/*************************************************************************
850 * Common macros
851 */
852#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
853#define IO_READ(addr) (*(vu32*) PHYS_TO_K1(addr))
854#define IO_WRITE(addr, data) (*(vu32*) PHYS_TO_K1(addr) = (u32) (data))
855#define RCP_STAT_PRINT \
856 rmonPrintf("current=%x start=%x end=%x dpstat=%x spstat=%x\n", IO_READ(DPC_CURRENT_REG), IO_READ(DPC_START_REG), \
857 IO_READ(DPC_END_REG), IO_READ(DPC_STATUS_REG), IO_READ(SP_STATUS_REG))
858
859#endif
860
861#endif /* _RCP_H_ */