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