1*74a4d8c2SCharles.Forsyth /* 2*74a4d8c2SCharles.Forsyth * Memory and machine-specific definitions. Used in C and assembler. 3*74a4d8c2SCharles.Forsyth */ 4*74a4d8c2SCharles.Forsyth 5*74a4d8c2SCharles.Forsyth /* 6*74a4d8c2SCharles.Forsyth * Sizes 7*74a4d8c2SCharles.Forsyth */ 8*74a4d8c2SCharles.Forsyth 9*74a4d8c2SCharles.Forsyth #define BI2BY 8 /* bits per byte */ 10*74a4d8c2SCharles.Forsyth #define BI2WD 32 /* bits per word */ 11*74a4d8c2SCharles.Forsyth #define BY2WD 4 /* bytes per word */ 12*74a4d8c2SCharles.Forsyth #define BY2V 8 /* bytes per double word */ 13*74a4d8c2SCharles.Forsyth #define BY2PG 4096 /* bytes per page */ 14*74a4d8c2SCharles.Forsyth #define WD2PG (BY2PG/BY2WD) /* words per page */ 15*74a4d8c2SCharles.Forsyth #define PGSHIFT 12 /* log(BY2PG) */ 16*74a4d8c2SCharles.Forsyth #define ROUND(s, sz) (((s)+(sz-1))&~(sz-1)) 17*74a4d8c2SCharles.Forsyth #define PGROUND(s) ROUND(s,BY2PG) 18*74a4d8c2SCharles.Forsyth 19*74a4d8c2SCharles.Forsyth #define MAXMACH 1 /* max # cpus system can run */ 20*74a4d8c2SCharles.Forsyth 21*74a4d8c2SCharles.Forsyth /* 22*74a4d8c2SCharles.Forsyth * Time 23*74a4d8c2SCharles.Forsyth */ 24*74a4d8c2SCharles.Forsyth #define HZ 50 /* clock frequency */ 25*74a4d8c2SCharles.Forsyth #define MS2HZ (1000/HZ) /* millisec per clock tick */ 26*74a4d8c2SCharles.Forsyth #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 27*74a4d8c2SCharles.Forsyth #define MS2TK(t) ((((ulong)(t))*HZ)/1000) /* milliseconds to ticks */ 28*74a4d8c2SCharles.Forsyth 29*74a4d8c2SCharles.Forsyth /* 30*74a4d8c2SCharles.Forsyth * PSR bits 31*74a4d8c2SCharles.Forsyth */ 32*74a4d8c2SCharles.Forsyth #define PSREC 0x00002000 33*74a4d8c2SCharles.Forsyth #define PSREF 0x00001000 34*74a4d8c2SCharles.Forsyth #define PSRSUPER 0x00000080 35*74a4d8c2SCharles.Forsyth #define PSRPSUPER 0x00000040 36*74a4d8c2SCharles.Forsyth #define PSRET 0x00000020 37*74a4d8c2SCharles.Forsyth #define SPL(n) (n<<8) 38*74a4d8c2SCharles.Forsyth 39*74a4d8c2SCharles.Forsyth /* 40*74a4d8c2SCharles.Forsyth * Magic registers 41*74a4d8c2SCharles.Forsyth */ 42*74a4d8c2SCharles.Forsyth 43*74a4d8c2SCharles.Forsyth #define MACH 6 /* R6 is m-> */ 44*74a4d8c2SCharles.Forsyth #define USER 5 /* R5 is u-> */ 45*74a4d8c2SCharles.Forsyth 46*74a4d8c2SCharles.Forsyth /* 47*74a4d8c2SCharles.Forsyth * Fundamental addresses 48*74a4d8c2SCharles.Forsyth */ 49*74a4d8c2SCharles.Forsyth 50*74a4d8c2SCharles.Forsyth #define USERADDR 0xE0000000 51*74a4d8c2SCharles.Forsyth #define UREGADDR (USERADDR+BY2PG-((32+6)*BY2WD)) 52*74a4d8c2SCharles.Forsyth #define BOOTSTACK (KTZERO-0*BY2PG) 53*74a4d8c2SCharles.Forsyth #define TRAPS (KTZERO-2*BY2PG) 54*74a4d8c2SCharles.Forsyth 55*74a4d8c2SCharles.Forsyth /* 56*74a4d8c2SCharles.Forsyth * Reference MMU registers (ASI 4) 57*74a4d8c2SCharles.Forsyth */ 58*74a4d8c2SCharles.Forsyth #define PCR 0x000 59*74a4d8c2SCharles.Forsyth #define CTPR 0x100 60*74a4d8c2SCharles.Forsyth #define CXR 0x200 61*74a4d8c2SCharles.Forsyth #define SFSR 0x300 62*74a4d8c2SCharles.Forsyth #define SFAR 0x400 63*74a4d8c2SCharles.Forsyth 64*74a4d8c2SCharles.Forsyth /* 65*74a4d8c2SCharles.Forsyth * Processor Control Register 66*74a4d8c2SCharles.Forsyth */ 67*74a4d8c2SCharles.Forsyth #define ITBRDISABLE (1<<16) 68*74a4d8c2SCharles.Forsyth #define BOOTMODE (1<<14) /* `must be cleared for normal operation' */ 69*74a4d8c2SCharles.Forsyth #define MEMPCHECK (1<<12) /* check parity */ 70*74a4d8c2SCharles.Forsyth #define ENABCACHE (3<<8) /* I & D caches */ 71*74a4d8c2SCharles.Forsyth #define NOFAULT (1<<1) /* no fault */ 72*74a4d8c2SCharles.Forsyth 73*74a4d8c2SCharles.Forsyth /* 74*74a4d8c2SCharles.Forsyth * special MMU regions 75*74a4d8c2SCharles.Forsyth * DMA segment for SBus DMA mapping via I/O MMU (hardware fixes location) 76*74a4d8c2SCharles.Forsyth * the frame buffer is mapped as one MMU region (16 Mbytes) 77*74a4d8c2SCharles.Forsyth * IO segments for device register pages etc. 78*74a4d8c2SCharles.Forsyth */ 79*74a4d8c2SCharles.Forsyth #define DMARANGE 0 80*74a4d8c2SCharles.Forsyth #define DMASEGSIZE ((16*MB)<<DMARANGE) 81*74a4d8c2SCharles.Forsyth #define DMASEGBASE (0 - DMASEGSIZE) 82*74a4d8c2SCharles.Forsyth #define FBSEGSIZE (1*(16*MB)) /* multiples of 16*MB */ 83*74a4d8c2SCharles.Forsyth #define FBSEGBASE (DMASEGBASE - DMASEGSIZE) 84*74a4d8c2SCharles.Forsyth #define IOSEGSIZE (16*MB) 85*74a4d8c2SCharles.Forsyth #define IOSEGBASE (FBSEGBASE - IOSEGSIZE) 86*74a4d8c2SCharles.Forsyth 87*74a4d8c2SCharles.Forsyth /* 88*74a4d8c2SCharles.Forsyth * MMU entries 89*74a4d8c2SCharles.Forsyth */ 90*74a4d8c2SCharles.Forsyth #define PTPVALID 1 /* page table pointer */ 91*74a4d8c2SCharles.Forsyth #define PTEVALID 2 /* page table entry */ 92*74a4d8c2SCharles.Forsyth #define PTERONLY (2<<2) /* read/execute */ 93*74a4d8c2SCharles.Forsyth #define PTEWRITE (3<<2) /* read/write/execute */ 94*74a4d8c2SCharles.Forsyth #define PTEKERNEL (4<<2) /* execute only */ 95*74a4d8c2SCharles.Forsyth #define PTENOCACHE (0<<7) 96*74a4d8c2SCharles.Forsyth #define PTECACHE (1<<7) 97*74a4d8c2SCharles.Forsyth #define PTEACCESS (1<<5) 98*74a4d8c2SCharles.Forsyth #define PTEMODIFY (1<<6) 99*74a4d8c2SCharles.Forsyth #define PTEMAINMEM 0 100*74a4d8c2SCharles.Forsyth #define PTEIO 0 101*74a4d8c2SCharles.Forsyth #define PTEPROBEMEM (PTEVALID|PTEKERNEL|PTENOCACHE|PTEWRITE|PTEMAINMEM) 102*74a4d8c2SCharles.Forsyth #define PTEUNCACHED PTEACCESS /* use as software flag for putmmu */ 103*74a4d8c2SCharles.Forsyth 104*74a4d8c2SCharles.Forsyth #define NTLBPID 64 /* limited by microsparc hardware contexts */ 105*74a4d8c2SCharles.Forsyth 106*74a4d8c2SCharles.Forsyth #define PTEMAPMEM (1024*1024) 107*74a4d8c2SCharles.Forsyth #define PTEPERTAB (PTEMAPMEM/BY2PG) 108*74a4d8c2SCharles.Forsyth #define SEGMAPSIZE 128 109*74a4d8c2SCharles.Forsyth 110*74a4d8c2SCharles.Forsyth #define INVALIDPTE 0 111*74a4d8c2SCharles.Forsyth #define PPN(pa) (((ulong)(pa)>>4)&0x7FFFFF0) 112*74a4d8c2SCharles.Forsyth #define PPT(pn) ((ulong*)KADDR((((ulong)(pn)&~0xF)<<4))) 113*74a4d8c2SCharles.Forsyth 114*74a4d8c2SCharles.Forsyth /* 115*74a4d8c2SCharles.Forsyth * Virtual addresses 116*74a4d8c2SCharles.Forsyth */ 117*74a4d8c2SCharles.Forsyth #define VTAG(va) ((va>>22)&0x03F) 118*74a4d8c2SCharles.Forsyth #define VPN(va) ((va>>13)&0x1FF) 119*74a4d8c2SCharles.Forsyth 120*74a4d8c2SCharles.Forsyth /* 121*74a4d8c2SCharles.Forsyth * Address spaces 122*74a4d8c2SCharles.Forsyth */ 123*74a4d8c2SCharles.Forsyth #define KZERO 0xE0000000 /* base of kernel address space */ 124*74a4d8c2SCharles.Forsyth #define KTZERO (KZERO+4*BY2PG) /* first address in kernel text */ 125*74a4d8c2SCharles.Forsyth #define KSTACK 8192 /* size of kernel stack */ 126*74a4d8c2SCharles.Forsyth 127*74a4d8c2SCharles.Forsyth #define MACHSIZE 4096 128*74a4d8c2SCharles.Forsyth 129*74a4d8c2SCharles.Forsyth /* 130*74a4d8c2SCharles.Forsyth * control registers in physical address space (ASI 20) 131*74a4d8c2SCharles.Forsyth */ 132*74a4d8c2SCharles.Forsyth #define IOCR 0x10000000 /* IO MMU control register */ 133*74a4d8c2SCharles.Forsyth #define IBAR 0x10000004 /* IO MMU page table base address */ 134*74a4d8c2SCharles.Forsyth #define AFR 0x10000018 /* address flush register */ 135*74a4d8c2SCharles.Forsyth #define AFSR 0x10001000 /* asynch fault status */ 136*74a4d8c2SCharles.Forsyth #define AFAR 0x10001004 /* asynch fault address */ 137*74a4d8c2SCharles.Forsyth #define SSCR(i) (0x10001010+(i)*4) /* Sbus slot i config register */ 138*74a4d8c2SCharles.Forsyth #define MFSR 0x10001020 /* memory fault status register */ 139*74a4d8c2SCharles.Forsyth #define MFAR 0x10001024 /* memory fault address register */ 140*74a4d8c2SCharles.Forsyth #define MID 0x10002000 /* sbus arbitration enable */ 141*74a4d8c2SCharles.Forsyth 142*74a4d8c2SCharles.Forsyth #define SYSCTL 0x71F00000 /* system control & reset register */ 143*74a4d8c2SCharles.Forsyth #define PROCINTCLR 0x71E00004 /* clear pending processor interrupts */ 144*74a4d8c2SCharles.Forsyth 145*74a4d8c2SCharles.Forsyth /* 146*74a4d8c2SCharles.Forsyth * IO MMU page table entry 147*74a4d8c2SCharles.Forsyth */ 148*74a4d8c2SCharles.Forsyth #define IOPTEVALID (1<<1) 149*74a4d8c2SCharles.Forsyth #define IOPTEWRITE (1<<2) 150