summaryrefslogtreecommitdiff
path: root/os/js/io.h
blob: c3868eb2e53929199f43e0c8e03b8ee481fd637d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
/*
 * most device registers are memory mapped, but
 * a few things are accessed using putphys/getphys
 */
#define	SBUS(n)		(0x30000000+(n)*0x10000000)
#define	FRAMEBUF(n)	SBUS(n)
#define	FRAMEBUFID(n)	(SBUS(n)+0x000000)
#define	DISPLAYRAM(n)	(SBUS(n)+0x800000)
#define	CLOCK		0x71D00000
#define	CLOCKFREQ	1000000		/* one microsecond increments */

#define SUPERIO_PHYS_PAGE		0x71300000
#define SUPERIO_INDEX_OFFSET		0x398
#define SUPERIO_DATA_OFFSET		0x399
#define SUPERIO_MOUSE_KBD_DATA_PORT	0x60
#define SUPERIO_MOUSE_KBD_CTL_PORT	0x64

#define AUDIO_PHYS_PAGE		0x66666666
#define AUDIO_INDEX_OFFSET	0x830

enum
{
	Mousevec = 13,
	Kbdvec = 13
};

#define	NVR_CKSUM_PHYS	0x71200000	/* non-volatile RAM cksum page */
#define	NVR_PHYS	0x71201000	/* non-volatile RAM */
#define DMA		0x78400000	/* SCSI and Ether DMA registers */
#define SCSI		0x78800000	/* NCR53C90 registers */
#define	ETHER		0x78C00000	/* RDP, RAP */
#define	FLOPPY		0x71400000
#define	SYSINTR		0x71E10000	/* system interrupt control registers */

#define	TIMECONFIG	0x71D10010	/* timer configuration register (phys) */
#define	AUXIO1		0x71900000
#define	AUXIO2		0x71910000

typedef struct Sysint Sysint;
struct Sysint
{
	ulong	pending;
	ulong	mask;
	ulong	maskclr;
	ulong	maskset;
	ulong	target;
};

enum {
	MaskAllIntr = 1<<31,
	MEIntr = 1<<30,
	MSIIntr = 1<<29,
	EMCIntr = 1<<28,
	VideoIntr = 1<<20,	/* supersparc only */
	Timer10 = 1<<19,
	EtherIntr = 1<<16,
	SCCIntr = 1<<15,
	KbdIntr = 1<<13,
	/* bits 7 to 13 are SBUS levels 1 to 7 */
};
#define	SBUSINTR(x)	(1<<((x)+6))

typedef struct SCCdev	SCCdev;
struct SCCdev
{
	uchar	ptrb;
	uchar	dummy1;
	uchar	datab;
	uchar	dummy2;
	uchar	ptra;
	uchar	dummy3;
	uchar	dataa;
	uchar	dummy4;
};

/*
 *  non-volatile ram
 */
#define NVREAD	(4096-32)	/* minus RTC */
#define NVWRITE	(0x800)		/* */
#define	IDOFF	(4096-8-32)

/*
 * real-time clock
 */
typedef struct RTCdev	RTCdev;
struct RTCdev
{
	uchar	control;		/* read or write the device */
	uchar	sec;
	uchar	min;
	uchar	hour;
	uchar	wday;
	uchar	mday;
	uchar	mon;
	uchar	year;
};
#define RTCOFF		0xFF8
#define RTCREAD		(0x40)
#define RTCWRITE	(0x80)

/*
 * dma
 */
typedef struct DMAdev DMAdev;
struct DMAdev {
	/* ESP/SCSI DMA */
	ulong	csr;			/* Control/Status */
	ulong	addr;			/* address in 16Mb segment */
	ulong	count;			/* transfer byte count */
	ulong	diag;

	/* Ether DMA */
	ulong	ecsr;			/* Control/Status */
	ulong	ediag;
	ulong	cache;			/* cache valid bits */
	uchar	base;			/* base address (16Mb segment) */
};

