xref: /plan9-contrib/sys/src/9/kw/dat.h (revision 77dd0a987f922b1125641a8757e16b54f2cf323f)
1154abd99SDavid du Colombier typedef struct Conf	Conf;
2154abd99SDavid du Colombier typedef struct Confmem	Confmem;
3154abd99SDavid du Colombier typedef struct FPsave	FPsave;
4154abd99SDavid du Colombier typedef struct ISAConf	ISAConf;
5154abd99SDavid du Colombier typedef struct Label	Label;
6154abd99SDavid du Colombier typedef struct Lock	Lock;
7b72bcbbfSDavid du Colombier typedef struct Memcache	Memcache;
8154abd99SDavid du Colombier typedef struct MMMU	MMMU;
9154abd99SDavid du Colombier typedef struct Mach	Mach;
10154abd99SDavid du Colombier typedef struct Page	Page;
11154abd99SDavid du Colombier typedef struct Pcidev	Pcidev;
12154abd99SDavid du Colombier typedef struct PhysUart	PhysUart;
13154abd99SDavid du Colombier typedef struct PMMU	PMMU;
14154abd99SDavid du Colombier typedef struct Proc	Proc;
15154abd99SDavid du Colombier typedef u32int		PTE;
167365b686SDavid du Colombier typedef struct Soc	Soc;
17154abd99SDavid du Colombier typedef struct Uart	Uart;
18154abd99SDavid du Colombier typedef struct Ureg	Ureg;
19154abd99SDavid du Colombier typedef uvlong		Tval;
20154abd99SDavid du Colombier 
21154abd99SDavid du Colombier #pragma incomplete Pcidev
22154abd99SDavid du Colombier #pragma incomplete Ureg
23154abd99SDavid du Colombier 
24154abd99SDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, mpt, flag, arg, srv) */
25154abd99SDavid du Colombier 
26154abd99SDavid du Colombier /*
27154abd99SDavid du Colombier  *  parameters for sysproc.c
28154abd99SDavid du Colombier  */
29154abd99SDavid du Colombier #define AOUT_MAGIC	(E_MAGIC)
30154abd99SDavid du Colombier 
31154abd99SDavid du Colombier struct Lock
32154abd99SDavid du Colombier {
33154abd99SDavid du Colombier 	ulong	key;
34154abd99SDavid du Colombier 	u32int	sr;
35154abd99SDavid du Colombier 	uintptr	pc;
36154abd99SDavid du Colombier 	Proc*	p;
37154abd99SDavid du Colombier 	Mach*	m;
38154abd99SDavid du Colombier 	int	isilock;
39154abd99SDavid du Colombier };
40154abd99SDavid du Colombier 
41154abd99SDavid du Colombier struct Label
42154abd99SDavid du Colombier {
43154abd99SDavid du Colombier 	uintptr	sp;
44154abd99SDavid du Colombier 	uintptr	pc;
45154abd99SDavid du Colombier };
46154abd99SDavid du Colombier 
47154abd99SDavid du Colombier /*
48154abd99SDavid du Colombier  * emulated floating point
49154abd99SDavid du Colombier  */
5048bb54a3SDavid du Colombier struct FPsave
51154abd99SDavid du Colombier {
52154abd99SDavid du Colombier 	ulong	status;
53154abd99SDavid du Colombier 	ulong	control;
54154abd99SDavid du Colombier 	ulong	regs[8][3];
55154abd99SDavid du Colombier 
56154abd99SDavid du Colombier 	int	fpstate;
57154abd99SDavid du Colombier };
58154abd99SDavid du Colombier 
59154abd99SDavid du Colombier /*
6048bb54a3SDavid du Colombier  * FPsave.status
61154abd99SDavid du Colombier  */
62154abd99SDavid du Colombier enum
63154abd99SDavid du Colombier {
64154abd99SDavid du Colombier 	FPinit,
65154abd99SDavid du Colombier 	FPactive,
66154abd99SDavid du Colombier 	FPinactive,
67*3b58d1fcSDavid du Colombier 
68*3b58d1fcSDavid du Colombier 	/* bit or'd with the state */
69*3b58d1fcSDavid du Colombier 	FPillegal= 0x100,
70154abd99SDavid du Colombier };
71154abd99SDavid du Colombier 
72154abd99SDavid du Colombier struct Confmem
73154abd99SDavid du Colombier {
74154abd99SDavid du Colombier 	uintptr	base;
75154abd99SDavid du Colombier 	usize	npage;
76154abd99SDavid du Colombier 	uintptr	limit;
77154abd99SDavid du Colombier 	uintptr	kbase;
78154abd99SDavid du Colombier 	uintptr	klimit;
79154abd99SDavid du Colombier };
80154abd99SDavid du Colombier 
81154abd99SDavid du Colombier struct Conf
82154abd99SDavid du Colombier {
83154abd99SDavid du Colombier 	ulong	nmach;		/* processors */
84154abd99SDavid du Colombier 	ulong	nproc;		/* processes */
855e27dea9SDavid du Colombier 	ulong	monitor;	/* has monitor? */
86154abd99SDavid du Colombier 	Confmem	mem[1];		/* physical memory */
87154abd99SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
88154abd99SDavid du Colombier 	usize	upages;		/* user page pool */
89154abd99SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
90154abd99SDavid du Colombier 	ulong	ialloc;		/* max interrupt time allocation in bytes */
91154abd99SDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
92154abd99SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
93154abd99SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
94154abd99SDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
95154abd99SDavid du Colombier //	ulong	hz;		/* processor cycle freq */
96154abd99SDavid du Colombier //	ulong	mhz;
97154abd99SDavid du Colombier };
98154abd99SDavid du Colombier 
9948bb54a3SDavid du Colombier /*
100154abd99SDavid du Colombier  *  MMU stuff in Mach.
101154abd99SDavid du Colombier  */
102154abd99SDavid du Colombier struct MMMU
103154abd99SDavid du Colombier {
104154abd99SDavid du Colombier 	PTE*	mmul1;		/* l1 for this processor */
105154abd99SDavid du Colombier 	int	mmul1lo;
106154abd99SDavid du Colombier 	int	mmul1hi;
107154abd99SDavid du Colombier 	int	mmupid;
108154abd99SDavid du Colombier };
109154abd99SDavid du Colombier 
110154abd99SDavid du Colombier /*
111154abd99SDavid du Colombier  *  MMU stuff in proc
112154abd99SDavid du Colombier  */
113154abd99SDavid du Colombier #define NCOLOR	1		/* 1 level cache, don't worry about VCE's */
114154abd99SDavid du Colombier struct PMMU
115154abd99SDavid du Colombier {
116154abd99SDavid du Colombier 	Page*	mmul2;
117154abd99SDavid du Colombier 	Page*	mmul2cache;	/* free mmu pages */
118154abd99SDavid du Colombier };
119154abd99SDavid du Colombier 
120154abd99SDavid du Colombier #include "../port/portdat.h"
121154abd99SDavid du Colombier 
122154abd99SDavid du Colombier struct Mach
123154abd99SDavid du Colombier {
124154abd99SDavid du Colombier 	int	machno;			/* physical id of processor */
125154abd99SDavid du Colombier 	uintptr	splpc;			/* pc of last caller to splhi */
126154abd99SDavid du Colombier 
127154abd99SDavid du Colombier 	Proc*	proc;			/* current process */
128154abd99SDavid du Colombier 
129154abd99SDavid du Colombier 	MMMU;
130154abd99SDavid du Colombier 	int	flushmmu;		/* flush current proc mmu state */
131154abd99SDavid du Colombier 
132154abd99SDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
133154abd99SDavid du Colombier 	Label	sched;			/* scheduler wakeup */
134154abd99SDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
135154abd99SDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
136154abd99SDavid du Colombier 	int	inclockintr;
137154abd99SDavid du Colombier 
138154abd99SDavid du Colombier 	Proc*	readied;		/* for runproc */
139154abd99SDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
140154abd99SDavid du Colombier 
141154abd99SDavid du Colombier 	int	cputype;
142ab6ce076SDavid du Colombier 	int	socrev;			/* system-on-chip revision */
143154abd99SDavid du Colombier 	ulong	delayloop;
144154abd99SDavid du Colombier 
145154abd99SDavid du Colombier 	/* stats */
146154abd99SDavid du Colombier 	int	tlbfault;
147154abd99SDavid du Colombier 	int	tlbpurge;
148154abd99SDavid du Colombier 	int	pfault;
149154abd99SDavid du Colombier 	int	cs;
150154abd99SDavid du Colombier 	int	syscall;
151154abd99SDavid du Colombier 	int	load;
152154abd99SDavid du Colombier 	int	intr;
153154abd99SDavid du Colombier 	vlong	fastclock;		/* last sampled value */
154154abd99SDavid du Colombier 	ulong	spuriousintr;
155154abd99SDavid du Colombier 	int	lastintr;
156154abd99SDavid du Colombier 	int	ilockdepth;
157154abd99SDavid du Colombier 	Perf	perf;			/* performance counters */
158154abd99SDavid du Colombier 
159154abd99SDavid du Colombier 	uvlong	cpuhz;			/* speed of cpu */
160154abd99SDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
161154abd99SDavid du Colombier 
162154abd99SDavid du Colombier 	/* save areas for exceptions */
163154abd99SDavid du Colombier 	u32int	sfiq[5];
164154abd99SDavid du Colombier 	u32int	sirq[5];
165154abd99SDavid du Colombier 	u32int	sund[5];
166154abd99SDavid du Colombier 	u32int	sabt[5];
167154abd99SDavid du Colombier #define fiqstack sfiq
168154abd99SDavid du Colombier #define irqstack sirq
169154abd99SDavid du Colombier #define abtstack sabt
170154abd99SDavid du Colombier #define undstack sund
171154abd99SDavid du Colombier 
172154abd99SDavid du Colombier 	int	stack[1];
173154abd99SDavid du Colombier };
174154abd99SDavid du Colombier 
175154abd99SDavid du Colombier /*
176154abd99SDavid du Colombier  * Fake kmap.
177154abd99SDavid du Colombier  */
178154abd99SDavid du Colombier typedef void		KMap;
179154abd99SDavid du Colombier #define	VA(k)		((uintptr)(k))
180154abd99SDavid du Colombier #define	kmap(p)		(KMap*)((p)->pa|kseg0)
181154abd99SDavid du Colombier #define	kunmap(k)
182154abd99SDavid du Colombier 
183154abd99SDavid du Colombier struct
184154abd99SDavid du Colombier {
185154abd99SDavid du Colombier 	Lock;
186154abd99SDavid du Colombier 	int	machs;			/* bitmap of active CPUs */
187154abd99SDavid du Colombier 	int	exiting;		/* shutdown */
188154abd99SDavid du Colombier 	int	ispanic;		/* shutdown in response to a panic */
189154abd99SDavid du Colombier }active;
190154abd99SDavid du Colombier 
191154abd99SDavid du Colombier enum {
192154abd99SDavid du Colombier 	Frequency	= 1200*1000*1000,	/* the processor clock */
193154abd99SDavid du Colombier };
194154abd99SDavid du Colombier 
195154abd99SDavid du Colombier extern register Mach* m;			/* R10 */
196154abd99SDavid du Colombier extern register Proc* up;			/* R9 */
197a7a38e3eSDavid du Colombier 
198154abd99SDavid du Colombier extern uintptr kseg0;
199154abd99SDavid du Colombier extern Mach* machaddr[MAXMACH];
200b649930dSDavid du Colombier extern ulong memsize;
201154abd99SDavid du Colombier 
202154abd99SDavid du Colombier enum {
203154abd99SDavid du Colombier 	Nvec = 8,	/* # of vectors at start of lexception.s */
204154abd99SDavid du Colombier };
205154abd99SDavid du Colombier 
206154abd99SDavid du Colombier /*
207154abd99SDavid du Colombier  * Layout of physical 0.
208154abd99SDavid du Colombier  */
209154abd99SDavid du Colombier typedef struct Vectorpage {
210154abd99SDavid du Colombier 	void	(*vectors[Nvec])(void);
211154abd99SDavid du Colombier 	uint	vtable[Nvec];
212154abd99SDavid du Colombier } Vectorpage;
213154abd99SDavid du Colombier 
214154abd99SDavid du Colombier /*
215154abd99SDavid du Colombier  *  a parsed plan9.ini line
216154abd99SDavid du Colombier  */
217154abd99SDavid du Colombier #define NISAOPT		8
218154abd99SDavid du Colombier 
219154abd99SDavid du Colombier struct ISAConf {
220154abd99SDavid du Colombier 	char		*type;
221154abd99SDavid du Colombier 	ulong	port;
222154abd99SDavid du Colombier 	int	irq;
223154abd99SDavid du Colombier 	ulong	dma;
224154abd99SDavid du Colombier 	ulong	mem;
225154abd99SDavid du Colombier 	ulong	size;
226154abd99SDavid du Colombier 	ulong	freq;
227154abd99SDavid du Colombier 
228154abd99SDavid du Colombier 	int	nopt;
229154abd99SDavid du Colombier 	char	*opt[NISAOPT];
230154abd99SDavid du Colombier };
231154abd99SDavid du Colombier 
232154abd99SDavid du Colombier #define	MACHP(n)	(machaddr[n])
233154abd99SDavid du Colombier 
234154abd99SDavid du Colombier /*
235154abd99SDavid du Colombier  * Horrid. But the alternative is 'defined'.
236154abd99SDavid du Colombier  */
237154abd99SDavid du Colombier #ifdef _DBGC_
238154abd99SDavid du Colombier #define DBGFLG		(dbgflg[_DBGC_])
239154abd99SDavid du Colombier #else
240154abd99SDavid du Colombier #define DBGFLG		(0)
241154abd99SDavid du Colombier #endif /* _DBGC_ */
242154abd99SDavid du Colombier 
243154abd99SDavid du Colombier int vflag;
244154abd99SDavid du Colombier extern char dbgflg[256];
245154abd99SDavid du Colombier 
246154abd99SDavid du Colombier #define dbgprint	print		/* for now */
24756713243SDavid du Colombier 
24856713243SDavid du Colombier /*
24956713243SDavid du Colombier  *  hardware info about a device
25056713243SDavid du Colombier  */
25156713243SDavid du Colombier typedef struct {
25256713243SDavid du Colombier 	ulong	port;
25356713243SDavid du Colombier 	int	size;
25456713243SDavid du Colombier } Devport;
25556713243SDavid du Colombier 
25656713243SDavid du Colombier struct DevConf
25756713243SDavid du Colombier {
25856713243SDavid du Colombier 	ulong	intnum;			/* interrupt number */
25956713243SDavid du Colombier 	char	*type;			/* card type, malloced */
26056713243SDavid du Colombier 	int	nports;			/* Number of ports */
26156713243SDavid du Colombier 	Devport	*ports;			/* The ports themselves */
26256713243SDavid du Colombier };
263b72bcbbfSDavid du Colombier 
26410dec6bfSDavid du Colombier enum {
26510dec6bfSDavid du Colombier 	Dcache,
26610dec6bfSDavid du Colombier 	Icache,
26710dec6bfSDavid du Colombier 	Unified,
26810dec6bfSDavid du Colombier };
26910dec6bfSDavid du Colombier 
270b72bcbbfSDavid du Colombier /* characteristics of a given cache level */
271b72bcbbfSDavid du Colombier struct Memcache {
272b72bcbbfSDavid du Colombier 	uint	level;		/* 1 is nearest processor, 2 further away */
27310dec6bfSDavid du Colombier 	uint	kind;		/* I, D or unified */
274b72bcbbfSDavid du Colombier 
275b72bcbbfSDavid du Colombier 	uint	size;
276b72bcbbfSDavid du Colombier 	uint	nways;		/* associativity */
277b72bcbbfSDavid du Colombier 	uint	nsets;
278b72bcbbfSDavid du Colombier 	uint	linelen;	/* bytes per cache line */
27910dec6bfSDavid du Colombier 	uint	setsways;
280b72bcbbfSDavid du Colombier 
281b72bcbbfSDavid du Colombier 	uint	log2linelen;
282b72bcbbfSDavid du Colombier 	uint	waysh;		/* shifts for set/way register */
283b72bcbbfSDavid du Colombier 	uint	setsh;
284b72bcbbfSDavid du Colombier };
2857365b686SDavid du Colombier 
2867365b686SDavid du Colombier struct Soc {			/* addr's of SoC controllers */
2877365b686SDavid du Colombier 	uintptr	cpu;
2887365b686SDavid du Colombier 	uintptr	devid;
2897365b686SDavid du Colombier 	uintptr	l2cache;
2907365b686SDavid du Colombier 	uintptr	sdramc;
2917365b686SDavid du Colombier 
2927365b686SDavid du Colombier 	uintptr	iocfg;
2937365b686SDavid du Colombier 	uintptr addrmap;
2947365b686SDavid du Colombier 	uintptr	intr;
2957365b686SDavid du Colombier 	uintptr	nand;
2967365b686SDavid du Colombier 	uintptr	cesa;		/* crypto accel. */
2977365b686SDavid du Colombier 	uintptr	ehci;
2987365b686SDavid du Colombier 	uintptr spi;
2997365b686SDavid du Colombier 	uintptr	twsi;
3007365b686SDavid du Colombier 
3017365b686SDavid du Colombier 	uintptr	analog;
3027365b686SDavid du Colombier 	uintptr	pci;
3037365b686SDavid du Colombier 	uintptr	pcibase;
3047365b686SDavid du Colombier 
3057365b686SDavid du Colombier 	uintptr	rtc;		/* real-time clock */
3067365b686SDavid du Colombier 	uintptr	clock;
3077365b686SDavid du Colombier 
3081ecc8ef2SDavid du Colombier 	uintptr ether[2];
3097365b686SDavid du Colombier 	uintptr	sata[3];
3107365b686SDavid du Colombier 	uintptr	uart[2];
3117365b686SDavid du Colombier 	uintptr	gpio[2];
3127365b686SDavid du Colombier } soc;
3137365b686SDavid du Colombier extern Soc soc;
314