xref: /plan9/sys/src/9/bcm/dat.h (revision 8cc1c73ac888c72077712859b03e7c83105a4b4f)
1*5d9de2d3SDavid du Colombier /*
2*5d9de2d3SDavid du Colombier  * Time.
3*5d9de2d3SDavid du Colombier  *
4*5d9de2d3SDavid du Colombier  * HZ should divide 1000 evenly, ideally.
5*5d9de2d3SDavid du Colombier  * 100, 125, 200, 250 and 333 are okay.
6*5d9de2d3SDavid du Colombier  */
7*5d9de2d3SDavid du Colombier #define	HZ		100			/* clock frequency */
8*5d9de2d3SDavid du Colombier #define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
9*5d9de2d3SDavid du Colombier #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
10*5d9de2d3SDavid du Colombier 
11*5d9de2d3SDavid du Colombier enum {
12*5d9de2d3SDavid du Colombier 	Mhz	= 1000 * 1000,
13*5d9de2d3SDavid du Colombier };
14*5d9de2d3SDavid du Colombier 
15*5d9de2d3SDavid du Colombier typedef struct Conf	Conf;
16*5d9de2d3SDavid du Colombier typedef struct Confmem	Confmem;
17*5d9de2d3SDavid du Colombier typedef struct FPsave	FPsave;
18*5d9de2d3SDavid du Colombier typedef struct ISAConf	ISAConf;
19*5d9de2d3SDavid du Colombier typedef struct Label	Label;
20*5d9de2d3SDavid du Colombier typedef struct Lock	Lock;
21*5d9de2d3SDavid du Colombier typedef struct Memcache	Memcache;
22*5d9de2d3SDavid du Colombier typedef struct MMMU	MMMU;
23*5d9de2d3SDavid du Colombier typedef struct Mach	Mach;
24*5d9de2d3SDavid du Colombier typedef struct Notsave	Notsave;
25*5d9de2d3SDavid du Colombier typedef struct Page	Page;
26*5d9de2d3SDavid du Colombier typedef struct PhysUart	PhysUart;
27*5d9de2d3SDavid du Colombier typedef struct PMMU	PMMU;
28*5d9de2d3SDavid du Colombier typedef struct Proc	Proc;
29*5d9de2d3SDavid du Colombier typedef u32int		PTE;
30*5d9de2d3SDavid du Colombier typedef struct Uart	Uart;
31*5d9de2d3SDavid du Colombier typedef struct Ureg	Ureg;
32*5d9de2d3SDavid du Colombier typedef uvlong		Tval;
33*5d9de2d3SDavid du Colombier 
34*5d9de2d3SDavid du Colombier #pragma incomplete Ureg
35*5d9de2d3SDavid du Colombier 
36*5d9de2d3SDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, mpt, flag, arg, srv) */
37*5d9de2d3SDavid du Colombier 
38*5d9de2d3SDavid du Colombier /*
39*5d9de2d3SDavid du Colombier  *  parameters for sysproc.c
40*5d9de2d3SDavid du Colombier  */
41*5d9de2d3SDavid du Colombier #define AOUT_MAGIC	(E_MAGIC)
42*5d9de2d3SDavid du Colombier 
43*5d9de2d3SDavid du Colombier struct Lock
44*5d9de2d3SDavid du Colombier {
45*5d9de2d3SDavid du Colombier 	ulong	key;
46*5d9de2d3SDavid du Colombier 	u32int	sr;
47*5d9de2d3SDavid du Colombier 	uintptr	pc;
48*5d9de2d3SDavid du Colombier 	Proc*	p;
49*5d9de2d3SDavid du Colombier 	Mach*	m;
50*5d9de2d3SDavid du Colombier 	int	isilock;
51*5d9de2d3SDavid du Colombier };
52*5d9de2d3SDavid du Colombier 
53*5d9de2d3SDavid du Colombier struct Label
54*5d9de2d3SDavid du Colombier {
55*5d9de2d3SDavid du Colombier 	uintptr	sp;
56*5d9de2d3SDavid du Colombier 	uintptr	pc;
57*5d9de2d3SDavid du Colombier };
58*5d9de2d3SDavid du Colombier 
59*5d9de2d3SDavid du Colombier enum {
60*5d9de2d3SDavid du Colombier 	Maxfpregs	= 32,	/* could be 16 or 32, see Mach.fpnregs */
61*5d9de2d3SDavid du Colombier 	Nfpctlregs	= 16,
62*5d9de2d3SDavid du Colombier };
63*5d9de2d3SDavid du Colombier 
64*5d9de2d3SDavid du Colombier /*
65*5d9de2d3SDavid du Colombier  * emulated or vfp3 floating point
66*5d9de2d3SDavid du Colombier  */
67*5d9de2d3SDavid du Colombier struct FPsave
68*5d9de2d3SDavid du Colombier {
69*5d9de2d3SDavid du Colombier 	ulong	status;
70*5d9de2d3SDavid du Colombier 	ulong	control;
71*5d9de2d3SDavid du Colombier 	/*
72*5d9de2d3SDavid du Colombier 	 * vfp3 with ieee fp regs; uvlong is sufficient for hardware but
73*5d9de2d3SDavid du Colombier 	 * each must be able to hold an Internal from fpi.h for sw emulation.
74*5d9de2d3SDavid du Colombier 	 */
75*5d9de2d3SDavid du Colombier 	ulong	regs[Maxfpregs][3];
76*5d9de2d3SDavid du Colombier 
77*5d9de2d3SDavid du Colombier 	int	fpstate;
78*5d9de2d3SDavid du Colombier 	uintptr	pc;		/* of failed fp instr. */
79*5d9de2d3SDavid du Colombier };
80*5d9de2d3SDavid du Colombier 
81*5d9de2d3SDavid du Colombier /*
82*5d9de2d3SDavid du Colombier  * FPsave.fpstate
83*5d9de2d3SDavid du Colombier  */
84*5d9de2d3SDavid du Colombier enum
85*5d9de2d3SDavid du Colombier {
86*5d9de2d3SDavid du Colombier 	FPinit,
87*5d9de2d3SDavid du Colombier 	FPactive,
88*5d9de2d3SDavid du Colombier 	FPinactive,
89*5d9de2d3SDavid du Colombier 	FPemu,
90*5d9de2d3SDavid du Colombier 
91*5d9de2d3SDavid du Colombier 	/* bits or'd with the state */
92*5d9de2d3SDavid du Colombier 	FPillegal= 0x100,
93*5d9de2d3SDavid du Colombier };
94*5d9de2d3SDavid du Colombier 
95*5d9de2d3SDavid du Colombier struct Confmem
96*5d9de2d3SDavid du Colombier {
97*5d9de2d3SDavid du Colombier 	uintptr	base;
98*5d9de2d3SDavid du Colombier 	usize	npage;
99*5d9de2d3SDavid du Colombier 	uintptr	limit;
100*5d9de2d3SDavid du Colombier 	uintptr	kbase;
101*5d9de2d3SDavid du Colombier 	uintptr	klimit;
102*5d9de2d3SDavid du Colombier };
103*5d9de2d3SDavid du Colombier 
104*5d9de2d3SDavid du Colombier struct Conf
105*5d9de2d3SDavid du Colombier {
106*5d9de2d3SDavid du Colombier 	ulong	nmach;		/* processors */
107*5d9de2d3SDavid du Colombier 	ulong	nproc;		/* processes */
108*5d9de2d3SDavid du Colombier 	Confmem	mem[1];		/* physical memory */
109*5d9de2d3SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
110*5d9de2d3SDavid du Colombier 	usize	upages;		/* user page pool */
111*5d9de2d3SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
112*5d9de2d3SDavid du Colombier 	ulong	ialloc;		/* max interrupt time allocation in bytes */
113*5d9de2d3SDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
114*5d9de2d3SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
115*5d9de2d3SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
116*5d9de2d3SDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
117*5d9de2d3SDavid du Colombier 	ulong	hz;		/* processor cycle freq */
118*5d9de2d3SDavid du Colombier 	ulong	mhz;
119*5d9de2d3SDavid du Colombier 	int	monitor;	/* flag */
120*5d9de2d3SDavid du Colombier };
121*5d9de2d3SDavid du Colombier 
122*5d9de2d3SDavid du Colombier /*
123*5d9de2d3SDavid du Colombier  *  things saved in the Proc structure during a notify
124*5d9de2d3SDavid du Colombier  */
125*5d9de2d3SDavid du Colombier struct Notsave {
126*5d9de2d3SDavid du Colombier 	int	emptiness;
127*5d9de2d3SDavid du Colombier };
128*5d9de2d3SDavid du Colombier 
129*5d9de2d3SDavid du Colombier /*
130*5d9de2d3SDavid du Colombier  *  MMU stuff in Mach.
131*5d9de2d3SDavid du Colombier  */
132*5d9de2d3SDavid du Colombier struct MMMU
133*5d9de2d3SDavid du Colombier {
134*5d9de2d3SDavid du Colombier 	PTE*	mmul1;		/* l1 for this processor */
135*5d9de2d3SDavid du Colombier 	int	mmul1lo;
136*5d9de2d3SDavid du Colombier 	int	mmul1hi;
137*5d9de2d3SDavid du Colombier 	int	mmupid;
138*5d9de2d3SDavid du Colombier };
139*5d9de2d3SDavid du Colombier 
140*5d9de2d3SDavid du Colombier /*
141*5d9de2d3SDavid du Colombier  *  MMU stuff in proc
142*5d9de2d3SDavid du Colombier  */
143*5d9de2d3SDavid du Colombier #define NCOLOR	1		/* 1 level cache, don't worry about VCE's */
144*5d9de2d3SDavid du Colombier struct PMMU
145*5d9de2d3SDavid du Colombier {
146*5d9de2d3SDavid du Colombier 	Page*	mmul2;
147*5d9de2d3SDavid du Colombier 	Page*	mmul2cache;	/* free mmu pages */
148*5d9de2d3SDavid du Colombier };
149*5d9de2d3SDavid du Colombier 
150*5d9de2d3SDavid du Colombier #include "../port/portdat.h"
151*5d9de2d3SDavid du Colombier 
152*5d9de2d3SDavid du Colombier struct Mach
153*5d9de2d3SDavid du Colombier {
154*5d9de2d3SDavid du Colombier 	int	machno;			/* physical id of processor */
155*5d9de2d3SDavid du Colombier 	uintptr	splpc;			/* pc of last caller to splhi */
156*5d9de2d3SDavid du Colombier 
157*5d9de2d3SDavid du Colombier 	Proc*	proc;			/* current process */
158*5d9de2d3SDavid du Colombier 
159*5d9de2d3SDavid du Colombier 	MMMU;
160*5d9de2d3SDavid du Colombier 	int	flushmmu;		/* flush current proc mmu state */
161*5d9de2d3SDavid du Colombier 
162*5d9de2d3SDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
163*5d9de2d3SDavid du Colombier 	Label	sched;			/* scheduler wakeup */
164*5d9de2d3SDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
165*5d9de2d3SDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
166*5d9de2d3SDavid du Colombier 
167*5d9de2d3SDavid du Colombier 	Proc*	readied;		/* for runproc */
168*5d9de2d3SDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
169*5d9de2d3SDavid du Colombier 
170*5d9de2d3SDavid du Colombier 	int	cputype;
171*5d9de2d3SDavid du Colombier 	ulong	delayloop;
172*5d9de2d3SDavid du Colombier 
173*5d9de2d3SDavid du Colombier 	/* stats */
174*5d9de2d3SDavid du Colombier 	int	tlbfault;
175*5d9de2d3SDavid du Colombier 	int	tlbpurge;
176*5d9de2d3SDavid du Colombier 	int	pfault;
177*5d9de2d3SDavid du Colombier 	int	cs;
178*5d9de2d3SDavid du Colombier 	int	syscall;
179*5d9de2d3SDavid du Colombier 	int	load;
180*5d9de2d3SDavid du Colombier 	int	intr;
181*5d9de2d3SDavid du Colombier 	uvlong	fastclock;		/* last sampled value */
182*5d9de2d3SDavid du Colombier 	ulong	spuriousintr;
183*5d9de2d3SDavid du Colombier 	int	lastintr;
184*5d9de2d3SDavid du Colombier 	int	ilockdepth;
185*5d9de2d3SDavid du Colombier 	Perf	perf;			/* performance counters */
186*5d9de2d3SDavid du Colombier 
187*5d9de2d3SDavid du Colombier 
188*5d9de2d3SDavid du Colombier 	int	cpumhz;
189*5d9de2d3SDavid du Colombier 	uvlong	cpuhz;			/* speed of cpu */
190*5d9de2d3SDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
191*5d9de2d3SDavid du Colombier 
192*5d9de2d3SDavid du Colombier 	/* vfp2 or vfp3 fpu */
193*5d9de2d3SDavid du Colombier 	int	havefp;
194*5d9de2d3SDavid du Colombier 	int	havefpvalid;
195*5d9de2d3SDavid du Colombier 	int	fpon;
196*5d9de2d3SDavid du Colombier 	int	fpconfiged;
197*5d9de2d3SDavid du Colombier 	int	fpnregs;
198*5d9de2d3SDavid du Colombier 	ulong	fpscr;			/* sw copy */
199*5d9de2d3SDavid du Colombier 	int	fppid;			/* pid of last fault */
200*5d9de2d3SDavid du Colombier 	uintptr	fppc;			/* addr of last fault */
201*5d9de2d3SDavid du Colombier 	int	fpcnt;			/* how many consecutive at that addr */
202*5d9de2d3SDavid du Colombier 
203*5d9de2d3SDavid du Colombier 	/* save areas for exceptions, hold R0-R4 */
204*5d9de2d3SDavid du Colombier 	u32int	sfiq[5];
205*5d9de2d3SDavid du Colombier 	u32int	sirq[5];
206*5d9de2d3SDavid du Colombier 	u32int	sund[5];
207*5d9de2d3SDavid du Colombier 	u32int	sabt[5];
208*5d9de2d3SDavid du Colombier 	u32int	smon[5];		/* probably not needed */
209*5d9de2d3SDavid du Colombier 	u32int	ssys[5];
210*5d9de2d3SDavid du Colombier 
211*5d9de2d3SDavid du Colombier 	int	stack[1];
212*5d9de2d3SDavid du Colombier };
213*5d9de2d3SDavid du Colombier 
214*5d9de2d3SDavid du Colombier /*
215*5d9de2d3SDavid du Colombier  * Fake kmap.
216*5d9de2d3SDavid du Colombier  */
217*5d9de2d3SDavid du Colombier typedef void		KMap;
218*5d9de2d3SDavid du Colombier #define	VA(k)		((uintptr)(k))
219*5d9de2d3SDavid du Colombier #define	kmap(p)		(KMap*)((p)->pa|kseg0)
220*5d9de2d3SDavid du Colombier #define	kunmap(k)
221*5d9de2d3SDavid du Colombier 
222*5d9de2d3SDavid du Colombier struct
223*5d9de2d3SDavid du Colombier {
224*5d9de2d3SDavid du Colombier 	Lock;
225*5d9de2d3SDavid du Colombier 	int	machs;			/* bitmap of active CPUs */
226*5d9de2d3SDavid du Colombier 	int	exiting;		/* shutdown */
227*5d9de2d3SDavid du Colombier 	int	ispanic;		/* shutdown in response to a panic */
228*5d9de2d3SDavid du Colombier }active;
229*5d9de2d3SDavid du Colombier 
230*5d9de2d3SDavid du Colombier extern register Mach* m;			/* R10 */
231*5d9de2d3SDavid du Colombier extern register Proc* up;			/* R9 */
232*5d9de2d3SDavid du Colombier extern uintptr kseg0;
233*5d9de2d3SDavid du Colombier extern Mach* machaddr[MAXMACH];
234*5d9de2d3SDavid du Colombier extern ulong memsize;
235*5d9de2d3SDavid du Colombier extern int normalprint;
236*5d9de2d3SDavid du Colombier 
237*5d9de2d3SDavid du Colombier /*
238*5d9de2d3SDavid du Colombier  *  a parsed plan9.ini line
239*5d9de2d3SDavid du Colombier  */
240*5d9de2d3SDavid du Colombier #define NISAOPT		8
241*5d9de2d3SDavid du Colombier 
242*5d9de2d3SDavid du Colombier struct ISAConf {
243*5d9de2d3SDavid du Colombier 	char	*type;
244*5d9de2d3SDavid du Colombier 	ulong	port;
245*5d9de2d3SDavid du Colombier 	int	irq;
246*5d9de2d3SDavid du Colombier 	ulong	dma;
247*5d9de2d3SDavid du Colombier 	ulong	mem;
248*5d9de2d3SDavid du Colombier 	ulong	size;
249*5d9de2d3SDavid du Colombier 	ulong	freq;
250*5d9de2d3SDavid du Colombier 
251*5d9de2d3SDavid du Colombier 	int	nopt;
252*5d9de2d3SDavid du Colombier 	char	*opt[NISAOPT];
253*5d9de2d3SDavid du Colombier };
254*5d9de2d3SDavid du Colombier 
255*5d9de2d3SDavid du Colombier #define	MACHP(n)	(machaddr[n])
256*5d9de2d3SDavid du Colombier 
257*5d9de2d3SDavid du Colombier /*
258*5d9de2d3SDavid du Colombier  * Horrid. But the alternative is 'defined'.
259*5d9de2d3SDavid du Colombier  */
260*5d9de2d3SDavid du Colombier #ifdef _DBGC_
261*5d9de2d3SDavid du Colombier #define DBGFLG		(dbgflg[_DBGC_])
262*5d9de2d3SDavid du Colombier #else
263*5d9de2d3SDavid du Colombier #define DBGFLG		(0)
264*5d9de2d3SDavid du Colombier #endif /* _DBGC_ */
265*5d9de2d3SDavid du Colombier 
266*5d9de2d3SDavid du Colombier int vflag;
267*5d9de2d3SDavid du Colombier extern char dbgflg[256];
268*5d9de2d3SDavid du Colombier 
269*5d9de2d3SDavid du Colombier #define dbgprint	print		/* for now */
270*5d9de2d3SDavid du Colombier 
271*5d9de2d3SDavid du Colombier /*
272*5d9de2d3SDavid du Colombier  *  hardware info about a device
273*5d9de2d3SDavid du Colombier  */
274*5d9de2d3SDavid du Colombier typedef struct {
275*5d9de2d3SDavid du Colombier 	ulong	port;
276*5d9de2d3SDavid du Colombier 	int	size;
277*5d9de2d3SDavid du Colombier } Devport;
278*5d9de2d3SDavid du Colombier 
279*5d9de2d3SDavid du Colombier struct DevConf
280*5d9de2d3SDavid du Colombier {
281*5d9de2d3SDavid du Colombier 	ulong	intnum;			/* interrupt number */
282*5d9de2d3SDavid du Colombier 	char	*type;			/* card type, malloced */
283*5d9de2d3SDavid du Colombier 	int	nports;			/* Number of ports */
284*5d9de2d3SDavid du Colombier 	Devport	*ports;			/* The ports themselves */
285*5d9de2d3SDavid du Colombier };
286*5d9de2d3SDavid du Colombier 
287