xref: /plan9-contrib/sys/src/9/omap/dat.h (revision 77dd0a987f922b1125641a8757e16b54f2cf323f)
18e32b400SDavid du Colombier /*
28e32b400SDavid du Colombier  * Time.
38e32b400SDavid du Colombier  *
48e32b400SDavid du Colombier  * HZ should divide 1000 evenly, ideally.
58e32b400SDavid du Colombier  * 100, 125, 200, 250 and 333 are okay.
68e32b400SDavid du Colombier  */
78e32b400SDavid du Colombier #define	HZ		100			/* clock frequency */
88e32b400SDavid du Colombier #define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
98e32b400SDavid du Colombier #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
108e32b400SDavid du Colombier 
11df2dbabfSDavid du Colombier enum {
12df2dbabfSDavid du Colombier 	Mhz	= 1000 * 1000,
13df2dbabfSDavid du Colombier };
14df2dbabfSDavid du Colombier 
158e32b400SDavid du Colombier /*
168e32b400SDavid du Colombier  * More accurate time
178e32b400SDavid du Colombier  */
188e32b400SDavid du Colombier #define MS2TMR(t)	((ulong)(((uvlong)(t) * m->cpuhz)/1000))
198e32b400SDavid du Colombier #define US2TMR(t)	((ulong)(((uvlong)(t) * m->cpuhz)/1000000))
208e32b400SDavid du Colombier 
218e32b400SDavid du Colombier /*
228e32b400SDavid du Colombier  * we ignore the first 2 uarts on the omap3530 (see uarti8250.c) and use the
238e32b400SDavid du Colombier  * third one but call it 0.
248e32b400SDavid du Colombier  */
258e32b400SDavid du Colombier #define CONSOLE 0
268e32b400SDavid du Colombier 
278e32b400SDavid du Colombier typedef struct Conf	Conf;
288e32b400SDavid du Colombier typedef struct Confmem	Confmem;
298e32b400SDavid du Colombier typedef struct FPsave	FPsave;
308e32b400SDavid du Colombier typedef struct ISAConf	ISAConf;
318e32b400SDavid du Colombier typedef struct Label	Label;
328e32b400SDavid du Colombier typedef struct Lock	Lock;
338e32b400SDavid du Colombier typedef struct Memcache	Memcache;
348e32b400SDavid du Colombier typedef struct MMMU	MMMU;
358e32b400SDavid du Colombier typedef struct Mach	Mach;
368e32b400SDavid du Colombier typedef u32int Mreg;				/* Msr - bloody UART */
378e32b400SDavid du Colombier typedef struct Page	Page;
388e32b400SDavid du Colombier typedef struct PhysUart	PhysUart;
398e32b400SDavid du Colombier typedef struct PMMU	PMMU;
408e32b400SDavid du Colombier typedef struct Proc	Proc;
418e32b400SDavid du Colombier typedef u32int		PTE;
428e32b400SDavid du Colombier typedef struct Uart	Uart;
438e32b400SDavid du Colombier typedef struct Ureg	Ureg;
448e32b400SDavid du Colombier typedef uvlong		Tval;
458e32b400SDavid du Colombier 
468e32b400SDavid du Colombier #pragma incomplete Ureg
478e32b400SDavid du Colombier 
488e32b400SDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, mpt, flag, arg, srv) */
498e32b400SDavid du Colombier 
508e32b400SDavid du Colombier /*
518e32b400SDavid du Colombier  *  parameters for sysproc.c
528e32b400SDavid du Colombier  */
538e32b400SDavid du Colombier #define AOUT_MAGIC	(E_MAGIC)
548e32b400SDavid du Colombier 
558e32b400SDavid du Colombier struct Lock
568e32b400SDavid du Colombier {
578e32b400SDavid du Colombier 	ulong	key;
588e32b400SDavid du Colombier 	u32int	sr;
598e32b400SDavid du Colombier 	uintptr	pc;
608e32b400SDavid du Colombier 	Proc*	p;
618e32b400SDavid du Colombier 	Mach*	m;
628e32b400SDavid du Colombier 	int	isilock;
638e32b400SDavid du Colombier };
648e32b400SDavid du Colombier 
658e32b400SDavid du Colombier struct Label
668e32b400SDavid du Colombier {
678e32b400SDavid du Colombier 	uintptr	sp;
688e32b400SDavid du Colombier 	uintptr	pc;
698e32b400SDavid du Colombier };
708e32b400SDavid du Colombier 
718e32b400SDavid du Colombier /*
728e32b400SDavid du Colombier  * emulated floating point
738e32b400SDavid du Colombier  */
748e32b400SDavid du Colombier struct FPsave
758e32b400SDavid du Colombier {
768e32b400SDavid du Colombier 	ulong	status;
778e32b400SDavid du Colombier 	ulong	control;
788e32b400SDavid du Colombier 	ulong	regs[8][3];
798e32b400SDavid du Colombier 
808e32b400SDavid du Colombier 	int	fpstate;
818e32b400SDavid du Colombier };
828e32b400SDavid du Colombier 
838e32b400SDavid du Colombier /*
848e32b400SDavid du Colombier  * FPsave.status
858e32b400SDavid du Colombier  */
868e32b400SDavid du Colombier enum
878e32b400SDavid du Colombier {
888e32b400SDavid du Colombier 	FPinit,
898e32b400SDavid du Colombier 	FPactive,
908e32b400SDavid du Colombier 	FPinactive,
91*3b58d1fcSDavid du Colombier 
92*3b58d1fcSDavid du Colombier 	/* bit or'd with the state */
93*3b58d1fcSDavid du Colombier 	FPillegal= 0x100,
948e32b400SDavid du Colombier };
958e32b400SDavid du Colombier 
968e32b400SDavid du Colombier struct Confmem
978e32b400SDavid du Colombier {
988e32b400SDavid du Colombier 	uintptr	base;
998e32b400SDavid du Colombier 	usize	npage;
1008e32b400SDavid du Colombier 	uintptr	limit;
1018e32b400SDavid du Colombier 	uintptr	kbase;
1028e32b400SDavid du Colombier 	uintptr	klimit;
1038e32b400SDavid du Colombier };
1048e32b400SDavid du Colombier 
1058e32b400SDavid du Colombier struct Conf
1068e32b400SDavid du Colombier {
1078e32b400SDavid du Colombier 	ulong	nmach;		/* processors */
1088e32b400SDavid du Colombier 	ulong	nproc;		/* processes */
1098e32b400SDavid du Colombier 	Confmem	mem[1];		/* physical memory */
1108e32b400SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
1118e32b400SDavid du Colombier 	usize	upages;		/* user page pool */
1128e32b400SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
1138e32b400SDavid du Colombier 	ulong	ialloc;		/* max interrupt time allocation in bytes */
1148e32b400SDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
1158e32b400SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
1168e32b400SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
1178e32b400SDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
1188e32b400SDavid du Colombier 	ulong	hz;		/* processor cycle freq */
1198e32b400SDavid du Colombier 	ulong	mhz;
1207fdb4909SDavid du Colombier 	int	monitor;	/* flag */
1218e32b400SDavid du Colombier };
1228e32b400SDavid du Colombier 
1238e32b400SDavid du Colombier /*
1248e32b400SDavid du Colombier  *  MMU stuff in Mach.
1258e32b400SDavid du Colombier  */
1268e32b400SDavid du Colombier struct MMMU
1278e32b400SDavid du Colombier {
1288e32b400SDavid du Colombier 	PTE*	mmul1;		/* l1 for this processor */
1298e32b400SDavid du Colombier 	int	mmul1lo;
1308e32b400SDavid du Colombier 	int	mmul1hi;
1318e32b400SDavid du Colombier 	int	mmupid;
1328e32b400SDavid du Colombier };
1338e32b400SDavid du Colombier 
1348e32b400SDavid du Colombier /*
1358e32b400SDavid du Colombier  *  MMU stuff in proc
1368e32b400SDavid du Colombier  */
1378e32b400SDavid du Colombier #define NCOLOR	1		/* 1 level cache, don't worry about VCE's */
1388e32b400SDavid du Colombier struct PMMU
1398e32b400SDavid du Colombier {
1408e32b400SDavid du Colombier 	Page*	mmul2;
1418e32b400SDavid du Colombier 	Page*	mmul2cache;	/* free mmu pages */
1428e32b400SDavid du Colombier };
1438e32b400SDavid du Colombier 
1448e32b400SDavid du Colombier #include "../port/portdat.h"
1458e32b400SDavid du Colombier 
1468e32b400SDavid du Colombier struct Mach
1478e32b400SDavid du Colombier {
1488e32b400SDavid du Colombier 	int	machno;			/* physical id of processor */
1498e32b400SDavid du Colombier 	uintptr	splpc;			/* pc of last caller to splhi */
1508e32b400SDavid du Colombier 
1518e32b400SDavid du Colombier 	Proc*	proc;			/* current process */
1528e32b400SDavid du Colombier 
1538e32b400SDavid du Colombier 	MMMU;
1548e32b400SDavid du Colombier 	int	flushmmu;		/* flush current proc mmu state */
1558e32b400SDavid du Colombier 
1568e32b400SDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
1578e32b400SDavid du Colombier 	Label	sched;			/* scheduler wakeup */
1588e32b400SDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
1598e32b400SDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
1608e32b400SDavid du Colombier 	int	inclockintr;
1618e32b400SDavid du Colombier 
1628e32b400SDavid du Colombier 	Proc*	readied;		/* for runproc */
1638e32b400SDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
1648e32b400SDavid du Colombier 
1658e32b400SDavid du Colombier 	int	cputype;
1668e32b400SDavid du Colombier 	ulong	delayloop;
1678e32b400SDavid du Colombier 
1688e32b400SDavid du Colombier 	/* stats */
1698e32b400SDavid du Colombier 	int	tlbfault;
1708e32b400SDavid du Colombier 	int	tlbpurge;
1718e32b400SDavid du Colombier 	int	pfault;
1728e32b400SDavid du Colombier 	int	cs;
1738e32b400SDavid du Colombier 	int	syscall;
1748e32b400SDavid du Colombier 	int	load;
1758e32b400SDavid du Colombier 	int	intr;
1768e32b400SDavid du Colombier 	uvlong	fastclock;		/* last sampled value */
1778e32b400SDavid du Colombier 	ulong	spuriousintr;
1788e32b400SDavid du Colombier 	int	lastintr;
1798e32b400SDavid du Colombier 	int	ilockdepth;
1808e32b400SDavid du Colombier 	Perf	perf;			/* performance counters */
1818e32b400SDavid du Colombier 
1828e32b400SDavid du Colombier 
1838e32b400SDavid du Colombier 	int	cpumhz;
1848e32b400SDavid du Colombier 	uvlong	cpuhz;			/* speed of cpu */
1858e32b400SDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
1868e32b400SDavid du Colombier 
1878e32b400SDavid du Colombier 	/* save areas for exceptions, hold R0-R4 */
1888e32b400SDavid du Colombier 	u32int	sfiq[5];
1898e32b400SDavid du Colombier 	u32int	sirq[5];
1908e32b400SDavid du Colombier 	u32int	sund[5];
1918e32b400SDavid du Colombier 	u32int	sabt[5];
1928e32b400SDavid du Colombier 	u32int	smon[5];		/* probably not needed */
1938e32b400SDavid du Colombier 	u32int	ssys[5];
1948e32b400SDavid du Colombier 
1958e32b400SDavid du Colombier 	int	stack[1];
1968e32b400SDavid du Colombier };
1978e32b400SDavid du Colombier 
1988e32b400SDavid du Colombier /*
1998e32b400SDavid du Colombier  * Fake kmap.
2008e32b400SDavid du Colombier  */
2018e32b400SDavid du Colombier typedef void		KMap;
2028e32b400SDavid du Colombier #define	VA(k)		((uintptr)(k))
2038e32b400SDavid du Colombier #define	kmap(p)		(KMap*)((p)->pa|kseg0)
2048e32b400SDavid du Colombier #define	kunmap(k)
2058e32b400SDavid du Colombier 
2068e32b400SDavid du Colombier struct
2078e32b400SDavid du Colombier {
2088e32b400SDavid du Colombier 	Lock;
2098e32b400SDavid du Colombier 	int	machs;			/* bitmap of active CPUs */
2108e32b400SDavid du Colombier 	int	exiting;		/* shutdown */
2118e32b400SDavid du Colombier 	int	ispanic;		/* shutdown in response to a panic */
2128e32b400SDavid du Colombier }active;
2138e32b400SDavid du Colombier 
2148e32b400SDavid du Colombier extern register Mach* m;			/* R10 */
2158e32b400SDavid du Colombier extern register Proc* up;			/* R9 */
2168e32b400SDavid du Colombier extern uintptr kseg0;
2178e32b400SDavid du Colombier extern Mach* machaddr[MAXMACH];
2188e32b400SDavid du Colombier extern ulong memsize;
219bacfa46cSDavid du Colombier extern int normalprint;
2208e32b400SDavid du Colombier 
2218e32b400SDavid du Colombier /*
2228e32b400SDavid du Colombier  *  a parsed plan9.ini line
2238e32b400SDavid du Colombier  */
2248e32b400SDavid du Colombier #define NISAOPT		8
2258e32b400SDavid du Colombier 
2268e32b400SDavid du Colombier struct ISAConf {
2278e32b400SDavid du Colombier 	char	*type;
2288e32b400SDavid du Colombier 	ulong	port;
2298e32b400SDavid du Colombier 	int	irq;
2308e32b400SDavid du Colombier 	ulong	dma;
2318e32b400SDavid du Colombier 	ulong	mem;
2328e32b400SDavid du Colombier 	ulong	size;
2338e32b400SDavid du Colombier 	ulong	freq;
2348e32b400SDavid du Colombier 
2358e32b400SDavid du Colombier 	int	nopt;
2368e32b400SDavid du Colombier 	char	*opt[NISAOPT];
2378e32b400SDavid du Colombier };
2388e32b400SDavid du Colombier 
2398e32b400SDavid du Colombier #define	MACHP(n)	(machaddr[n])
2408e32b400SDavid du Colombier 
2418e32b400SDavid du Colombier /*
2428e32b400SDavid du Colombier  * Horrid. But the alternative is 'defined'.
2438e32b400SDavid du Colombier  */
2448e32b400SDavid du Colombier #ifdef _DBGC_
2458e32b400SDavid du Colombier #define DBGFLG		(dbgflg[_DBGC_])
2468e32b400SDavid du Colombier #else
2478e32b400SDavid du Colombier #define DBGFLG		(0)
2488e32b400SDavid du Colombier #endif /* _DBGC_ */
2498e32b400SDavid du Colombier 
2508e32b400SDavid du Colombier int vflag;
2518e32b400SDavid du Colombier extern char dbgflg[256];
2528e32b400SDavid du Colombier 
2538e32b400SDavid du Colombier #define dbgprint	print		/* for now */
2548e32b400SDavid du Colombier 
2558e32b400SDavid du Colombier /*
2568e32b400SDavid du Colombier  *  hardware info about a device
2578e32b400SDavid du Colombier  */
2588e32b400SDavid du Colombier typedef struct {
2598e32b400SDavid du Colombier 	ulong	port;
2608e32b400SDavid du Colombier 	int	size;
2618e32b400SDavid du Colombier } Devport;
2628e32b400SDavid du Colombier 
2638e32b400SDavid du Colombier struct DevConf
2648e32b400SDavid du Colombier {
2658e32b400SDavid du Colombier 	ulong	intnum;			/* interrupt number */
2668e32b400SDavid du Colombier 	char	*type;			/* card type, malloced */
2678e32b400SDavid du Colombier 	int	nports;			/* Number of ports */
2688e32b400SDavid du Colombier 	Devport	*ports;			/* The ports themselves */
2698e32b400SDavid du Colombier };
2708e32b400SDavid du Colombier 
2718e32b400SDavid du Colombier enum {
2728e32b400SDavid du Colombier 	Dcache,
2738e32b400SDavid du Colombier 	Icache,
2748e32b400SDavid du Colombier 	Unified,
2758e32b400SDavid du Colombier };
2768e32b400SDavid du Colombier 
2778e32b400SDavid du Colombier /* characteristics of a given cache level */
2788e32b400SDavid du Colombier struct Memcache {
2798e32b400SDavid du Colombier 	uint	level;		/* 1 is nearest processor, 2 further away */
2808e32b400SDavid du Colombier 	uint	l1ip;		/* l1 I policy */
2818e32b400SDavid du Colombier 
2828e32b400SDavid du Colombier 	uint	nways;		/* associativity */
2838e32b400SDavid du Colombier 	uint	nsets;
2848e32b400SDavid du Colombier 	uint	linelen;	/* bytes per cache line */
2858e32b400SDavid du Colombier 	uint	setsways;
2868e32b400SDavid du Colombier 
2878e32b400SDavid du Colombier 	uint	log2linelen;
2888e32b400SDavid du Colombier 	uint	waysh;		/* shifts for set/way register */
2898e32b400SDavid du Colombier 	uint	setsh;
2908e32b400SDavid du Colombier };
2918e32b400SDavid du Colombier 
2928e32b400SDavid du Colombier enum Dmamode {
2938e32b400SDavid du Colombier 	Const,
2948e32b400SDavid du Colombier 	Postincr,
2958e32b400SDavid du Colombier 	Index,
2968e32b400SDavid du Colombier 	Index2,
2978e32b400SDavid du Colombier };
298