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