1154abd99SDavid du Colombier typedef struct Conf Conf; 2154abd99SDavid du Colombier typedef struct Confmem Confmem; 3154abd99SDavid du Colombier typedef struct FPsave FPsave; 4154abd99SDavid du Colombier typedef struct ISAConf ISAConf; 5154abd99SDavid du Colombier typedef struct Label Label; 6154abd99SDavid du Colombier typedef struct Lock Lock; 7b72bcbbfSDavid du Colombier typedef struct Memcache Memcache; 8154abd99SDavid du Colombier typedef struct MMMU MMMU; 9154abd99SDavid du Colombier typedef struct Mach Mach; 10154abd99SDavid du Colombier typedef struct Page Page; 11154abd99SDavid du Colombier typedef struct Pcidev Pcidev; 12154abd99SDavid du Colombier typedef struct PhysUart PhysUart; 13154abd99SDavid du Colombier typedef struct PMMU PMMU; 14154abd99SDavid du Colombier typedef struct Proc Proc; 15154abd99SDavid du Colombier typedef u32int PTE; 167365b686SDavid du Colombier typedef struct Soc Soc; 17154abd99SDavid du Colombier typedef struct Uart Uart; 18154abd99SDavid du Colombier typedef struct Ureg Ureg; 19154abd99SDavid du Colombier typedef uvlong Tval; 20154abd99SDavid du Colombier 21154abd99SDavid du Colombier #pragma incomplete Pcidev 22154abd99SDavid du Colombier #pragma incomplete Ureg 23154abd99SDavid du Colombier 24154abd99SDavid du Colombier #define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */ 25154abd99SDavid du Colombier 26154abd99SDavid du Colombier /* 27154abd99SDavid du Colombier * parameters for sysproc.c 28154abd99SDavid du Colombier */ 29154abd99SDavid du Colombier #define AOUT_MAGIC (E_MAGIC) 30154abd99SDavid du Colombier 31154abd99SDavid du Colombier struct Lock 32154abd99SDavid du Colombier { 33154abd99SDavid du Colombier ulong key; 34154abd99SDavid du Colombier u32int sr; 35154abd99SDavid du Colombier uintptr pc; 36154abd99SDavid du Colombier Proc* p; 37154abd99SDavid du Colombier Mach* m; 38154abd99SDavid du Colombier int isilock; 39154abd99SDavid du Colombier }; 40154abd99SDavid du Colombier 41154abd99SDavid du Colombier struct Label 42154abd99SDavid du Colombier { 43154abd99SDavid du Colombier uintptr sp; 44154abd99SDavid du Colombier uintptr pc; 45154abd99SDavid du Colombier }; 46154abd99SDavid du Colombier 47154abd99SDavid du Colombier /* 48154abd99SDavid du Colombier * emulated floating point 49154abd99SDavid du Colombier */ 5048bb54a3SDavid du Colombier struct FPsave 51154abd99SDavid du Colombier { 52154abd99SDavid du Colombier ulong status; 53154abd99SDavid du Colombier ulong control; 54154abd99SDavid du Colombier ulong regs[8][3]; 55154abd99SDavid du Colombier 56154abd99SDavid du Colombier int fpstate; 57154abd99SDavid du Colombier }; 58154abd99SDavid du Colombier 59154abd99SDavid du Colombier /* 6048bb54a3SDavid du Colombier * FPsave.status 61154abd99SDavid du Colombier */ 62154abd99SDavid du Colombier enum 63154abd99SDavid du Colombier { 64154abd99SDavid du Colombier FPinit, 65154abd99SDavid du Colombier FPactive, 66154abd99SDavid du Colombier FPinactive, 67*3b58d1fcSDavid du Colombier 68*3b58d1fcSDavid du Colombier /* bit or'd with the state */ 69*3b58d1fcSDavid du Colombier FPillegal= 0x100, 70154abd99SDavid du Colombier }; 71154abd99SDavid du Colombier 72154abd99SDavid du Colombier struct Confmem 73154abd99SDavid du Colombier { 74154abd99SDavid du Colombier uintptr base; 75154abd99SDavid du Colombier usize npage; 76154abd99SDavid du Colombier uintptr limit; 77154abd99SDavid du Colombier uintptr kbase; 78154abd99SDavid du Colombier uintptr klimit; 79154abd99SDavid du Colombier }; 80154abd99SDavid du Colombier 81154abd99SDavid du Colombier struct Conf 82154abd99SDavid du Colombier { 83154abd99SDavid du Colombier ulong nmach; /* processors */ 84154abd99SDavid du Colombier ulong nproc; /* processes */ 855e27dea9SDavid du Colombier ulong monitor; /* has monitor? */ 86154abd99SDavid du Colombier Confmem mem[1]; /* physical memory */ 87154abd99SDavid du Colombier ulong npage; /* total physical pages of memory */ 88154abd99SDavid du Colombier usize upages; /* user page pool */ 89154abd99SDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 90154abd99SDavid du Colombier ulong ialloc; /* max interrupt time allocation in bytes */ 91154abd99SDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 92154abd99SDavid du Colombier ulong nimage; /* number of page cache image headers */ 93154abd99SDavid du Colombier ulong nswap; /* number of swap pages */ 94154abd99SDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 95154abd99SDavid du Colombier // ulong hz; /* processor cycle freq */ 96154abd99SDavid du Colombier // ulong mhz; 97154abd99SDavid du Colombier }; 98154abd99SDavid du Colombier 9948bb54a3SDavid du Colombier /* 100154abd99SDavid du Colombier * MMU stuff in Mach. 101154abd99SDavid du Colombier */ 102154abd99SDavid du Colombier struct MMMU 103154abd99SDavid du Colombier { 104154abd99SDavid du Colombier PTE* mmul1; /* l1 for this processor */ 105154abd99SDavid du Colombier int mmul1lo; 106154abd99SDavid du Colombier int mmul1hi; 107154abd99SDavid du Colombier int mmupid; 108154abd99SDavid du Colombier }; 109154abd99SDavid du Colombier 110154abd99SDavid du Colombier /* 111154abd99SDavid du Colombier * MMU stuff in proc 112154abd99SDavid du Colombier */ 113154abd99SDavid du Colombier #define NCOLOR 1 /* 1 level cache, don't worry about VCE's */ 114154abd99SDavid du Colombier struct PMMU 115154abd99SDavid du Colombier { 116154abd99SDavid du Colombier Page* mmul2; 117154abd99SDavid du Colombier Page* mmul2cache; /* free mmu pages */ 118154abd99SDavid du Colombier }; 119154abd99SDavid du Colombier 120154abd99SDavid du Colombier #include "../port/portdat.h" 121154abd99SDavid du Colombier 122154abd99SDavid du Colombier struct Mach 123154abd99SDavid du Colombier { 124154abd99SDavid du Colombier int machno; /* physical id of processor */ 125154abd99SDavid du Colombier uintptr splpc; /* pc of last caller to splhi */ 126154abd99SDavid du Colombier 127154abd99SDavid du Colombier Proc* proc; /* current process */ 128154abd99SDavid du Colombier 129154abd99SDavid du Colombier MMMU; 130154abd99SDavid du Colombier int flushmmu; /* flush current proc mmu state */ 131154abd99SDavid du Colombier 132154abd99SDavid du Colombier ulong ticks; /* of the clock since boot time */ 133154abd99SDavid du Colombier Label sched; /* scheduler wakeup */ 134154abd99SDavid du Colombier Lock alarmlock; /* access to alarm list */ 135154abd99SDavid du Colombier void* alarm; /* alarms bound to this clock */ 136154abd99SDavid du Colombier int inclockintr; 137154abd99SDavid du Colombier 138154abd99SDavid du Colombier Proc* readied; /* for runproc */ 139154abd99SDavid du Colombier ulong schedticks; /* next forced context switch */ 140154abd99SDavid du Colombier 141154abd99SDavid du Colombier int cputype; 142ab6ce076SDavid du Colombier int socrev; /* system-on-chip revision */ 143154abd99SDavid du Colombier ulong delayloop; 144154abd99SDavid du Colombier 145154abd99SDavid du Colombier /* stats */ 146154abd99SDavid du Colombier int tlbfault; 147154abd99SDavid du Colombier int tlbpurge; 148154abd99SDavid du Colombier int pfault; 149154abd99SDavid du Colombier int cs; 150154abd99SDavid du Colombier int syscall; 151154abd99SDavid du Colombier int load; 152154abd99SDavid du Colombier int intr; 153154abd99SDavid du Colombier vlong fastclock; /* last sampled value */ 154154abd99SDavid du Colombier ulong spuriousintr; 155154abd99SDavid du Colombier int lastintr; 156154abd99SDavid du Colombier int ilockdepth; 157154abd99SDavid du Colombier Perf perf; /* performance counters */ 158154abd99SDavid du Colombier 159154abd99SDavid du Colombier uvlong cpuhz; /* speed of cpu */ 160154abd99SDavid du Colombier uvlong cyclefreq; /* Frequency of user readable cycle counter */ 161154abd99SDavid du Colombier 162154abd99SDavid du Colombier /* save areas for exceptions */ 163154abd99SDavid du Colombier u32int sfiq[5]; 164154abd99SDavid du Colombier u32int sirq[5]; 165154abd99SDavid du Colombier u32int sund[5]; 166154abd99SDavid du Colombier u32int sabt[5]; 167154abd99SDavid du Colombier #define fiqstack sfiq 168154abd99SDavid du Colombier #define irqstack sirq 169154abd99SDavid du Colombier #define abtstack sabt 170154abd99SDavid du Colombier #define undstack sund 171154abd99SDavid du Colombier 172154abd99SDavid du Colombier int stack[1]; 173154abd99SDavid du Colombier }; 174154abd99SDavid du Colombier 175154abd99SDavid du Colombier /* 176154abd99SDavid du Colombier * Fake kmap. 177154abd99SDavid du Colombier */ 178154abd99SDavid du Colombier typedef void KMap; 179154abd99SDavid du Colombier #define VA(k) ((uintptr)(k)) 180154abd99SDavid du Colombier #define kmap(p) (KMap*)((p)->pa|kseg0) 181154abd99SDavid du Colombier #define kunmap(k) 182154abd99SDavid du Colombier 183154abd99SDavid du Colombier struct 184154abd99SDavid du Colombier { 185154abd99SDavid du Colombier Lock; 186154abd99SDavid du Colombier int machs; /* bitmap of active CPUs */ 187154abd99SDavid du Colombier int exiting; /* shutdown */ 188154abd99SDavid du Colombier int ispanic; /* shutdown in response to a panic */ 189154abd99SDavid du Colombier }active; 190154abd99SDavid du Colombier 191154abd99SDavid du Colombier enum { 192154abd99SDavid du Colombier Frequency = 1200*1000*1000, /* the processor clock */ 193154abd99SDavid du Colombier }; 194154abd99SDavid du Colombier 195154abd99SDavid du Colombier extern register Mach* m; /* R10 */ 196154abd99SDavid du Colombier extern register Proc* up; /* R9 */ 197a7a38e3eSDavid du Colombier 198154abd99SDavid du Colombier extern uintptr kseg0; 199154abd99SDavid du Colombier extern Mach* machaddr[MAXMACH]; 200b649930dSDavid du Colombier extern ulong memsize; 201154abd99SDavid du Colombier 202154abd99SDavid du Colombier enum { 203154abd99SDavid du Colombier Nvec = 8, /* # of vectors at start of lexception.s */ 204154abd99SDavid du Colombier }; 205154abd99SDavid du Colombier 206154abd99SDavid du Colombier /* 207154abd99SDavid du Colombier * Layout of physical 0. 208154abd99SDavid du Colombier */ 209154abd99SDavid du Colombier typedef struct Vectorpage { 210154abd99SDavid du Colombier void (*vectors[Nvec])(void); 211154abd99SDavid du Colombier uint vtable[Nvec]; 212154abd99SDavid du Colombier } Vectorpage; 213154abd99SDavid du Colombier 214154abd99SDavid du Colombier /* 215154abd99SDavid du Colombier * a parsed plan9.ini line 216154abd99SDavid du Colombier */ 217154abd99SDavid du Colombier #define NISAOPT 8 218154abd99SDavid du Colombier 219154abd99SDavid du Colombier struct ISAConf { 220154abd99SDavid du Colombier char *type; 221154abd99SDavid du Colombier ulong port; 222154abd99SDavid du Colombier int irq; 223154abd99SDavid du Colombier ulong dma; 224154abd99SDavid du Colombier ulong mem; 225154abd99SDavid du Colombier ulong size; 226154abd99SDavid du Colombier ulong freq; 227154abd99SDavid du Colombier 228154abd99SDavid du Colombier int nopt; 229154abd99SDavid du Colombier char *opt[NISAOPT]; 230154abd99SDavid du Colombier }; 231154abd99SDavid du Colombier 232154abd99SDavid du Colombier #define MACHP(n) (machaddr[n]) 233154abd99SDavid du Colombier 234154abd99SDavid du Colombier /* 235154abd99SDavid du Colombier * Horrid. But the alternative is 'defined'. 236154abd99SDavid du Colombier */ 237154abd99SDavid du Colombier #ifdef _DBGC_ 238154abd99SDavid du Colombier #define DBGFLG (dbgflg[_DBGC_]) 239154abd99SDavid du Colombier #else 240154abd99SDavid du Colombier #define DBGFLG (0) 241154abd99SDavid du Colombier #endif /* _DBGC_ */ 242154abd99SDavid du Colombier 243154abd99SDavid du Colombier int vflag; 244154abd99SDavid du Colombier extern char dbgflg[256]; 245154abd99SDavid du Colombier 246154abd99SDavid du Colombier #define dbgprint print /* for now */ 24756713243SDavid du Colombier 24856713243SDavid du Colombier /* 24956713243SDavid du Colombier * hardware info about a device 25056713243SDavid du Colombier */ 25156713243SDavid du Colombier typedef struct { 25256713243SDavid du Colombier ulong port; 25356713243SDavid du Colombier int size; 25456713243SDavid du Colombier } Devport; 25556713243SDavid du Colombier 25656713243SDavid du Colombier struct DevConf 25756713243SDavid du Colombier { 25856713243SDavid du Colombier ulong intnum; /* interrupt number */ 25956713243SDavid du Colombier char *type; /* card type, malloced */ 26056713243SDavid du Colombier int nports; /* Number of ports */ 26156713243SDavid du Colombier Devport *ports; /* The ports themselves */ 26256713243SDavid du Colombier }; 263b72bcbbfSDavid du Colombier 26410dec6bfSDavid du Colombier enum { 26510dec6bfSDavid du Colombier Dcache, 26610dec6bfSDavid du Colombier Icache, 26710dec6bfSDavid du Colombier Unified, 26810dec6bfSDavid du Colombier }; 26910dec6bfSDavid du Colombier 270b72bcbbfSDavid du Colombier /* characteristics of a given cache level */ 271b72bcbbfSDavid du Colombier struct Memcache { 272b72bcbbfSDavid du Colombier uint level; /* 1 is nearest processor, 2 further away */ 27310dec6bfSDavid du Colombier uint kind; /* I, D or unified */ 274b72bcbbfSDavid du Colombier 275b72bcbbfSDavid du Colombier uint size; 276b72bcbbfSDavid du Colombier uint nways; /* associativity */ 277b72bcbbfSDavid du Colombier uint nsets; 278b72bcbbfSDavid du Colombier uint linelen; /* bytes per cache line */ 27910dec6bfSDavid du Colombier uint setsways; 280b72bcbbfSDavid du Colombier 281b72bcbbfSDavid du Colombier uint log2linelen; 282b72bcbbfSDavid du Colombier uint waysh; /* shifts for set/way register */ 283b72bcbbfSDavid du Colombier uint setsh; 284b72bcbbfSDavid du Colombier }; 2857365b686SDavid du Colombier 2867365b686SDavid du Colombier struct Soc { /* addr's of SoC controllers */ 2877365b686SDavid du Colombier uintptr cpu; 2887365b686SDavid du Colombier uintptr devid; 2897365b686SDavid du Colombier uintptr l2cache; 2907365b686SDavid du Colombier uintptr sdramc; 2917365b686SDavid du Colombier 2927365b686SDavid du Colombier uintptr iocfg; 2937365b686SDavid du Colombier uintptr addrmap; 2947365b686SDavid du Colombier uintptr intr; 2957365b686SDavid du Colombier uintptr nand; 2967365b686SDavid du Colombier uintptr cesa; /* crypto accel. */ 2977365b686SDavid du Colombier uintptr ehci; 2987365b686SDavid du Colombier uintptr spi; 2997365b686SDavid du Colombier uintptr twsi; 3007365b686SDavid du Colombier 3017365b686SDavid du Colombier uintptr analog; 3027365b686SDavid du Colombier uintptr pci; 3037365b686SDavid du Colombier uintptr pcibase; 3047365b686SDavid du Colombier 3057365b686SDavid du Colombier uintptr rtc; /* real-time clock */ 3067365b686SDavid du Colombier uintptr clock; 3077365b686SDavid du Colombier 3081ecc8ef2SDavid du Colombier uintptr ether[2]; 3097365b686SDavid du Colombier uintptr sata[3]; 3107365b686SDavid du Colombier uintptr uart[2]; 3117365b686SDavid du Colombier uintptr gpio[2]; 3127365b686SDavid du Colombier } soc; 3137365b686SDavid du Colombier extern Soc soc; 314