]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmLib/Arm11/Arm11Support.S
ArmPkg/ArmLib: Added ArmReadMidr()
[mirror_edk2.git] / ArmPkg / Library / ArmLib / Arm11 / Arm11Support.S
CommitLineData
1e57a462 1#------------------------------------------------------------------------------ \r
2#\r
3# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
4# Copyright (c) 2011, ARM Limited. All rights reserved.\r
5#\r
6# This program and the accompanying materials\r
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14#------------------------------------------------------------------------------\r
15\r
16#include <AsmMacroIoLib.h>\r
17\r
18.text\r
19.align 2\r
20GCC_ASM_EXPORT(ArmDisableCachesAndMmu)\r
21GCC_ASM_EXPORT(ArmInvalidateInstructionAndDataTlb)\r
22GCC_ASM_EXPORT(ArmCleanInvalidateDataCache)\r
23GCC_ASM_EXPORT(ArmCleanDataCache)\r
24GCC_ASM_EXPORT(ArmInvalidateDataCache)\r
25GCC_ASM_EXPORT(ArmInvalidateInstructionCache)\r
26GCC_ASM_EXPORT(ArmInvalidateDataCacheEntryByMVA)\r
27GCC_ASM_EXPORT(ArmCleanDataCacheEntryByMVA)\r
28GCC_ASM_EXPORT(ArmCleanInvalidateDataCacheEntryByMVA)\r
29GCC_ASM_EXPORT(ArmEnableMmu)\r
30GCC_ASM_EXPORT(ArmDisableMmu)\r
31GCC_ASM_EXPORT(ArmMmuEnabled)\r
32GCC_ASM_EXPORT(ArmEnableDataCache)\r
33GCC_ASM_EXPORT(ArmDisableDataCache)\r
34GCC_ASM_EXPORT(ArmEnableInstructionCache)\r
35GCC_ASM_EXPORT(ArmDisableInstructionCache)\r
36GCC_ASM_EXPORT(ArmEnableBranchPrediction)\r
37GCC_ASM_EXPORT(ArmDisableBranchPrediction)\r
38GCC_ASM_EXPORT(ArmDataMemoryBarrier)\r
39GCC_ASM_EXPORT(ArmDataSyncronizationBarrier)\r
40GCC_ASM_EXPORT(ArmInstructionSynchronizationBarrier)\r
41GCC_ASM_EXPORT(ArmSetLowVectors)\r
42GCC_ASM_EXPORT(ArmSetHighVectors)\r
43GCC_ASM_EXPORT(ArmIsMpCore)\r
44GCC_ASM_EXPORT(ArmCallWFI)\r
45GCC_ASM_EXPORT(ArmReadMpidr)\r
9401d6f4 46GCC_ASM_EXPORT(ArmReadMidr)\r
1e57a462 47GCC_ASM_EXPORT(ArmUpdateTranslationTableEntry)\r
48GCC_ASM_EXPORT(ArmEnableFiq)\r
49GCC_ASM_EXPORT(ArmDisableFiq)\r
50GCC_ASM_EXPORT(ArmEnableInterrupts)\r
51GCC_ASM_EXPORT(ArmDisableInterrupts)\r
52GCC_ASM_EXPORT (ArmEnableVFP)\r
53\r
54Arm11PartNumberMask: .word 0xFFF0\r
55Arm11PartNumber: .word 0xB020\r
56\r
57.set DC_ON, (0x1<<2)\r
58.set IC_ON, (0x1<<12)\r
59.set XP_ON, (0x1<<23)\r
60.set CTRL_M_BIT, (1 << 0)\r
61.set CTRL_C_BIT, (1 << 2)\r
62.set CTRL_I_BIT, (1 << 12)\r
63\r
64ASM_PFX(ArmDisableCachesAndMmu):\r
65 mrc p15, 0, r0, c1, c0, 0 @ Get control register\r
66 bic r0, r0, #CTRL_M_BIT @ Disable MMU\r
67 bic r0, r0, #CTRL_C_BIT @ Disable D Cache\r
68 bic r0, r0, #CTRL_I_BIT @ Disable I Cache\r
69 mcr p15, 0, r0, c1, c0, 0 @ Write control register\r
70 bx LR\r
71\r
72ASM_PFX(ArmInvalidateInstructionAndDataTlb):\r
73 mcr p15, 0, r0, c8, c7, 0 @ Invalidate Inst TLB and Data TLB\r
74 bx lr\r
75\r
76ASM_PFX(ArmInvalidateDataCacheEntryByMVA):\r
77 mcr p15, 0, r0, c7, c6, 1 @invalidate single data cache line \r
78 bx lr\r
79\r
80\r
81ASM_PFX(ArmCleanDataCacheEntryByMVA):\r
82 mcr p15, 0, r0, c7, c10, 1 @clean single data cache line \r
83 bx lr\r
84\r
85\r
86ASM_PFX(ArmCleanInvalidateDataCacheEntryByMVA):\r
87 mcr p15, 0, r0, c7, c14, 1 @clean and invalidate single data cache line\r
88 bx lr\r
89\r
90\r
91ASM_PFX(ArmCleanDataCache):\r
92 mcr p15, 0, r0, c7, c10, 0 @ clean entire data cache\r
93 bx lr\r
94\r
95\r
96ASM_PFX(ArmCleanInvalidateDataCache):\r
97 mcr p15, 0, r0, c7, c14, 0 @ clean and invalidate entire data cache\r
98 bx lr\r
99\r
100\r
101ASM_PFX(ArmInvalidateDataCache):\r
102 mcr p15, 0, r0, c7, c6, 0 @ invalidate entire data cache\r
103 bx lr\r
104\r
105\r
106ASM_PFX(ArmInvalidateInstructionCache):\r
107 mcr p15, 0, r0, c7, c5, 0 @invalidate entire instruction cache\r
108 mov R0,#0\r
109 mcr p15,0,R0,c7,c5,4 @Flush Prefetch buffer\r
110 bx lr\r
111\r
112ASM_PFX(ArmEnableMmu):\r
113 mrc p15,0,R0,c1,c0,0\r
114 orr R0,R0,#1\r
115 mcr p15,0,R0,c1,c0,0\r
116 bx LR\r
117\r
118ASM_PFX(ArmMmuEnabled):\r
119 mrc p15,0,R0,c1,c0,0\r
120 and R0,R0,#1\r
121 bx LR\r
122\r
123ASM_PFX(ArmDisableMmu):\r
124 mrc p15,0,R0,c1,c0,0\r
125 bic R0,R0,#1\r
126 mcr p15,0,R0,c1,c0,0\r
127 mov R0,#0\r
128 mcr p15,0,R0,c7,c10,4 @Data synchronization barrier\r
129 mov R0,#0\r
130 mcr p15,0,R0,c7,c5,4 @Flush Prefetch buffer\r
131 bx LR\r
132\r
133ASM_PFX(ArmEnableDataCache):\r
134 LoadConstantToReg(DC_ON, R1) @ldr R1,=DC_ON\r
135 mrc p15,0,R0,c1,c0,0 @Read control register configuration data\r
136 orr R0,R0,R1 @Set C bit\r
137 mcr p15,0,r0,c1,c0,0 @Write control register configuration data\r
138 bx LR\r
139 \r
140ASM_PFX(ArmDisableDataCache):\r
141 LoadConstantToReg(DC_ON, R1) @ldr R1,=DC_ON\r
142 mrc p15,0,R0,c1,c0,0 @Read control register configuration data\r
143 bic R0,R0,R1 @Clear C bit\r
144 mcr p15,0,r0,c1,c0,0 @Write control register configuration data\r
145 bx LR\r
146\r
147ASM_PFX(ArmEnableInstructionCache):\r
148 ldr R1,=IC_ON\r
149 mrc p15,0,R0,c1,c0,0 @Read control register configuration data\r
150 orr R0,R0,R1 @Set I bit\r
151 mcr p15,0,r0,c1,c0,0 @Write control register configuration data\r
152 bx LR\r
153 \r
154ASM_PFX(ArmDisableInstructionCache):\r
155 ldr R1,=IC_ON\r
156 mrc p15,0,R0,c1,c0,0 @Read control register configuration data\r
157 bic R0,R0,R1 @Clear I bit.\r
158 mcr p15,0,r0,c1,c0,0 @Write control register configuration data\r
159 bx LR\r
160\r
161ASM_PFX(ArmEnableBranchPrediction):\r
162 mrc p15, 0, r0, c1, c0, 0\r
163 orr r0, r0, #0x00000800\r
164 mcr p15, 0, r0, c1, c0, 0\r
165 bx LR\r
166\r
167ASM_PFX(ArmDisableBranchPrediction):\r
168 mrc p15, 0, r0, c1, c0, 0\r
169 bic r0, r0, #0x00000800\r
170 mcr p15, 0, r0, c1, c0, 0\r
171 bx LR\r
172\r
173ASM_PFX(ArmDataMemoryBarrier):\r
174 mov R0, #0\r
175 mcr P15, #0, R0, C7, C10, #5 \r
176 bx LR\r
177 \r
178ASM_PFX(ArmDataSyncronizationBarrier):\r
179 mov R0, #0\r
180 mcr P15, #0, R0, C7, C10, #4 \r
181 bx LR\r
182 \r
183ASM_PFX(ArmInstructionSynchronizationBarrier):\r
184 mov R0, #0\r
185 mcr P15, #0, R0, C7, C5, #4 \r
186 bx LR\r
187\r
188ASM_PFX(ArmSetLowVectors):\r
189 mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR into R0 (Read control register configuration data)\r
190 bic r0, r0, #0x00002000 @ clear V bit\r
191 mcr p15, 0, r0, c1, c0, 0 @ Write R0 into SCTLR (Write control register configuration data)\r
192 bx LR\r
193\r
194ASM_PFX(ArmSetHighVectors):\r
195 mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR into R0 (Read control register configuration data)\r
196 orr r0, r0, #0x00002000 @ clear V bit\r
197 mcr p15, 0, r0, c1, c0, 0 @ Write R0 into SCTLR (Write control register configuration data)\r
198 bx LR\r
199\r
200ASM_PFX(ArmIsMpCore):\r
201 push { r1 }\r
202 mrc p15, 0, r0, c0, c0, 0\r
203 # Extract Part Number to check it is an ARM11MP core (0xB02)\r
204 LoadConstantToReg (Arm11PartNumberMask, r1)\r
205 and r0, r0, r1\r
206 LoadConstantToReg (Arm11PartNumber, r1)\r
207 cmp r0, r1\r
208 movne r0, #0\r
209 pop { r1 }\r
210 bx lr \r
211\r
212ASM_PFX(ArmCallWFI):\r
213 wfi\r
214 bx lr\r
215\r
216ASM_PFX(ArmReadMpidr):\r
217 mrc p15, 0, r0, c0, c0, 5 @ read MPIDR\r
218 bx lr\r
219\r
9401d6f4
OM
220ASM_PFX(ArmReadMpidr):\r
221 mrc p15, 0, r0, c0, c0, 0 @ Read Main ID Register\r
222 bx lr\r
223\r
1e57a462 224ASM_PFX(ArmEnableFiq):\r
225 mrs R0,CPSR\r
226 bic R0,R0,#0x40 @Enable FIQ interrupts\r
227 msr CPSR_c,R0\r
228 bx LR\r
229\r
230ASM_PFX(ArmDisableFiq):\r
231 mrs R0,CPSR\r
232 orr R1,R0,#0x40 @Disable FIQ interrupts\r
233 msr CPSR_c,R1\r
234 tst R0,#0x80\r
235 moveq R0,#1\r
236 movne R0,#0\r
237 bx LR\r
238\r
239ASM_PFX(ArmEnableInterrupts):\r
240 mrs R0,CPSR\r
241 bic R0,R0,#0x80 @Enable IRQ interrupts\r
242 msr CPSR_c,R0\r
243 bx LR\r
244\r
245ASM_PFX(ArmDisableInterrupts):\r
246 mrs R0,CPSR\r
247 orr R1,R0,#0x80 @Disable IRQ interrupts\r
248 msr CPSR_c,R1\r
249 tst R0,#0x80\r
250 moveq R0,#1\r
251 movne R0,#0\r
252 bx LR\r
253\r
254ASM_PFX(ArmEnableVFP):\r
255 # Read CPACR (Coprocessor Access Control Register)\r
256 mrc p15, 0, r0, c1, c0, 2\r
257 # Enable VPF access (Full Access to CP10, CP11) (V* instructions)\r
258 orr r0, r0, #0x00f00000\r
259 # Write back CPACR (Coprocessor Access Control Register)\r
260 mcr p15, 0, r0, c1, c0, 2\r
261 # Set EN bit in FPEXC. The Advanced SIMD and VFP extensions are enabled and operate normally.\r
262 mov r0, #0x40000000\r
263 #TODO: Fixme - need compilation flag\r
264 #fmxr FPEXC, r0\r
265 bx lr\r
266\r
267ASM_FUNCTION_REMOVE_IF_UNREFERENCED\r