enum {
	Int_pend	= 0x00000001,	/* interrupt pending */
	Err_pend	= 0x00000002,	/* error pending */
	Pack_cnt	= 0x0000000C,	/* pack count (mask) */
	Int_en		= 0x00000010,	/* interrupt enable */
	Dma_Flush	= 0x00000020,	/* flush pack end error */
	Drain		= 0x00000040,	/* drain pack to memory */
	Dma_Reset	= 0x00000080,	/* hardware reset (sticky) */
	Write		= 0x00000100,	/* set for device to memory (!) */
	En_dma		= 0x00000200,	/* enable DMA */
	Req_pend	= 0x00000400,	/* request pending */
	Byte_addr	= 0x00001800,	/* next byte addr (mask) */
	En_cnt		= 0x00002000,	/* enable count */
	Tc		= 0x00004000,	/* terminal count */
	Ilacc		= 0x00008000,	/* which ether chip */
	Dev_id		= 0xF0000000,	/* device ID */
};

/*
 *  NCR53C90 SCSI controller (every 4th location)
 */
typedef struct SCSIdev	SCSIdev;
struct SCSIdev {
	uchar	countlo;		/* byte count, low bits */
	uchar	pad1[3];
	uchar	countmi;		/* byte count, middle bits */
	uchar	pad2[3];
	uchar	fifo;			/* data fifo */
	uchar	pad3[3];
	uchar	cmd;			/* command byte */
	uchar	pad4[3];
	union {
		struct {		/* read only... */
			uchar	status;		/* status */
			uchar	pad05[3];
			uchar	intr;		/* interrupt status */
			uchar	pad06[3];
			uchar	step;		/* sequence step */
			uchar	pad07[3];
			uchar	fflags;		/* fifo flags */
			uchar	pad08[3];
			uchar	config;		/* RW: configuration */
			uchar	pad09[3];
			uchar	Reserved1;
			uchar	pad0A[3];
			uchar	Reserved2;
			uchar	pad0B[3];
			uchar	conf2;		/* RW: configuration */
			uchar	pad0C[3];
			uchar	conf3;		/* RW: configuration */
			uchar	pad0D[3];
			uchar	partid;		/* unique part id */
			uchar	pad0E[3];
			uchar	fbottom;	/* RW: fifo bottom */
			uchar	pad0F[3];
		};
		struct {		/* write only... */
			uchar	destid;		/* destination id */
			uchar	pad15[3];
			uchar	timeout;	/* during selection */
			uchar	pad16[3];
			uchar	syncperiod;	/* synchronous xfr period */
			uchar	pad17[3];
			uchar	syncoffset;	/* synchronous xfr offset */
			uchar	pad18[3];
			uchar	RW0;
			uchar	pad19[3];
			uchar	clkconf;
			uchar	pad1A[3];
			uchar	test;	
			uchar	pad1B[3];
			uchar	RW1;
			uchar	pad1C[3];
			uchar	RW2;
			uchar	pad1D[3];
			uchar	counthi;	/* byte count, hi bits */
			uchar	pad1E[3];
			uchar	RW3;
			uchar	pad1F[3];
		};
	};
};

/*
 * DMA2 ENET
 */
enum {
	E_Int_pend	= 0x00000001,	/* interrupt pending */
	E_Err_pend	= 0x00000002,	/* error pending */
	E_draining	= 0x0000000C,	/* E-cache draining */
	E_Int_en	= 0x00000010,	/* interrupt enable */
	E_Invalidate	= 0x00000020,	/* mark E-cache invalid */
	E_Slave_err	= 0x00000040,	/* slave access size error (sticky) */
	E_Reset		= 0x00000080,	/* invalidate cache & reset interface (sticky) */
	E_Drain		= 0x00000400,	/* force draining of E-cache to memory */
	E_Dsbl_wr_drn	= 0x00000800,	/* disable E-cache drain on descriptor writes from ENET */
	E_Dsbl_rd_drn	= 0x00001000,	/* disable E-cache drain on slave reads to ENET */
	E_Ilacc		= 0x00008000,	/* `modifies ENET DMA cycle' */
	E_Dsbl_buf_wr	= 0x00010000,	/* disable buffering of slave writes to ENET */
	E_Dsbl_wr_inval	= 0x00020000,	/* do not invalidate E-cache on slave writes */
	E_Burst_size	= 0x000C0000,	/* DMA burst size */
	E_Loop_test	= 0x00200000,	/* loop back mode */
	E_TP_select	= 0x00400000,	/* zero for AUI mode */
	E_Dev_id	= 0xF0000000,	/* device ID */
};