1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
/*
* Memory and machine-specific definitions. Used in C and assembler.
*/
/*
* Sizes
*/
#define BI2BY 8 /* bits per byte */
#define BI2WD 32 /* bits per word */
#define BY2WD 4 /* bytes per word */
#define BY2V 8 /* bytes per double word */
#define BY2PG 4096 /* bytes per page */
#define WD2PG (BY2PG/BY2WD) /* words per page */
#define PGSHIFT 12 /* log(BY2PG) */
#define ROUND(s, sz) (((s)+(sz-1))&~(sz-1))
#define PGROUND(s) ROUND(s, BY2PG)
#define BIT(n) (1<<n)
#define BITS(a,b) ((1<<(b+1))-(1<<a))
#define MAXMACH 1 /* max # cpus system can run */
/*
* Time
*/
#define HZ (100) /* clock frequency */
#define MS2HZ (1000/HZ) /* millisec per clock tick */
#define TK2SEC(t) ((t)/HZ) /* ticks to seconds */
#define MS2TK(t) ((t)/MS2HZ) /* milliseconds to ticks */
/*
* More accurate time
*/
#define CLOCKFREQ 3686400
#define MS2TMR(t) ((ulong)(((uvlong)(t)*CLOCKFREQ)/1000))
#define US2TMR(t) ((ulong)(((uvlong)(t)*CLOCKFREQ)/1000000))
/*
* Address spaces
* nearly everything maps 1-1 with physical addresses
* 0 to 1Mb is not mapped
* cache strategy varies as needed (see mmu.c)
*/
#define KZERO 0xC0000000
#define MACHADDR (KZERO+0x00001000)
#define KTTB (KZERO+0x00004000)
#define KTZERO (KZERO+0x00008010)
#define KSTACK 8192 /* Size of kernel stack */
#define FLASHMEM 0x50000000 /* map flash at phys 0 to otherwise unused virtual space */
#define FLUSHMEM 0xE0000000 /* internally decoded zero memory (for cache flushing) */
#define DCFADDR FLUSHMEM /* cached and buffered for cache writeback */
#define MCFADDR (FLUSHMEM+(1<<20)) /* cached and unbuffered for minicache writeback */
#define UCDRAMZERO 0xC8000000 /* base of memory doubly-mapped as uncached */
#define AIVECADDR 0xFFFF0000 /* alternative interrupt vector address (other is 0) */
/*
* Physical addresses
*/
#define PHYSFLASH0 0x00000000 /* flash (chip select 0) */
#define PHYSCS1 0x08000000 /* static chip select 1 */
#define PHYSCS2 0x10000000 /* static chip select 2 */
#define PHYSCS3 0x18000000 /* static chip select 3 */
#define PHYSPCMCIA0 0x20000000 /* PCMCIA socket 0 space */
#define PHYSPCMCIA1 0x30000000 /* PCMCIA socket 1 space */
#define PCMCIASIZE 0x10000000 /* they're both huge */
#define PHYSCS4 0x40000000 /* static chip select 4 */
#define PHYSCS5 0x48000000 /* static chip select 5 */
#define PHYSSERIAL(n) (0x80000000+0x10000*(n)) /* serial devices */
#define PHYSUSB 0x80000000
#define PHYSGPCLK 0x80020060
#define PHYSMCP 0x80060000
#define PHYSSSP 0x80070060
#define PHYSOSTMR 0x90000000 /* timers */
#define PHYSRTC 0x90010000 /* real time clock */
#define PHYSPOWER 0x90020000 /* power management registers */
#define PHYSRESET 0x90030000 /* reset controller */
#define PHYSGPIO 0x90040000
#define PHYSINTR 0x90050000 /* interrupt controller */
#define PHYSPPC 0x90060000 /* peripheral pin controller */
#define PHYSMEMCFG 0xA0000000 /* memory configuration */
#define PHYSDMA 0xB0000000 /* DMA controller */
#define PHYSLCD 0xB0100000 /* LCD controller */
#define PHYSMEM0 0xC0000000
#define PHYSFLUSH0 0xE0000000 /* internally decoded, for cache flushing */
/*
* Memory Interface Control Registers
*/
#define MDCNFG (PHYSMEMCFG) /* memory controller configuration */
#define MDCAS0 (PHYSMEMCFG+4)
#define MDCAS1 (PHYSMEMCFG+8)
#define MDCAS2 (PHYSMEMCFG+0xC)
#define MSC0 (PHYSMEMCFG+0x10)
#define MSC1 (PHYSMEMCFG+0x14)
#define MSC2 (PHYSMEMCFG+0x2C) /* SA1110, but not SA1100 */
#define MSCx(RRR, RDN, RDF, RBW, RT) ((((RRR)&0x7)<<13)|(((RDN)&0x1F)<<8)|(((RDF)&0x1F)<<3)|(((RBW)&1)<<2)|((RT)&3))
#define CACHELINELOG 5
#define CACHELINESZ (1<<CACHELINELOG)
/*
* PSR
*/
#define PsrMusr 0x10 /* mode */
#define PsrMfiq 0x11
#define PsrMirq 0x12
#define PsrMsvc 0x13
#define PsrMabt 0x17
#define PsrMund 0x1B
#define PsrMsys 0x1F
#define PsrMask 0x1F
#define PsrDfiq 0x00000040 /* disable FIQ interrupts */
#define PsrDirq 0x00000080 /* disable IRQ interrupts */
#define PsrV 0x10000000 /* overflow */
#define PsrC 0x20000000 /* carry/borrow/extend */
#define PsrZ 0x40000000 /* zero */
#define PsrN 0x80000000 /* negative/less than */
/*
* Internal MMU coprocessor registers
*/
#define CpCPUID 0 /* R: */
#define CpControl 1 /* R/W: */
#define CpTTB 2 /* R/W: translation table base */
#define CpDAC 3 /* R/W: domain access control */
#define CpFSR 5 /* R/W: fault status */
#define CpFAR 6 /* R/W: fault address */
#define CpCacheCtl 7 /* W: */
#define CpTLBops 8 /* W: TLB operations */
#define CpRBops 9 /* W: Read Buffer operations */
#define CpPID 13 /* R/W: Process ID Virtual Mapping */
#define CpDebug 14 /* R/W: debug registers */
#define CpTest 15 /* W: Test, Clock and Idle Control */
/*
* Coprocessors
*/
#define CpMMU 15
#define CpPWR 15
/*
* CpControl bits
*/
#define CpCmmu 0x00000001 /* M: MMU enable */
#define CpCalign 0x00000002 /* A: alignment fault enable */
#define CpCDcache 0x00000004 /* C: instruction/data cache on */
#define CpCwb 0x00000008 /* W: write buffer turned on */
#define CpCi32 0x00000010 /* P: 32-bit programme space */
#define CpCd32 0x00000020 /* D: 32-bit data space */
#define CpCbe 0x00000080 /* B: big-endian operation */
#define CpCsystem 0x00000100 /* S: system permission */
#define CpCrom 0x00000200 /* R: ROM permission */
#define CpCIcache 0x00001000 /* I: Instruction Cache on */
#define CpCaltivec 0x00002000 /* X: alternative interrupt vectors */
/*
* MMU
*/
/*
* Small pages:
* L1: 12-bit index -> 4096 descriptors -> 16Kb
* L2: 8-bit index -> 256 descriptors -> 1Kb
* Each L2 descriptor has access permissions for 4 1Kb sub-pages.
*
* TTB + L1Tx gives address of L1 descriptor
* L1 descriptor gives PTBA
* PTBA + L2Tx gives address of L2 descriptor
* L2 descriptor gives PBA
*/
#define MmuSection (1<<20)
#define MmuLargePage (1<<16)
#define MmuSmallPage (1<<12)
#define MmuTTB(pa) ((pa) & ~0x3FFF) /* translation table base */
#define MmuL1x(pa) (((pa)>>20) & 0xFFF) /* L1 table index */
#define MmuPTBA(pa) ((pa) & ~0x3FF) /* page table base address */
#define MmuL2x(pa) (((pa)>>12) & 0xFF) /* L2 table index */
#define MmuPBA(pa) ((pa) & ~0xFFF) /* page base address */
#define MmuSBA(pa) ((pa) & ~0xFFFFF) /* section base address */
#define MmuL1type 0x03
#define MmuL1page 0x01 /* descriptor is for L2 pages */
#define MmuL1section 0x02 /* descriptor is for section */
#define MmuL2invalid 0x000
#define MmuL2large 0x001 /* large */
#define MmuL2small 0x002 /* small */
#define MmuWB 0x004 /* data goes through write buffer */
#define MmuIDC 0x008 /* data placed in cache */
#define MmuDAC(d) (((d) & 0xF)<<5) /* L1 domain */
#define MmuAP(i, v) ((v)<<(((i)*2)+4)) /* access permissions */
#define MmuL1AP(v) MmuAP(3, (v))
#define MmuL2AP(v) MmuAP(3, (v))|MmuAP(2, (v))|MmuAP(1, (v))|MmuAP(0, (v))
#define MmuAPsro 0 /* supervisor ro if S|R */
#define MmuAPsrw 1 /* supervisor rw */
#define MmuAPuro 2 /* supervisor rw + user ro */
#define MmuAPurw 3 /* supervisor rw + user rw */
|