]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Library/ArmLib.h
ArmPkg ArmVirtPkg MdeModulePkg: switch to separate ArmMmuLib
[mirror_edk2.git] / ArmPkg / Include / Library / ArmLib.h
CommitLineData
1e57a462 1/** @file\r
2\r
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
ff1f27c0 4 Copyright (c) 2011 - 2016, ARM Ltd. All rights reserved.<BR>\r
1e57a462 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#ifndef __ARM_LIB__\r
17#define __ARM_LIB__\r
18\r
19#include <Uefi/UefiBaseType.h>\r
20\r
25402f5d 21#ifdef MDE_CPU_ARM\r
70119d27 22 #include <Chipset/ArmV7.h>\r
25402f5d
HL
23#elif defined(MDE_CPU_AARCH64)\r
24 #include <Chipset/AArch64.h>\r
1e57a462 25#else\r
25402f5d 26 #error "Unknown chipset."\r
1e57a462 27#endif\r
28\r
1e57a462 29/**\r
30 * The UEFI firmware must not use the ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_* attributes.\r
31 *\r
32 * The Non Secure memory attribute (ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_*) should only\r
33 * be used in Secure World to distinguished Secure to Non-Secure memory.\r
34 */\r
35typedef enum {\r
36 ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED = 0,\r
37 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED,\r
38 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK,\r
39 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK,\r
40 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH,\r
41 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH,\r
42 ARM_MEMORY_REGION_ATTRIBUTE_DEVICE,\r
43 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE\r
44} ARM_MEMORY_REGION_ATTRIBUTES;\r
45\r
46#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1)\r
47\r
48typedef struct {\r
49 EFI_PHYSICAL_ADDRESS PhysicalBase;\r
50 EFI_VIRTUAL_ADDRESS VirtualBase;\r
c357fd6a 51 UINT64 Length;\r
1e57a462 52 ARM_MEMORY_REGION_ATTRIBUTES Attributes;\r
53} ARM_MEMORY_REGION_DESCRIPTOR;\r
54\r
55typedef VOID (*CACHE_OPERATION)(VOID);\r
56typedef VOID (*LINE_OPERATION)(UINTN);\r
57\r
58//\r
59// ARM Processor Mode\r
60//\r
61typedef enum {\r
62 ARM_PROCESSOR_MODE_USER = 0x10,\r
63 ARM_PROCESSOR_MODE_FIQ = 0x11,\r
64 ARM_PROCESSOR_MODE_IRQ = 0x12,\r
65 ARM_PROCESSOR_MODE_SUPERVISOR = 0x13,\r
66 ARM_PROCESSOR_MODE_ABORT = 0x17,\r
67 ARM_PROCESSOR_MODE_HYP = 0x1A,\r
68 ARM_PROCESSOR_MODE_UNDEFINED = 0x1B,\r
69 ARM_PROCESSOR_MODE_SYSTEM = 0x1F,\r
70 ARM_PROCESSOR_MODE_MASK = 0x1F\r
71} ARM_PROCESSOR_MODE;\r
72\r
73//\r
74// ARM Cpu IDs\r
75//\r
76#define ARM_CPU_IMPLEMENTER_MASK (0xFFU << 24)\r
77#define ARM_CPU_IMPLEMENTER_ARMLTD (0x41U << 24)\r
78#define ARM_CPU_IMPLEMENTER_DEC (0x44U << 24)\r
79#define ARM_CPU_IMPLEMENTER_MOT (0x4DU << 24)\r
80#define ARM_CPU_IMPLEMENTER_QUALCOMM (0x51U << 24)\r
81#define ARM_CPU_IMPLEMENTER_MARVELL (0x56U << 24)\r
82\r
83#define ARM_CPU_PRIMARY_PART_MASK (0xFFF << 4)\r
84#define ARM_CPU_PRIMARY_PART_CORTEXA5 (0xC05 << 4)\r
85#define ARM_CPU_PRIMARY_PART_CORTEXA7 (0xC07 << 4)\r
86#define ARM_CPU_PRIMARY_PART_CORTEXA8 (0xC08 << 4)\r
87#define ARM_CPU_PRIMARY_PART_CORTEXA9 (0xC09 << 4)\r
88#define ARM_CPU_PRIMARY_PART_CORTEXA15 (0xC0F << 4)\r
89\r
90//\r
91// ARM MP Core IDs\r
92//\r
90ed18ca
OM
93#define ARM_CORE_AFF0 0xFF\r
94#define ARM_CORE_AFF1 (0xFF << 8)\r
95#define ARM_CORE_AFF2 (0xFF << 16)\r
96#define ARM_CORE_AFF3 (0xFFULL << 32)\r
97\r
98#define ARM_CORE_MASK ARM_CORE_AFF0\r
99#define ARM_CLUSTER_MASK ARM_CORE_AFF1\r
1e57a462 100#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)\r
101#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)\r
e359565e 102#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))\r
1e57a462 103#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)\r
104\r
1e57a462 105UINTN\r
106EFIAPI\r
107ArmDataCacheLineLength (\r
108 VOID\r
109 );\r
3402aac7 110\r
1e57a462 111UINTN\r
112EFIAPI\r
113ArmInstructionCacheLineLength (\r
114 VOID\r
115 );\r
168d7245 116\r
c653fc2a
AB
117UINTN\r
118EFIAPI\r
119ArmCacheWritebackGranule (\r
120 VOID\r
121 );\r
122\r
168d7245
OM
123UINTN\r
124EFIAPI\r
125ArmIsArchTimerImplemented (\r
126 VOID\r
127 );\r
128\r
129UINTN\r
130EFIAPI\r
131ArmReadIdPfr0 (\r
132 VOID\r
133 );\r
134\r
135UINTN\r
136EFIAPI\r
137ArmReadIdPfr1 (\r
138 VOID\r
139 );\r
140\r
64751727 141UINTN\r
1e57a462 142EFIAPI\r
64751727 143ArmCacheInfo (\r
1e57a462 144 VOID\r
145 );\r
146\r
147BOOLEAN\r
148EFIAPI\r
149ArmIsMpCore (\r
150 VOID\r
151 );\r
152\r
153VOID\r
154EFIAPI\r
155ArmInvalidateDataCache (\r
156 VOID\r
157 );\r
158\r
159\r
160VOID\r
161EFIAPI\r
162ArmCleanInvalidateDataCache (\r
163 VOID\r
164 );\r
165\r
166VOID\r
167EFIAPI\r
168ArmCleanDataCache (\r
169 VOID\r
170 );\r
171\r
1e57a462 172VOID\r
173EFIAPI\r
174ArmInvalidateInstructionCache (\r
175 VOID\r
176 );\r
177\r
178VOID\r
179EFIAPI\r
180ArmInvalidateDataCacheEntryByMVA (\r
181 IN UINTN Address\r
182 );\r
183\r
184VOID\r
185EFIAPI\r
cf580da1 186ArmCleanDataCacheEntryToPoUByMVA (\r
1e57a462 187 IN UINTN Address\r
188 );\r
189\r
b7de7e3c
EC
190VOID\r
191EFIAPI\r
cf580da1
AB
192ArmInvalidateInstructionCacheEntryToPoUByMVA (\r
193 IN UINTN Address\r
194 );\r
195\r
196VOID\r
197EFIAPI\r
198ArmCleanDataCacheEntryByMVA (\r
b7de7e3c
EC
199IN UINTN Address\r
200);\r
201\r
1e57a462 202VOID\r
203EFIAPI\r
204ArmCleanInvalidateDataCacheEntryByMVA (\r
205 IN UINTN Address\r
206 );\r
207\r
0ff0e414
OM
208VOID\r
209EFIAPI\r
210ArmInvalidateDataCacheEntryBySetWay (\r
211 IN UINTN SetWayFormat\r
212 );\r
213\r
214VOID\r
215EFIAPI\r
216ArmCleanDataCacheEntryBySetWay (\r
217 IN UINTN SetWayFormat\r
218 );\r
219\r
220VOID\r
221EFIAPI\r
222ArmCleanInvalidateDataCacheEntryBySetWay (\r
223 IN UINTN SetWayFormat\r
224 );\r
225\r
1e57a462 226VOID\r
227EFIAPI\r
228ArmEnableDataCache (\r
229 VOID\r
230 );\r
231\r
232VOID\r
233EFIAPI\r
234ArmDisableDataCache (\r
235 VOID\r
236 );\r
237\r
238VOID\r
239EFIAPI\r
240ArmEnableInstructionCache (\r
241 VOID\r
242 );\r
243\r
244VOID\r
245EFIAPI\r
246ArmDisableInstructionCache (\r
247 VOID\r
248 );\r
3402aac7 249\r
1e57a462 250VOID\r
251EFIAPI\r
252ArmEnableMmu (\r
253 VOID\r
254 );\r
255\r
256VOID\r
257EFIAPI\r
258ArmDisableMmu (\r
259 VOID\r
260 );\r
261\r
0ff0e414
OM
262VOID\r
263EFIAPI\r
264ArmEnableCachesAndMmu (\r
265 VOID\r
266 );\r
267\r
1e57a462 268VOID\r
269EFIAPI\r
270ArmDisableCachesAndMmu (\r
271 VOID\r
272 );\r
273\r
1e57a462 274VOID\r
275EFIAPI\r
276ArmEnableInterrupts (\r
277 VOID\r
278 );\r
279\r
280UINTN\r
281EFIAPI\r
282ArmDisableInterrupts (\r
283 VOID\r
284 );\r
47585ed5 285\r
1e57a462 286BOOLEAN\r
287EFIAPI\r
288ArmGetInterruptState (\r
289 VOID\r
290 );\r
291\r
0ff0e414
OM
292VOID\r
293EFIAPI\r
294ArmEnableAsynchronousAbort (\r
295 VOID\r
296 );\r
297\r
47585ed5 298UINTN\r
299EFIAPI\r
0ff0e414 300ArmDisableAsynchronousAbort (\r
47585ed5 301 VOID\r
302 );\r
303\r
304VOID\r
305EFIAPI\r
306ArmEnableIrq (\r
307 VOID\r
308 );\r
309\r
0ff0e414
OM
310UINTN\r
311EFIAPI\r
312ArmDisableIrq (\r
313 VOID\r
314 );\r
315\r
1e57a462 316VOID\r
317EFIAPI\r
318ArmEnableFiq (\r
319 VOID\r
320 );\r
321\r
322UINTN\r
323EFIAPI\r
324ArmDisableFiq (\r
325 VOID\r
326 );\r
3402aac7 327\r
1e57a462 328BOOLEAN\r
329EFIAPI\r
330ArmGetFiqState (\r
331 VOID\r
332 );\r
333\r
8dd618d2
OM
334/**\r
335 * Invalidate Data and Instruction TLBs\r
336 */\r
1e57a462 337VOID\r
338EFIAPI\r
339ArmInvalidateTlb (\r
340 VOID\r
341 );\r
3402aac7 342\r
1e57a462 343VOID\r
344EFIAPI\r
345ArmUpdateTranslationTableEntry (\r
346 IN VOID *TranslationTableEntry,\r
347 IN VOID *Mva\r
348 );\r
3402aac7 349\r
1e57a462 350VOID\r
351EFIAPI\r
352ArmSetDomainAccessControl (\r
353 IN UINT32 Domain\r
354 );\r
355\r
356VOID\r
357EFIAPI\r
358ArmSetTTBR0 (\r
359 IN VOID *TranslationTableBase\r
360 );\r
361\r
ff1f27c0
EL
362VOID\r
363EFIAPI\r
364ArmSetTTBCR (\r
365 IN UINT32 Bits\r
366 );\r
367\r
1e57a462 368VOID *\r
369EFIAPI\r
370ArmGetTTBR0BaseAddress (\r
371 VOID\r
372 );\r
373\r
1e57a462 374BOOLEAN\r
375EFIAPI\r
376ArmMmuEnabled (\r
377 VOID\r
378 );\r
3402aac7 379\r
1e57a462 380VOID\r
381EFIAPI\r
382ArmEnableBranchPrediction (\r
383 VOID\r
384 );\r
385\r
386VOID\r
387EFIAPI\r
388ArmDisableBranchPrediction (\r
389 VOID\r
390 );\r
391\r
392VOID\r
393EFIAPI\r
394ArmSetLowVectors (\r
395 VOID\r
396 );\r
397\r
398VOID\r
399EFIAPI\r
400ArmSetHighVectors (\r
401 VOID\r
402 );\r
403\r
404VOID\r
405EFIAPI\r
406ArmDataMemoryBarrier (\r
407 VOID\r
408 );\r
3402aac7 409\r
1e57a462 410VOID\r
411EFIAPI\r
cf93a378 412ArmDataSynchronizationBarrier (\r
1e57a462 413 VOID\r
414 );\r
3402aac7 415\r
1e57a462 416VOID\r
417EFIAPI\r
418ArmInstructionSynchronizationBarrier (\r
419 VOID\r
420 );\r
421\r
422VOID\r
423EFIAPI\r
424ArmWriteVBar (\r
4e57d6d7 425 IN UINTN VectorBase\r
1e57a462 426 );\r
427\r
4e57d6d7 428UINTN\r
1e57a462 429EFIAPI\r
430ArmReadVBar (\r
431 VOID\r
432 );\r
433\r
434VOID\r
435EFIAPI\r
436ArmWriteAuxCr (\r
437 IN UINT32 Bit\r
438 );\r
439\r
440UINT32\r
441EFIAPI\r
442ArmReadAuxCr (\r
443 VOID\r
444 );\r
445\r
446VOID\r
447EFIAPI\r
448ArmSetAuxCrBit (\r
449 IN UINT32 Bits\r
450 );\r
451\r
452VOID\r
453EFIAPI\r
454ArmUnsetAuxCrBit (\r
455 IN UINT32 Bits\r
456 );\r
457\r
458VOID\r
459EFIAPI\r
460ArmCallSEV (\r
461 VOID\r
462 );\r
463\r
464VOID\r
465EFIAPI\r
466ArmCallWFE (\r
467 VOID\r
468 );\r
469\r
470VOID\r
471EFIAPI\r
472ArmCallWFI (\r
25402f5d 473\r
1e57a462 474 VOID\r
475 );\r
476\r
477UINTN\r
478EFIAPI\r
479ArmReadMpidr (\r
480 VOID\r
481 );\r
482\r
9401d6f4
OM
483UINTN\r
484EFIAPI\r
485ArmReadMidr (\r
486 VOID\r
487 );\r
488\r
1e57a462 489UINT32\r
490EFIAPI\r
491ArmReadCpacr (\r
492 VOID\r
493 );\r
494\r
495VOID\r
496EFIAPI\r
497ArmWriteCpacr (\r
498 IN UINT32 Access\r
499 );\r
500\r
501VOID\r
502EFIAPI\r
503ArmEnableVFP (\r
504 VOID\r
505 );\r
506\r
46d4d75c
OM
507/**\r
508 Get the Secure Configuration Register value\r
509\r
510 @return Value read from the Secure Configuration Register\r
511\r
512**/\r
1e57a462 513UINT32\r
514EFIAPI\r
515ArmReadScr (\r
516 VOID\r
517 );\r
518\r
46d4d75c
OM
519/**\r
520 Set the Secure Configuration Register\r
521\r
522 @param Value Value to write to the Secure Configuration Register\r
523\r
524**/\r
1e57a462 525VOID\r
526EFIAPI\r
527ArmWriteScr (\r
46d4d75c 528 IN UINT32 Value\r
1e57a462 529 );\r
530\r
531UINT32\r
532EFIAPI\r
533ArmReadMVBar (\r
534 VOID\r
535 );\r
536\r
537VOID\r
538EFIAPI\r
539ArmWriteMVBar (\r
540 IN UINT32 VectorMonitorBase\r
541 );\r
542\r
543UINT32\r
544EFIAPI\r
545ArmReadSctlr (\r
546 VOID\r
547 );\r
548\r
5ea2c2d3 549UINTN\r
550EFIAPI\r
551ArmReadHVBar (\r
552 VOID\r
553 );\r
554\r
555VOID\r
556EFIAPI\r
557ArmWriteHVBar (\r
558 IN UINTN HypModeVectorBase\r
559 );\r
560\r
52d44f77
OM
561\r
562//\r
563// Helper functions for accessing CPU ACTLR\r
564//\r
565\r
566UINTN\r
567EFIAPI\r
568ArmReadCpuActlr (\r
569 VOID\r
570 );\r
571\r
572VOID\r
573EFIAPI\r
574ArmWriteCpuActlr (\r
575 IN UINTN Val\r
576 );\r
577\r
578VOID\r
579EFIAPI\r
580ArmSetCpuActlrBit (\r
581 IN UINTN Bits\r
582 );\r
583\r
584VOID\r
585EFIAPI\r
586ArmUnsetCpuActlrBit (\r
587 IN UINTN Bits\r
588 );\r
589\r
1e57a462 590#endif // __ARM_LIB__\r