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