xref: /inferno-os/os/js/io.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth /*
2*74a4d8c2SCharles.Forsyth  * most device registers are memory mapped, but
3*74a4d8c2SCharles.Forsyth  * a few things are accessed using putphys/getphys
4*74a4d8c2SCharles.Forsyth  */
5*74a4d8c2SCharles.Forsyth #define	SBUS(n)		(0x30000000+(n)*0x10000000)
6*74a4d8c2SCharles.Forsyth #define	FRAMEBUF(n)	SBUS(n)
7*74a4d8c2SCharles.Forsyth #define	FRAMEBUFID(n)	(SBUS(n)+0x000000)
8*74a4d8c2SCharles.Forsyth #define	DISPLAYRAM(n)	(SBUS(n)+0x800000)
9*74a4d8c2SCharles.Forsyth #define	CLOCK		0x71D00000
10*74a4d8c2SCharles.Forsyth #define	CLOCKFREQ	1000000		/* one microsecond increments */
11*74a4d8c2SCharles.Forsyth 
12*74a4d8c2SCharles.Forsyth #define SUPERIO_PHYS_PAGE		0x71300000
13*74a4d8c2SCharles.Forsyth #define SUPERIO_INDEX_OFFSET		0x398
14*74a4d8c2SCharles.Forsyth #define SUPERIO_DATA_OFFSET		0x399
15*74a4d8c2SCharles.Forsyth #define SUPERIO_MOUSE_KBD_DATA_PORT	0x60
16*74a4d8c2SCharles.Forsyth #define SUPERIO_MOUSE_KBD_CTL_PORT	0x64
17*74a4d8c2SCharles.Forsyth 
18*74a4d8c2SCharles.Forsyth #define AUDIO_PHYS_PAGE		0x66666666
19*74a4d8c2SCharles.Forsyth #define AUDIO_INDEX_OFFSET	0x830
20*74a4d8c2SCharles.Forsyth 
21*74a4d8c2SCharles.Forsyth enum
22*74a4d8c2SCharles.Forsyth {
23*74a4d8c2SCharles.Forsyth 	Mousevec = 13,
24*74a4d8c2SCharles.Forsyth 	Kbdvec = 13
25*74a4d8c2SCharles.Forsyth };
26*74a4d8c2SCharles.Forsyth 
27*74a4d8c2SCharles.Forsyth #define	NVR_CKSUM_PHYS	0x71200000	/* non-volatile RAM cksum page */
28*74a4d8c2SCharles.Forsyth #define	NVR_PHYS	0x71201000	/* non-volatile RAM */
29*74a4d8c2SCharles.Forsyth #define DMA		0x78400000	/* SCSI and Ether DMA registers */
30*74a4d8c2SCharles.Forsyth #define SCSI		0x78800000	/* NCR53C90 registers */
31*74a4d8c2SCharles.Forsyth #define	ETHER		0x78C00000	/* RDP, RAP */
32*74a4d8c2SCharles.Forsyth #define	FLOPPY		0x71400000
33*74a4d8c2SCharles.Forsyth #define	SYSINTR		0x71E10000	/* system interrupt control registers */
34*74a4d8c2SCharles.Forsyth 
35*74a4d8c2SCharles.Forsyth #define	TIMECONFIG	0x71D10010	/* timer configuration register (phys) */
36*74a4d8c2SCharles.Forsyth #define	AUXIO1		0x71900000
37*74a4d8c2SCharles.Forsyth #define	AUXIO2		0x71910000
38*74a4d8c2SCharles.Forsyth 
39*74a4d8c2SCharles.Forsyth typedef struct Sysint Sysint;
40*74a4d8c2SCharles.Forsyth struct Sysint
41*74a4d8c2SCharles.Forsyth {
42*74a4d8c2SCharles.Forsyth 	ulong	pending;
43*74a4d8c2SCharles.Forsyth 	ulong	mask;
44*74a4d8c2SCharles.Forsyth 	ulong	maskclr;
45*74a4d8c2SCharles.Forsyth 	ulong	maskset;
46*74a4d8c2SCharles.Forsyth 	ulong	target;
47*74a4d8c2SCharles.Forsyth };
48*74a4d8c2SCharles.Forsyth 
49*74a4d8c2SCharles.Forsyth enum {
50*74a4d8c2SCharles.Forsyth 	MaskAllIntr = 1<<31,
51*74a4d8c2SCharles.Forsyth 	MEIntr = 1<<30,
52*74a4d8c2SCharles.Forsyth 	MSIIntr = 1<<29,
53*74a4d8c2SCharles.Forsyth 	EMCIntr = 1<<28,
54*74a4d8c2SCharles.Forsyth 	VideoIntr = 1<<20,	/* supersparc only */
55*74a4d8c2SCharles.Forsyth 	Timer10 = 1<<19,
56*74a4d8c2SCharles.Forsyth 	EtherIntr = 1<<16,
57*74a4d8c2SCharles.Forsyth 	SCCIntr = 1<<15,
58*74a4d8c2SCharles.Forsyth 	KbdIntr = 1<<13,
59*74a4d8c2SCharles.Forsyth 	/* bits 7 to 13 are SBUS levels 1 to 7 */
60*74a4d8c2SCharles.Forsyth };
61*74a4d8c2SCharles.Forsyth #define	SBUSINTR(x)	(1<<((x)+6))
62*74a4d8c2SCharles.Forsyth 
63*74a4d8c2SCharles.Forsyth typedef struct SCCdev	SCCdev;
64*74a4d8c2SCharles.Forsyth struct SCCdev
65*74a4d8c2SCharles.Forsyth {
66*74a4d8c2SCharles.Forsyth 	uchar	ptrb;
67*74a4d8c2SCharles.Forsyth 	uchar	dummy1;
68*74a4d8c2SCharles.Forsyth 	uchar	datab;
69*74a4d8c2SCharles.Forsyth 	uchar	dummy2;
70*74a4d8c2SCharles.Forsyth 	uchar	ptra;
71*74a4d8c2SCharles.Forsyth 	uchar	dummy3;
72*74a4d8c2SCharles.Forsyth 	uchar	dataa;
73*74a4d8c2SCharles.Forsyth 	uchar	dummy4;
74*74a4d8c2SCharles.Forsyth };
75*74a4d8c2SCharles.Forsyth 
76*74a4d8c2SCharles.Forsyth /*
77*74a4d8c2SCharles.Forsyth  *  non-volatile ram
78*74a4d8c2SCharles.Forsyth  */
79*74a4d8c2SCharles.Forsyth #define NVREAD	(4096-32)	/* minus RTC */
80*74a4d8c2SCharles.Forsyth #define NVWRITE	(0x800)		/* */
81*74a4d8c2SCharles.Forsyth #define	IDOFF	(4096-8-32)
82*74a4d8c2SCharles.Forsyth 
83*74a4d8c2SCharles.Forsyth /*
84*74a4d8c2SCharles.Forsyth  * real-time clock
85*74a4d8c2SCharles.Forsyth  */
86*74a4d8c2SCharles.Forsyth typedef struct RTCdev	RTCdev;
87*74a4d8c2SCharles.Forsyth struct RTCdev
88*74a4d8c2SCharles.Forsyth {
89*74a4d8c2SCharles.Forsyth 	uchar	control;		/* read or write the device */
90*74a4d8c2SCharles.Forsyth 	uchar	sec;
91*74a4d8c2SCharles.Forsyth 	uchar	min;
92*74a4d8c2SCharles.Forsyth 	uchar	hour;
93*74a4d8c2SCharles.Forsyth 	uchar	wday;
94*74a4d8c2SCharles.Forsyth 	uchar	mday;
95*74a4d8c2SCharles.Forsyth 	uchar	mon;
96*74a4d8c2SCharles.Forsyth 	uchar	year;
97*74a4d8c2SCharles.Forsyth };
98*74a4d8c2SCharles.Forsyth #define RTCOFF		0xFF8
99*74a4d8c2SCharles.Forsyth #define RTCREAD		(0x40)
100*74a4d8c2SCharles.Forsyth #define RTCWRITE	(0x80)
101*74a4d8c2SCharles.Forsyth 
102*74a4d8c2SCharles.Forsyth /*
103*74a4d8c2SCharles.Forsyth  * dma
104*74a4d8c2SCharles.Forsyth  */
105*74a4d8c2SCharles.Forsyth typedef struct DMAdev DMAdev;
106*74a4d8c2SCharles.Forsyth struct DMAdev {
107*74a4d8c2SCharles.Forsyth 	/* ESP/SCSI DMA */
108*74a4d8c2SCharles.Forsyth 	ulong	csr;			/* Control/Status */
109*74a4d8c2SCharles.Forsyth 	ulong	addr;			/* address in 16Mb segment */
110*74a4d8c2SCharles.Forsyth 	ulong	count;			/* transfer byte count */
111*74a4d8c2SCharles.Forsyth 	ulong	diag;
112*74a4d8c2SCharles.Forsyth 
113*74a4d8c2SCharles.Forsyth 	/* Ether DMA */
114*74a4d8c2SCharles.Forsyth 	ulong	ecsr;			/* Control/Status */
115*74a4d8c2SCharles.Forsyth 	ulong	ediag;
116*74a4d8c2SCharles.Forsyth 	ulong	cache;			/* cache valid bits */
117*74a4d8c2SCharles.Forsyth 	uchar	base;			/* base address (16Mb segment) */
118*74a4d8c2SCharles.Forsyth };
119*74a4d8c2SCharles.Forsyth 
120*74a4d8c2SCharles.Forsyth enum {
121*74a4d8c2SCharles.Forsyth 	Int_pend	= 0x00000001,	/* interrupt pending */
122*74a4d8c2SCharles.Forsyth 	Err_pend	= 0x00000002,	/* error pending */
123*74a4d8c2SCharles.Forsyth 	Pack_cnt	= 0x0000000C,	/* pack count (mask) */
124*74a4d8c2SCharles.Forsyth 	Int_en		= 0x00000010,	/* interrupt enable */
125*74a4d8c2SCharles.Forsyth 	Dma_Flush	= 0x00000020,	/* flush pack end error */
126*74a4d8c2SCharles.Forsyth 	Drain		= 0x00000040,	/* drain pack to memory */
127*74a4d8c2SCharles.Forsyth 	Dma_Reset	= 0x00000080,	/* hardware reset (sticky) */
128*74a4d8c2SCharles.Forsyth 	Write		= 0x00000100,	/* set for device to memory (!) */
129*74a4d8c2SCharles.Forsyth 	En_dma		= 0x00000200,	/* enable DMA */
130*74a4d8c2SCharles.Forsyth 	Req_pend	= 0x00000400,	/* request pending */
131*74a4d8c2SCharles.Forsyth 	Byte_addr	= 0x00001800,	/* next byte addr (mask) */
132*74a4d8c2SCharles.Forsyth 	En_cnt		= 0x00002000,	/* enable count */
133*74a4d8c2SCharles.Forsyth 	Tc		= 0x00004000,	/* terminal count */
134*74a4d8c2SCharles.Forsyth 	Ilacc		= 0x00008000,	/* which ether chip */
135*74a4d8c2SCharles.Forsyth 	Dev_id		= 0xF0000000,	/* device ID */
136*74a4d8c2SCharles.Forsyth };
137*74a4d8c2SCharles.Forsyth 
138*74a4d8c2SCharles.Forsyth /*
139*74a4d8c2SCharles.Forsyth  *  NCR53C90 SCSI controller (every 4th location)
140*74a4d8c2SCharles.Forsyth  */
141*74a4d8c2SCharles.Forsyth typedef struct SCSIdev	SCSIdev;
142*74a4d8c2SCharles.Forsyth struct SCSIdev {
143*74a4d8c2SCharles.Forsyth 	uchar	countlo;		/* byte count, low bits */
144*74a4d8c2SCharles.Forsyth 	uchar	pad1[3];
145*74a4d8c2SCharles.Forsyth 	uchar	countmi;		/* byte count, middle bits */
146*74a4d8c2SCharles.Forsyth 	uchar	pad2[3];
147*74a4d8c2SCharles.Forsyth 	uchar	fifo;			/* data fifo */
148*74a4d8c2SCharles.Forsyth 	uchar	pad3[3];
149*74a4d8c2SCharles.Forsyth 	uchar	cmd;			/* command byte */
150*74a4d8c2SCharles.Forsyth 	uchar	pad4[3];
151*74a4d8c2SCharles.Forsyth 	union {
152*74a4d8c2SCharles.Forsyth 		struct {		/* read only... */
153*74a4d8c2SCharles.Forsyth 			uchar	status;		/* status */
154*74a4d8c2SCharles.Forsyth 			uchar	pad05[3];
155*74a4d8c2SCharles.Forsyth 			uchar	intr;		/* interrupt status */
156*74a4d8c2SCharles.Forsyth 			uchar	pad06[3];
157*74a4d8c2SCharles.Forsyth 			uchar	step;		/* sequence step */
158*74a4d8c2SCharles.Forsyth 			uchar	pad07[3];
159*74a4d8c2SCharles.Forsyth 			uchar	fflags;		/* fifo flags */
160*74a4d8c2SCharles.Forsyth 			uchar	pad08[3];
161*74a4d8c2SCharles.Forsyth 			uchar	config;		/* RW: configuration */
162*74a4d8c2SCharles.Forsyth 			uchar	pad09[3];
163*74a4d8c2SCharles.Forsyth 			uchar	Reserved1;
164*74a4d8c2SCharles.Forsyth 			uchar	pad0A[3];
165*74a4d8c2SCharles.Forsyth 			uchar	Reserved2;
166*74a4d8c2SCharles.Forsyth 			uchar	pad0B[3];
167*74a4d8c2SCharles.Forsyth 			uchar	conf2;		/* RW: configuration */
168*74a4d8c2SCharles.Forsyth 			uchar	pad0C[3];
169*74a4d8c2SCharles.Forsyth 			uchar	conf3;		/* RW: configuration */
170*74a4d8c2SCharles.Forsyth 			uchar	pad0D[3];
171*74a4d8c2SCharles.Forsyth 			uchar	partid;		/* unique part id */
172*74a4d8c2SCharles.Forsyth 			uchar	pad0E[3];
173*74a4d8c2SCharles.Forsyth 			uchar	fbottom;	/* RW: fifo bottom */
174*74a4d8c2SCharles.Forsyth 			uchar	pad0F[3];
175*74a4d8c2SCharles.Forsyth 		};
176*74a4d8c2SCharles.Forsyth 		struct {		/* write only... */
177*74a4d8c2SCharles.Forsyth 			uchar	destid;		/* destination id */
178*74a4d8c2SCharles.Forsyth 			uchar	pad15[3];
179*74a4d8c2SCharles.Forsyth 			uchar	timeout;	/* during selection */
180*74a4d8c2SCharles.Forsyth 			uchar	pad16[3];
181*74a4d8c2SCharles.Forsyth 			uchar	syncperiod;	/* synchronous xfr period */
182*74a4d8c2SCharles.Forsyth 			uchar	pad17[3];
183*74a4d8c2SCharles.Forsyth 			uchar	syncoffset;	/* synchronous xfr offset */
184*74a4d8c2SCharles.Forsyth 			uchar	pad18[3];
185*74a4d8c2SCharles.Forsyth 			uchar	RW0;
186*74a4d8c2SCharles.Forsyth 			uchar	pad19[3];
187*74a4d8c2SCharles.Forsyth 			uchar	clkconf;
188*74a4d8c2SCharles.Forsyth 			uchar	pad1A[3];
189*74a4d8c2SCharles.Forsyth 			uchar	test;
190*74a4d8c2SCharles.Forsyth 			uchar	pad1B[3];
191*74a4d8c2SCharles.Forsyth 			uchar	RW1;
192*74a4d8c2SCharles.Forsyth 			uchar	pad1C[3];
193*74a4d8c2SCharles.Forsyth 			uchar	RW2;
194*74a4d8c2SCharles.Forsyth 			uchar	pad1D[3];
195*74a4d8c2SCharles.Forsyth 			uchar	counthi;	/* byte count, hi bits */
196*74a4d8c2SCharles.Forsyth 			uchar	pad1E[3];
197*74a4d8c2SCharles.Forsyth 			uchar	RW3;
198*74a4d8c2SCharles.Forsyth 			uchar	pad1F[3];
199*74a4d8c2SCharles.Forsyth 		};
200*74a4d8c2SCharles.Forsyth 	};
201*74a4d8c2SCharles.Forsyth };
202*74a4d8c2SCharles.Forsyth 
203*74a4d8c2SCharles.Forsyth /*
204*74a4d8c2SCharles.Forsyth  * DMA2 ENET
205*74a4d8c2SCharles.Forsyth  */
206*74a4d8c2SCharles.Forsyth enum {
207*74a4d8c2SCharles.Forsyth 	E_Int_pend	= 0x00000001,	/* interrupt pending */
208*74a4d8c2SCharles.Forsyth 	E_Err_pend	= 0x00000002,	/* error pending */
209*74a4d8c2SCharles.Forsyth 	E_draining	= 0x0000000C,	/* E-cache draining */
210*74a4d8c2SCharles.Forsyth 	E_Int_en	= 0x00000010,	/* interrupt enable */
211*74a4d8c2SCharles.Forsyth 	E_Invalidate	= 0x00000020,	/* mark E-cache invalid */
212*74a4d8c2SCharles.Forsyth 	E_Slave_err	= 0x00000040,	/* slave access size error (sticky) */
213*74a4d8c2SCharles.Forsyth 	E_Reset		= 0x00000080,	/* invalidate cache & reset interface (sticky) */
214*74a4d8c2SCharles.Forsyth 	E_Drain		= 0x00000400,	/* force draining of E-cache to memory */
215*74a4d8c2SCharles.Forsyth 	E_Dsbl_wr_drn	= 0x00000800,	/* disable E-cache drain on descriptor writes from ENET */
216*74a4d8c2SCharles.Forsyth 	E_Dsbl_rd_drn	= 0x00001000,	/* disable E-cache drain on slave reads to ENET */
217*74a4d8c2SCharles.Forsyth 	E_Ilacc		= 0x00008000,	/* `modifies ENET DMA cycle' */
218*74a4d8c2SCharles.Forsyth 	E_Dsbl_buf_wr	= 0x00010000,	/* disable buffering of slave writes to ENET */
219*74a4d8c2SCharles.Forsyth 	E_Dsbl_wr_inval	= 0x00020000,	/* do not invalidate E-cache on slave writes */
220*74a4d8c2SCharles.Forsyth 	E_Burst_size	= 0x000C0000,	/* DMA burst size */
221*74a4d8c2SCharles.Forsyth 	E_Loop_test	= 0x00200000,	/* loop back mode */
222*74a4d8c2SCharles.Forsyth 	E_TP_select	= 0x00400000,	/* zero for AUI mode */
223*74a4d8c2SCharles.Forsyth 	E_Dev_id	= 0xF0000000,	/* device ID */
224*74a4d8c2SCharles.Forsyth };
225