xref: /plan9-contrib/sys/src/boot/vt4/data.h (revision da917039c7f233c1a27d212bf012c6afa758af39)
1*da917039SDavid du Colombier enum {
2*da917039SDavid du Colombier 	PRINTSIZE = 256,
3*da917039SDavid du Colombier };
4*da917039SDavid du Colombier 
5*da917039SDavid du Colombier #define		MS2NS(n) (((vlong)(n))*1000000LL)
6*da917039SDavid du Colombier #define		TK2MS(x) ((x)*(1000/HZ))
7*da917039SDavid du Colombier 
8*da917039SDavid du Colombier #define MB	(1024*1024)
9*da917039SDavid du Colombier 
10*da917039SDavid du Colombier /*
11*da917039SDavid du Colombier  * Where configuration info is left for the loaded programme.
12*da917039SDavid du Colombier  * This will turn into a structure as more is done by the boot loader
13*da917039SDavid du Colombier  * (e.g. why parse the .ini file twice?).
14*da917039SDavid du Colombier  * There are 3584 bytes available at CONFADDR on the PC.
15*da917039SDavid du Colombier  *
16*da917039SDavid du Colombier  * The low-level boot routines in l.s leave data for us at CONFADDR,
17*da917039SDavid du Colombier  * which we pick up before reading the plan9.ini file.
18*da917039SDavid du Colombier  */
19*da917039SDavid du Colombier #define BOOTLINELEN	64
20*da917039SDavid du Colombier #define BOOTARGS	((char*)(CONFADDR+BOOTLINELEN))
21*da917039SDavid du Colombier #define	BOOTARGSLEN	1024	/* size reduction */
22*da917039SDavid du Colombier #define	MAXCONF		15	/* from 100; size reduction */
23*da917039SDavid du Colombier 
24*da917039SDavid du Colombier /*
25*da917039SDavid du Colombier  * intc bits, as of 18 aug 2009.
26*da917039SDavid du Colombier  * specific to rae's virtex4 design
27*da917039SDavid du Colombier  * vanilla design defines Intuarttx.
28*da917039SDavid du Colombier  */
29*da917039SDavid du Colombier enum {
30*da917039SDavid du Colombier 	Bitllfifo,
31*da917039SDavid du Colombier 	Bittemac,
32*da917039SDavid du Colombier 	Bitdma,
33*da917039SDavid du Colombier 	Bitdma2,
34*da917039SDavid du Colombier 	Bituart,
35*da917039SDavid du Colombier 	Bitmiiphy,
36*da917039SDavid du Colombier 	Bitqtmmacfail,			/* qtm only */
37*da917039SDavid du Colombier 	Bitqtmdraminit,			/* qtm only */
38*da917039SDavid du Colombier 
39*da917039SDavid du Colombier 	Intllfifo=1<<Bitllfifo,		/* local-link FIFO */
40*da917039SDavid du Colombier 	Inttemac= 1<<Bittemac,
41*da917039SDavid du Colombier 	Intdma	= 1<<Bitdma,
42*da917039SDavid du Colombier 	Intdma2	= 1<<Bitdma2,
43*da917039SDavid du Colombier 	Intuart = 1<<Bituart,
44*da917039SDavid du Colombier 	Intmiiphy = 1<<Bitmiiphy,
45*da917039SDavid du Colombier 	Intqtmmacfail= 1<<Bitqtmmacfail,
46*da917039SDavid du Colombier 	Intqtmdraminit= 1<<Bitqtmdraminit,
47*da917039SDavid du Colombier };
48*da917039SDavid du Colombier 
49*da917039SDavid du Colombier typedef struct Boot Boot;
50*da917039SDavid du Colombier typedef struct File File;
51*da917039SDavid du Colombier typedef struct Fs Fs;
52*da917039SDavid du Colombier typedef struct Lock Lock;
53*da917039SDavid du Colombier typedef union Mach Mach;
54*da917039SDavid du Colombier typedef struct Medium Medium;
55*da917039SDavid du Colombier typedef u32int Mreg;				/* Msr - bloody UART */
56*da917039SDavid du Colombier typedef struct Proc Proc;
57*da917039SDavid du Colombier typedef struct Timer Timer;
58*da917039SDavid du Colombier typedef struct Type Type;
59*da917039SDavid du Colombier typedef struct Ureg Ureg;
60*da917039SDavid du Colombier 
61*da917039SDavid du Colombier struct Lock
62*da917039SDavid du Colombier {
63*da917039SDavid du Colombier 	uint	key;
64*da917039SDavid du Colombier 	ulong	sr;
65*da917039SDavid du Colombier 	ulong	pc;
66*da917039SDavid du Colombier //	Proc	*p;
67*da917039SDavid du Colombier 	Mach	*m;
68*da917039SDavid du Colombier 	ushort	isilock;
69*da917039SDavid du Colombier 	long	lockcycles;
70*da917039SDavid du Colombier };
71*da917039SDavid du Colombier 
72*da917039SDavid du Colombier 
73*da917039SDavid du Colombier typedef union Mach {
74*da917039SDavid du Colombier 	struct {
75*da917039SDavid du Colombier 		int	machno;
76*da917039SDavid du Colombier 		void*	up;		/* offset known in assember */
77*da917039SDavid du Colombier 
78*da917039SDavid du Colombier 		/* ordering from here on irrelevant */
79*da917039SDavid du Colombier 
80*da917039SDavid du Colombier 		ulong	ticks;		/* of the clock since boot time */
81*da917039SDavid du Colombier 		long	oscclk;		/* oscillator frequency (MHz) */
82*da917039SDavid du Colombier 		long	cpuhz;		/* general system clock (cycles) */
83*da917039SDavid du Colombier 		long	clockgen;	/* clock generator frequency (cycles) */
84*da917039SDavid du Colombier 		long	vcohz;
85*da917039SDavid du Colombier 		long	pllhz;
86*da917039SDavid du Colombier 		long	plbhz;
87*da917039SDavid du Colombier 		long	opbhz;
88*da917039SDavid du Colombier 		long	epbhz;
89*da917039SDavid du Colombier 		long	pcihz;
90*da917039SDavid du Colombier 		int	cputype;
91*da917039SDavid du Colombier 		ulong	delayloop;
92*da917039SDavid du Colombier //		uvlong	cyclefreq;	/* frequency of user readable cycle clock */
93*da917039SDavid du Colombier 		uvlong	fastclock;
94*da917039SDavid du Colombier 		int	intr;
95*da917039SDavid du Colombier 	};
96*da917039SDavid du Colombier //	uintptr	stack[MACHSIZE/sizeof(uintptr)];	/* now in dram */
97*da917039SDavid du Colombier } Mach;
98*da917039SDavid du Colombier 
99*da917039SDavid du Colombier extern Mach* machptr[MAXMACH];
100*da917039SDavid du Colombier 
101*da917039SDavid du Colombier #define	MACHP(n)	machptr[n]
102*da917039SDavid du Colombier 
103*da917039SDavid du Colombier extern register Mach* m;
104*da917039SDavid du Colombier extern register void* up;
105*da917039SDavid du Colombier 
106*da917039SDavid du Colombier /*
107*da917039SDavid du Colombier  * rest copied from /sys/src/boot/pc/dat.h:
108*da917039SDavid du Colombier  */
109*da917039SDavid du Colombier 
110*da917039SDavid du Colombier typedef struct Medium Medium;
111*da917039SDavid du Colombier typedef struct Boot Boot;
112*da917039SDavid du Colombier 
113*da917039SDavid du Colombier enum {					/* type */
114*da917039SDavid du Colombier 	Tether		= 0,
115*da917039SDavid du Colombier 	Tany		= -1,
116*da917039SDavid du Colombier };
117*da917039SDavid du Colombier 
118*da917039SDavid du Colombier enum {					/* name and flag */
119*da917039SDavid du Colombier 	Fnone		= 0x00,
120*da917039SDavid du Colombier 
121*da917039SDavid du Colombier 	Nfs		= 0x00,
122*da917039SDavid du Colombier 	Ffs		= (1<<Nfs),
123*da917039SDavid du Colombier 	Nboot		= 0x01,
124*da917039SDavid du Colombier 	Fboot		= (1<<Nboot),
125*da917039SDavid du Colombier 	Nbootp		= 0x02,
126*da917039SDavid du Colombier 	Fbootp		= (1<<Nbootp),
127*da917039SDavid du Colombier 	NName		= 3,
128*da917039SDavid du Colombier 
129*da917039SDavid du Colombier 	Fany		= Fbootp|Fboot|Ffs,
130*da917039SDavid du Colombier 
131*da917039SDavid du Colombier 	Fini		= 0x10,
132*da917039SDavid du Colombier 	Fprobe		= 0x80,
133*da917039SDavid du Colombier };
134*da917039SDavid du Colombier 
135*da917039SDavid du Colombier typedef struct Type {
136*da917039SDavid du Colombier 	ushort	type;
137*da917039SDavid du Colombier 	ushort	flag;
138*da917039SDavid du Colombier 	int	(*init)(void);
139*da917039SDavid du Colombier 	void	(*initdev)(int, char*);
140*da917039SDavid du Colombier 	void*	(*getfspart)(int, char*, int);	/* actually returns Dos* */
141*da917039SDavid du Colombier 	void	(*addconf)(int);
142*da917039SDavid du Colombier 	int	(*boot)(int, char*, Boot*);
143*da917039SDavid du Colombier 	void	(*printdevs)(int);
144*da917039SDavid du Colombier 	char**	parts;
145*da917039SDavid du Colombier 	char**	inis;
146*da917039SDavid du Colombier 	int	mask;
147*da917039SDavid du Colombier 	Medium*	media;
148*da917039SDavid du Colombier } Type;
149*da917039SDavid du Colombier 
150*da917039SDavid du Colombier extern void (*etherdetach)(void);
151*da917039SDavid du Colombier 
152*da917039SDavid du Colombier #define	_MAGIC(f, b)	((f)|((((4*(b))+0)*(b))+7))
153*da917039SDavid du Colombier #define	Q_MAGIC		_MAGIC(0, 21)		/* powerpc */
154*da917039SDavid du Colombier 
155*da917039SDavid du Colombier typedef struct Exec Exec;
156*da917039SDavid du Colombier struct	Exec
157*da917039SDavid du Colombier {
158*da917039SDavid du Colombier 	uchar	magic[4];		/* magic number */
159*da917039SDavid du Colombier 	uchar	text[4];	 	/* size of text segment */
160*da917039SDavid du Colombier 	uchar	data[4];	 	/* size of initialized data */
161*da917039SDavid du Colombier 	uchar	bss[4];	  		/* size of uninitialized data */
162*da917039SDavid du Colombier 	uchar	syms[4];	 	/* size of symbol table */
163*da917039SDavid du Colombier 	uchar	entry[4];	 	/* entry point */
164*da917039SDavid du Colombier 	uchar	spsz[4];		/* size of sp/pc offset table */
165*da917039SDavid du Colombier 	uchar	pcsz[4];		/* size of pc/line number table */
166*da917039SDavid du Colombier };
167*da917039SDavid du Colombier 
168*da917039SDavid du Colombier typedef struct Block Block;
169*da917039SDavid du Colombier struct Block {
170*da917039SDavid du Colombier 	Block*	next;
171*da917039SDavid du Colombier 	uchar*	rp;			/* first unconsumed byte */
172*da917039SDavid du Colombier 	uchar*	wp;			/* first empty byte */
173*da917039SDavid du Colombier 	uchar*	lim;			/* 1 past the end of the buffer */
174*da917039SDavid du Colombier 	uchar*	base;			/* start of the buffer */
175*da917039SDavid du Colombier 	ulong	flag;
176*da917039SDavid du Colombier };
177*da917039SDavid du Colombier #define BLEN(s)	((s)->wp - (s)->rp)
178*da917039SDavid du Colombier 
179*da917039SDavid du Colombier enum {
180*da917039SDavid du Colombier 	Eaddrlen	= 6,
181*da917039SDavid du Colombier 	/* next two exclude 4-byte ether CRC */
182*da917039SDavid du Colombier 	ETHERMINTU	= 60,		/* minimum transmit size */
183*da917039SDavid du Colombier 	ETHERMAXTU	= 1514,		/* maximum transmit size */
184*da917039SDavid du Colombier 	ETHERHDRSIZE	= 14,		/* size of an ethernet header */
185*da917039SDavid du Colombier 
186*da917039SDavid du Colombier 	MaxEther	= 1,	/* from 6; size reduction */
187*da917039SDavid du Colombier };
188*da917039SDavid du Colombier 
189*da917039SDavid du Colombier typedef struct {
190*da917039SDavid du Colombier 	uchar	d[Eaddrlen];
191*da917039SDavid du Colombier 	uchar	s[Eaddrlen];
192*da917039SDavid du Colombier 	uchar	type[2];
193*da917039SDavid du Colombier 	uchar	data[1500];
194*da917039SDavid du Colombier 	uchar	crc[4];
195*da917039SDavid du Colombier } Etherpkt;
196*da917039SDavid du Colombier 
197*da917039SDavid du Colombier enum {	/* returned by bootpass */
198*da917039SDavid du Colombier 	MORE, ENOUGH, FAIL
199*da917039SDavid du Colombier };
200*da917039SDavid du Colombier enum {
201*da917039SDavid du Colombier 	INITKERNEL,
202*da917039SDavid du Colombier 	READEXEC,
203*da917039SDavid du Colombier 	READ9TEXT,
204*da917039SDavid du Colombier 	READ9DATA,
205*da917039SDavid du Colombier 	READGZIP,
206*da917039SDavid du Colombier 	READEHDR,
207*da917039SDavid du Colombier 	READPHDR,
208*da917039SDavid du Colombier 	READEPAD,
209*da917039SDavid du Colombier 	READEDATA,
210*da917039SDavid du Colombier 	TRYBOOT,
211*da917039SDavid du Colombier 	INIT9LOAD,
212*da917039SDavid du Colombier 	READ9LOAD,
213*da917039SDavid du Colombier 	FAILED
214*da917039SDavid du Colombier };
215*da917039SDavid du Colombier 
216*da917039SDavid du Colombier struct Boot {
217*da917039SDavid du Colombier 	int state;
218*da917039SDavid du Colombier 
219*da917039SDavid du Colombier 	Exec exec;
220*da917039SDavid du Colombier 	char *bp;	/* base ptr */
221*da917039SDavid du Colombier 	char *wp;	/* write ptr */
222*da917039SDavid du Colombier 	char *ep;	/* end ptr */
223*da917039SDavid du Colombier };
224*da917039SDavid du Colombier 
225*da917039SDavid du Colombier extern uvlong	clockintrs;
226*da917039SDavid du Colombier extern int	debug;
227*da917039SDavid du Colombier extern char	*defaultpartition;
228*da917039SDavid du Colombier extern int	iniread;
229*da917039SDavid du Colombier extern uvlong	myhz;
230*da917039SDavid du Colombier extern int	pxe;
231*da917039SDavid du Colombier extern int	securemem;
232*da917039SDavid du Colombier extern int	vga;
233