xref: /inferno-os/os/boot/mpc/dat.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth typedef struct Alarm Alarm;
2*74a4d8c2SCharles.Forsyth typedef struct Block Block;
3*74a4d8c2SCharles.Forsyth typedef struct IMM IMM;
4*74a4d8c2SCharles.Forsyth typedef struct Queue Queue;
5*74a4d8c2SCharles.Forsyth 
6*74a4d8c2SCharles.Forsyth typedef struct List {
7*74a4d8c2SCharles.Forsyth 	void	*next;
8*74a4d8c2SCharles.Forsyth } List;
9*74a4d8c2SCharles.Forsyth 
10*74a4d8c2SCharles.Forsyth typedef struct {
11*74a4d8c2SCharles.Forsyth 	int	fake;
12*74a4d8c2SCharles.Forsyth 	int	pri;
13*74a4d8c2SCharles.Forsyth } Lock;
14*74a4d8c2SCharles.Forsyth #define	lock(x)
15*74a4d8c2SCharles.Forsyth #define	unlock(x)
16*74a4d8c2SCharles.Forsyth 
17*74a4d8c2SCharles.Forsyth struct Alarm {
18*74a4d8c2SCharles.Forsyth 	List;
19*74a4d8c2SCharles.Forsyth 	int	busy;
20*74a4d8c2SCharles.Forsyth 	long	dt;
21*74a4d8c2SCharles.Forsyth 	void	(*f)(Alarm*);
22*74a4d8c2SCharles.Forsyth 	void	*arg;
23*74a4d8c2SCharles.Forsyth };
24*74a4d8c2SCharles.Forsyth 
25*74a4d8c2SCharles.Forsyth enum {
26*74a4d8c2SCharles.Forsyth 	Eaddrlen	= 6,
27*74a4d8c2SCharles.Forsyth 	ETHERMINTU	= 60,		/* minimum transmit size */
28*74a4d8c2SCharles.Forsyth 	ETHERMAXTU	= 1514,		/* maximum transmit size */
29*74a4d8c2SCharles.Forsyth 	ETHERHDRSIZE	= 14,		/* size of an ethernet header */
30*74a4d8c2SCharles.Forsyth 
31*74a4d8c2SCharles.Forsyth 	MaxEther	= 4,
32*74a4d8c2SCharles.Forsyth };
33*74a4d8c2SCharles.Forsyth 
34*74a4d8c2SCharles.Forsyth typedef struct {
35*74a4d8c2SCharles.Forsyth 	uchar	d[Eaddrlen];
36*74a4d8c2SCharles.Forsyth 	uchar	s[Eaddrlen];
37*74a4d8c2SCharles.Forsyth 	uchar	type[2];
38*74a4d8c2SCharles.Forsyth 	uchar	data[1500];
39*74a4d8c2SCharles.Forsyth 	uchar	crc[4];
40*74a4d8c2SCharles.Forsyth } Etherpkt;
41*74a4d8c2SCharles.Forsyth 
42*74a4d8c2SCharles.Forsyth extern uchar broadcast[Eaddrlen];
43*74a4d8c2SCharles.Forsyth 
44*74a4d8c2SCharles.Forsyth enum {
45*74a4d8c2SCharles.Forsyth 	Npart		= 20+2,		/* 8 sub partitions, disk, and partition */
46*74a4d8c2SCharles.Forsyth 	Maxxfer		= 16*1024,	/* maximum transfer size/cmd */
47*74a4d8c2SCharles.Forsyth };
48*74a4d8c2SCharles.Forsyth 
49*74a4d8c2SCharles.Forsyth typedef struct {
50*74a4d8c2SCharles.Forsyth 	ulong	start;
51*74a4d8c2SCharles.Forsyth 	ulong	end;
52*74a4d8c2SCharles.Forsyth 	char	name[NAMELEN+1];
53*74a4d8c2SCharles.Forsyth } Partition;
54*74a4d8c2SCharles.Forsyth 
55*74a4d8c2SCharles.Forsyth typedef struct {
56*74a4d8c2SCharles.Forsyth 	int	online;
57*74a4d8c2SCharles.Forsyth 	int	npart;		/* number of real partitions */
58*74a4d8c2SCharles.Forsyth 	Partition p[Npart];
59*74a4d8c2SCharles.Forsyth 	ulong	offset;
60*74a4d8c2SCharles.Forsyth 	Partition *current;	/* current partition */
61*74a4d8c2SCharles.Forsyth 
62*74a4d8c2SCharles.Forsyth 	ulong	cap;		/* total bytes */
63*74a4d8c2SCharles.Forsyth 	int	bytes;		/* bytes/sector */
64*74a4d8c2SCharles.Forsyth 	int	sectors;	/* sectors/track */
65*74a4d8c2SCharles.Forsyth 	int	heads;		/* heads/cyl */
66*74a4d8c2SCharles.Forsyth 	long	cyl;		/* cylinders/drive */
67*74a4d8c2SCharles.Forsyth 
68*74a4d8c2SCharles.Forsyth 	char	lba;		/* true if drive has logical block addressing */
69*74a4d8c2SCharles.Forsyth 	char	multi;		/* non-zero if drive does multiple block xfers */
70*74a4d8c2SCharles.Forsyth } Disc;
71*74a4d8c2SCharles.Forsyth 
72*74a4d8c2SCharles.Forsyth enum {
73*74a4d8c2SCharles.Forsyth 	ScsiTestunit	= 0x00,
74*74a4d8c2SCharles.Forsyth 	ScsiExtsens	= 0x03,
75*74a4d8c2SCharles.Forsyth 	ScsiInquiry	= 0x12,
76*74a4d8c2SCharles.Forsyth 	ScsiModesense	= 0x1a,
77*74a4d8c2SCharles.Forsyth 	ScsiStartunit	= 0x1B,
78*74a4d8c2SCharles.Forsyth 	ScsiStopunit	= 0x1B,
79*74a4d8c2SCharles.Forsyth 	ScsiGetcap	= 0x25,
80*74a4d8c2SCharles.Forsyth 	ScsiRead	= 0x08,
81*74a4d8c2SCharles.Forsyth 	ScsiWrite	= 0x0a,
82*74a4d8c2SCharles.Forsyth 	ScsiExtread	= 0x28,
83*74a4d8c2SCharles.Forsyth 	ScsiExtwrite	= 0x2a,
84*74a4d8c2SCharles.Forsyth 
85*74a4d8c2SCharles.Forsyth 	/* data direction */
86*74a4d8c2SCharles.Forsyth 	ScsiIn		= 1,
87*74a4d8c2SCharles.Forsyth 	ScsiOut		= 0,
88*74a4d8c2SCharles.Forsyth };
89*74a4d8c2SCharles.Forsyth 
90*74a4d8c2SCharles.Forsyth typedef struct Scsibuf Scsibuf;
91*74a4d8c2SCharles.Forsyth typedef struct Scsibuf {
92*74a4d8c2SCharles.Forsyth 	void*		virt;
93*74a4d8c2SCharles.Forsyth 	void*		phys;
94*74a4d8c2SCharles.Forsyth 	Scsibuf*	next;
95*74a4d8c2SCharles.Forsyth };
96*74a4d8c2SCharles.Forsyth 
97*74a4d8c2SCharles.Forsyth typedef struct Scsidata {
98*74a4d8c2SCharles.Forsyth 	uchar*		base;
99*74a4d8c2SCharles.Forsyth 	uchar*		lim;
100*74a4d8c2SCharles.Forsyth 	uchar*		ptr;
101*74a4d8c2SCharles.Forsyth } Scsidata;
102*74a4d8c2SCharles.Forsyth 
103*74a4d8c2SCharles.Forsyth typedef struct Ureg Ureg;
104*74a4d8c2SCharles.Forsyth 
105*74a4d8c2SCharles.Forsyth typedef struct Scsi {
106*74a4d8c2SCharles.Forsyth 	ulong		pid;
107*74a4d8c2SCharles.Forsyth 	ushort		target;
108*74a4d8c2SCharles.Forsyth 	ushort		lun;
109*74a4d8c2SCharles.Forsyth 	ushort		rflag;
110*74a4d8c2SCharles.Forsyth 	ushort		status;
111*74a4d8c2SCharles.Forsyth 	Scsidata 	cmd;
112*74a4d8c2SCharles.Forsyth 	Scsidata 	data;
113*74a4d8c2SCharles.Forsyth 	Scsibuf*	b;
114*74a4d8c2SCharles.Forsyth 	uchar*		save;
115*74a4d8c2SCharles.Forsyth 	uchar		cmdblk[16];
116*74a4d8c2SCharles.Forsyth } Scsi;
117*74a4d8c2SCharles.Forsyth 
118*74a4d8c2SCharles.Forsyth typedef struct Segdesc {
119*74a4d8c2SCharles.Forsyth 	ulong	d0;
120*74a4d8c2SCharles.Forsyth 	ulong	d1;
121*74a4d8c2SCharles.Forsyth } Segdesc;
122*74a4d8c2SCharles.Forsyth 
123*74a4d8c2SCharles.Forsyth typedef struct Mach {
124*74a4d8c2SCharles.Forsyth 	ulong	ticks;			/* of the clock since boot time */
125*74a4d8c2SCharles.Forsyth 	ulong	delayloop;
126*74a4d8c2SCharles.Forsyth 	long	cpuhz;	/* general system clock (cycles) */
127*74a4d8c2SCharles.Forsyth 	long	clockgen;	/* clock generator frequency (cycles) */
128*74a4d8c2SCharles.Forsyth 	ulong	cpupvr;	/* cpu type in processor version register */
129*74a4d8c2SCharles.Forsyth 	ulong	cputype;	/* cpu variant in BCD (eg, 0x823xx) */
130*74a4d8c2SCharles.Forsyth 	void*	alarm;			/* alarms bound to this clock */
131*74a4d8c2SCharles.Forsyth 	ulong*	bcsr;
132*74a4d8c2SCharles.Forsyth 	IMM*	iomem;
133*74a4d8c2SCharles.Forsyth } Mach;
134*74a4d8c2SCharles.Forsyth 
135*74a4d8c2SCharles.Forsyth /* Mach.cputype */
136*74a4d8c2SCharles.Forsyth #define MPCREV(x)	((x) & 0xFF)
137*74a4d8c2SCharles.Forsyth #define MPCMODEL(x)	(((x)>>8) & 0xFFF)
138*74a4d8c2SCharles.Forsyth #define MPCFAMILY(x)	(((x)>>24) & 0x0F)
139*74a4d8c2SCharles.Forsyth 
140*74a4d8c2SCharles.Forsyth 
141*74a4d8c2SCharles.Forsyth extern Mach *m;
142*74a4d8c2SCharles.Forsyth 
143*74a4d8c2SCharles.Forsyth #define Q_MAGIC		((((4*21)+0)*21)+7)
144*74a4d8c2SCharles.Forsyth 
145*74a4d8c2SCharles.Forsyth typedef struct Exec Exec;
146*74a4d8c2SCharles.Forsyth struct	Exec
147*74a4d8c2SCharles.Forsyth {
148*74a4d8c2SCharles.Forsyth 	uchar	magic[4];		/* magic number */
149*74a4d8c2SCharles.Forsyth 	uchar	text[4];	 	/* size of text segment */
150*74a4d8c2SCharles.Forsyth 	uchar	data[4];	 	/* size of initialized data */
151*74a4d8c2SCharles.Forsyth 	uchar	bss[4];	  		/* size of uninitialized data */
152*74a4d8c2SCharles.Forsyth 	uchar	syms[4];	 	/* size of symbol table */
153*74a4d8c2SCharles.Forsyth 	uchar	entry[4];	 	/* entry point */
154*74a4d8c2SCharles.Forsyth 	uchar	spsz[4];		/* size of sp/pc offset table */
155*74a4d8c2SCharles.Forsyth 	uchar	pcsz[4];		/* size of pc/line number table */
156*74a4d8c2SCharles.Forsyth };
157*74a4d8c2SCharles.Forsyth 
158*74a4d8c2SCharles.Forsyth /*
159*74a4d8c2SCharles.Forsyth  *  bootline passed by boot program
160*74a4d8c2SCharles.Forsyth  */
161*74a4d8c2SCharles.Forsyth #define BOOTLINE ((char *)0x200000-150)
162*74a4d8c2SCharles.Forsyth 
163*74a4d8c2SCharles.Forsyth /*
164*74a4d8c2SCharles.Forsyth  * Where we leave configuration info.
165*74a4d8c2SCharles.Forsyth  */
166*74a4d8c2SCharles.Forsyth #define BOOTARGS	((char*)(0x200000))
167*74a4d8c2SCharles.Forsyth #define	BOOTARGSLEN	1024
168*74a4d8c2SCharles.Forsyth #define	MAXCONF		32
169*74a4d8c2SCharles.Forsyth 
170*74a4d8c2SCharles.Forsyth /*
171*74a4d8c2SCharles.Forsyth  *  a parsed plan9.ini line
172*74a4d8c2SCharles.Forsyth  */
173*74a4d8c2SCharles.Forsyth #define ISAOPTLEN	16
174*74a4d8c2SCharles.Forsyth #define NISAOPT		8
175*74a4d8c2SCharles.Forsyth 
176*74a4d8c2SCharles.Forsyth typedef struct  ISAConf {
177*74a4d8c2SCharles.Forsyth 	char	type[NAMELEN];
178*74a4d8c2SCharles.Forsyth 	ulong	port;
179*74a4d8c2SCharles.Forsyth 	ulong	irq;
180*74a4d8c2SCharles.Forsyth 	ulong	mem;
181*74a4d8c2SCharles.Forsyth 	ulong	size;
182*74a4d8c2SCharles.Forsyth 	uchar	ea[6];
183*74a4d8c2SCharles.Forsyth 
184*74a4d8c2SCharles.Forsyth 	int	nopt;
185*74a4d8c2SCharles.Forsyth 	char	opt[NISAOPT][ISAOPTLEN];
186*74a4d8c2SCharles.Forsyth } ISAConf;
187*74a4d8c2SCharles.Forsyth 
188*74a4d8c2SCharles.Forsyth typedef struct {
189*74a4d8c2SCharles.Forsyth 	int	size;
190*74a4d8c2SCharles.Forsyth 	ulong	addr;
191*74a4d8c2SCharles.Forsyth } Map;
192*74a4d8c2SCharles.Forsyth 
193*74a4d8c2SCharles.Forsyth typedef struct {
194*74a4d8c2SCharles.Forsyth 	char*	name;
195*74a4d8c2SCharles.Forsyth 	Map*	map;
196*74a4d8c2SCharles.Forsyth 	Map*	mapend;
197*74a4d8c2SCharles.Forsyth 
198*74a4d8c2SCharles.Forsyth 	Lock;
199*74a4d8c2SCharles.Forsyth } RMap;
200*74a4d8c2SCharles.Forsyth 
201*74a4d8c2SCharles.Forsyth typedef struct PCIcfg PCIcfg;
202*74a4d8c2SCharles.Forsyth 
203*74a4d8c2SCharles.Forsyth extern	uchar*	vgamem;
204*74a4d8c2SCharles.Forsyth 
205*74a4d8c2SCharles.Forsyth struct Block {
206*74a4d8c2SCharles.Forsyth 	uchar	*rp;
207*74a4d8c2SCharles.Forsyth 	uchar	*wp;
208*74a4d8c2SCharles.Forsyth 	uchar	*lim;
209*74a4d8c2SCharles.Forsyth 	uchar	*data;
210*74a4d8c2SCharles.Forsyth 	Block*	next;
211*74a4d8c2SCharles.Forsyth 	ulong	magic;
212*74a4d8c2SCharles.Forsyth };
213*74a4d8c2SCharles.Forsyth #define	BLEN(b)	((b)->wp-(b)->rp)
214*74a4d8c2SCharles.Forsyth 
215*74a4d8c2SCharles.Forsyth typedef struct QLock {
216*74a4d8c2SCharles.Forsyth 	int	dummy;
217*74a4d8c2SCharles.Forsyth } QLock;
218