]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.asm
Updated Hardware Interrupt protocol to add an EOI member. Added ARM Data/Instruction...
[mirror_edk2.git] / ArmPkg / Library / ArmLib / ArmV7 / ArmV7Support.asm
CommitLineData
2ef2b01e
A
1//------------------------------------------------------------------------------
2//
3// Copyright (c) 2008-2009 Apple Inc. All rights reserved.
4//
5// All rights reserved. This program and the accompanying materials
6// are licensed and made available under the terms and conditions of the BSD License
7// which accompanies this distribution. The full text of the license may be found at
8// http://opensource.org/licenses/bsd-license.php
9//
10// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12//
13//------------------------------------------------------------------------------
14
15 EXPORT ArmInvalidateInstructionCache
16 EXPORT ArmInvalidateDataCacheEntryByMVA
17 EXPORT ArmCleanDataCacheEntryByMVA
18 EXPORT ArmCleanInvalidateDataCacheEntryByMVA
19 EXPORT ArmInvalidateDataCacheEntryBySetWay
20 EXPORT ArmCleanDataCacheEntryBySetWay
21 EXPORT ArmCleanInvalidateDataCacheEntryBySetWay
22 EXPORT ArmDrainWriteBuffer
23 EXPORT ArmEnableMmu
24 EXPORT ArmDisableMmu
c2b5ca8b 25 EXPORT ArmMmuEnabled
2ef2b01e
A
26 EXPORT ArmEnableDataCache
27 EXPORT ArmDisableDataCache
28 EXPORT ArmEnableInstructionCache
29 EXPORT ArmDisableInstructionCache
30 EXPORT ArmEnableBranchPrediction
31 EXPORT ArmDisableBranchPrediction
37b91c49 32 EXPORT ArmV7AllDataCachesOperation
026c3d34 33 EXPORT ArmDataMemoryBarrier
34 EXPORT ArmDataSyncronizationBarrier
35 EXPORT ArmInstructionSynchronizationBarrier
36
2ef2b01e
A
37
38DC_ON EQU ( 0x1:SHL:2 )
39IC_ON EQU ( 0x1:SHL:12 )
2ef2b01e
A
40
41
42 AREA ArmCacheLib, CODE, READONLY
43 PRESERVE8
44
45
46ArmInvalidateDataCacheEntryByMVA
98bc0c8c 47 MCR p15, 0, r0, c7, c6, 1 ; invalidate single data cache line
1a27eb48 48 DSB
49 ISB
2ef2b01e
A
50 BX lr
51
52
53ArmCleanDataCacheEntryByMVA
54 MCR p15, 0, r0, c7, c10, 1 ; clean single data cache line
1a27eb48 55 DSB
56 ISB
2ef2b01e
A
57 BX lr
58
59
60ArmCleanInvalidateDataCacheEntryByMVA
61 MCR p15, 0, r0, c7, c14, 1 ; clean and invalidate single data cache line
1a27eb48 62 DSB
63 ISB
2ef2b01e
A
64 BX lr
65
66
67ArmInvalidateDataCacheEntryBySetWay
68 mcr p15, 0, r0, c7, c6, 2 ; Invalidate this line
1a27eb48 69 DSB
70 ISB
2ef2b01e
A
71 bx lr
72
73
74ArmCleanInvalidateDataCacheEntryBySetWay
75 mcr p15, 0, r0, c7, c14, 2 ; Clean and Invalidate this line
1a27eb48 76 DSB
77 ISB
2ef2b01e
A
78 bx lr
79
80
81ArmCleanDataCacheEntryBySetWay
82 mcr p15, 0, r0, c7, c10, 2 ; Clean this line
1a27eb48 83 DSB
84 ISB
2ef2b01e
A
85 bx lr
86
87
88ArmDrainWriteBuffer
89 mcr p15, 0, r0, c7, c10, 4 ; Drain write buffer for sync
1a27eb48 90 DSB
91 ISB
2ef2b01e
A
92 bx lr
93
94
95ArmInvalidateInstructionCache
96 MOV R0,#0
97 MCR p15,0,R0,c7,c5,0 ;Invalidate entire instruction cache
98 MOV R0,#0
99 MCR p15,0,R0,c7,c5,4 ;Instruction synchronization barrier
1a27eb48 100 DSB
101 ISB
2ef2b01e
A
102 BX LR
103
104ArmEnableMmu
105 mrc p15,0,R0,c1,c0,0
106 orr R0,R0,#1
107 mcr p15,0,R0,c1,c0,0
1a27eb48 108 DSB
109 ISB
2ef2b01e
A
110 bx LR
111
c2b5ca8b
A
112ArmMmuEnabled
113 mrc p15,0,R0,c1,c0,0
114 and R0,R0,#1
1a27eb48 115 ISB
c2b5ca8b
A
116 bx LR
117
2ef2b01e
A
118ArmDisableMmu
119 mov R0,#0
120 mcr p15,0,R0,c13,c0,0 ;FCSE PID register must be cleared before disabling MMU
121 mrc p15,0,R0,c1,c0,0
122 bic R0,R0,#1
123 mcr p15,0,R0,c1,c0,0 ;Disable MMU
1a27eb48 124 DSB
125 ISB
2ef2b01e
A
126 bx LR
127
128ArmEnableDataCache
129 LDR R1,=DC_ON
130 MRC p15,0,R0,c1,c0,0 ;Read control register configuration data
131 ORR R0,R0,R1 ;Set C bit
132 MCR p15,0,r0,c1,c0,0 ;Write control register configuration data
1a27eb48 133 DSB
134 ISB
2ef2b01e
A
135 BX LR
136
137ArmDisableDataCache
138 LDR R1,=DC_ON
139 MRC p15,0,R0,c1,c0,0 ;Read control register configuration data
140 BIC R0,R0,R1 ;Clear C bit
141 MCR p15,0,r0,c1,c0,0 ;Write control register configuration data
1a27eb48 142 ISB
2ef2b01e
A
143 BX LR
144
145ArmEnableInstructionCache
146 LDR R1,=IC_ON
147 MRC p15,0,R0,c1,c0,0 ;Read control register configuration data
148 ORR R0,R0,R1 ;Set I bit
149 MCR p15,0,r0,c1,c0,0 ;Write control register configuration data
1a27eb48 150 ISB
2ef2b01e
A
151 BX LR
152
153ArmDisableInstructionCache
154 LDR R1,=IC_ON
155 MRC p15,0,R0,c1,c0,0 ;Read control register configuration data
156 BIC R0,R0,R1 ;Clear I bit.
157 MCR p15,0,r0,c1,c0,0 ;Write control register configuration data
1a27eb48 158 ISB
2ef2b01e
A
159 BX LR
160
161ArmEnableBranchPrediction
162 mrc p15, 0, r0, c1, c0, 0
163 orr r0, r0, #0x00000800
164 mcr p15, 0, r0, c1, c0, 0
1a27eb48 165 ISB
2ef2b01e
A
166 bx LR
167
168ArmDisableBranchPrediction
169 mrc p15, 0, r0, c1, c0, 0
170 bic r0, r0, #0x00000800
171 mcr p15, 0, r0, c1, c0, 0
1a27eb48 172 ISB
2ef2b01e
A
173 bx LR
174
98bc0c8c 175
176ArmV7AllDataCachesOperation
177 STMFD SP!,{r4-r12, LR}
178 MOV R1, R0 ; Save Function call in R1
179 MRC p15, 1, R6, c0, c0, 1 ; Read CLIDR
180 ANDS R3, R6, #&7000000 ; Mask out all but Level of Coherency (LoC)
181 MOV R3, R3, LSR #23 ; Cache level value (naturally aligned)
182 BEQ Finished
183 MOV R10, #0
184
185Loop1
186 ADD R2, R10, R10, LSR #1 ; Work out 3xcachelevel
187 MOV R12, R6, LSR R2 ; bottom 3 bits are the Cache type for this level
188 AND R12, R12, #7 ; get those 3 bits alone
189 CMP R12, #2
190 BLT Skip ; no cache or only instruction cache at this level
191 MCR p15, 2, R10, c0, c0, 0 ; write the Cache Size selection register (CSSELR) // OR in 1 for Instruction
192 ISB ; ISB to sync the change to the CacheSizeID reg
193 MRC p15, 1, R12, c0, c0, 0 ; reads current Cache Size ID register (CCSIDR)
194 AND R2, R12, #&7 ; extract the line length field
195 ADD R2, R2, #4 ; add 4 for the line length offset (log2 16 bytes)
196 LDR R4, =0x3FF
197 ANDS R4, R4, R12, LSR #3 ; R4 is the max number on the way size (right aligned)
198 CLZ R5, R4 ; R5 is the bit position of the way size increment
199 LDR R7, =0x00007FFF
200 ANDS R7, R7, R12, LSR #13 ; R7 is the max number of the index size (right aligned)
201
202Loop2
203 MOV R9, R4 ; R9 working copy of the max way size (right aligned)
204
205Loop3
206 ORR R0, R10, R9, LSL R5 ; factor in the way number and cache number into R11
207 ORR R0, R0, R7, LSL R2 ; factor in the index number
208
209 BLX R1
210
211 SUBS R9, R9, #1 ; decrement the way number
212 BGE Loop3
213 SUBS R7, R7, #1 ; decrement the index
214 BGE Loop2
215Skip
216 ADD R10, R10, #2 ; increment the cache number
217 CMP R3, R10
218 BGT Loop1
219
220Finished
221 LDMFD SP!, {r4-r12, lr}
222 BX LR
223
026c3d34 224
225ArmDataMemoryBarrier
226 DMB
227 BX LR
228
229ArmDataSyncronizationBarrier
230 DSB
231 BX LR
232
233ArmInstructionSynchronizationBarrier
234 ISB
235 BX LR
236
2ef2b01e 237 END