1 //------------------------------------------------------------------------------
3 // Copyright (c) 2008-2009 Apple Inc. All rights reserved.
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
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.
13 //------------------------------------------------------------------------------
15 EXPORT ArmInvalidateInstructionCache
16 EXPORT ArmInvalidateDataCacheEntryByMVA
17 EXPORT ArmCleanDataCacheEntryByMVA
18 EXPORT ArmCleanInvalidateDataCacheEntryByMVA
19 EXPORT ArmInvalidateDataCacheEntryBySetWay
20 EXPORT ArmCleanDataCacheEntryBySetWay
21 EXPORT ArmCleanInvalidateDataCacheEntryBySetWay
22 EXPORT ArmDrainWriteBuffer
26 EXPORT ArmEnableDataCache
27 EXPORT ArmDisableDataCache
28 EXPORT ArmEnableInstructionCache
29 EXPORT ArmDisableInstructionCache
30 EXPORT ArmEnableBranchPrediction
31 EXPORT ArmDisableBranchPrediction
32 EXPORT ArmV7AllDataCachesOperation
33 EXPORT ArmDataMemoryBarrier
34 EXPORT ArmDataSyncronizationBarrier
35 EXPORT ArmInstructionSynchronizationBarrier
37 AREA ArmCacheLib, CODE, READONLY
40 DC_ON EQU ( 0x1:SHL:2 )
41 IC_ON EQU ( 0x1:SHL:12 )
45 ArmInvalidateDataCacheEntryByMVA
46 mcr p15, 0, r0, c7, c6, 1 ; invalidate single data cache line
52 ArmCleanDataCacheEntryByMVA
53 mcr p15, 0, r0, c7, c10, 1 ; clean single data cache line
59 ArmCleanInvalidateDataCacheEntryByMVA
60 mcr p15, 0, r0, c7, c14, 1 ; clean and invalidate single data cache line
66 ArmInvalidateDataCacheEntryBySetWay
67 mcr p15, 0, r0, c7, c6, 2 ; Invalidate this line
73 ArmCleanInvalidateDataCacheEntryBySetWay
74 mcr p15, 0, r0, c7, c14, 2 ; Clean and Invalidate this line
80 ArmCleanDataCacheEntryBySetWay
81 mcr p15, 0, r0, c7, c10, 2 ; Clean this line
88 mcr p15, 0, r0, c7, c10, 4 ; Drain write buffer for sync
94 ArmInvalidateInstructionCache
96 mcr p15,0,R0,c7,c5,0 ;Invalidate entire instruction cache
118 mcr p15,0,R0,c13,c0,0 ;FCSE PID register must be cleared before disabling MMU
121 mcr p15,0,R0,c1,c0,0 ;Disable MMU
128 mrc p15,0,R0,c1,c0,0 ;Read control register configuration data
129 orr R0,R0,R1 ;Set C bit
130 mcr p15,0,r0,c1,c0,0 ;Write control register configuration data
137 mrc p15,0,R0,c1,c0,0 ;Read control register configuration data
138 bic R0,R0,R1 ;Clear C bit
139 mcr p15,0,r0,c1,c0,0 ;Write control register configuration data
143 ArmEnableInstructionCache
145 mrc p15,0,R0,c1,c0,0 ;Read control register configuration data
146 orr R0,R0,R1 ;Set I bit
147 mcr p15,0,r0,c1,c0,0 ;Write control register configuration data
152 ArmDisableInstructionCache
154 mrc p15,0,R0,c1,c0,0 ;Read control register configuration data
155 BIC R0,R0,R1 ;Clear I bit.
156 mcr p15,0,r0,c1,c0,0 ;Write control register configuration data
160 ArmEnableBranchPrediction
161 mrc p15, 0, r0, c1, c0, 0
162 orr r0, r0, #0x00000800
163 mcr p15, 0, r0, c1, c0, 0
167 ArmDisableBranchPrediction
168 mrc p15, 0, r0, c1, c0, 0
169 bic r0, r0, #0x00000800
170 mcr p15, 0, r0, c1, c0, 0
175 ArmV7AllDataCachesOperation
176 stmfd SP!,{r4-r12, LR}
177 mov R1, R0 ; Save Function call in R1
178 mrc p15, 1, R6, c0, c0, 1 ; Read CLIDR
179 ands R3, R6, #&7000000 ; Mask out all but Level of Coherency (LoC)
180 mov R3, R3, LSR #23 ; Cache level value (naturally aligned)
185 add R2, R10, R10, LSR #1 ; Work out 3xcachelevel
186 mov R12, R6, LSR R2 ; bottom 3 bits are the Cache type for this level
187 and R12, R12, #7 ; get those 3 bits alone
189 blt Skip ; no cache or only instruction cache at this level
190 mcr p15, 2, R10, c0, c0, 0 ; write the Cache Size selection register (CSSELR) // OR in 1 for Instruction
191 isb ; isb to sync the change to the CacheSizeID reg
192 mrc p15, 1, R12, c0, c0, 0 ; reads current Cache Size ID register (CCSIDR)
193 and R2, R12, #&7 ; extract the line length field
194 add R2, R2, #4 ; add 4 for the line length offset (log2 16 bytes)
196 ands R4, R4, R12, LSR #3 ; R4 is the max number on the way size (right aligned)
197 clz R5, R4 ; R5 is the bit position of the way size increment
199 ands R7, R7, R12, LSR #13 ; R7 is the max number of the index size (right aligned)
202 mov R9, R4 ; R9 working copy of the max way size (right aligned)
205 orr R0, R10, R9, LSL R5 ; factor in the way number and cache number into R11
206 orr R0, R0, R7, LSL R2 ; factor in the index number
210 subs R9, R9, #1 ; decrement the way number
212 subs R7, R7, #1 ; decrement the index
215 add R10, R10, #2 ; increment the cache number
220 ldmfd SP!, {r4-r12, lr}
228 ArmDataSyncronizationBarrier
232 ArmInstructionSynchronizationBarrier