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