xref: /plan9/sys/src/9/teg2/dat.h (revision 8cc1c73ac888c72077712859b03e7c83105a4b4f)
13de6a9c0SDavid du Colombier /*
23de6a9c0SDavid du Colombier  * Time.
33de6a9c0SDavid du Colombier  *
43de6a9c0SDavid du Colombier  * HZ should divide 1000 evenly, ideally.
53de6a9c0SDavid du Colombier  * 100, 125, 200, 250 and 333 are okay.
63de6a9c0SDavid du Colombier  */
73de6a9c0SDavid du Colombier #define	HZ		100			/* clock frequency */
83de6a9c0SDavid du Colombier #define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
93de6a9c0SDavid du Colombier #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
103de6a9c0SDavid du Colombier 
113de6a9c0SDavid du Colombier enum {
123de6a9c0SDavid du Colombier 	Mhz	= 1000 * 1000,
133de6a9c0SDavid du Colombier 	Dogsectimeout = 4,		/* must be ≤ 34 s. to fit in a ulong */
143de6a9c0SDavid du Colombier };
153de6a9c0SDavid du Colombier 
163de6a9c0SDavid du Colombier /*
173de6a9c0SDavid du Colombier  * More accurate time
183de6a9c0SDavid du Colombier  */
193de6a9c0SDavid du Colombier #define MS2TMR(t)	((ulong)(((uvlong)(t) * m->cpuhz)/1000))
203de6a9c0SDavid du Colombier #define US2TMR(t)	((ulong)(((uvlong)(t) * m->cpuhz)/1000000))
213de6a9c0SDavid du Colombier 
223de6a9c0SDavid du Colombier #define CONSOLE 0
233de6a9c0SDavid du Colombier 
243de6a9c0SDavid du Colombier typedef struct Conf	Conf;
253de6a9c0SDavid du Colombier typedef struct Confmem	Confmem;
263de6a9c0SDavid du Colombier typedef struct FPsave	FPsave;
273de6a9c0SDavid du Colombier typedef struct ISAConf	ISAConf;
283de6a9c0SDavid du Colombier typedef struct Isolated Isolated;
293de6a9c0SDavid du Colombier typedef struct Label	Label;
303de6a9c0SDavid du Colombier typedef struct Lock	Lock;
313de6a9c0SDavid du Colombier typedef struct Lowmemcache Lowmemcache;
323de6a9c0SDavid du Colombier typedef struct Memcache	Memcache;
333de6a9c0SDavid du Colombier typedef struct MMMU	MMMU;
343de6a9c0SDavid du Colombier typedef struct Mach	Mach;
353de6a9c0SDavid du Colombier typedef u32int Mreg;				/* Msr - bloody UART */
363de6a9c0SDavid du Colombier typedef struct Notsave	Notsave;
373de6a9c0SDavid du Colombier typedef struct Page	Page;
383de6a9c0SDavid du Colombier typedef struct Pcisiz Pcisiz;
393de6a9c0SDavid du Colombier typedef struct Pcidev Pcidev;
403de6a9c0SDavid du Colombier typedef struct PhysUart	PhysUart;
413de6a9c0SDavid du Colombier typedef struct PMMU	PMMU;
423de6a9c0SDavid du Colombier typedef struct Proc	Proc;
433de6a9c0SDavid du Colombier typedef u32int		PTE;
443de6a9c0SDavid du Colombier typedef struct Soc	Soc;
453de6a9c0SDavid du Colombier typedef struct Uart	Uart;
463de6a9c0SDavid du Colombier typedef struct Ureg	Ureg;
473de6a9c0SDavid du Colombier typedef uvlong		Tval;
483de6a9c0SDavid du Colombier 
493de6a9c0SDavid du Colombier #pragma incomplete Pcidev
503de6a9c0SDavid du Colombier #pragma incomplete Ureg
513de6a9c0SDavid du Colombier 
523de6a9c0SDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, mpt, flag, arg, srv) */
533de6a9c0SDavid du Colombier 
543de6a9c0SDavid du Colombier /*
553de6a9c0SDavid du Colombier  *  parameters for sysproc.c
563de6a9c0SDavid du Colombier  */
573de6a9c0SDavid du Colombier #define AOUT_MAGIC	(E_MAGIC)
583de6a9c0SDavid du Colombier 
593de6a9c0SDavid du Colombier struct Lock
603de6a9c0SDavid du Colombier {
613de6a9c0SDavid du Colombier 	ulong	key;
623de6a9c0SDavid du Colombier 	u32int	sr;
633de6a9c0SDavid du Colombier 	uintptr	pc;
643de6a9c0SDavid du Colombier 	Proc*	p;
653de6a9c0SDavid du Colombier 	Mach*	m;
663de6a9c0SDavid du Colombier 	int	isilock;
673de6a9c0SDavid du Colombier };
683de6a9c0SDavid du Colombier 
693de6a9c0SDavid du Colombier struct Label
703de6a9c0SDavid du Colombier {
713de6a9c0SDavid du Colombier 	uintptr	sp;
723de6a9c0SDavid du Colombier 	uintptr	pc;
733de6a9c0SDavid du Colombier };
743de6a9c0SDavid du Colombier 
753de6a9c0SDavid du Colombier enum {
763de6a9c0SDavid du Colombier 	Maxfpregs	= 32,	/* could be 16 or 32, see Mach.fpnregs */
773de6a9c0SDavid du Colombier 	Nfpctlregs	= 16,
783de6a9c0SDavid du Colombier };
793de6a9c0SDavid du Colombier 
803de6a9c0SDavid du Colombier /*
813de6a9c0SDavid du Colombier  * emulated or vfp3 floating point
823de6a9c0SDavid du Colombier  */
833de6a9c0SDavid du Colombier struct FPsave
843de6a9c0SDavid du Colombier {
853de6a9c0SDavid du Colombier 	ulong	status;
863de6a9c0SDavid du Colombier 	ulong	control;
873de6a9c0SDavid du Colombier 	/*
883de6a9c0SDavid du Colombier 	 * vfp3 with ieee fp regs; uvlong is sufficient for hardware but
893de6a9c0SDavid du Colombier 	 * each must be able to hold an Internal from fpi.h for sw emulation.
903de6a9c0SDavid du Colombier 	 */
913de6a9c0SDavid du Colombier 	ulong	regs[Maxfpregs][3];
923de6a9c0SDavid du Colombier 
933de6a9c0SDavid du Colombier 	int	fpstate;
943de6a9c0SDavid du Colombier 	uintptr	pc;		/* of failed fp instr. */
953de6a9c0SDavid du Colombier };
963de6a9c0SDavid du Colombier 
973de6a9c0SDavid du Colombier /*
98*9b7bf7dfSDavid du Colombier  * FPsave.fpstate
993de6a9c0SDavid du Colombier  */
1003de6a9c0SDavid du Colombier enum
1013de6a9c0SDavid du Colombier {
1023de6a9c0SDavid du Colombier 	FPinit,
1033de6a9c0SDavid du Colombier 	FPactive,
1043de6a9c0SDavid du Colombier 	FPinactive,
105*9b7bf7dfSDavid du Colombier 	FPemu,
1063de6a9c0SDavid du Colombier 
1073de6a9c0SDavid du Colombier 	/* bit or'd with the state */
1083de6a9c0SDavid du Colombier 	FPillegal= 0x100,
1093de6a9c0SDavid du Colombier };
1103de6a9c0SDavid du Colombier 
1113de6a9c0SDavid du Colombier struct Confmem
1123de6a9c0SDavid du Colombier {
1133de6a9c0SDavid du Colombier 	uintptr	base;
1143de6a9c0SDavid du Colombier 	usize	npage;
1153de6a9c0SDavid du Colombier 	uintptr	limit;
1163de6a9c0SDavid du Colombier 	uintptr	kbase;
1173de6a9c0SDavid du Colombier 	uintptr	klimit;
1183de6a9c0SDavid du Colombier };
1193de6a9c0SDavid du Colombier 
1203de6a9c0SDavid du Colombier struct Conf
1213de6a9c0SDavid du Colombier {
1223de6a9c0SDavid du Colombier 	ulong	nmach;		/* processors */
1233de6a9c0SDavid du Colombier 	ulong	nproc;		/* processes */
1243de6a9c0SDavid du Colombier 	Confmem	mem[1];		/* physical memory */
1253de6a9c0SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
1263de6a9c0SDavid du Colombier 	usize	upages;		/* user page pool */
1273de6a9c0SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
1283de6a9c0SDavid du Colombier 	ulong	ialloc;		/* max interrupt time allocation in bytes */
1293de6a9c0SDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
1303de6a9c0SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
1313de6a9c0SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
1323de6a9c0SDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
1333de6a9c0SDavid du Colombier 	ulong	hz;		/* processor cycle freq */
1343de6a9c0SDavid du Colombier 	ulong	mhz;
1353de6a9c0SDavid du Colombier 	int	monitor;	/* flag */
1363de6a9c0SDavid du Colombier };
1373de6a9c0SDavid du Colombier 
1383de6a9c0SDavid du Colombier /*
1393de6a9c0SDavid du Colombier  *  things saved in the Proc structure during a notify
1403de6a9c0SDavid du Colombier  */
1413de6a9c0SDavid du Colombier struct Notsave {
1423de6a9c0SDavid du Colombier 	int	emptiness;
1433de6a9c0SDavid du Colombier };
1443de6a9c0SDavid du Colombier 
1453de6a9c0SDavid du Colombier /*
1463de6a9c0SDavid du Colombier  *  MMU stuff in Mach.
1473de6a9c0SDavid du Colombier  */
1483de6a9c0SDavid du Colombier struct MMMU
1493de6a9c0SDavid du Colombier {
1503de6a9c0SDavid du Colombier 	PTE*	mmul1;		/* l1 for this processor */
1513de6a9c0SDavid du Colombier 	int	mmul1lo;
1523de6a9c0SDavid du Colombier 	int	mmul1hi;
1533de6a9c0SDavid du Colombier 	int	mmupid;
1543de6a9c0SDavid du Colombier };
1553de6a9c0SDavid du Colombier 
1563de6a9c0SDavid du Colombier /*
1573de6a9c0SDavid du Colombier  *  MMU stuff in proc
1583de6a9c0SDavid du Colombier  */
1593de6a9c0SDavid du Colombier #define NCOLOR	1		/* 1 level cache, don't worry about VCE's */
1603de6a9c0SDavid du Colombier struct PMMU
1613de6a9c0SDavid du Colombier {
1623de6a9c0SDavid du Colombier 	Page*	mmul2;
1633de6a9c0SDavid du Colombier 	Page*	mmul2cache;	/* free mmu pages */
1643de6a9c0SDavid du Colombier };
1653de6a9c0SDavid du Colombier 
1663de6a9c0SDavid du Colombier #include "../port/portdat.h"
1673de6a9c0SDavid du Colombier 
1683de6a9c0SDavid du Colombier struct Mach
1693de6a9c0SDavid du Colombier {
1703de6a9c0SDavid du Colombier 	/* offsets known to asm */
1713de6a9c0SDavid du Colombier 	int	machno;			/* physical id of processor */
1723de6a9c0SDavid du Colombier 	uintptr	splpc;			/* pc of last caller to splhi */
1733de6a9c0SDavid du Colombier 
1743de6a9c0SDavid du Colombier 	Proc*	proc;			/* current process */
1753de6a9c0SDavid du Colombier 
1763de6a9c0SDavid du Colombier 	MMMU;
1773de6a9c0SDavid du Colombier 	/* end of offsets known to asm */
1783de6a9c0SDavid du Colombier 	int	flushmmu;		/* flush current proc mmu state */
1793de6a9c0SDavid du Colombier 
1803de6a9c0SDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
1813de6a9c0SDavid du Colombier 	Label	sched;			/* scheduler wakeup */
1823de6a9c0SDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
1833de6a9c0SDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
1843de6a9c0SDavid du Colombier 	int	inclockintr;
1853de6a9c0SDavid du Colombier 
1863de6a9c0SDavid du Colombier 	Proc*	readied;		/* for runproc */
1873de6a9c0SDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
1883de6a9c0SDavid du Colombier 
1893de6a9c0SDavid du Colombier 	int	cputype;
1903de6a9c0SDavid du Colombier 	ulong	delayloop;
1913de6a9c0SDavid du Colombier 
1923de6a9c0SDavid du Colombier 	/* stats */
1933de6a9c0SDavid du Colombier 	int	tlbfault;
1943de6a9c0SDavid du Colombier 	int	tlbpurge;
1953de6a9c0SDavid du Colombier 	int	pfault;
1963de6a9c0SDavid du Colombier 	int	cs;
1973de6a9c0SDavid du Colombier 	int	syscall;
1983de6a9c0SDavid du Colombier 	int	load;
1993de6a9c0SDavid du Colombier 	int	intr;
2003de6a9c0SDavid du Colombier 	uvlong	fastclock;		/* last sampled value */
2013de6a9c0SDavid du Colombier 	ulong	spuriousintr;
2023de6a9c0SDavid du Colombier 	int	lastintr;
2033de6a9c0SDavid du Colombier 	int	ilockdepth;
2043de6a9c0SDavid du Colombier 	Perf	perf;			/* performance counters */
2053de6a9c0SDavid du Colombier 
2063de6a9c0SDavid du Colombier 	int	probing;		/* probeaddr() state */
2073de6a9c0SDavid du Colombier 	int	trapped;
2083de6a9c0SDavid du Colombier 	Lock	probelock;
2093de6a9c0SDavid du Colombier 	int	inidlehands;
2103de6a9c0SDavid du Colombier 
2113de6a9c0SDavid du Colombier 	int	cpumhz;
2123de6a9c0SDavid du Colombier 	uvlong	cpuhz;			/* speed of cpu */
2133de6a9c0SDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
2143de6a9c0SDavid du Colombier 
2153de6a9c0SDavid du Colombier 	/* vfp3 fpu */
2163de6a9c0SDavid du Colombier 	int	havefp;
2173de6a9c0SDavid du Colombier 	int	havefpvalid;
2183de6a9c0SDavid du Colombier 	int	fpon;
2193de6a9c0SDavid du Colombier 	int	fpconfiged;
2203de6a9c0SDavid du Colombier 	int	fpnregs;
2213de6a9c0SDavid du Colombier 	ulong	fpscr;			/* sw copy */
2223de6a9c0SDavid du Colombier 	int	fppid;			/* pid of last fault */
2233de6a9c0SDavid du Colombier 	uintptr	fppc;			/* addr of last fault */
2243de6a9c0SDavid du Colombier 	int	fpcnt;			/* how many consecutive at that addr */
2253de6a9c0SDavid du Colombier 
2263de6a9c0SDavid du Colombier 	/* save areas for exceptions, hold R0-R4 */
2273de6a9c0SDavid du Colombier 	u32int	sfiq[5];
2283de6a9c0SDavid du Colombier 	u32int	sirq[5];
2293de6a9c0SDavid du Colombier 	u32int	sund[5];
2303de6a9c0SDavid du Colombier 	u32int	sabt[5];
2313de6a9c0SDavid du Colombier 	u32int	smon[5];		/* probably not needed */
2323de6a9c0SDavid du Colombier 	u32int	ssys[5];
2333de6a9c0SDavid du Colombier 
2343de6a9c0SDavid du Colombier 	int	stack[1];
2353de6a9c0SDavid du Colombier };
2363de6a9c0SDavid du Colombier 
2373de6a9c0SDavid du Colombier /*
2383de6a9c0SDavid du Colombier  * Fake kmap.
2393de6a9c0SDavid du Colombier  */
2403de6a9c0SDavid du Colombier typedef void		KMap;
2413de6a9c0SDavid du Colombier #define	VA(k)		((uintptr)(k))
2423de6a9c0SDavid du Colombier #define	kmap(p)		(KMap*)((p)->pa|kseg0)
2433de6a9c0SDavid du Colombier #define	kunmap(k)
2443de6a9c0SDavid du Colombier 
2453de6a9c0SDavid du Colombier struct
2463de6a9c0SDavid du Colombier {
2473de6a9c0SDavid du Colombier 	Lock;
2483de6a9c0SDavid du Colombier 	int	machs;			/* bitmap of active CPUs */
2493de6a9c0SDavid du Colombier 	int	wfi;			/* bitmap of CPUs in WFI state */
2503de6a9c0SDavid du Colombier 	int	stopped;		/* bitmap of CPUs stopped */
2513de6a9c0SDavid du Colombier 	int	exiting;		/* shutdown */
2523de6a9c0SDavid du Colombier 	int	ispanic;		/* shutdown in response to a panic */
2533de6a9c0SDavid du Colombier 	int	thunderbirdsarego;	/* lets the added processors continue to schedinit */
2543de6a9c0SDavid du Colombier }active;
2553de6a9c0SDavid du Colombier 
2563de6a9c0SDavid du Colombier extern register Mach* m;			/* R10 */
2573de6a9c0SDavid du Colombier extern register Proc* up;			/* R9 */
2583de6a9c0SDavid du Colombier 
2593de6a9c0SDavid du Colombier /* an object guaranteed to be in its own cache line */
2603de6a9c0SDavid du Colombier typedef uchar Cacheline[CACHELINESZ];
2613de6a9c0SDavid du Colombier struct Isolated {
2623de6a9c0SDavid du Colombier 	Cacheline c0;
2633de6a9c0SDavid du Colombier 	ulong	word;
2643de6a9c0SDavid du Colombier 	Cacheline c1;
2653de6a9c0SDavid du Colombier };
2663de6a9c0SDavid du Colombier 
2673de6a9c0SDavid du Colombier extern Memcache cachel[];		/* arm arch v7 supports 1-7 */
2683de6a9c0SDavid du Colombier extern ulong intrcount[MAXMACH];
2693de6a9c0SDavid du Colombier extern int irqtooearly;
2703de6a9c0SDavid du Colombier extern uintptr kseg0;
2713de6a9c0SDavid du Colombier extern Isolated l1ptstable;
2723de6a9c0SDavid du Colombier extern uchar *l2pages;
2733de6a9c0SDavid du Colombier extern Mach* machaddr[MAXMACH];
2743de6a9c0SDavid du Colombier extern ulong memsize;
2753de6a9c0SDavid du Colombier extern int navailcpus;
2763de6a9c0SDavid du Colombier extern int normalprint;
2773de6a9c0SDavid du Colombier 
2783de6a9c0SDavid du Colombier /*
2793de6a9c0SDavid du Colombier  *  a parsed plan9.ini line
2803de6a9c0SDavid du Colombier  */
2813de6a9c0SDavid du Colombier #define NISAOPT		8
2823de6a9c0SDavid du Colombier 
2833de6a9c0SDavid du Colombier struct ISAConf {
2843de6a9c0SDavid du Colombier 	char	*type;
2853de6a9c0SDavid du Colombier 	ulong	port;
2863de6a9c0SDavid du Colombier 	int	irq;
2873de6a9c0SDavid du Colombier 	ulong	dma;
2883de6a9c0SDavid du Colombier 	ulong	mem;
2893de6a9c0SDavid du Colombier 	ulong	size;
2903de6a9c0SDavid du Colombier 	ulong	freq;
2913de6a9c0SDavid du Colombier 
2923de6a9c0SDavid du Colombier 	int	nopt;
2933de6a9c0SDavid du Colombier 	char	*opt[NISAOPT];
2943de6a9c0SDavid du Colombier };
2953de6a9c0SDavid du Colombier 
2963de6a9c0SDavid du Colombier #define	MACHP(n) machaddr[n]
2973de6a9c0SDavid du Colombier 
2983de6a9c0SDavid du Colombier /*
2993de6a9c0SDavid du Colombier  * Horrid. But the alternative is 'defined'.
3003de6a9c0SDavid du Colombier  */
3013de6a9c0SDavid du Colombier #ifdef _DBGC_
3023de6a9c0SDavid du Colombier #define DBGFLG		(dbgflg[_DBGC_])
3033de6a9c0SDavid du Colombier #else
3043de6a9c0SDavid du Colombier #define DBGFLG		(0)
3053de6a9c0SDavid du Colombier #endif /* _DBGC_ */
3063de6a9c0SDavid du Colombier 
3073de6a9c0SDavid du Colombier int vflag;
3083de6a9c0SDavid du Colombier extern char dbgflg[256];
3093de6a9c0SDavid du Colombier 
3103de6a9c0SDavid du Colombier #define dbgprint	print		/* for now */
3113de6a9c0SDavid du Colombier 
3123de6a9c0SDavid du Colombier /*
3133de6a9c0SDavid du Colombier  *  hardware info about a device
3143de6a9c0SDavid du Colombier  */
3153de6a9c0SDavid du Colombier typedef struct {
3163de6a9c0SDavid du Colombier 	ulong	port;
3173de6a9c0SDavid du Colombier 	int	size;
3183de6a9c0SDavid du Colombier } Devport;
3193de6a9c0SDavid du Colombier 
3203de6a9c0SDavid du Colombier struct DevConf
3213de6a9c0SDavid du Colombier {
3223de6a9c0SDavid du Colombier 	ulong	intnum;			/* interrupt number */
3233de6a9c0SDavid du Colombier 	char	*type;			/* card type, malloced */
3243de6a9c0SDavid du Colombier 	int	nports;			/* Number of ports */
3253de6a9c0SDavid du Colombier 	Devport	*ports;			/* The ports themselves */
3263de6a9c0SDavid du Colombier };
3273de6a9c0SDavid du Colombier 
3283de6a9c0SDavid du Colombier /* characteristics of a given arm cache level */
3293de6a9c0SDavid du Colombier struct Memcache {
3303de6a9c0SDavid du Colombier 	uint	waysh;		/* shifts for set/way register */
3313de6a9c0SDavid du Colombier 	uint	setsh;
3323de6a9c0SDavid du Colombier 
3333de6a9c0SDavid du Colombier 	uint	log2linelen;
3343de6a9c0SDavid du Colombier 
3353de6a9c0SDavid du Colombier 	uint	level;		/* 1 is nearest processor, 2 further away */
3363de6a9c0SDavid du Colombier 	uint	type;
3373de6a9c0SDavid du Colombier 	uint	external;	/* flag */
3383de6a9c0SDavid du Colombier 	uint	l1ip;		/* l1 I policy */
3393de6a9c0SDavid du Colombier 
3403de6a9c0SDavid du Colombier 	uint	nways;		/* associativity */
3413de6a9c0SDavid du Colombier 	uint	nsets;
3423de6a9c0SDavid du Colombier 	uint	linelen;	/* bytes per cache line */
3433de6a9c0SDavid du Colombier 	uint	setsways;
3443de6a9c0SDavid du Colombier };
3453de6a9c0SDavid du Colombier enum Cachetype {
3463de6a9c0SDavid du Colombier 	Nocache,
3473de6a9c0SDavid du Colombier 	Ionly,
3483de6a9c0SDavid du Colombier 	Donly,
3493de6a9c0SDavid du Colombier 	Splitid,
3503de6a9c0SDavid du Colombier 	Unified,
3513de6a9c0SDavid du Colombier };
3523de6a9c0SDavid du Colombier enum {
3533de6a9c0SDavid du Colombier 	Intcache,
3543de6a9c0SDavid du Colombier 	Extcache,
3553de6a9c0SDavid du Colombier };
3563de6a9c0SDavid du Colombier 
3573de6a9c0SDavid du Colombier /*
3583de6a9c0SDavid du Colombier  * characteristics of cache level, kept at low, fixed address (CACHECONF).
3593de6a9c0SDavid du Colombier  * all offsets are known to cache.v7.s.
3603de6a9c0SDavid du Colombier  */
3613de6a9c0SDavid du Colombier struct Lowmemcache {
3623de6a9c0SDavid du Colombier 	uint	l1waysh;		/* shifts for set/way register */
3633de6a9c0SDavid du Colombier 	uint	l1setsh;
3643de6a9c0SDavid du Colombier 	uint	l2waysh;
3653de6a9c0SDavid du Colombier 	uint	l2setsh;
3663de6a9c0SDavid du Colombier };
3673de6a9c0SDavid du Colombier 
3683de6a9c0SDavid du Colombier /*
3693de6a9c0SDavid du Colombier  * cache capabilities.  write-back vs write-through is controlled
3703de6a9c0SDavid du Colombier  * by the Buffered bit in PTEs.
3713de6a9c0SDavid du Colombier  *
3723de6a9c0SDavid du Colombier  * see cache.v7.s and Memcache in dat.h
3733de6a9c0SDavid du Colombier  */
3743de6a9c0SDavid du Colombier enum {
3753de6a9c0SDavid du Colombier 	Cawt	= 1 << 31,
3763de6a9c0SDavid du Colombier 	Cawb	= 1 << 30,
3773de6a9c0SDavid du Colombier 	Cara	= 1 << 29,
3783de6a9c0SDavid du Colombier 	Cawa	= 1 << 28,
3793de6a9c0SDavid du Colombier };
3803de6a9c0SDavid du Colombier 
3813de6a9c0SDavid du Colombier /* non-architectural L2 cache */
3823de6a9c0SDavid du Colombier typedef struct Cacheimpl Cacheimpl;
3833de6a9c0SDavid du Colombier struct Cacheimpl {
3843de6a9c0SDavid du Colombier 	void	(*info)(Memcache *);
3853de6a9c0SDavid du Colombier 	void	(*on)(void);
3863de6a9c0SDavid du Colombier 	void	(*off)(void);
3873de6a9c0SDavid du Colombier 
3883de6a9c0SDavid du Colombier 	void	(*inv)(void);
3893de6a9c0SDavid du Colombier 	void	(*wb)(void);
3903de6a9c0SDavid du Colombier 	void	(*wbinv)(void);
3913de6a9c0SDavid du Colombier 
3923de6a9c0SDavid du Colombier 	void	(*invse)(void *, int);
3933de6a9c0SDavid du Colombier 	void	(*wbse)(void *, int);
3943de6a9c0SDavid du Colombier 	void	(*wbinvse)(void *, int);
3953de6a9c0SDavid du Colombier };
3963de6a9c0SDavid du Colombier /* extern */ Cacheimpl *l2cache, *allcache, *nocache, *l1cache;
3973de6a9c0SDavid du Colombier 
3983de6a9c0SDavid du Colombier enum Dmamode {
3993de6a9c0SDavid du Colombier 	Const,
4003de6a9c0SDavid du Colombier 	Postincr,
4013de6a9c0SDavid du Colombier 	Index,
4023de6a9c0SDavid du Colombier 	Index2,
4033de6a9c0SDavid du Colombier };
4043de6a9c0SDavid du Colombier 
4053de6a9c0SDavid du Colombier /* pmu = power management unit */
4063de6a9c0SDavid du Colombier enum Irqs {
4073de6a9c0SDavid du Colombier 	/*
4083de6a9c0SDavid du Colombier 	 * 1st 32 gic irqs reserved for cpu; private interrupts.
4093de6a9c0SDavid du Colombier 	 *  0—15 are software-generated by other cpus;
4103de6a9c0SDavid du Colombier 	 * 16—31 are private peripheral intrs.
4113de6a9c0SDavid du Colombier 	 */
4123de6a9c0SDavid du Colombier 	Cpu0irq		= 0,
4133de6a9c0SDavid du Colombier 	Cpu1irq,
4143de6a9c0SDavid du Colombier 	/* ... */
4153de6a9c0SDavid du Colombier 	Cpu15irq	= 15,
4163de6a9c0SDavid du Colombier 	Glbtmrirq	= 27,
4173de6a9c0SDavid du Colombier 	Loctmrirq	= 29,
4183de6a9c0SDavid du Colombier 	Wdtmrirq	= 30,
4193de6a9c0SDavid du Colombier 
4203de6a9c0SDavid du Colombier 	/* shared interrupts */
4213de6a9c0SDavid du Colombier 	Ctlr0base	= (1+0)*32,		/* primary ctlr */
4223de6a9c0SDavid du Colombier 	Tn0irq		= Ctlr0base + 0,	/* tegra timers */
4233de6a9c0SDavid du Colombier 	Tn1irq		= Ctlr0base + 1,
4243de6a9c0SDavid du Colombier 	Rtcirq		= Ctlr0base + 2,
4253de6a9c0SDavid du Colombier 
4263de6a9c0SDavid du Colombier 	Ctlr1base	= (1+1)*32,		/* secondary ctlr */
4273de6a9c0SDavid du Colombier 	Uartirq		= Ctlr1base + 4,
4283de6a9c0SDavid du Colombier 	Tn2irq		= Ctlr1base + 9,	/* tegra timers */
4293de6a9c0SDavid du Colombier 	Tn3irq		= Ctlr1base + 10,
4303de6a9c0SDavid du Colombier 	/* +24 is cpu0_pmu_intr, +25 is cpu1_pum_intr */
4313de6a9c0SDavid du Colombier 
4323de6a9c0SDavid du Colombier 	Ctlr2base	= (1+2)*32,		/* ternary ctlr */
4333de6a9c0SDavid du Colombier 	Extpmuirq	= Ctlr2base + 22,
4343de6a9c0SDavid du Colombier 
4353de6a9c0SDavid du Colombier 	Ctlr3base	= (1+3)*32,		/* quad ctlr */
4363de6a9c0SDavid du Colombier 	Pcieirq		= Ctlr3base + 2,
4373de6a9c0SDavid du Colombier };
4383de6a9c0SDavid du Colombier 
4393de6a9c0SDavid du Colombier struct Soc {			/* addr's of SoC controllers */
4403de6a9c0SDavid du Colombier 	uintptr clkrst;
4413de6a9c0SDavid du Colombier 	uintptr	power;
4423de6a9c0SDavid du Colombier 	uintptr	exceptvec;
4433de6a9c0SDavid du Colombier 	uintptr	sema;
4443de6a9c0SDavid du Colombier 	uintptr	l2cache;
4453de6a9c0SDavid du Colombier 	uintptr	flow;
4463de6a9c0SDavid du Colombier 
4473de6a9c0SDavid du Colombier 	/* private memory region */
4483de6a9c0SDavid du Colombier 	uintptr	scu;
4493de6a9c0SDavid du Colombier 	uintptr	intr;		/* `cpu interface' */
4503de6a9c0SDavid du Colombier 	/* private-peripheral-interrupt cortex-a clocks */
4513de6a9c0SDavid du Colombier 	uintptr	glbtmr;
4523de6a9c0SDavid du Colombier 	uintptr	loctmr;
4533de6a9c0SDavid du Colombier 
4543de6a9c0SDavid du Colombier 	uintptr	intrdist;
4553de6a9c0SDavid du Colombier 
4563de6a9c0SDavid du Colombier 	uintptr	uart[5];
4573de6a9c0SDavid du Colombier 
4583de6a9c0SDavid du Colombier 	/* shared-peripheral-interrupt tegra2 clocks */
4593de6a9c0SDavid du Colombier 	uintptr	rtc;		/* real-time clock */
4603de6a9c0SDavid du Colombier 	uintptr	tmr[4];
4613de6a9c0SDavid du Colombier 	uintptr	µs;
4623de6a9c0SDavid du Colombier 
4633de6a9c0SDavid du Colombier 	uintptr	pci;
4643de6a9c0SDavid du Colombier 	uintptr	ether;
4653de6a9c0SDavid du Colombier 
4663de6a9c0SDavid du Colombier 	uintptr	ehci;
4673de6a9c0SDavid du Colombier 	uintptr	ide;
4683de6a9c0SDavid du Colombier 
4693de6a9c0SDavid du Colombier 	uintptr	nand;
4703de6a9c0SDavid du Colombier 	uintptr	nor;
4713de6a9c0SDavid du Colombier 
4723de6a9c0SDavid du Colombier 	uintptr	spi[4];
4733de6a9c0SDavid du Colombier 	uintptr	twsi;
4743de6a9c0SDavid du Colombier 	uintptr	mmc[4];
4753de6a9c0SDavid du Colombier 	uintptr	gpio[7];
4763de6a9c0SDavid du Colombier } soc;
4773de6a9c0SDavid du Colombier extern Soc soc;
478