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 #define BI2BY 8 /* bits per byte */ 9*74a4d8c2SCharles.Forsyth #define BI2WD 32 /* bits per word */ 10*74a4d8c2SCharles.Forsyth #define BY2WD 4 /* bytes per word */ 11*74a4d8c2SCharles.Forsyth #define BY2V 8 /* bytes per double word */ 12*74a4d8c2SCharles.Forsyth #define BY2PG 4096 /* bytes per page */ 13*74a4d8c2SCharles.Forsyth #define WD2PG (BY2PG/BY2WD) /* words per page */ 14*74a4d8c2SCharles.Forsyth #define PGSHIFT 12 /* log(BY2PG) */ 15*74a4d8c2SCharles.Forsyth #define ROUND(s, sz) (((s)+(sz-1))&~(sz-1)) 16*74a4d8c2SCharles.Forsyth #define PGROUND(s) ROUND(s, BY2PG) 17*74a4d8c2SCharles.Forsyth #define BLOCKALIGN 8 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 (20) /* 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 TK2MS(t) ((((ulong)(t))*1000)/HZ) /* ticks to milliseconds */ 28*74a4d8c2SCharles.Forsyth #define MS2TK(t) ((((ulong)(t))*HZ)/1000) /* milliseconds to ticks */ 29*74a4d8c2SCharles.Forsyth 30*74a4d8c2SCharles.Forsyth /* 31*74a4d8c2SCharles.Forsyth * Virtual addresses: 32*74a4d8c2SCharles.Forsyth * 33*74a4d8c2SCharles.Forsyth * We direct map all discovered DRAM and the area twixt 0xe0000000 and 34*74a4d8c2SCharles.Forsyth * 0xe8000000 used to provide zeros for cache flushing. 35*74a4d8c2SCharles.Forsyth * 36*74a4d8c2SCharles.Forsyth * Flash is mapped to 0xb0000000 and special registers are mapped 37*74a4d8c2SCharles.Forsyth * on demand to areas starting at 0xa0000000. 38*74a4d8c2SCharles.Forsyth * 39*74a4d8c2SCharles.Forsyth * The direct mapping is convenient but not necessary. It means 40*74a4d8c2SCharles.Forsyth * that we don't have to turn on the MMU till well into the 41*74a4d8c2SCharles.Forsyth * kernel. This can be changed by providing a mapping in l.s 42*74a4d8c2SCharles.Forsyth * before calling main. 43*74a4d8c2SCharles.Forsyth */ 44*74a4d8c2SCharles.Forsyth #define UZERO 0 /* base of user address space */ 45*74a4d8c2SCharles.Forsyth #define UTZERO (UZERO+BY2PG) /* first address in user text */ 46*74a4d8c2SCharles.Forsyth #define KZERO 0xC0000000 /* base of kernel address space */ 47*74a4d8c2SCharles.Forsyth #define KTZERO 0xC0008000 /* first address in kernel text */ 48*74a4d8c2SCharles.Forsyth #define EMEMZERO 0x90000000 /* 256 meg for add on memory */ 49*74a4d8c2SCharles.Forsyth #define EMEMTOP 0xA0000000 /* ... */ 50*74a4d8c2SCharles.Forsyth #define REGZERO 0xA0000000 /* 128 meg for mapspecial regs */ 51*74a4d8c2SCharles.Forsyth #define REGTOP 0xA8000000 /* ... */ 52*74a4d8c2SCharles.Forsyth #define FLASHZERO 0xB0000000 /* 128 meg for flash */ 53*74a4d8c2SCharles.Forsyth #define FLASHTOP 0xB8000000 /* ... */ 54*74a4d8c2SCharles.Forsyth #define DRAMZERO 0xC0000000 /* 128 meg for dram */ 55*74a4d8c2SCharles.Forsyth #define DRAMTOP 0xC8000000 /* ... */ 56*74a4d8c2SCharles.Forsyth #define UCDRAMZERO 0xC8000000 /* 128 meg for dram (uncached/unbuffered) */ 57*74a4d8c2SCharles.Forsyth #define UCDRAMTOP 0xD0000000 /* ... */ 58*74a4d8c2SCharles.Forsyth #define NULLZERO 0xE0000000 /* 128 meg for cache flush zeroes */ 59*74a4d8c2SCharles.Forsyth #define NULLTOP 0xE8000000 /* ... */ 60*74a4d8c2SCharles.Forsyth #define USTKTOP 0x2000000 /* byte just beyond user stack */ 61*74a4d8c2SCharles.Forsyth #define USTKSIZE (8*1024*1024) /* size of user stack */ 62*74a4d8c2SCharles.Forsyth #define TSTKTOP (USTKTOP-USTKSIZE) /* end of new stack in sysexec */ 63*74a4d8c2SCharles.Forsyth #define TSTKSIZ 100 64*74a4d8c2SCharles.Forsyth #define MACHADDR (KZERO+0x00001000) 65*74a4d8c2SCharles.Forsyth #define EVECTORS 0xFFFF0000 /* virt base of exception vectors */ 66*74a4d8c2SCharles.Forsyth 67*74a4d8c2SCharles.Forsyth #define KSTACK (16*1024) /* Size of kernel stack */ 68*74a4d8c2SCharles.Forsyth 69*74a4d8c2SCharles.Forsyth #define FLATESIZE (700*1024) /* maximum size of compressed image */ 70*74a4d8c2SCharles.Forsyth 71*74a4d8c2SCharles.Forsyth /* 72*74a4d8c2SCharles.Forsyth * Offsets into flash 73*74a4d8c2SCharles.Forsyth */ 74*74a4d8c2SCharles.Forsyth #define Flash_bootldr (FLASHZERO+0x0) /* boot loader */ 75*74a4d8c2SCharles.Forsyth #define Flash_kernel (FLASHZERO+0x10000) /* boot kernel */ 76*74a4d8c2SCharles.Forsyth #define Flash_tar (FLASHZERO+0x100000) /* tar file containing fs.sac */ 77*74a4d8c2SCharles.Forsyth 78*74a4d8c2SCharles.Forsyth /* 79*74a4d8c2SCharles.Forsyth * virtual MMU 80*74a4d8c2SCharles.Forsyth */ 81*74a4d8c2SCharles.Forsyth #define PTEMAPMEM (1024*1024) 82*74a4d8c2SCharles.Forsyth #define PTEPERTAB (PTEMAPMEM/BY2PG) 83*74a4d8c2SCharles.Forsyth #define SEGMAPSIZE 1984 84*74a4d8c2SCharles.Forsyth #define SSEGMAPSIZE 16 85*74a4d8c2SCharles.Forsyth #define PPN(x) ((x)&~(BY2PG-1)) 86*74a4d8c2SCharles.Forsyth 87*74a4d8c2SCharles.Forsyth /* 88*74a4d8c2SCharles.Forsyth * SA1110 definitions 89*74a4d8c2SCharles.Forsyth */ 90*74a4d8c2SCharles.Forsyth 91*74a4d8c2SCharles.Forsyth /* 92*74a4d8c2SCharles.Forsyth * memory physical addresses 93*74a4d8c2SCharles.Forsyth */ 94*74a4d8c2SCharles.Forsyth #define PHYSFLASH0 0x00000000 95*74a4d8c2SCharles.Forsyth #define PHYSDRAM0 0xC0000000 96*74a4d8c2SCharles.Forsyth #define PHYSNULL0 0xE0000000 97*74a4d8c2SCharles.Forsyth 98*74a4d8c2SCharles.Forsyth /* 99*74a4d8c2SCharles.Forsyth * peripheral control module physical addresses 100*74a4d8c2SCharles.Forsyth */ 101*74a4d8c2SCharles.Forsyth #define USBREGS 0x80000000 /* serial port 0 - USB */ 102*74a4d8c2SCharles.Forsyth #define UART1REGS 0x80010000 /* serial port 1 - UART */ 103*74a4d8c2SCharles.Forsyth #define GPCLKREGS 0x80020060 /* serial port 1 - general purpose clock */ 104*74a4d8c2SCharles.Forsyth #define UART2REGS 0x80030000 /* serial port 2 - low speed IR */ 105*74a4d8c2SCharles.Forsyth #define HSSPREGS 0x80040060 /* serial port 2 - high speed IR */ 106*74a4d8c2SCharles.Forsyth #define UART3REGS 0x80050000 /* serial port 3 - RS232 UART */ 107*74a4d8c2SCharles.Forsyth #define MCPREGS 0x80060000 /* serial port 4 - multimedia comm port */ 108*74a4d8c2SCharles.Forsyth #define SSPREGS 0x80070060 /* serial port 4 - synchronous serial port */ 109*74a4d8c2SCharles.Forsyth #define OSTIMERREGS 0x90000000 /* operating system timer registers */ 110*74a4d8c2SCharles.Forsyth #define POWERREGS 0x90020000 /* power management */ 111*74a4d8c2SCharles.Forsyth #define GPIOREGS 0x90040000 /* 28 general purpose IO pins */ 112*74a4d8c2SCharles.Forsyth #define INTRREGS 0x90050000 /* interrupt registers */ 113*74a4d8c2SCharles.Forsyth #define PPCREGS 0x90060000 /* peripheral pin controller */ 114*74a4d8c2SCharles.Forsyth #define MEMCONFREGS 0xA0000000 /* memory configuration */ 115*74a4d8c2SCharles.Forsyth #define LCDREGS 0xB0100000 /* display */ 116*74a4d8c2SCharles.Forsyth 117*74a4d8c2SCharles.Forsyth /* 118*74a4d8c2SCharles.Forsyth * PCMCIA addresses 119*74a4d8c2SCharles.Forsyth */ 120*74a4d8c2SCharles.Forsyth #define PHYSPCM0REGS 0x20000000 121*74a4d8c2SCharles.Forsyth #define PYHSPCM0ATTR 0x28000000 122*74a4d8c2SCharles.Forsyth #define PYHSPCM0MEM 0x2C000000 123*74a4d8c2SCharles.Forsyth #define PHYSPCM1REGS 0x30000000 124*74a4d8c2SCharles.Forsyth #define PYHSPCM1ATTR 0x38000000 125*74a4d8c2SCharles.Forsyth #define PYHSPCM1MEM 0x3C000000 126*74a4d8c2SCharles.Forsyth 127*74a4d8c2SCharles.Forsyth /* 128*74a4d8c2SCharles.Forsyth * Program Status Registers 129*74a4d8c2SCharles.Forsyth */ 130*74a4d8c2SCharles.Forsyth #define PsrMusr 0x00000010 /* mode */ 131*74a4d8c2SCharles.Forsyth #define PsrMfiq 0x00000011 132*74a4d8c2SCharles.Forsyth #define PsrMirq 0x00000012 133*74a4d8c2SCharles.Forsyth #define PsrMsvc 0x00000013 134*74a4d8c2SCharles.Forsyth #define PsrMabt 0x00000017 135*74a4d8c2SCharles.Forsyth #define PsrMund 0x0000001B 136*74a4d8c2SCharles.Forsyth #define PsrMask 0x0000001F 137*74a4d8c2SCharles.Forsyth 138*74a4d8c2SCharles.Forsyth #define PsrDfiq 0x00000040 /* disable FIQ interrupts */ 139*74a4d8c2SCharles.Forsyth #define PsrDirq 0x00000080 /* disable IRQ interrupts */ 140*74a4d8c2SCharles.Forsyth 141*74a4d8c2SCharles.Forsyth #define PsrV 0x10000000 /* overflow */ 142*74a4d8c2SCharles.Forsyth #define PsrC 0x20000000 /* carry/borrow/extend */ 143*74a4d8c2SCharles.Forsyth #define PsrZ 0x40000000 /* zero */ 144*74a4d8c2SCharles.Forsyth #define PsrN 0x80000000 /* negative/less than */ 145*74a4d8c2SCharles.Forsyth 146*74a4d8c2SCharles.Forsyth /* 147*74a4d8c2SCharles.Forsyth * Coprocessors 148*74a4d8c2SCharles.Forsyth */ 149*74a4d8c2SCharles.Forsyth #define CpMMU 15 150*74a4d8c2SCharles.Forsyth #define CpPWR 15 151*74a4d8c2SCharles.Forsyth 152*74a4d8c2SCharles.Forsyth /* 153*74a4d8c2SCharles.Forsyth * Internal MMU coprocessor registers 154*74a4d8c2SCharles.Forsyth */ 155*74a4d8c2SCharles.Forsyth #define CpCPUID 0 /* R: */ 156*74a4d8c2SCharles.Forsyth #define CpControl 1 /* R: */ 157*74a4d8c2SCharles.Forsyth #define CpTTB 2 /* RW: translation table base */ 158*74a4d8c2SCharles.Forsyth #define CpDAC 3 /* RW: domain access control */ 159*74a4d8c2SCharles.Forsyth #define CpFSR 5 /* RW: fault status */ 160*74a4d8c2SCharles.Forsyth #define CpFAR 6 /* RW: fault address */ 161*74a4d8c2SCharles.Forsyth #define CpCacheFlush 7 /* W: cache flushing, wb draining*/ 162*74a4d8c2SCharles.Forsyth #define CpTLBFlush 8 /* W: TLB flushing */ 163*74a4d8c2SCharles.Forsyth #define CpRBFlush 9 /* W: Read Buffer ops */ 164*74a4d8c2SCharles.Forsyth #define CpPID 13 /* RW: PID for virtual mapping */ 165*74a4d8c2SCharles.Forsyth #define CpBpt 14 /* W: Breakpoint register */ 166*74a4d8c2SCharles.Forsyth #define CpTest 15 /* W: Test, Clock and Idle Control */ 167*74a4d8c2SCharles.Forsyth 168*74a4d8c2SCharles.Forsyth /* 169*74a4d8c2SCharles.Forsyth * CpControl 170*74a4d8c2SCharles.Forsyth */ 171*74a4d8c2SCharles.Forsyth #define CpCmmuena 0x00000001 /* M: MMU enable */ 172*74a4d8c2SCharles.Forsyth #define CpCalign 0x00000002 /* A: alignment fault enable */ 173*74a4d8c2SCharles.Forsyth #define CpCdcache 0x00000004 /* C: data cache on */ 174*74a4d8c2SCharles.Forsyth #define CpCwb 0x00000008 /* W: write buffer turned on */ 175*74a4d8c2SCharles.Forsyth #define CpCi32 0x00000010 /* P: 32-bit program space */ 176*74a4d8c2SCharles.Forsyth #define CpCd32 0x00000020 /* D: 32-bit data space */ 177*74a4d8c2SCharles.Forsyth #define CpCbe 0x00000080 /* B: big-endian operation */ 178*74a4d8c2SCharles.Forsyth #define CpCsystem 0x00000100 /* S: system permission */ 179*74a4d8c2SCharles.Forsyth #define CpCrom 0x00000200 /* R: ROM permission */ 180*74a4d8c2SCharles.Forsyth #define CpCicache 0x00001000 /* I: instruction cache on */ 181*74a4d8c2SCharles.Forsyth #define CpCvivec 0x00002000 /* X: virtual interrupt vector adjust */ 182*74a4d8c2SCharles.Forsyth 183*74a4d8c2SCharles.Forsyth /* 184*74a4d8c2SCharles.Forsyth * fault codes 185*74a4d8c2SCharles.Forsyth */ 186*74a4d8c2SCharles.Forsyth #define FCterm 0x2 /* terminal */ 187*74a4d8c2SCharles.Forsyth #define FCvec 0x0 /* vector */ 188*74a4d8c2SCharles.Forsyth #define FCalignf 0x1 /* unaligned full word data access */ 189*74a4d8c2SCharles.Forsyth #define FCalignh 0x3 /* unaligned half word data access */ 190*74a4d8c2SCharles.Forsyth #define FCl1abort 0xc /* level 1 external abort on translation */ 191*74a4d8c2SCharles.Forsyth #define FCl2abort 0xe /* level 2 external abort on translation */ 192*74a4d8c2SCharles.Forsyth #define FCtransSec 0x5 /* section translation */ 193*74a4d8c2SCharles.Forsyth #define FCtransPage 0x7 /* page translation */ 194*74a4d8c2SCharles.Forsyth #define FCdomainSec 0x9 /* section domain */ 195*74a4d8c2SCharles.Forsyth #define FCdomainPage 0x11 /* page domain */ 196*74a4d8c2SCharles.Forsyth #define FCpermSec 0x9 /* section permissions */ 197*74a4d8c2SCharles.Forsyth #define FCpermPage 0x11 /* page permissions */ 198*74a4d8c2SCharles.Forsyth #define FCabortLFSec 0x4 /* external abort on linefetch for section */ 199*74a4d8c2SCharles.Forsyth #define FCabortLFPage 0x6 /* external abort on linefetch for page */ 200*74a4d8c2SCharles.Forsyth #define FCabortNLFSec 0x8 /* external abort on non-linefetch for section */ 201*74a4d8c2SCharles.Forsyth #define FCabortNLFPage 0xa /* external abort on non-linefetch for page */ 202*74a4d8c2SCharles.Forsyth 203*74a4d8c2SCharles.Forsyth /* 204*74a4d8c2SCharles.Forsyth * PTE bits used by fault.h. mmu.c translates them to real values. 205*74a4d8c2SCharles.Forsyth */ 206*74a4d8c2SCharles.Forsyth #define PTEVALID (1<<0) 207*74a4d8c2SCharles.Forsyth #define PTERONLY 0 /* this is implied by the absence of PTEWRITE */ 208*74a4d8c2SCharles.Forsyth #define PTEWRITE (1<<1) 209*74a4d8c2SCharles.Forsyth #define PTEUNCACHED (1<<2) 210*74a4d8c2SCharles.Forsyth #define PTEKERNEL (1<<3) /* no user access */ 211*74a4d8c2SCharles.Forsyth 212*74a4d8c2SCharles.Forsyth /* 213*74a4d8c2SCharles.Forsyth * H3650 specific definitions 214*74a4d8c2SCharles.Forsyth */ 215*74a4d8c2SCharles.Forsyth #define EGPIOREGS 0x49000000 /* Additional GPIO register */ 216