author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Mon, 18 Jan 2010 21:31:10 +0200 | |
changeset 36 | 538db54a451d |
parent 0 | a41df078684a |
permissions | -rw-r--r-- |
0 | 1 |
; Copyright (c) 2003-2008 Nokia Corporation and/or its subsidiary(-ies). |
2 |
; All rights reserved. |
|
3 |
; This component and the accompanying materials are made available |
|
4 |
; under the terms of the License "Eclipse Public License v1.0" |
|
5 |
; which accompanies this distribution, and is available |
|
6 |
; at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 |
; |
|
8 |
; Initial Contributors: |
|
9 |
; Nokia Corporation - initial contribution. |
|
10 |
; |
|
11 |
; Contributors: |
|
12 |
; |
|
13 |
; Description: |
|
14 |
; e32\include\kernel\arm\bootcpu.inc |
|
15 |
; |
|
16 |
; |
|
17 |
;******************************************************************************* |
|
18 |
; |
|
19 |
; CPU/MMU definitions for bootstrap |
|
20 |
; |
|
21 |
||
22 |
IF :LNOT: :DEF: __BOOTCPU_INC__ |
|
23 |
GBLL __BOOTCPU_INC__ |
|
24 |
||
25 |
MACRO |
|
26 |
INIT_LOGICAL_SYMBOL $sym, $count |
|
27 |
IF :LNOT: :DEF: $sym |
|
28 |
GBLL $sym |
|
29 |
$sym SETL {FALSE} |
|
30 |
ELSE |
|
31 |
$sym SETL {TRUE} |
|
32 |
IF :LEN: "$count" > 0 |
|
33 |
$count SETA $count + 1 |
|
34 |
ENDIF |
|
35 |
ENDIF |
|
36 |
MEND |
|
37 |
||
38 |
MACRO |
|
39 |
INIT_NUMERIC_SYMBOL $sym, $default |
|
40 |
IF :LNOT: :DEF: $sym |
|
41 |
GBLA $sym |
|
42 |
$sym SETA $default |
|
43 |
ENDIF |
|
44 |
MEND |
|
45 |
||
46 |
MACRO |
|
47 |
INIT_NUMERIC_CONSTANT $sym, $default |
|
48 |
IF :LNOT: :DEF: $sym |
|
49 |
$sym EQU $default |
|
50 |
ENDIF |
|
51 |
MEND |
|
52 |
||
53 |
; CP15 control register bits |
|
54 |
; Define these here so they can be used in config.inc to override MMU settings |
|
55 |
MMUCR_M EQU 0x00000001 ; MMU enable |
|
56 |
MMUCR_A EQU 0x00000002 ; Alignment check |
|
57 |
MMUCR_C EQU 0x00000004 ; DCache enable |
|
58 |
MMUCR_W EQU 0x00000008 ; Write buffer enable |
|
59 |
MMUCR_SBO EQU 0x00000070 ; Always 1 |
|
60 |
MMUCR_B EQU 0x00000080 ; Big endian |
|
61 |
MMUCR_S EQU 0x00000100 ; System permission modifier |
|
62 |
MMUCR_R EQU 0x00000200 ; ROM permission modifier |
|
63 |
MMUCR_F EQU 0x00000400 ; |
|
64 |
MMUCR_Z EQU 0x00000800 ; Flow prediction enable |
|
65 |
MMUCR_I EQU 0x00001000 ; ICache enable |
|
66 |
MMUCR_V EQU 0x00002000 ; High vectors |
|
67 |
MMUCR_RR EQU 0x00004000 ; Round Robin cache replacement |
|
68 |
MMUCR_L4 EQU 0x00008000 ; LDR PC v4 behaviour (don't set T bit) |
|
69 |
MMUCR_DT EQU 0x00010000 ; DTCM enable |
|
70 |
||
71 |
MMUCR_IT EQU 0x00040000 ; ITCM enable |
|
72 |
||
73 |
||
74 |
MMUCR_FI EQU 0x00200000 ; Fast Interrupt configuration (low latency) |
|
75 |
MMUCR_U EQU 0x00400000 ; Unaligned data access enable (mixed endian) |
|
76 |
MMUCR_XP EQU 0x00800000 ; ARMv6 extended page table format |
|
77 |
MMUCR_VE EQU 0x01000000 ; Vectored interrupt enable |
|
78 |
MMUCR_EE EQU 0x02000000 ; CPSR E bit following exception (mixed endian) |
|
79 |
MMUCR_L2XSCALE EQU 0x04000000 ; L2 Cache enable on XScale platform |
|
80 |
MMUCR_TRE EQU 0x10000000 ; TEX remapping |
|
81 |
MMUCR_FA EQU 0x20000000 ; AP[0] is used as Access Bit. Four (instead of eight) access permissions are available. |
|
82 |
||
83 |
INCLUDE config.inc |
|
84 |
||
85 |
INIT_LOGICAL_SYMBOL CFG_DebugBootRom |
|
86 |
INIT_LOGICAL_SYMBOL CFG_CustomVectors |
|
87 |
INIT_LOGICAL_SYMBOL CFG_UseBootstrapVectors |
|
88 |
INIT_LOGICAL_SYMBOL CFG_AutoDetectROM |
|
89 |
INIT_LOGICAL_SYMBOL CFG_IncludeRAMAllocator |
|
90 |
INIT_LOGICAL_SYMBOL CFG_BootLoader |
|
91 |
INIT_LOGICAL_SYMBOL SMP |
|
92 |
||
93 |
IF SMP |
|
94 |
GBLL CFG_USE_SHARED_MEMORY |
|
95 |
CFG_USE_SHARED_MEMORY SETL {TRUE} |
|
96 |
ENDIF |
|
97 |
||
98 |
INCLUDE bootmacro.inc |
|
99 |
INCLUDE bootdefs.inc |
|
100 |
INCLUDE kernboot.inc |
|
101 |
INCLUDE e32rom.inc |
|
102 |
||
103 |
; Check memory model definition |
|
104 |
GBLA NMM |
|
105 |
NMM SETA 0 |
|
106 |
||
107 |
INIT_LOGICAL_SYMBOL CFG_MMDirect, NMM |
|
108 |
INIT_LOGICAL_SYMBOL CFG_MMMoving, NMM |
|
109 |
INIT_LOGICAL_SYMBOL CFG_MMMultiple, NMM |
|
110 |
INIT_LOGICAL_SYMBOL CFG_MMFlexible, NMM |
|
111 |
||
112 |
IF NMM=0 |
|
113 |
! 1, "No memory model specified" |
|
114 |
ENDIF |
|
115 |
IF NMM>1 |
|
116 |
! 2, "More than one memory model specified" |
|
117 |
ENDIF |
|
118 |
||
119 |
IF :LNOT: CFG_MMDirect |
|
120 |
INCLUDE mmboot.inc |
|
121 |
ENDIF |
|
122 |
||
123 |
INIT_NUMERIC_CONSTANT CFG_RomSizeAlign, 16 ; 64K by default |
|
124 |
||
125 |
; First declare variables |
|
126 |
GBLA NCPU |
|
127 |
NCPU SETA 0 |
|
128 |
IF :DEF: CPUOK |
|
129 |
NCPU SETA 1 |
|
130 |
ENDIF |
|
131 |
||
132 |
GBLL CFG_ARMV7 |
|
133 |
CFG_ARMV7 SETL {FALSE} |
|
134 |
GBLL CFG_ARMV6 |
|
135 |
CFG_ARMV6 SETL {FALSE} |
|
136 |
GBLL CFG_MMUPresent |
|
137 |
CFG_MMUPresent SETL {FALSE} |
|
138 |
GBLL CFG_CachePresent |
|
139 |
CFG_CachePresent SETL {FALSE} |
|
140 |
GBLL CFG_WriteBufferPresent |
|
141 |
CFG_WriteBufferPresent SETL {FALSE} |
|
142 |
GBLL CFG_SplitCache |
|
143 |
CFG_SplitCache SETL {FALSE} |
|
144 |
GBLL CFG_SplitTLB |
|
145 |
CFG_SplitTLB SETL {FALSE} |
|
146 |
GBLL CFG_AltDCachePresent |
|
147 |
CFG_AltDCachePresent SETL {FALSE} |
|
148 |
GBLL CFG_WriteBackCache |
|
149 |
CFG_WriteBackCache SETL {FALSE} |
|
150 |
GBLL CFG_CacheWriteAllocate |
|
151 |
CFG_CacheWriteAllocate SETL {FALSE} |
|
152 |
GBLL CFG_CachePhysicalTag |
|
153 |
CFG_CachePhysicalTag SETL {FALSE} |
|
154 |
GBLL CFG_CacheFlushByDataRead |
|
155 |
CFG_CacheFlushByDataRead SETL {FALSE} |
|
156 |
GBLL CFG_CacheFlushByWaySetIndex |
|
157 |
CFG_CacheFlushByWaySetIndex SETL {FALSE} |
|
158 |
GBLL CFG_CacheFlushByLineAlloc |
|
159 |
CFG_CacheFlushByLineAlloc SETL {FALSE} |
|
160 |
GBLL CFG_CachePolicyInPTE |
|
161 |
CFG_CachePolicyInPTE SETL {FALSE} |
|
162 |
GBLL CFG_TEX |
|
163 |
CFG_TEX SETL {FALSE} |
|
164 |
GBLL CFG_SingleEntryDCacheFlush |
|
165 |
CFG_SingleEntryDCacheFlush SETL {FALSE} |
|
166 |
GBLL CFG_SingleEntryICacheFlush |
|
167 |
CFG_SingleEntryICacheFlush SETL {FALSE} |
|
168 |
GBLL CFG_SingleEntryITLBFlush |
|
169 |
CFG_SingleEntryITLBFlush SETL {FALSE} |
|
170 |
GBLL CFG_SingleEntryTLBFlush |
|
171 |
CFG_SingleEntryTLBFlush SETL {FALSE} |
|
172 |
GBLL CFG_CacheTypeReg |
|
173 |
CFG_CacheTypeReg SETL {FALSE} |
|
174 |
GBLL CFG_BTBPresent |
|
175 |
CFG_BTBPresent SETL {FALSE} |
|
176 |
GBLL CFG_AuxCRPresent |
|
177 |
CFG_AuxCRPresent SETL {FALSE} |
|
178 |
GBLL CFG_CARPresent |
|
179 |
CFG_CARPresent SETL {FALSE} |
|
180 |
GBLL CFG_PrefetchBuffer |
|
181 |
CFG_PrefetchBuffer SETL {FALSE} |
|
182 |
GBLL CFG_FCSE_Present |
|
183 |
CFG_FCSE_Present SETL {FALSE} |
|
184 |
GBLL CFG_ASID_Present |
|
185 |
CFG_ASID_Present SETL {FALSE} |
|
186 |
GBLL CFG_Cpu_Has_CLZ |
|
187 |
CFG_Cpu_Has_CLZ SETL {FALSE} |
|
188 |
GBLL CFG_Cpu_Has_TrustZone |
|
189 |
CFG_Cpu_Has_TrustZone SETL {FALSE} |
|
190 |
;TrustZone platforms with Symbian OS Kernel running in Non-Secure Mode |
|
191 |
GBLL CFG_TrustZone_NonSecure |
|
192 |
CFG_TrustZone_NonSecure SETL {FALSE} |
|
193 |
; Cache attributes are re-mapped into TEX[0]:C:B only. TEX[2:1] are freed up for S/W purpose. |
|
194 |
; Also, access permissions are mapped to APX:AP[1] only. AP[0] is freed up for S/W purpose. |
|
195 |
GBLL CFG_MemoryTypeRemapping |
|
196 |
CFG_MemoryTypeRemapping SETL {FALSE} |
|
197 |
; Page tables are Write-Back cached. Mandatory if CFG_MemoryTypeRemapping is TRUE |
|
198 |
GBLL CFG_WriteThroughDisabled |
|
199 |
CFG_WriteThroughDisabled SETL {FALSE} |
|
200 |
GBLL CFG_Cpu_Has_WFE_SEV |
|
201 |
CFG_Cpu_Has_WFE_SEV SETL {FALSE} |
|
202 |
GBLL CFG_Cpu_Has_WFI |
|
203 |
CFG_Cpu_Has_WFI SETL {FALSE} |
|
204 |
||
205 |
||
206 |
||
207 |
;******************************************************************************* |
|
208 |
IF :DEF: CFG_CPU_GENERIC_ARM4 |
|
209 |
||
210 |
NCPU SETA NCPU+1 |
|
211 |
||
212 |
ENDIF |
|
213 |
||
214 |
;******************************************************************************* |
|
215 |
IF :DEF: CFG_CPU_ARM710T :LOR: :DEF: CFG_CPU_ARM720T |
|
216 |
||
217 |
NCPU SETA NCPU+1 |
|
218 |
||
219 |
CFG_MMUPresent SETL {TRUE} |
|
220 |
CFG_CachePresent SETL {TRUE} |
|
221 |
CFG_WriteBufferPresent SETL {TRUE} |
|
222 |
CFG_SingleEntryTLBFlush SETL {TRUE} |
|
223 |
||
224 |
IF :DEF: CFG_CPU_ARM720T |
|
225 |
CFG_FCSE_Present SETL {TRUE} |
|
226 |
ENDIF |
|
227 |
||
228 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_SBO+MMUCR_R |
|
229 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_W |
|
230 |
||
231 |
PDE_EXTRA EQU 0x00000010 |
|
232 |
||
233 |
ENDIF |
|
234 |
||
235 |
;******************************************************************************* |
|
236 |
IF :DEF: CFG_CPU_SA1 |
|
237 |
||
238 |
NCPU SETA NCPU+1 |
|
239 |
||
240 |
CFG_MMUPresent SETL {TRUE} |
|
241 |
CFG_CachePresent SETL {TRUE} |
|
242 |
CFG_WriteBufferPresent SETL {TRUE} |
|
243 |
CFG_SplitCache SETL {TRUE} |
|
244 |
CFG_SplitTLB SETL {TRUE} |
|
245 |
CFG_AltDCachePresent SETL {TRUE} |
|
246 |
CFG_WriteBackCache SETL {TRUE} |
|
247 |
CFG_CacheFlushByDataRead SETL {TRUE} |
|
248 |
CFG_SingleEntryDCacheFlush SETL {TRUE} |
|
249 |
CFG_FCSE_Present SETL {TRUE} |
|
250 |
||
251 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_SBO+MMUCR_R+MMUCR_I |
|
252 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_W+MMUCR_V |
|
253 |
||
254 |
PDE_EXTRA EQU 0x00000000 |
|
255 |
||
256 |
ENDIF |
|
257 |
||
258 |
;******************************************************************************* |
|
259 |
IF :DEF: CFG_CPU_ARM920T :LOR: :DEF: CFG_CPU_ARM925T :LOR: :DEF: CFG_CPU_ARM926J |
|
260 |
||
261 |
NCPU SETA NCPU+1 |
|
262 |
||
263 |
CFG_MMUPresent SETL {TRUE} |
|
264 |
CFG_CachePresent SETL {TRUE} |
|
265 |
CFG_WriteBufferPresent SETL {TRUE} |
|
266 |
CFG_SplitCache SETL {TRUE} |
|
267 |
CFG_SplitTLB SETL {TRUE} |
|
268 |
CFG_WriteBackCache SETL {TRUE} |
|
269 |
CFG_CacheFlushByWaySetIndex SETL {TRUE} |
|
270 |
CFG_CachePolicyInPTE SETL {TRUE} |
|
271 |
CFG_CacheTypeReg SETL {TRUE} |
|
272 |
CFG_SingleEntryDCacheFlush SETL {TRUE} |
|
273 |
CFG_SingleEntryICacheFlush SETL {TRUE} |
|
274 |
CFG_SingleEntryITLBFlush SETL {TRUE} |
|
275 |
CFG_FCSE_Present SETL {TRUE} |
|
276 |
||
277 |
IF :DEF: CFG_CPU_ARM926J |
|
278 |
CFG_Cpu_Has_CLZ SETL {TRUE} |
|
279 |
ENDIF |
|
280 |
||
281 |
IF :DEF: CFG_CPU_ARM926J |
|
282 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_R+MMUCR_I+0x00050000 |
|
283 |
ELSE |
|
284 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_R+MMUCR_I |
|
285 |
ENDIF |
|
286 |
||
287 |
IF :DEF: CFG_CPU_ARM920T |
|
288 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+0xC0000000 ; FastBus + AsyncClock |
|
289 |
ELSE |
|
290 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V |
|
291 |
ENDIF |
|
292 |
||
293 |
PDE_EXTRA EQU 0x00000010 |
|
294 |
||
295 |
ENDIF |
|
296 |
||
297 |
;******************************************************************************* |
|
298 |
IF :DEF: CFG_CPU_XSCALE |
|
299 |
||
300 |
NCPU SETA NCPU+1 |
|
301 |
||
302 |
CFG_Cpu_Has_CLZ SETL {TRUE} |
|
303 |
CFG_MMUPresent SETL {TRUE} |
|
304 |
CFG_CachePresent SETL {TRUE} |
|
305 |
CFG_WriteBufferPresent SETL {TRUE} |
|
306 |
CFG_SplitCache SETL {TRUE} |
|
307 |
CFG_SplitTLB SETL {TRUE} |
|
308 |
IF :LNOT: :DEF: CFG_CPU_MANZANO |
|
309 |
CFG_AltDCachePresent SETL {TRUE} |
|
310 |
CFG_CacheFlushByLineAlloc SETL {TRUE} |
|
311 |
ENDIF |
|
312 |
CFG_CacheWriteAllocate SETL {TRUE} |
|
313 |
CFG_WriteBackCache SETL {TRUE} |
|
314 |
CFG_SingleEntryDCacheFlush SETL {TRUE} |
|
315 |
CFG_SingleEntryICacheFlush SETL {TRUE} |
|
316 |
CFG_SingleEntryITLBFlush SETL {TRUE} |
|
317 |
CFG_CachePolicyInPTE SETL {TRUE} |
|
318 |
CFG_CacheTypeReg SETL {TRUE} |
|
319 |
CFG_BTBPresent SETL {TRUE} |
|
320 |
CFG_AuxCRPresent SETL {TRUE} |
|
321 |
CFG_CARPresent SETL {TRUE} |
|
322 |
CFG_FCSE_Present SETL {TRUE} |
|
323 |
CFG_TEX SETL {TRUE} |
|
324 |
||
325 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_R+MMUCR_I |
|
326 |
IF :DEF: CFG_HasXScaleL2Cache |
|
327 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+MMUCR_Z+MMUCR_L2XSCALE |
|
328 |
ELSE |
|
329 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+MMUCR_Z |
|
330 |
ENDIF |
|
331 |
||
332 |
INIT_NUMERIC_CONSTANT DefaultAuxCRClear, 0xFFFFFFFF |
|
333 |
INIT_NUMERIC_CONSTANT DefaultAuxCRSet, 0x00000020 ; enable WB coalescing, minicache WTRA |
|
334 |
||
335 |
PDE_EXTRA EQU 0x00000000 |
|
336 |
||
337 |
ENDIF |
|
338 |
||
339 |
;******************************************************************************* |
|
340 |
IF :DEF: CFG_CPU_ARM1136 |
|
341 |
||
342 |
NCPU SETA NCPU+1 |
|
343 |
||
344 |
CFG_ARMV6 SETL {TRUE} |
|
345 |
CFG_MMUPresent SETL {TRUE} |
|
346 |
CFG_CachePresent SETL {TRUE} |
|
347 |
CFG_CachePhysicalTag SETL {TRUE} |
|
348 |
CFG_WriteBufferPresent SETL {TRUE} |
|
349 |
CFG_SplitCache SETL {TRUE} |
|
350 |
CFG_CacheWriteAllocate SETL {TRUE} |
|
351 |
CFG_WriteBackCache SETL {TRUE} |
|
352 |
CFG_CacheFlushByWaySetIndex SETL {TRUE} |
|
353 |
CFG_SingleEntryDCacheFlush SETL {TRUE} |
|
354 |
CFG_SingleEntryICacheFlush SETL {TRUE} |
|
355 |
CFG_SingleEntryTLBFlush SETL {TRUE} |
|
356 |
CFG_CachePolicyInPTE SETL {TRUE} |
|
357 |
CFG_CacheTypeReg SETL {TRUE} |
|
358 |
CFG_BTBPresent SETL {TRUE} |
|
359 |
CFG_AuxCRPresent SETL {TRUE} |
|
360 |
CFG_CARPresent SETL {TRUE} |
|
361 |
CFG_PrefetchBuffer SETL {TRUE} |
|
362 |
CFG_FCSE_Present SETL {TRUE} |
|
363 |
CFG_ASID_Present SETL {TRUE} |
|
364 |
CFG_Cpu_Has_CLZ SETL {TRUE} |
|
365 |
CFG_TEX SETL {TRUE} |
|
36
538db54a451d
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
366 |
IF CFG_MMFlexible |
538db54a451d
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
367 |
; flexible memory model doesn't use Write Through memory for internal mappings. |
538db54a451d
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
368 |
CFG_WriteThroughDisabled SETL {TRUE} |
538db54a451d
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
369 |
ELSE |
538db54a451d
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
370 |
; multiple memory model uses Write Through memory for internal mappings unless erratum 399234 prevents us to do so |
0 | 371 |
IF (:LNOT: :DEF: CFG_CPU_ARM1136_ERRATUM_399234_FIXED) |
372 |
CFG_WriteThroughDisabled SETL {TRUE} |
|
373 |
ENDIF |
|
36
538db54a451d
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
374 |
ENDIF |
538db54a451d
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
375 |
|
0 | 376 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_I+MMUCR_IT+MMUCR_DT |
377 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+MMUCR_Z+MMUCR_XP+MMUCR_U |
|
378 |
||
379 |
INIT_NUMERIC_CONSTANT DefaultAuxCRClear, 0x0000003F |
|
380 |
||
381 |
IF (:LNOT: :DEF: CFG_CPU_ARM1136_ERRATUM_415662_FIXED :LOR: :LNOT: :DEF: CFG_CPU_ARM1136_ERRATUM_411920_FIXED) |
|
382 |
; base port should also ensure that BPR_AuxCRSet parameter (if used) has RV bit set |
|
383 |
INIT_NUMERIC_CONSTANT DefaultAuxCRSet, 0x00000027 ; enable static/dynamic/return prediction and |
|
384 |
; disable "Block Transfer Cache Operations" (RV bit) |
|
385 |
ELSE |
|
386 |
INIT_NUMERIC_CONSTANT DefaultAuxCRSet, 0x00000007 ; enable static/dynamic/return prediction |
|
387 |
ENDIF |
|
388 |
||
389 |
PDE_EXTRA EQU 0x00000000 |
|
390 |
||
391 |
ENDIF |
|
392 |
||
393 |
;******************************************************************************* |
|
394 |
IF :DEF: CFG_CPU_ARM1176 |
|
395 |
||
396 |
NCPU SETA NCPU+1 |
|
397 |
||
398 |
CFG_ARMV6 SETL {TRUE} |
|
399 |
CFG_MMUPresent SETL {TRUE} |
|
400 |
CFG_CachePresent SETL {TRUE} |
|
401 |
CFG_CachePhysicalTag SETL {TRUE} |
|
402 |
CFG_WriteBufferPresent SETL {TRUE} |
|
403 |
CFG_SplitCache SETL {TRUE} |
|
404 |
CFG_CacheWriteAllocate SETL {TRUE} |
|
405 |
CFG_WriteBackCache SETL {TRUE} |
|
406 |
CFG_CacheFlushByWaySetIndex SETL {TRUE} |
|
407 |
CFG_SingleEntryDCacheFlush SETL {TRUE} |
|
408 |
CFG_SingleEntryICacheFlush SETL {TRUE} |
|
409 |
CFG_SingleEntryTLBFlush SETL {TRUE} |
|
410 |
CFG_CachePolicyInPTE SETL {TRUE} |
|
411 |
CFG_CacheTypeReg SETL {TRUE} |
|
412 |
CFG_BTBPresent SETL {TRUE} |
|
413 |
;CFG_AuxCRPresent SETL {TRUE} ;set to false because AuxCR is not write accessible in non-secure mode |
|
414 |
CFG_CARPresent SETL {TRUE} |
|
415 |
CFG_PrefetchBuffer SETL {TRUE} |
|
416 |
CFG_FCSE_Present SETL {TRUE} |
|
417 |
CFG_ASID_Present SETL {TRUE} |
|
418 |
CFG_Cpu_Has_CLZ SETL {TRUE} |
|
419 |
CFG_TEX SETL {TRUE} |
|
420 |
CFG_MemoryTypeRemapping SETL {TRUE} |
|
421 |
CFG_WriteThroughDisabled SETL {TRUE} |
|
422 |
CFG_Cpu_Has_TrustZone SETL {TRUE} |
|
423 |
IF :LNOT: :DEF: CFG_TrustZone_Secure |
|
424 |
CFG_TrustZone_NonSecure SETL {TRUE} |
|
425 |
ENDIF |
|
426 |
||
427 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_I+MMUCR_IT+MMUCR_DT+MMUCR_TRE+MMUCR_FA |
|
428 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+MMUCR_Z+MMUCR_XP+MMUCR_U |
|
429 |
||
430 |
INIT_NUMERIC_CONSTANT DefaultAuxCRClear, 0x0000003F |
|
431 |
IF (:LNOT: :DEF: CFG_CPU_ARM1136_ERRATUM_411920_FIXED) |
|
432 |
; ARM1136 errata suggests this fix for 1176 as well |
|
433 |
; base port should also ensure that BPR_AuxCRSet parameter (if used) has RV bit set |
|
434 |
INIT_NUMERIC_CONSTANT DefaultAuxCRSet, 0x00000027 ; enable static/dynamic/return prediction and |
|
435 |
; disable "Block Transfer Cache Operations" (RV bit) |
|
436 |
ELSE |
|
437 |
INIT_NUMERIC_CONSTANT DefaultAuxCRSet, 0x00000007 ; enable static/dynamic/return prediction |
|
438 |
ENDIF |
|
439 |
||
440 |
PDE_EXTRA EQU 0x00000000 |
|
441 |
||
442 |
ENDIF |
|
443 |
||
444 |
;******************************************************************************* |
|
445 |
IF :DEF: CFG_CPU_ARM11MP |
|
446 |
||
447 |
NCPU SETA NCPU+1 |
|
448 |
||
449 |
CFG_ARMV6 SETL {TRUE} |
|
450 |
CFG_MMUPresent SETL {TRUE} |
|
451 |
CFG_CachePresent SETL {TRUE} |
|
452 |
CFG_CachePhysicalTag SETL {TRUE} |
|
453 |
CFG_WriteBufferPresent SETL {TRUE} |
|
454 |
CFG_SplitCache SETL {TRUE} |
|
455 |
CFG_CacheWriteAllocate SETL {TRUE} |
|
456 |
CFG_WriteBackCache SETL {TRUE} |
|
457 |
CFG_CacheFlushByWaySetIndex SETL {TRUE} |
|
458 |
CFG_SingleEntryDCacheFlush SETL {TRUE} |
|
459 |
CFG_SingleEntryICacheFlush SETL {TRUE} |
|
460 |
CFG_SingleEntryTLBFlush SETL {TRUE} |
|
461 |
CFG_CachePolicyInPTE SETL {TRUE} |
|
462 |
CFG_CacheTypeReg SETL {TRUE} |
|
463 |
CFG_BTBPresent SETL {TRUE} |
|
464 |
CFG_AuxCRPresent SETL {TRUE} |
|
465 |
CFG_CARPresent SETL {TRUE} |
|
466 |
CFG_PrefetchBuffer SETL {TRUE} |
|
467 |
CFG_FCSE_Present SETL {TRUE} |
|
468 |
CFG_ASID_Present SETL {TRUE} |
|
469 |
CFG_TEX SETL {TRUE} |
|
470 |
CFG_MemoryTypeRemapping SETL {TRUE} |
|
471 |
CFG_Cpu_Has_CLZ SETL {TRUE} |
|
472 |
CFG_WriteThroughDisabled SETL {TRUE} |
|
473 |
CFG_Cpu_Has_WFE_SEV SETL {TRUE} |
|
474 |
CFG_Cpu_Has_WFI SETL {TRUE} |
|
475 |
||
476 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_I+MMUCR_IT+MMUCR_DT+MMUCR_TRE+MMUCR_FA |
|
477 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+MMUCR_Z+MMUCR_XP+MMUCR_U |
|
478 |
||
479 |
INIT_NUMERIC_CONSTANT DefaultAuxCRClear, 0x0000003F |
|
480 |
||
481 |
IF :DEF: CFG_USE_SHARED_MEMORY |
|
482 |
INIT_NUMERIC_CONSTANT SET_AUXSMP, 0x20 |
|
483 |
ELSE |
|
484 |
INIT_NUMERIC_CONSTANT SET_AUXSMP, 0x0 |
|
485 |
ENDIF |
|
486 |
||
487 |
INIT_NUMERIC_CONSTANT DefaultAuxCRSet, 0x00000007 | SET_AUXSMP ; enable static/dynamic/return prediction |
|
488 |
||
489 |
PDE_EXTRA EQU 0x00000000 |
|
490 |
||
491 |
ENDIF |
|
492 |
||
493 |
;******************************************************************************* |
|
494 |
IF :DEF: CFG_CPU_CORTEX_A8N |
|
495 |
IF :LNOT: :DEF: CFG_CPU_CORTEX_A8 |
|
496 |
GBLL CFG_CPU_CORTEX_A8 |
|
497 |
ENDIF |
|
498 |
ENDIF |
|
499 |
||
500 |
IF :DEF: CFG_CPU_CORTEX_A8 |
|
501 |
||
502 |
NCPU SETA NCPU+1 |
|
503 |
||
504 |
CFG_ARMV7 SETL {TRUE} |
|
505 |
CFG_MMUPresent SETL {TRUE} |
|
506 |
CFG_CachePresent SETL {TRUE} |
|
507 |
CFG_CachePhysicalTag SETL {TRUE} |
|
508 |
CFG_WriteBufferPresent SETL {TRUE} |
|
509 |
CFG_SplitCache SETL {TRUE} |
|
510 |
CFG_AltDCachePresent SETL {TRUE} |
|
511 |
CFG_CacheWriteAllocate SETL {TRUE} |
|
512 |
CFG_WriteBackCache SETL {TRUE} |
|
513 |
CFG_CacheFlushByWaySetIndex SETL {TRUE} |
|
514 |
CFG_SingleEntryDCacheFlush SETL {TRUE} |
|
515 |
CFG_SingleEntryICacheFlush SETL {TRUE} |
|
516 |
CFG_SingleEntryTLBFlush SETL {TRUE} |
|
517 |
CFG_CachePolicyInPTE SETL {TRUE} |
|
518 |
CFG_CacheTypeReg SETL {TRUE} |
|
519 |
CFG_BTBPresent SETL {TRUE} |
|
520 |
CFG_CARPresent SETL {TRUE} |
|
521 |
CFG_PrefetchBuffer SETL {TRUE} |
|
522 |
CFG_FCSE_Present SETL {TRUE} |
|
523 |
CFG_ASID_Present SETL {TRUE} |
|
524 |
CFG_TEX SETL {TRUE} |
|
525 |
CFG_Cpu_Has_CLZ SETL {TRUE} |
|
526 |
CFG_Cpu_Has_TrustZone SETL {TRUE} |
|
527 |
IF :LNOT: :DEF: CFG_TrustZone_Secure |
|
528 |
CFG_TrustZone_NonSecure SETL {TRUE} |
|
529 |
ELSE |
|
530 |
CFG_AuxCRPresent SETL {TRUE} ; AuxCR is not write accessible in non-secure mode |
|
531 |
ENDIF |
|
532 |
CFG_MemoryTypeRemapping SETL {TRUE} |
|
533 |
CFG_WriteThroughDisabled SETL {TRUE} |
|
534 |
CFG_Cpu_Has_WFE_SEV SETL {TRUE} |
|
535 |
CFG_Cpu_Has_WFI SETL {TRUE} |
|
536 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_I+MMUCR_DT+MMUCR_IT+MMUCR_U+MMUCR_XP+MMUCR_TRE+MMUCR_FA |
|
537 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+MMUCR_Z |
|
538 |
||
539 |
INIT_NUMERIC_CONSTANT DefaultAuxCRClear, 0x00000000 |
|
540 |
INIT_NUMERIC_CONSTANT DefaultAuxCRSet, 0x00000002 ;Enable L2 Cache |
|
541 |
||
542 |
PDE_EXTRA EQU 0x00000000 |
|
543 |
||
544 |
ENDIF |
|
545 |
||
546 |
;******************************************************************************* |
|
547 |
IF :DEF: CFG_CPU_CORTEX_A9 |
|
548 |
||
549 |
NCPU SETA NCPU+1 |
|
550 |
||
551 |
CFG_ARMV7 SETL {TRUE} |
|
552 |
CFG_MMUPresent SETL {TRUE} |
|
553 |
CFG_CachePresent SETL {TRUE} |
|
554 |
CFG_CachePhysicalTag SETL {TRUE} |
|
555 |
CFG_WriteBufferPresent SETL {TRUE} |
|
556 |
CFG_SplitCache SETL {TRUE} |
|
557 |
CFG_AltDCachePresent SETL {TRUE} |
|
558 |
CFG_CacheWriteAllocate SETL {TRUE} |
|
559 |
CFG_WriteBackCache SETL {TRUE} |
|
560 |
CFG_CacheFlushByWaySetIndex SETL {TRUE} |
|
561 |
CFG_SingleEntryDCacheFlush SETL {TRUE} |
|
562 |
CFG_SingleEntryICacheFlush SETL {TRUE} |
|
563 |
CFG_SingleEntryTLBFlush SETL {TRUE} |
|
564 |
CFG_CachePolicyInPTE SETL {TRUE} |
|
565 |
CFG_CacheTypeReg SETL {TRUE} |
|
566 |
CFG_BTBPresent SETL {TRUE} |
|
567 |
CFG_CARPresent SETL {TRUE} |
|
568 |
CFG_PrefetchBuffer SETL {TRUE} |
|
569 |
CFG_FCSE_Present SETL {TRUE} |
|
570 |
CFG_ASID_Present SETL {TRUE} |
|
571 |
CFG_TEX SETL {TRUE} |
|
572 |
CFG_Cpu_Has_CLZ SETL {TRUE} |
|
573 |
CFG_Cpu_Has_TrustZone SETL {TRUE} |
|
574 |
IF :LNOT: :DEF: CFG_TrustZone_Secure |
|
575 |
CFG_TrustZone_NonSecure SETL {TRUE} |
|
576 |
ELSE |
|
577 |
CFG_AuxCRPresent SETL {TRUE} ; AuxCR is not write accessible in non-secure mode |
|
578 |
ENDIF |
|
579 |
CFG_MemoryTypeRemapping SETL {TRUE} |
|
580 |
CFG_WriteThroughDisabled SETL {TRUE} |
|
581 |
CFG_Cpu_Has_WFE_SEV SETL {TRUE} |
|
582 |
CFG_Cpu_Has_WFI SETL {TRUE} |
|
583 |
INIT_NUMERIC_CONSTANT InitialMMUCR, MMUCR_A+MMUCR_W+MMUCR_SBO+MMUCR_I+MMUCR_DT+MMUCR_IT+MMUCR_U+MMUCR_XP+MMUCR_TRE+MMUCR_FA |
|
584 |
INIT_NUMERIC_CONSTANT ExtraMMUCR, MMUCR_M+MMUCR_C+MMUCR_V+MMUCR_Z |
|
585 |
||
586 |
INIT_NUMERIC_CONSTANT DefaultAuxCRClear, 0x000003FF |
|
587 |
||
588 |
A9_ACTLR_CACHE_TLB_BRDCST EQU 0x00000001 ; ACTLR bit 0 set => Cache/TLB maintenance operations are broadcast to other cores |
|
589 |
A9_ACTLR_DSIDE_PREFETCH EQU 0x00000004 ; D-side prefetch enable |
|
590 |
A9_ACTLR_FOZ EQU 0x00000008 ; Enable "Full Of Zero" mode (whatever that is) |
|
591 |
A9_ACTLR_SMP EQU 0x00000040 ; Enable coherency |
|
592 |
A9_ACTLR_CACHE_EXCLUSIVE EQU 0x00000080 ; Enable exclusive caching |
|
593 |
A9_ACTLR_PARITY EQU 0x00000200 ; Enable parity checking |
|
594 |
||
595 |
IF :DEF: CFG_USE_SHARED_MEMORY |
|
596 |
INIT_NUMERIC_CONSTANT SET_AUXSMP, A9_ACTLR_SMP | A9_ACTLR_CACHE_TLB_BRDCST |
|
597 |
ELSE |
|
598 |
INIT_NUMERIC_CONSTANT SET_AUXSMP, 0 |
|
599 |
ENDIF |
|
600 |
||
601 |
INIT_NUMERIC_CONSTANT DefaultAuxCRSet, 0x00000000 | SET_AUXSMP |
|
602 |
||
603 |
PDE_EXTRA EQU 0x00000000 |
|
604 |
||
605 |
ENDIF |
|
606 |
||
607 |
;******************************************************************************* |
|
608 |
||
609 |
IF CFG_MemoryTypeRemapping |
|
610 |
; Default values for Primary Region Remap Registers & Normal Memory Remap Registers. Memory types shall be: |
|
611 |
; TEX[0]:C:B Memory Type |
|
612 |
;--------------------------- |
|
613 |
; 000 Strongly ordered |
|
614 |
; 001 Device |
|
615 |
; 010 Normal, inner & outer uncached |
|
616 |
; 011 Normal, inner & outer write back, write/read allocate |
|
617 |
; 1XX Strongly ordered (not used by Kernel) |
|
618 |
; Memory types for TEX[0]:C:B = 101, 110 & 111 may be overwritten (for the purpose of use in device drivers) |
|
619 |
; by BPR_Platform_Specific_Mappings parameter in Baseport. |
|
620 |
; Shared attribute is re-mapped as: 0->0 & 1->1 for both Device and Normal memory |
|
621 |
INIT_NUMERIC_CONSTANT DefaultPRRR, 0x000a00a4 |
|
622 |
INIT_NUMERIC_CONSTANT DefaultNMRR, 0x00400040 |
|
623 |
ENDIF |
|
624 |
||
625 |
; MMU page table descriptors |
|
626 |
; Level 1 (ARMv4) |
|
627 |
PDE_PT EQU 0x00000001 ; page table |
|
628 |
PDE_PT_MSK EQU 0xfffffc00 ; page table address mask |
|
629 |
PDE_SECTION EQU 0x00000002 ; section |
|
630 |
PDE_SEC_MSK EQU 0xfff00000 ; section address mask |
|
631 |
PDE_B EQU 0x00000004 ; B bit for section |
|
632 |
PDE_C EQU 0x00000008 ; C bit for section |
|
633 |
PDE_DOM_SH EQU 5 ; shift for domain in PDE |
|
634 |
PDE_DOM_MSK EQU 0x000001e0 ; mask for domain in PDE |
|
635 |
PDE_AP_SH EQU 10 ; shift for access permissions (section) |
|
636 |
PDE_AP_MSK EQU 0x00000c00 ; mask for access permissions (section) |
|
637 |
||
638 |
IF CFG_TEX |
|
639 |
; Level 1 (ARMv5) |
|
640 |
PDE_P EQU 0x00000200 ; PDE P bit (ECC enable) |
|
641 |
PDE_TEX_SH EQU 12 ; shift for TEX (section) |
|
642 |
PDE_TEX_MSK EQU 0x00007000 ; mask for TEX (section) |
|
643 |
ENDIF |
|
644 |
||
645 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
646 |
; Level 1 (ARMv6) |
|
647 |
PDE_XN EQU 0x00000010 ; XN bit for section (ARMv6) |
|
648 |
PDE_APX EQU 0x00008000 ; APX for section (ARMv6) |
|
649 |
PDE_S EQU 0x00010000 ; S bit for section (ARMv6) |
|
650 |
PDE_NG EQU 0x00020000 ; NG bit for section (ARMv6) |
|
651 |
ENDIF |
|
652 |
||
653 |
; Level 2 (ARMv4) |
|
654 |
PTE_LP EQU 0x00000001 ; large page |
|
655 |
PTE_LP_MSK EQU 0xffff0000 ; large page address mask |
|
656 |
PTE_SP EQU 0x00000002 ; small page |
|
657 |
PTE_SP_MSK EQU 0xfffff000 ; small page address mask |
|
658 |
PTE_B EQU 0x00000004 ; PTE B bit |
|
659 |
PTE_C EQU 0x00000008 ; PTE C bit |
|
660 |
PTE_AP0_SH EQU 4 ; AP0 shift |
|
661 |
PTE_AP0_MSK EQU 0x00000030 ; AP0 mask |
|
662 |
||
663 |
IF CFG_TEX |
|
664 |
; Level 2 (ARMv5) |
|
665 |
PTE_ESP EQU 0x00000003 ; extended small page |
|
666 |
PTE_LP_TEX_SH EQU 12 ; large page TEX shift |
|
667 |
PTE_LP_TEX_MSK EQU 0x00007000 ; large page TEX mask |
|
668 |
PTE_AP_SH EQU 4 ; AP shift |
|
669 |
PTE_AP_MSK EQU 0x00000030 ; AP mask |
|
670 |
PTE_ESP_TEX_SH EQU 6 ; extended small page TEX shift |
|
671 |
PTE_ESP_TEX_MSK EQU 0x000000c0 ; extended small page TEX mask |
|
672 |
ENDIF |
|
673 |
||
674 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
675 |
; Level 2 (ARMv6) |
|
676 |
PTE_ESP_TEX1 EQU 0x00000080 ; extended small page TEX1 bit |
|
677 |
PTE_APX EQU 0x00000200 ; APX for extended small or large page |
|
678 |
PTE_S EQU 0x00000400 ; S for extended small or large page |
|
679 |
PTE_NG EQU 0x00000800 ; NG for extended small or large page |
|
680 |
PTE_LP_XN EQU 0x00008000 ; XN for large page |
|
681 |
PTE_ESP_XN EQU 0x00000001 ; XN for extended small page |
|
682 |
ENDIF |
|
683 |
||
684 |
; MMU Permissions (APX:AP) |
|
685 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
686 |
||
687 |
PERM_RWNO EQU 1 |
|
688 |
PERM_RWRW EQU 3 |
|
689 |
PERM_RONO EQU 5 |
|
690 |
IF CFG_MemoryTypeRemapping |
|
691 |
PERM_RORO EQU 7 |
|
692 |
ELSE |
|
693 |
PERM_NONO EQU 0 |
|
694 |
PERM_RWRO EQU 2 |
|
695 |
PERM_RORO EQU 6 |
|
696 |
ENDIF |
|
697 |
||
698 |
ELSE |
|
699 |
||
700 |
PERM_RORO EQU 0 |
|
701 |
PERM_RWNO EQU 1 |
|
702 |
PERM_RWRO EQU 2 |
|
703 |
PERM_RWRW EQU 3 |
|
704 |
||
705 |
ENDIF |
|
706 |
||
707 |
; Cache attributes (TEX:CB) |
|
708 |
||
709 |
IF CFG_CachePolicyInPTE |
|
710 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
711 |
IF CFG_MemoryTypeRemapping |
|
712 |
;arm1176, arm11mpcore, armv7 |
|
713 |
MEMORY_STRONGLY_ORDERED EQU 0x00; strongly ordered |
|
714 |
MEMORY_DEVICE EQU 0x01; device |
|
715 |
MEMORY_UNCACHED EQU 0x02; outer and inner noncacheable, buffered, coalescing |
|
716 |
MEMORY_FULLY_CACHED EQU 0x03; outer and inner write back, read/write allocate |
|
717 |
;types 4 & 5 are reserved for Kernel's internal usage (and not in use so far) |
|
718 |
MEMORY_SPECIFIC6 EQU 0x06; Baseport specific memory type, as specified by BPR_PRRR_NRRR_Extra |
|
719 |
MEMORY_SPECIFIC7 EQU 0x07; Baseport specific memory type, as specified by BPR_PRRR_NRRR_Extra |
|
720 |
||
721 |
ELSE |
|
722 |
;arm1136 |
|
723 |
CACHE_SO EQU 0x00 ; strongly ordered |
|
724 |
CACHE_SD EQU 0x01 ; shared device |
|
725 |
CACHE_WBRA EQU 0x03 ; outer and inner WBRA |
|
726 |
CACHE_BUFC EQU 0x04 ; outer and inner noncacheable, buffered, coalescing |
|
727 |
CACHE_NSD EQU 0x08 ; nonshared device |
|
728 |
CACHE_WBWA EQU 0x15 ; outer and inner WBWA |
|
729 |
||
730 |
IF :DEF: CFG_CPU_ARM1136_ERRATUM_399234_FIXED |
|
731 |
CACHE_WTRA EQU 0x02 ; outer and inner WTRA |
|
732 |
CACHE_WTRA_WBRA EQU 0x1e ; outer WBRA inner WTRA (page tables) |
|
733 |
CACHE_WTRA_WBWA EQU 0x16 ; outer WBWA inner WTRA (page tables) |
|
734 |
ELSE |
|
735 |
; Downgrade Write-Through cache mode to outer and inner noncacheable, buffered, coalescing |
|
736 |
CACHE_WTRA EQU CACHE_BUFC |
|
737 |
CACHE_WTRA_WBRA EQU CACHE_BUFC |
|
738 |
CACHE_WTRA_WBWA EQU CACHE_BUFC |
|
739 |
ENDIF |
|
740 |
||
741 |
ENDIF |
|
742 |
ELSE |
|
743 |
IF CFG_TEX |
|
744 |
IF :DEF: CFG_CPU_MANZANO |
|
745 |
; Manzano |
|
746 |
CACHE_NCNB EQU 0 ; not cached or buffered |
|
747 |
CACHE_BUFC EQU 4 ; buffered, coalescing, not cached |
|
748 |
CACHE_WTRA EQU 0x12; write through read allocate |
|
749 |
CACHE_WBRA EQU 0x13; write back read allocate |
|
750 |
CACHE_BFNC EQU 5 ; buffered, non-coalescing, not cached |
|
751 |
CACHE_OFF_WBWA EQU 0x14; L1 not cached/buffered L2 write back write allocate |
|
752 |
CACHE_WTRA_WBWA EQU 0x16; L1 write throught read allocate L2 write back write allocate |
|
753 |
CACHE_WBRA_WBWA EQU 0x17; L1 write back read allocate L2 write back write allocate |
|
754 |
ELSE |
|
755 |
; Basic XScale |
|
756 |
CACHE_NCNB EQU 0 ; not cached or buffered |
|
757 |
CACHE_BUFC EQU 1 ; buffered, coalescing, not cached |
|
758 |
CACHE_WTRA EQU 2 ; write through read allocate |
|
759 |
CACHE_WBRA EQU 3 ; write back read allocate |
|
760 |
CACHE_BFNC EQU 5 ; buffered, non-coalescing, not cached |
|
761 |
CACHE_MINI EQU 6 ; minicache |
|
762 |
CACHE_WBWA EQU 7 ; write back write allocate |
|
763 |
ENDIF |
|
764 |
ELSE |
|
765 |
; ARM9/10 |
|
766 |
CACHE_NCNB EQU 0 ; not cached or buffered |
|
767 |
CACHE_BUF EQU 1 ; buffered not cached |
|
768 |
CACHE_WT EQU 2 ; write through |
|
769 |
CACHE_WB EQU 3 ; write back |
|
770 |
ENDIF |
|
771 |
ENDIF |
|
772 |
||
773 |
ELSE |
|
774 |
||
775 |
IF CFG_WriteBackCache |
|
776 |
; SA1 |
|
777 |
CACHE_NCNB EQU 0 ; not cached or buffered |
|
778 |
CACHE_BUF EQU 1 ; buffered not cached |
|
779 |
CACHE_MINI EQU 2 ; minicache, writeback |
|
780 |
CACHE_WB EQU 3 ; cached write back |
|
781 |
ELSE |
|
782 |
; old write through |
|
783 |
CACHE_NCNB EQU 0 ; not cached or buffered |
|
784 |
CACHE_BUF EQU 1 ; buffered not cached |
|
785 |
CACHE_WT_NB EQU 2 ; cached not buffered (?) |
|
786 |
CACHE_WT EQU 3 ; cached write through |
|
787 |
ENDIF |
|
788 |
||
789 |
ENDIF |
|
790 |
||
791 |
; Macro to define a boot table permission entry |
|
792 |
; Entry is defined by: |
|
793 |
; Permissions (3), Cache Attributes (5), Domain (4) |
|
794 |
; P bit (ARMv5, 1) |
|
795 |
; XN (ARMv6, 1) |
|
796 |
; NG (ARMv6, 1) |
|
797 |
; S (ARMv6, 1) |
|
798 |
; |
|
799 |
BTP_FLAG EQU 0x80000000 |
|
800 |
||
801 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
802 |
||
803 |
BTPERM_EXECUTE EQU 1 |
|
804 |
BTPERM_NO_EXECUTE EQU 0 |
|
805 |
BTPERM_GLOBAL EQU 1 |
|
806 |
BTPERM_LOCAL EQU 0 |
|
807 |
BTPERM_SHARED EQU 1 |
|
808 |
BTPERM_NON_SHARED EQU 0 |
|
809 |
BTPERM_ECC EQU 1 |
|
810 |
BTPERM_NON_ECC EQU 0 |
|
811 |
||
812 |
MACRO |
|
813 |
BTP_ENTRY $domain, $perm, $cache, $execute, $global, $P, $S |
|
814 |
DCD $domain + ($perm :SHL: 4) + ($cache :SHL: 7) + ($execute :SHL: 12) + ($global :SHL: 13) + ($P :SHL: 14) + ($S :SHL: 15) + BTP_FLAG |
|
815 |
MEND |
|
816 |
||
817 |
ELSE |
|
818 |
IF CFG_TEX |
|
819 |
||
820 |
BTPERM_ECC EQU 1 |
|
821 |
BTPERM_NON_ECC EQU 0 |
|
822 |
||
823 |
MACRO |
|
824 |
BTP_ENTRY $domain, $perm, $cache, $P |
|
825 |
DCD $domain + ($perm :SHL: 4) + ($cache :SHL: 7) + ($P :SHL: 14) + BTP_FLAG |
|
826 |
MEND |
|
827 |
||
828 |
ELSE |
|
829 |
||
830 |
MACRO |
|
831 |
BTP_ENTRY $domain, $perm, $cache |
|
832 |
DCD $domain + ($perm :SHL: 4) + ($cache :SHL: 7) + BTP_FLAG |
|
833 |
MEND |
|
834 |
||
835 |
ENDIF |
|
836 |
ENDIF |
|
837 |
||
838 |
; Default domain + permissions for uncached mapping |
|
839 |
IF CFG_MMDirect |
|
840 |
CLIENT_DOMAIN EQU 0 ; direct model uses domain 0 for everything |
|
841 |
UNC_PERM EQU PERM_RWRW ; uncached memory mapping is user-accessible |
|
842 |
ENDIF |
|
843 |
||
844 |
IF CFG_MMMoving |
|
845 |
CLIENT_DOMAIN EQU 1 ; moving model uses domain 1 for general fixed mappings |
|
846 |
UNC_PERM EQU PERM_RWNO ; and uncached mapping is dummy and not user accessible |
|
847 |
ENDIF |
|
848 |
||
849 |
IF CFG_MMMultiple |
|
850 |
CLIENT_DOMAIN EQU 0 ; multiple model uses domain 0 for general fixed mappings |
|
851 |
UNC_PERM EQU PERM_RWNO ; and uncached mapping is dummy and not user accessible |
|
852 |
ENDIF |
|
853 |
||
854 |
IF CFG_MMFlexible |
|
855 |
CLIENT_DOMAIN EQU 0 ; flexible model uses domain 0 for general fixed mappings |
|
856 |
UNC_PERM EQU PERM_RWNO ; and uncached mapping is dummy and not user accessible |
|
857 |
ENDIF |
|
858 |
||
859 |
;******************************************************************************* |
|
860 |
; Macros for hardware mappings |
|
861 |
||
862 |
HW_MULT_4K EQU 0x000 ; size is number of 4K pages |
|
863 |
HW_MULT_64K EQU 0x400 ; size is number of 64K pages |
|
864 |
HW_MULT_1M EQU 0x800 ; size is number of 1M pages |
|
865 |
HW_MULT_MASK EQU 0xC00 |
|
866 |
HW_MAP_EXT EQU 0x200 ; extended mapping description |
|
867 |
HW_MAP_EXT2 EQU 0x100 ; extended mapping description |
|
868 |
HW_SIZE_MASK EQU 0x0FF ; bottom 8 bits give size |
|
869 |
||
870 |
; Declare a hardware mapping with standard permissions |
|
871 |
MACRO |
|
872 |
HW_MAPPING $phys, $size, $mult |
|
873 |
IF ($mult=HW_MULT_4K) :LAND: ($phys :AND: 0x0FFF)<>0 |
|
874 |
! 1, "HW physical address not 4K aligned" |
|
875 |
ENDIF |
|
876 |
IF ($mult=HW_MULT_64K) :LAND: ($phys :AND: 0x0FFFF)<>0 |
|
877 |
! 1, "HW physical address not 64K aligned" |
|
878 |
ENDIF |
|
879 |
IF ($mult=HW_MULT_1M) :LAND: ($phys :AND: 0x0FFFFF)<>0 |
|
880 |
! 1, "HW physical address not 1M aligned" |
|
881 |
ENDIF |
|
882 |
IF ($size>255) |
|
883 |
! 1, "HW mapping maximum 255 pages" |
|
884 |
ENDIF |
|
885 |
DCD $phys + $size + $mult |
|
886 |
MEND |
|
887 |
||
888 |
; Declare a hardware mapping with nonstandard permissions |
|
889 |
; Follow this with a BTP_ENTRY macro specifying the required permissions |
|
890 |
MACRO |
|
891 |
HW_MAPPING_EXT $phys, $size, $mult |
|
892 |
IF ($mult=HW_MULT_4K) :LAND: ($phys :AND: 0x0FFF)<>0 |
|
893 |
! 1, "HW physical address not 4K aligned" |
|
894 |
ENDIF |
|
895 |
IF ($mult=HW_MULT_64K) :LAND: ($phys :AND: 0x0FFFF)<>0 |
|
896 |
! 1, "HW physical address not 64K aligned" |
|
897 |
ENDIF |
|
898 |
IF ($mult=HW_MULT_1M) :LAND: ($phys :AND: 0x0FFFFF)<>0 |
|
899 |
! 1, "HW physical address not 1M aligned" |
|
900 |
ENDIF |
|
901 |
IF ($size>255) |
|
902 |
! 1, "HW mapping maximum 255 pages" |
|
903 |
ENDIF |
|
904 |
DCD $phys + $size + $mult + HW_MAP_EXT |
|
905 |
MEND |
|
906 |
||
907 |
; Declare a hardware mapping with nonstandard linear address |
|
908 |
MACRO |
|
909 |
HW_MAPPING_EXT2 $phys, $size, $mult, $lin |
|
910 |
IF ($mult=HW_MULT_4K) :LAND: ($phys :AND: 0x0FFF)<>0 |
|
911 |
! 1, "HW physical address not 4K aligned" |
|
912 |
ENDIF |
|
913 |
IF ($mult=HW_MULT_64K) :LAND: ($phys :AND: 0x0FFFF)<>0 |
|
914 |
! 1, "HW physical address not 64K aligned" |
|
915 |
ENDIF |
|
916 |
IF ($mult=HW_MULT_1M) :LAND: ($phys :AND: 0x0FFFFF)<>0 |
|
917 |
! 1, "HW physical address not 1M aligned" |
|
918 |
ENDIF |
|
919 |
IF ($mult=HW_MULT_4K) :LAND: ($lin :AND: 0x0FFF)<>0 |
|
920 |
! 1, "HW linear address not 4K aligned" |
|
921 |
ENDIF |
|
922 |
IF ($mult=HW_MULT_64K) :LAND: ($lin :AND: 0x0FFFF)<>0 |
|
923 |
! 1, "HW linear address not 64K aligned" |
|
924 |
ENDIF |
|
925 |
IF ($mult=HW_MULT_1M) :LAND: ($lin :AND: 0x0FFFFF)<>0 |
|
926 |
! 1, "HW linear address not 1M aligned" |
|
927 |
ENDIF |
|
928 |
IF ($size>255) |
|
929 |
! 1, "HW mapping maximum 255 pages" |
|
930 |
ENDIF |
|
931 |
DCD $phys + $size + $mult + HW_MAP_EXT2 |
|
932 |
DCD $lin |
|
933 |
MEND |
|
934 |
||
935 |
; Declare a hardware mapping with nonstandard linear address and permissions |
|
936 |
; Follow this with a BTP_ENTRY macro specifying the required permissions |
|
937 |
MACRO |
|
938 |
HW_MAPPING_EXT3 $phys, $size, $mult, $lin |
|
939 |
IF ($mult=HW_MULT_4K) :LAND: ($phys :AND: 0x0FFF)<>0 |
|
940 |
! 1, "HW physical address not 4K aligned" |
|
941 |
ENDIF |
|
942 |
IF ($mult=HW_MULT_64K) :LAND: ($phys :AND: 0x0FFFF)<>0 |
|
943 |
! 1, "HW physical address not 64K aligned" |
|
944 |
ENDIF |
|
945 |
IF ($mult=HW_MULT_1M) :LAND: ($phys :AND: 0x0FFFFF)<>0 |
|
946 |
! 1, "HW physical address not 1M aligned" |
|
947 |
ENDIF |
|
948 |
IF ($mult=HW_MULT_4K) :LAND: ($lin :AND: 0x0FFF)<>0 |
|
949 |
! 1, "HW linear address not 4K aligned" |
|
950 |
ENDIF |
|
951 |
IF ($mult=HW_MULT_64K) :LAND: ($lin :AND: 0x0FFFF)<>0 |
|
952 |
! 1, "HW linear address not 64K aligned" |
|
953 |
ENDIF |
|
954 |
IF ($mult=HW_MULT_1M) :LAND: ($lin :AND: 0x0FFFFF)<>0 |
|
955 |
! 1, "HW linear address not 1M aligned" |
|
956 |
ENDIF |
|
957 |
IF ($size>255) |
|
958 |
! 1, "HW mapping maximum 255 pages" |
|
959 |
ENDIF |
|
960 |
DCD $phys + $size + $mult + HW_MAP_EXT2 + HW_MAP_EXT |
|
961 |
DCD $lin |
|
962 |
MEND |
|
963 |
||
964 |
;******************************************************************************* |
|
965 |
; Macros for ROM |
|
966 |
||
967 |
ROM_WIDTH_8 EQU 3 ; 8 bit wide |
|
968 |
ROM_WIDTH_16 EQU 4 ; 16 bit wide |
|
969 |
ROM_WIDTH_32 EQU 5 ; 32 bit wide |
|
970 |
||
971 |
MACRO |
|
972 |
ROM_PARAMS $width, $type, $rand_speed, $seq_speed |
|
973 |
DCD $width + ($type<<8) + ($rand_speed<<16) + ($seq_speed<<24) |
|
974 |
MEND |
|
975 |
||
976 |
MACRO |
|
977 |
ROM_BANK $physbase, $maxsize, $lin_override, $width, $type, $rand_speed, $seq_speed |
|
978 |
DCD $physbase |
|
979 |
DCD $maxsize |
|
980 |
ROM_PARAMS $width, $type, $rand_speed, $seq_speed |
|
981 |
DCD $lin_override |
|
982 |
MEND |
|
983 |
||
984 |
;******************************************************************************* |
|
985 |
; Macros for RAM |
|
986 |
||
987 |
RAM_VERBATIM EQU 1 ; OR base with this to skip testing of RAM |
|
988 |
||
989 |
;******************************************************************************* |
|
990 |
||
991 |
IF NCPU=0 |
|
992 |
! 1, "No CPU specified" |
|
993 |
ENDIF |
|
994 |
IF NCPU>1 |
|
995 |
! 2, "More than one CPU specified" |
|
996 |
ENDIF |
|
997 |
||
998 |
IF CFG_BootLoader :LAND: :LNOT: CFG_MMDirect |
|
999 |
! 3, "Bootloader must use direct model" |
|
1000 |
ENDIF |
|
1001 |
IF :LNOT: CFG_MMDirect |
|
1002 |
IF :LNOT: CFG_MMUPresent |
|
1003 |
! 3, "Only direct model permitted without MMU" |
|
1004 |
ENDIF |
|
1005 |
ENDIF |
|
1006 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
1007 |
IF CFG_MMMoving |
|
1008 |
! 4, "Moving model not supported on ARMv6/7" |
|
1009 |
ENDIF |
|
1010 |
INIT_NUMERIC_CONSTANT CFG_ARMV6_LARGE_CONFIG_THRESHOLD, 0x02000000 |
|
1011 |
ELSE |
|
1012 |
IF CFG_MMMultiple |
|
1013 |
! 5, "Multiple model not supported on ARMv4/5" |
|
1014 |
ENDIF |
|
1015 |
IF CFG_MMFlexible |
|
1016 |
! 5, "Flexible model not supported on ARMv4/5" |
|
1017 |
ENDIF |
|
1018 |
ENDIF |
|
1019 |
IF CFG_MMUPresent |
|
1020 |
CFG_IncludeRAMAllocator SETL {TRUE} |
|
1021 |
ENDIF |
|
1022 |
||
1023 |
;******************************************************************************* |
|
1024 |
||
1025 |
; Write buffer |
|
1026 |
MACRO |
|
1027 |
DRAIN_WB $reg, $cc |
|
1028 |
IF CFG_WriteBufferPresent |
|
1029 |
IF :DEF: CFG_CPU_XSCALE |
|
1030 |
MCR$cc p15, 0, $reg, c7, c10, 4 |
|
1031 |
MCR$cc p15, 0, $reg, c7, c5, 0 |
|
1032 |
ELSE |
|
1033 |
MCR$cc p15, 0, $reg, c7, c10, 4 |
|
1034 |
ENDIF |
|
1035 |
ENDIF |
|
1036 |
MEND |
|
1037 |
||
1038 |
; CP15 barrier |
|
1039 |
MACRO |
|
1040 |
CPWAIT $reg, $cc |
|
1041 |
IF :DEF: CFG_CPU_XSCALE |
|
1042 |
MRC$cc p15, 0, $reg, c2, c0, 0 |
|
1043 |
MOV$cc $reg, $reg |
|
1044 |
SUB$cc PC, PC, #4 |
|
1045 |
ENDIF |
|
1046 |
MEND |
|
1047 |
||
1048 |
; Cache (entire) |
|
1049 |
||
1050 |
IF ((:DEF: CFG_CPU_ARM1136 :LOR: :DEF: CFG_CPU_ARM1176) :LAND: :LNOT: :DEF: CFG_CPU_ARM1136_ERRATUM_411920_FIXED) |
|
1051 |
||
1052 |
MACRO |
|
1053 |
PURGE_ICACHE $reg1, $reg2, $cc |
|
1054 |
||
1055 |
GETCPSR $reg2 |
|
1056 |
orr $reg1, $reg2, #0xC0 |
|
1057 |
SETCPSR $reg1 ; disable interrupts |
|
1058 |
||
1059 |
MOV$cc $reg1, #0 |
|
1060 |
MCR$cc p15, 0, $reg1, c7, c5, 0 ; Invalidate Entire Instruction Cache |
|
1061 |
MCR$cc p15, 0, $reg1, c7, c5, 0 ; Invalidate Entire Instruction Cache |
|
1062 |
MCR$cc p15, 0, $reg1, c7, c5, 0 ; Invalidate Entire Instruction Cache |
|
1063 |
MCR$cc p15, 0, $reg1, c7, c5, 0 ; Invalidate Entire Instruction Cache |
|
1064 |
||
1065 |
MSR cpsr_c, $reg2 ; reenable interrupts |
|
1066 |
NOP |
|
1067 |
NOP |
|
1068 |
NOP |
|
1069 |
NOP |
|
1070 |
NOP |
|
1071 |
NOP |
|
1072 |
NOP |
|
1073 |
NOP |
|
1074 |
NOP |
|
1075 |
NOP |
|
1076 |
NOP |
|
1077 |
MEND |
|
1078 |
||
1079 |
ELSE |
|
1080 |
||
1081 |
MACRO |
|
1082 |
PURGE_ICACHE $reg, $cc |
|
1083 |
IF CFG_CachePresent |
|
1084 |
IF CFG_SplitCache |
|
1085 |
IF :DEF: CFG_CPU_CORTEX_A9 :LAND: (:LNOT: :DEF: CFG_CPU_ARM_A9_ERRATUM_571618_FIXED) |
|
1086 |
; ARM Cortex-A9 MPCore erratum 571618 workaround |
|
1087 |
; Execute memory barrier before interruptible CP15 operations |
|
1088 |
ARM_DMB |
|
1089 |
ENDIF |
|
1090 |
MCR$cc p15, 0, $reg, c7, c5, 0 |
|
1091 |
ELSE |
|
1092 |
MCR$cc p15, 0, $reg, c7, c7, 0 |
|
1093 |
ENDIF |
|
1094 |
ENDIF |
|
1095 |
MEND |
|
1096 |
||
1097 |
ENDIF |
|
1098 |
||
1099 |
MACRO |
|
1100 |
PURGE_DCACHE $reg, $cc |
|
1101 |
IF CFG_CachePresent |
|
1102 |
IF CFG_SplitCache |
|
1103 |
MCR$cc p15, 0, $reg, c7, c6, 0 |
|
1104 |
ELSE |
|
1105 |
MCR$cc p15, 0, $reg, c7, c7, 0 |
|
1106 |
ENDIF |
|
1107 |
ENDIF |
|
1108 |
MEND |
|
1109 |
||
1110 |
IF :LNOT: CFG_TrustZone_NonSecure |
|
1111 |
;Not available in non-secure mode of TrustZone |
|
1112 |
MACRO |
|
1113 |
PURGE_IDCACHE $reg, $cc |
|
1114 |
IF CFG_CachePresent |
|
1115 |
IF CFG_ARMV7 |
|
1116 |
! 1, "Instruction removed on ARMv7" |
|
1117 |
ELSE |
|
1118 |
MCR$cc p15, 0, $reg, c7, c7, 0 |
|
1119 |
ENDIF |
|
1120 |
ENDIF |
|
1121 |
MEND |
|
1122 |
ENDIF |
|
1123 |
||
1124 |
MACRO |
|
1125 |
FLUSH_DCACHE $reg, $cc |
|
1126 |
IF CFG_CachePresent |
|
1127 |
IF CFG_WriteBackCache |
|
1128 |
BL$cc FlushWriteBackDCache |
|
1129 |
ELSE |
|
1130 |
PURGE_DCACHE $reg, $cc |
|
1131 |
ENDIF |
|
1132 |
ENDIF |
|
1133 |
MEND |
|
1134 |
||
1135 |
; 1136 & 1176 bootroms don't use this macro. If they do, 411920 ARM1136 erratum should be fixed here. |
|
1136 |
MACRO |
|
1137 |
FLUSH_IDCACHE $reg, $cc |
|
1138 |
IF CFG_CachePresent |
|
1139 |
IF CFG_WriteBackCache |
|
1140 |
MOV$cc PC, PC |
|
1141 |
ADD PC, PC, #4 |
|
1142 |
BL FlushWriteBackDCache |
|
1143 |
IF :DEF: CFG_CPU_CORTEX_A9 :LAND: (:LNOT: :DEF: CFG_CPU_ARM_A9_ERRATUM_571618_FIXED) |
|
1144 |
; ARM Cortex-A9 MPCore erratum 571618 workaround |
|
1145 |
; Execute memory barrier before interruptible CP15 operations |
|
1146 |
ARM_DMB |
|
1147 |
ENDIF |
|
1148 |
MCR p15, 0, $reg, c7, c5, 0 |
|
1149 |
ELSE |
|
1150 |
PURGE_IDCACHE $reg, $cc |
|
1151 |
ENDIF |
|
1152 |
ENDIF |
|
1153 |
MEND |
|
1154 |
||
1155 |
||
1156 |
; Cache (line by address) |
|
1157 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
1158 |
||
1159 |
MACRO |
|
1160 |
CLEAN_DCACHE_LINE $reg, $cc |
|
1161 |
MCR$cc p15, 0, $reg, c7, c10, 1 |
|
1162 |
MEND |
|
1163 |
||
1164 |
MACRO |
|
1165 |
CACHE_LINE_SIZE $reg1, $reg2 |
|
1166 |
IF CFG_ARMV6 |
|
1167 |
MOV $reg1, #32 ; This is the same on all ARMv6 platforms |
|
1168 |
ELSE |
|
1169 |
MRC p15, 0, $reg2, c0, c0, 1 ; get Cache Type reg. |
|
1170 |
;reg2 - bits[19:16] = log2(MinDCacheLine_in_words) |
|
1171 |
AND $reg2, #0xf0000 ; |
|
1172 |
MOV $reg2, $reg2, lsr #16 ; |
|
1173 |
MOV $reg1, #4 |
|
1174 |
MOV $reg1, $reg1,lsl $reg2 ; reg1 = MinDCacheLine_in_bytes |
|
1175 |
ENDIF |
|
1176 |
MEND |
|
1177 |
||
1178 |
ENDIF |
|
1179 |
||
1180 |
||
1181 |
; Cache (line by index) |
|
1182 |
||
1183 |
; TLB (entire) |
|
1184 |
MACRO |
|
1185 |
FLUSH_ITLB $reg, $cc |
|
1186 |
IF CFG_MMUPresent |
|
1187 |
IF CFG_SplitTLB |
|
1188 |
MCR$cc p15, 0, $reg, c8, c5, 0 |
|
1189 |
ELSE |
|
1190 |
MCR$cc p15, 0, $reg, c8, c7, 0 |
|
1191 |
ENDIF |
|
1192 |
ENDIF |
|
1193 |
MEND |
|
1194 |
||
1195 |
MACRO |
|
1196 |
FLUSH_DTLB $reg, $cc |
|
1197 |
IF CFG_MMUPresent |
|
1198 |
IF CFG_SplitTLB |
|
1199 |
MCR$cc p15, 0, $reg, c8, c6, 0 |
|
1200 |
ELSE |
|
1201 |
MCR$cc p15, 0, $reg, c8, c7, 0 |
|
1202 |
ENDIF |
|
1203 |
ENDIF |
|
1204 |
MEND |
|
1205 |
||
1206 |
MACRO |
|
1207 |
FLUSH_IDTLB $reg, $cc |
|
1208 |
IF CFG_MMUPresent |
|
1209 |
MCR$cc p15, 0, $reg, c8, c7, 0 |
|
1210 |
ENDIF |
|
1211 |
MEND |
|
1212 |
||
1213 |
; TLB (entry) |
|
1214 |
||
1215 |
MACRO |
|
1216 |
FLUSH_ITLB_ENTRY $reg, $cc |
|
1217 |
IF CFG_MMUPresent |
|
1218 |
IF CFG_SplitTLB |
|
1219 |
IF CFG_SingleEntryITLBFlush |
|
1220 |
MCR$cc p15, 0, $reg, c8, c5, 1 |
|
1221 |
ELSE |
|
1222 |
MCR$cc p15, 0, $reg, c8, c5, 0 |
|
1223 |
ENDIF |
|
1224 |
ELSE |
|
1225 |
IF CFG_SingleEntryTLBFlush |
|
1226 |
IF :DEF: CFG_CPU_ARM11MP |
|
1227 |
MCR$cc p15, 0, $reg, c8, c7, 3 |
|
1228 |
ELSE |
|
1229 |
MCR$cc p15, 0, $reg, c8, c7, 1 |
|
1230 |
ENDIF |
|
1231 |
ELSE |
|
1232 |
MCR$cc p15, 0, $reg, c8, c7, 0 |
|
1233 |
ENDIF |
|
1234 |
ENDIF |
|
1235 |
ENDIF |
|
1236 |
MEND |
|
1237 |
||
1238 |
MACRO |
|
1239 |
FLUSH_DTLB_ENTRY $reg, $cc |
|
1240 |
IF CFG_MMUPresent |
|
1241 |
IF CFG_SplitTLB |
|
1242 |
MCR$cc p15, 0, $reg, c8, c6, 1 |
|
1243 |
ELSE |
|
1244 |
IF CFG_SingleEntryTLBFlush |
|
1245 |
IF :DEF: CFG_CPU_ARM11MP |
|
1246 |
MCR$cc p15, 0, $reg, c8, c7, 3 |
|
1247 |
ELSE |
|
1248 |
MCR$cc p15, 0, $reg, c8, c7, 1 |
|
1249 |
ENDIF |
|
1250 |
ELSE |
|
1251 |
MCR$cc p15, 0, $reg, c8, c7, 0 |
|
1252 |
ENDIF |
|
1253 |
ENDIF |
|
1254 |
ENDIF |
|
1255 |
MEND |
|
1256 |
||
1257 |
MACRO |
|
1258 |
FLUSH_IDTLB_ENTRY $reg, $cc |
|
1259 |
IF CFG_MMUPresent |
|
1260 |
IF CFG_SplitTLB |
|
1261 |
IF CFG_SingleEntryTLBFlush |
|
1262 |
MCR$cc p15, 0, $reg, c8, c7, 1 |
|
1263 |
ELSE IF CFG_SingleEntryITLBFlush |
|
1264 |
MCR$cc p15, 0, $reg, c8, c6, 1 |
|
1265 |
MCR$cc p15, 0, $reg, c8, c5, 1 |
|
1266 |
ELSE |
|
1267 |
MCR$cc p15, 0, $reg, c8, c7, 0 |
|
1268 |
ENDIF |
|
1269 |
ELSE |
|
1270 |
IF CFG_SingleEntryTLBFlush |
|
1271 |
IF :DEF: CFG_CPU_ARM11MP |
|
1272 |
MCR$cc p15, 0, $reg, c8, c7, 3 |
|
1273 |
ELSE |
|
1274 |
MCR$cc p15, 0, $reg, c8, c7, 1 |
|
1275 |
ENDIF |
|
1276 |
ELSE |
|
1277 |
MCR$cc p15, 0, $reg, c8, c7, 0 |
|
1278 |
ENDIF |
|
1279 |
ENDIF |
|
1280 |
ENDIF |
|
1281 |
MEND |
|
1282 |
||
1283 |
; BTB |
|
1284 |
MACRO |
|
1285 |
FLUSH_BTB $reg, $cc |
|
1286 |
IF CFG_BTBPresent |
|
1287 |
MCR$cc p15, 0, $reg, c7, c5, 6 |
|
1288 |
ENDIF |
|
1289 |
MEND |
|
1290 |
||
1291 |
; CAR |
|
1292 |
IF CFG_CARPresent |
|
1293 |
MACRO |
|
1294 |
GET_CAR $reg, $cc |
|
1295 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
1296 |
MRC$cc p15, 0, $reg, c1, c0, 2 |
|
1297 |
ENDIF |
|
1298 |
IF :DEF: CFG_CPU_XSCALE |
|
1299 |
MRC$cc p15, 0, $reg, c15, c1, 0 |
|
1300 |
ENDIF |
|
1301 |
MEND |
|
1302 |
||
1303 |
MACRO |
|
1304 |
SET_CAR $reg, $cc |
|
1305 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
1306 |
MCR$cc p15, 0, $reg, c1, c0, 2 |
|
1307 |
ARM_ISB |
|
1308 |
ENDIF |
|
1309 |
IF :DEF: CFG_CPU_XSCALE |
|
1310 |
MCR$cc p15, 0, $reg, c15, c1, 0 |
|
1311 |
ENDIF |
|
1312 |
MEND |
|
1313 |
ENDIF |
|
1314 |
||
1315 |
; DACR |
|
1316 |
IF CFG_MMUPresent |
|
1317 |
MACRO |
|
1318 |
GET_DACR $reg, $cc |
|
1319 |
MRC$cc p15, 0, $reg, c3, c0, 0 |
|
1320 |
MEND |
|
1321 |
||
1322 |
MACRO |
|
1323 |
SET_DACR $reg, $cc |
|
1324 |
MCR$cc p15, 0, $reg, c3, c0, 0 |
|
1325 |
MEND |
|
1326 |
ENDIF |
|
1327 |
||
1328 |
; FCSE |
|
1329 |
IF CFG_FCSE_Present |
|
1330 |
MACRO |
|
1331 |
GET_FCSE $reg, $cc |
|
1332 |
MRC$cc p15, 0, $reg, c13, c0, 0 |
|
1333 |
MEND |
|
1334 |
||
1335 |
MACRO |
|
1336 |
SET_FCSE $reg, $cc |
|
1337 |
MCR$cc p15, 0, $reg, c13, c0, 0 |
|
1338 |
MEND |
|
1339 |
ENDIF |
|
1340 |
||
1341 |
; ASID |
|
1342 |
IF CFG_ASID_Present |
|
1343 |
MACRO |
|
1344 |
GET_ASID $reg, $cc |
|
1345 |
MRC$cc p15, 0, $reg, c13, c0, 1 |
|
1346 |
MEND |
|
1347 |
||
1348 |
MACRO |
|
1349 |
SET_ASID $reg, $cc |
|
1350 |
ARM_DSB |
|
1351 |
MCR$cc p15, 0, $reg, c13, c0, 1 |
|
1352 |
ARM_ISB |
|
1353 |
MEND |
|
1354 |
ENDIF |
|
1355 |
||
1356 |
; MMUID |
|
1357 |
IF CFG_MMUPresent |
|
1358 |
MACRO |
|
1359 |
GET_MMUID $reg, $cc |
|
1360 |
MRC$cc p15, 0, $reg, c0, c0, 0 |
|
1361 |
MEND |
|
1362 |
ENDIF |
|
1363 |
||
1364 |
; Cache type |
|
1365 |
IF CFG_CacheTypeReg |
|
1366 |
MACRO |
|
1367 |
GET_CTR $reg, $cc |
|
1368 |
MRC$cc p15, 0, $reg, c0, c0, 1 |
|
1369 |
MEND |
|
1370 |
ENDIF |
|
1371 |
||
1372 |
; TCM type/TLB type |
|
1373 |
IF CFG_ARMV6 :LOR: CFG_ARMV7 |
|
1374 |
MACRO |
|
1375 |
GET_TCM_TYPE $reg, $cc |
|
1376 |
MRC$cc p15, 0, $reg, c0, c0, 2 |
|
1377 |
MEND |
|
1378 |
||
1379 |
MACRO |
|
1380 |
GET_TLB_TYPE $reg, $cc |
|
1381 |
MRC$cc p15, 0, $reg, c0, c0, 3 |
|
1382 |
MEND |
|
1383 |
ENDIF |
|
1384 |
||
1385 |
; Address selection |
|
1386 |
MACRO |
|
1387 |
GET_ADDRESS $reg, $phys, $lin |
|
1388 |
IF CFG_MMDirect |
|
1389 |
LDR $reg, =$phys |
|
1390 |
ELSE |
|
1391 |
MRC p15, 0, $reg, c1, c0, 0 |
|
1392 |
TST $reg, #MMUCR_M |
|
1393 |
LDREQ $reg, =$phys |
|
1394 |
LDRNE $reg, =$lin |
|
1395 |
ENDIF |
|
1396 |
MEND |
|
1397 |
||
1398 |
;CLZ instruction macro |
|
1399 |
IF CFG_Cpu_Has_CLZ |
|
1400 |
MACRO |
|
1401 |
CLZ_M $Rd, $Rm |
|
1402 |
DCD 0xe16f0f10 + ($Rd :SHL: 12) + $Rm |
|
1403 |
MEND |
|
1404 |
ENDIF |
|
1405 |
||
1406 |
; WFI instruction macro |
|
1407 |
IF CFG_Cpu_Has_WFI |
|
1408 |
MACRO |
|
1409 |
ARM_WFI |
|
1410 |
ARM_DSB |
|
1411 |
DCD 0xE320F003 |
|
1412 |
MEND |
|
1413 |
ENDIF |
|
1414 |
||
1415 |
; WFE/SEV instruction macros |
|
1416 |
IF CFG_Cpu_Has_WFE_SEV |
|
1417 |
MACRO |
|
1418 |
ARM_WFE |
|
1419 |
ARM_DSB |
|
1420 |
DCD 0xE320F002 |
|
1421 |
MEND |
|
1422 |
||
1423 |
MACRO |
|
1424 |
ARM_SEV |
|
1425 |
DCD 0xE320F004 |
|
1426 |
MEND |
|
1427 |
ENDIF |
|
1428 |
||
1429 |
; DMB/DSB/ISB instruction macros |
|
1430 |
IF CFG_ARMV7 |
|
1431 |
||
1432 |
MACRO |
|
1433 |
ARM_DSB |
|
1434 |
DCD 0xF57FF04F ; DSBSY (full system DSB) |
|
1435 |
MEND |
|
1436 |
||
1437 |
MACRO |
|
1438 |
ARM_DMB |
|
1439 |
DCD 0xF57FF05F ; DMBSY (full system DMB) |
|
1440 |
MEND |
|
1441 |
||
1442 |
MACRO |
|
1443 |
ARM_ISB |
|
1444 |
DCD 0xF57FF06F ; ISBSY (full system ISB) |
|
1445 |
MEND |
|
1446 |
||
1447 |
ELSE |
|
1448 |
||
1449 |
MACRO |
|
1450 |
ARM_DSB |
|
1451 |
DRAIN_WB r0 ; DSB=drain write buffer CP15 instruction |
|
1452 |
MEND |
|
1453 |
||
1454 |
MACRO |
|
1455 |
ARM_DMB ; Use DSB instead of DMB since performance |
|
1456 |
ARM_DSB ; not a problem in bootstrap |
|
1457 |
MEND |
|
1458 |
||
1459 |
MACRO |
|
1460 |
ARM_ISB |
|
1461 |
IF CFG_ARMV6 |
|
1462 |
MCR p15, 0, r0, c7, c5, 4 |
|
1463 |
ENDIF |
|
1464 |
MEND |
|
1465 |
||
1466 |
ENDIF |
|
1467 |
||
1468 |
||
1469 |
;******************************************************************************* |
|
1470 |
; handy bits and pieces |
|
1471 |
;******************************************************************************* |
|
1472 |
||
1473 |
IF SMP |
|
1474 |
||
1475 |
IF CFG_MMDirect |
|
1476 |
SuperCpuSize EQU 0x14000 ; Space reserved for super page + CPU page(s) |
|
1477 |
DefaultPTAlloc EQU 0x10000 ; Space reserved for page tables |
|
1478 |
ELSE |
|
1479 |
SuperCpuSize EQU 0x2000 ; Space reserved for super page + CPU page(s) |
|
1480 |
ENDIF |
|
1481 |
||
1482 |
ELSE |
|
1483 |
||
1484 |
IF CFG_MMDirect |
|
1485 |
SuperCpuSize EQU 0x5000 ; Space reserved for super page + CPU page(s) |
|
1486 |
DefaultPTAlloc EQU 0x8000 ; Space reserved for page tables |
|
1487 |
ELSE |
|
1488 |
SuperCpuSize EQU 0x2000 ; Space reserved for super page + CPU page(s) |
|
1489 |
ENDIF |
|
1490 |
||
1491 |
ENDIF |
|
1492 |
||
1493 |
||
1494 |
;******************************************************************************* |
|
1495 |
; extern declarations |
|
1496 |
;******************************************************************************* |
|
1497 |
||
1498 |
IF :LNOT: :DEF: __BOOTCPU_S__ |
|
1499 |
IMPORT InitCpu |
|
1500 |
IF CFG_MMUPresent |
|
1501 |
IMPORT PageTableUpdate |
|
1502 |
IMPORT GetPdeValue |
|
1503 |
IMPORT GetPteValue |
|
1504 |
IMPORT EnableMmu |
|
1505 |
ENDIF |
|
1506 |
ENDIF |
|
1507 |
||
1508 |
IF :LNOT: :DEF: __BOOTUTILS_S__ |
|
1509 |
IMPORT WordFill |
|
1510 |
IMPORT WordMove |
|
1511 |
IMPORT BootCall |
|
1512 |
IMPORT GetParameter |
|
1513 |
IMPORT GetMandatoryParameter |
|
1514 |
IMPORT FindParameter |
|
1515 |
IMPORT FindRamBankWidth |
|
1516 |
IMPORT FindRamBankConfig |
|
1517 |
IMPORT ExciseRamArea |
|
1518 |
IMPORT RomPhysicalToLinear |
|
1519 |
IMPORT RomLinearToPhysical |
|
1520 |
IMPORT FindPrimary |
|
1521 |
IMPORT CheckForExtensionRom |
|
1522 |
IMPORT SetupSuperPageRunningFromRAM |
|
1523 |
IMPORT RelocateSuperPage |
|
1524 |
IF CFG_MMDirect |
|
1525 |
IMPORT RamPhysicalToLinear |
|
1526 |
IMPORT RamLinearToPhysical |
|
1527 |
ENDIF |
|
1528 |
||
1529 |
IF CFG_MMUPresent |
|
1530 |
IF :LNOT: CFG_MMDirect |
|
1531 |
IMPORT AllocAndMap |
|
1532 |
ENDIF |
|
1533 |
IMPORT MapContiguous |
|
1534 |
IMPORT InitMemMapSystem |
|
1535 |
IMPORT SwitchToVirtual |
|
1536 |
ENDIF |
|
1537 |
||
1538 |
IF CFG_DebugBootRom |
|
1539 |
IMPORT WriteS |
|
1540 |
IMPORT WriteNL |
|
1541 |
IMPORT WriteW |
|
1542 |
IMPORT WriteH |
|
1543 |
IMPORT WriteB |
|
1544 |
IMPORT MemDump |
|
1545 |
IMPORT InitStacks |
|
1546 |
ENDIF |
|
1547 |
||
1548 |
IF CFG_IncludeRAMAllocator |
|
1549 |
IMPORT HandleAllocRequest |
|
1550 |
ELSE |
|
1551 |
IMPORT AllocatorStub |
|
1552 |
ENDIF |
|
1553 |
||
1554 |
IF CFG_AutoDetectROM |
|
1555 |
IMPORT FindRomBankSize |
|
1556 |
IMPORT CheckROMPresent |
|
1557 |
ENDIF |
|
1558 |
||
1559 |
IMPORT BasicFaultHandler |
|
1560 |
||
1561 |
ENDIF |
|
1562 |
||
1563 |
IF :DEF: __BOOTUTILS_S__ :LOR: :DEF: __BOOTCPU_S__ :LOR: :DEF: __BOOTMAIN_S__ |
|
1564 |
IMPORT Fault |
|
1565 |
ENDIF |
|
1566 |
||
1567 |
IF SMP |
|
1568 |
IF :LNOT: :DEF: __BOOTCPU_S__ |
|
1569 |
IMPORT GetAPBootCodePhysAddr |
|
1570 |
IMPORT APBootCodeEntry |
|
1571 |
IMPORT APResetEntry |
|
1572 |
IMPORT HandshakeAP |
|
1573 |
ENDIF |
|
1574 |
ENDIF |
|
1575 |
||
1576 |
ENDIF ; __BOOTCPU_INC__ |
|
1577 |
END |
|
1578 |