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