xref: /inferno-os/os/boot/arm1110/mem.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
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