]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Library/ArmLib.h
ArmPkg: remove duplicated ARM/AArch64 ArmGicArchSecLib sources
[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
5cc25cff 5 Copyright (c) 2020, NUVIA Inc. All rights reserved.<BR>\r
1e57a462 6\r
4059386c 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
1e57a462 8\r
9**/\r
10\r
11#ifndef __ARM_LIB__\r
12#define __ARM_LIB__\r
13\r
14#include <Uefi/UefiBaseType.h>\r
15\r
25402f5d 16#ifdef MDE_CPU_ARM\r
70119d27 17 #include <Chipset/ArmV7.h>\r
25402f5d
HL
18#elif defined(MDE_CPU_AARCH64)\r
19 #include <Chipset/AArch64.h>\r
1e57a462 20#else\r
25402f5d 21 #error "Unknown chipset."\r
1e57a462 22#endif\r
23\r
e0307a7d
AB
24#define EFI_MEMORY_CACHETYPE_MASK (EFI_MEMORY_UC | EFI_MEMORY_WC | \\r
25 EFI_MEMORY_WT | EFI_MEMORY_WB | \\r
26 EFI_MEMORY_UCE)\r
27\r
1e57a462 28/**\r
29 * The UEFI firmware must not use the ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_* attributes.\r
30 *\r
31 * The Non Secure memory attribute (ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_*) should only\r
32 * be used in Secure World to distinguished Secure to Non-Secure memory.\r
33 */\r
34typedef enum {\r
35 ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED = 0,\r
36 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED,\r
37 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK,\r
38 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK,\r
829633e3
PL
39\r
40 // On some platforms, memory mapped flash region is designed as not supporting\r
41 // shareable attribute, so WRITE_BACK_NONSHAREABLE is added for such special\r
42 // need.\r
43 // Do NOT use below two attributes if you are not sure.\r
44 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_NONSHAREABLE,\r
45 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK_NONSHAREABLE,\r
46\r
1e57a462 47 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH,\r
48 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH,\r
49 ARM_MEMORY_REGION_ATTRIBUTE_DEVICE,\r
50 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE\r
51} ARM_MEMORY_REGION_ATTRIBUTES;\r
52\r
53#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1)\r
54\r
55typedef struct {\r
56 EFI_PHYSICAL_ADDRESS PhysicalBase;\r
57 EFI_VIRTUAL_ADDRESS VirtualBase;\r
c357fd6a 58 UINT64 Length;\r
1e57a462 59 ARM_MEMORY_REGION_ATTRIBUTES Attributes;\r
60} ARM_MEMORY_REGION_DESCRIPTOR;\r
61\r
62typedef VOID (*CACHE_OPERATION)(VOID);\r
63typedef VOID (*LINE_OPERATION)(UINTN);\r
64\r
65//\r
66// ARM Processor Mode\r
67//\r
68typedef enum {\r
69 ARM_PROCESSOR_MODE_USER = 0x10,\r
70 ARM_PROCESSOR_MODE_FIQ = 0x11,\r
71 ARM_PROCESSOR_MODE_IRQ = 0x12,\r
72 ARM_PROCESSOR_MODE_SUPERVISOR = 0x13,\r
73 ARM_PROCESSOR_MODE_ABORT = 0x17,\r
74 ARM_PROCESSOR_MODE_HYP = 0x1A,\r
75 ARM_PROCESSOR_MODE_UNDEFINED = 0x1B,\r
76 ARM_PROCESSOR_MODE_SYSTEM = 0x1F,\r
77 ARM_PROCESSOR_MODE_MASK = 0x1F\r
78} ARM_PROCESSOR_MODE;\r
79\r
80//\r
81// ARM Cpu IDs\r
82//\r
83#define ARM_CPU_IMPLEMENTER_MASK (0xFFU << 24)\r
84#define ARM_CPU_IMPLEMENTER_ARMLTD (0x41U << 24)\r
85#define ARM_CPU_IMPLEMENTER_DEC (0x44U << 24)\r
86#define ARM_CPU_IMPLEMENTER_MOT (0x4DU << 24)\r
87#define ARM_CPU_IMPLEMENTER_QUALCOMM (0x51U << 24)\r
88#define ARM_CPU_IMPLEMENTER_MARVELL (0x56U << 24)\r
89\r
90#define ARM_CPU_PRIMARY_PART_MASK (0xFFF << 4)\r
91#define ARM_CPU_PRIMARY_PART_CORTEXA5 (0xC05 << 4)\r
92#define ARM_CPU_PRIMARY_PART_CORTEXA7 (0xC07 << 4)\r
93#define ARM_CPU_PRIMARY_PART_CORTEXA8 (0xC08 << 4)\r
94#define ARM_CPU_PRIMARY_PART_CORTEXA9 (0xC09 << 4)\r
95#define ARM_CPU_PRIMARY_PART_CORTEXA15 (0xC0F << 4)\r
96\r
97//\r
98// ARM MP Core IDs\r
99//\r
90ed18ca
OM
100#define ARM_CORE_AFF0 0xFF\r
101#define ARM_CORE_AFF1 (0xFF << 8)\r
102#define ARM_CORE_AFF2 (0xFF << 16)\r
103#define ARM_CORE_AFF3 (0xFFULL << 32)\r
104\r
105#define ARM_CORE_MASK ARM_CORE_AFF0\r
106#define ARM_CLUSTER_MASK ARM_CORE_AFF1\r
1e57a462 107#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)\r
108#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)\r
e359565e 109#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))\r
1e57a462 110#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)\r
111\r
1e57a462 112UINTN\r
113EFIAPI\r
114ArmDataCacheLineLength (\r
115 VOID\r
116 );\r
3402aac7 117\r
1e57a462 118UINTN\r
119EFIAPI\r
120ArmInstructionCacheLineLength (\r
121 VOID\r
122 );\r
168d7245 123\r
c653fc2a
AB
124UINTN\r
125EFIAPI\r
126ArmCacheWritebackGranule (\r
127 VOID\r
128 );\r
129\r
168d7245
OM
130UINTN\r
131EFIAPI\r
132ArmIsArchTimerImplemented (\r
133 VOID\r
134 );\r
135\r
136UINTN\r
137EFIAPI\r
138ArmReadIdPfr0 (\r
139 VOID\r
140 );\r
141\r
142UINTN\r
143EFIAPI\r
144ArmReadIdPfr1 (\r
145 VOID\r
146 );\r
147\r
64751727 148UINTN\r
1e57a462 149EFIAPI\r
64751727 150ArmCacheInfo (\r
1e57a462 151 VOID\r
152 );\r
153\r
154BOOLEAN\r
155EFIAPI\r
156ArmIsMpCore (\r
157 VOID\r
158 );\r
159\r
160VOID\r
161EFIAPI\r
162ArmInvalidateDataCache (\r
163 VOID\r
164 );\r
165\r
166\r
167VOID\r
168EFIAPI\r
169ArmCleanInvalidateDataCache (\r
170 VOID\r
171 );\r
172\r
173VOID\r
174EFIAPI\r
175ArmCleanDataCache (\r
176 VOID\r
177 );\r
178\r
1e57a462 179VOID\r
180EFIAPI\r
181ArmInvalidateInstructionCache (\r
182 VOID\r
183 );\r
184\r
185VOID\r
186EFIAPI\r
187ArmInvalidateDataCacheEntryByMVA (\r
188 IN UINTN Address\r
189 );\r
190\r
191VOID\r
192EFIAPI\r
cf580da1 193ArmCleanDataCacheEntryToPoUByMVA (\r
1e57a462 194 IN UINTN Address\r
195 );\r
196\r
b7de7e3c
EC
197VOID\r
198EFIAPI\r
cf580da1
AB
199ArmInvalidateInstructionCacheEntryToPoUByMVA (\r
200 IN UINTN Address\r
201 );\r
202\r
203VOID\r
204EFIAPI\r
205ArmCleanDataCacheEntryByMVA (\r
b7de7e3c
EC
206IN UINTN Address\r
207);\r
208\r
1e57a462 209VOID\r
210EFIAPI\r
211ArmCleanInvalidateDataCacheEntryByMVA (\r
212 IN UINTN Address\r
213 );\r
214\r
215VOID\r
216EFIAPI\r
217ArmEnableDataCache (\r
218 VOID\r
219 );\r
220\r
221VOID\r
222EFIAPI\r
223ArmDisableDataCache (\r
224 VOID\r
225 );\r
226\r
227VOID\r
228EFIAPI\r
229ArmEnableInstructionCache (\r
230 VOID\r
231 );\r
232\r
233VOID\r
234EFIAPI\r
235ArmDisableInstructionCache (\r
236 VOID\r
237 );\r
3402aac7 238\r
1e57a462 239VOID\r
240EFIAPI\r
241ArmEnableMmu (\r
242 VOID\r
243 );\r
244\r
245VOID\r
246EFIAPI\r
247ArmDisableMmu (\r
248 VOID\r
249 );\r
250\r
0ff0e414
OM
251VOID\r
252EFIAPI\r
253ArmEnableCachesAndMmu (\r
254 VOID\r
255 );\r
256\r
1e57a462 257VOID\r
258EFIAPI\r
259ArmDisableCachesAndMmu (\r
260 VOID\r
261 );\r
262\r
1e57a462 263VOID\r
264EFIAPI\r
265ArmEnableInterrupts (\r
266 VOID\r
267 );\r
268\r
269UINTN\r
270EFIAPI\r
271ArmDisableInterrupts (\r
272 VOID\r
273 );\r
47585ed5 274\r
1e57a462 275BOOLEAN\r
276EFIAPI\r
277ArmGetInterruptState (\r
278 VOID\r
279 );\r
280\r
0ff0e414
OM
281VOID\r
282EFIAPI\r
283ArmEnableAsynchronousAbort (\r
284 VOID\r
285 );\r
286\r
47585ed5 287UINTN\r
288EFIAPI\r
0ff0e414 289ArmDisableAsynchronousAbort (\r
47585ed5 290 VOID\r
291 );\r
292\r
293VOID\r
294EFIAPI\r
295ArmEnableIrq (\r
296 VOID\r
297 );\r
298\r
0ff0e414
OM
299UINTN\r
300EFIAPI\r
301ArmDisableIrq (\r
302 VOID\r
303 );\r
304\r
1e57a462 305VOID\r
306EFIAPI\r
307ArmEnableFiq (\r
308 VOID\r
309 );\r
310\r
311UINTN\r
312EFIAPI\r
313ArmDisableFiq (\r
314 VOID\r
315 );\r
3402aac7 316\r
1e57a462 317BOOLEAN\r
318EFIAPI\r
319ArmGetFiqState (\r
320 VOID\r
321 );\r
322\r
8dd618d2
OM
323/**\r
324 * Invalidate Data and Instruction TLBs\r
325 */\r
1e57a462 326VOID\r
327EFIAPI\r
328ArmInvalidateTlb (\r
329 VOID\r
330 );\r
3402aac7 331\r
1e57a462 332VOID\r
333EFIAPI\r
334ArmUpdateTranslationTableEntry (\r
335 IN VOID *TranslationTableEntry,\r
336 IN VOID *Mva\r
337 );\r
3402aac7 338\r
1e57a462 339VOID\r
340EFIAPI\r
341ArmSetDomainAccessControl (\r
342 IN UINT32 Domain\r
343 );\r
344\r
345VOID\r
346EFIAPI\r
347ArmSetTTBR0 (\r
348 IN VOID *TranslationTableBase\r
349 );\r
350\r
ff1f27c0
EL
351VOID\r
352EFIAPI\r
353ArmSetTTBCR (\r
354 IN UINT32 Bits\r
355 );\r
356\r
1e57a462 357VOID *\r
358EFIAPI\r
359ArmGetTTBR0BaseAddress (\r
360 VOID\r
361 );\r
362\r
1e57a462 363BOOLEAN\r
364EFIAPI\r
365ArmMmuEnabled (\r
366 VOID\r
367 );\r
3402aac7 368\r
1e57a462 369VOID\r
370EFIAPI\r
371ArmEnableBranchPrediction (\r
372 VOID\r
373 );\r
374\r
375VOID\r
376EFIAPI\r
377ArmDisableBranchPrediction (\r
378 VOID\r
379 );\r
380\r
381VOID\r
382EFIAPI\r
383ArmSetLowVectors (\r
384 VOID\r
385 );\r
386\r
387VOID\r
388EFIAPI\r
389ArmSetHighVectors (\r
390 VOID\r
391 );\r
392\r
393VOID\r
394EFIAPI\r
395ArmDataMemoryBarrier (\r
396 VOID\r
397 );\r
3402aac7 398\r
1e57a462 399VOID\r
400EFIAPI\r
cf93a378 401ArmDataSynchronizationBarrier (\r
1e57a462 402 VOID\r
403 );\r
3402aac7 404\r
1e57a462 405VOID\r
406EFIAPI\r
407ArmInstructionSynchronizationBarrier (\r
408 VOID\r
409 );\r
410\r
411VOID\r
412EFIAPI\r
413ArmWriteVBar (\r
4e57d6d7 414 IN UINTN VectorBase\r
1e57a462 415 );\r
416\r
4e57d6d7 417UINTN\r
1e57a462 418EFIAPI\r
419ArmReadVBar (\r
420 VOID\r
421 );\r
422\r
423VOID\r
424EFIAPI\r
425ArmWriteAuxCr (\r
426 IN UINT32 Bit\r
427 );\r
428\r
429UINT32\r
430EFIAPI\r
431ArmReadAuxCr (\r
432 VOID\r
433 );\r
434\r
435VOID\r
436EFIAPI\r
437ArmSetAuxCrBit (\r
438 IN UINT32 Bits\r
439 );\r
440\r
441VOID\r
442EFIAPI\r
443ArmUnsetAuxCrBit (\r
444 IN UINT32 Bits\r
445 );\r
446\r
447VOID\r
448EFIAPI\r
449ArmCallSEV (\r
450 VOID\r
451 );\r
452\r
453VOID\r
454EFIAPI\r
455ArmCallWFE (\r
456 VOID\r
457 );\r
458\r
459VOID\r
460EFIAPI\r
461ArmCallWFI (\r
25402f5d 462\r
1e57a462 463 VOID\r
464 );\r
465\r
466UINTN\r
467EFIAPI\r
468ArmReadMpidr (\r
469 VOID\r
470 );\r
471\r
9401d6f4
OM
472UINTN\r
473EFIAPI\r
474ArmReadMidr (\r
475 VOID\r
476 );\r
477\r
1e57a462 478UINT32\r
479EFIAPI\r
480ArmReadCpacr (\r
481 VOID\r
482 );\r
483\r
484VOID\r
485EFIAPI\r
486ArmWriteCpacr (\r
487 IN UINT32 Access\r
488 );\r
489\r
490VOID\r
491EFIAPI\r
492ArmEnableVFP (\r
493 VOID\r
494 );\r
495\r
46d4d75c
OM
496/**\r
497 Get the Secure Configuration Register value\r
498\r
499 @return Value read from the Secure Configuration Register\r
500\r
501**/\r
1e57a462 502UINT32\r
503EFIAPI\r
504ArmReadScr (\r
505 VOID\r
506 );\r
507\r
46d4d75c
OM
508/**\r
509 Set the Secure Configuration Register\r
510\r
511 @param Value Value to write to the Secure Configuration Register\r
512\r
513**/\r
1e57a462 514VOID\r
515EFIAPI\r
516ArmWriteScr (\r
46d4d75c 517 IN UINT32 Value\r
1e57a462 518 );\r
519\r
520UINT32\r
521EFIAPI\r
522ArmReadMVBar (\r
523 VOID\r
524 );\r
525\r
526VOID\r
527EFIAPI\r
528ArmWriteMVBar (\r
529 IN UINT32 VectorMonitorBase\r
530 );\r
531\r
532UINT32\r
533EFIAPI\r
534ArmReadSctlr (\r
535 VOID\r
536 );\r
537\r
1e1d1697
MZ
538VOID\r
539EFIAPI\r
540ArmWriteSctlr (\r
541 IN UINT32 Value\r
542 );\r
543\r
5ea2c2d3 544UINTN\r
545EFIAPI\r
546ArmReadHVBar (\r
547 VOID\r
548 );\r
549\r
550VOID\r
551EFIAPI\r
552ArmWriteHVBar (\r
553 IN UINTN HypModeVectorBase\r
554 );\r
555\r
52d44f77
OM
556\r
557//\r
558// Helper functions for accessing CPU ACTLR\r
559//\r
560\r
561UINTN\r
562EFIAPI\r
563ArmReadCpuActlr (\r
564 VOID\r
565 );\r
566\r
567VOID\r
568EFIAPI\r
569ArmWriteCpuActlr (\r
570 IN UINTN Val\r
571 );\r
572\r
573VOID\r
574EFIAPI\r
575ArmSetCpuActlrBit (\r
576 IN UINTN Bits\r
577 );\r
578\r
579VOID\r
580EFIAPI\r
581ArmUnsetCpuActlrBit (\r
582 IN UINTN Bits\r
583 );\r
584\r
734bd6cc
AB
585//\r
586// Accessors for the architected generic timer registers\r
587//\r
588\r
589#define ARM_ARCH_TIMER_ENABLE (1 << 0)\r
590#define ARM_ARCH_TIMER_IMASK (1 << 1)\r
591#define ARM_ARCH_TIMER_ISTATUS (1 << 2)\r
592\r
593UINTN\r
594EFIAPI\r
595ArmReadCntFrq (\r
596 VOID\r
597 );\r
598\r
599VOID\r
600EFIAPI\r
601ArmWriteCntFrq (\r
602 UINTN FreqInHz\r
603 );\r
604\r
605UINT64\r
606EFIAPI\r
607ArmReadCntPct (\r
608 VOID\r
609 );\r
610\r
611UINTN\r
612EFIAPI\r
613ArmReadCntkCtl (\r
614 VOID\r
615 );\r
616\r
617VOID\r
618EFIAPI\r
619ArmWriteCntkCtl (\r
620 UINTN Val\r
621 );\r
622\r
623UINTN\r
624EFIAPI\r
625ArmReadCntpTval (\r
626 VOID\r
627 );\r
628\r
629VOID\r
630EFIAPI\r
631ArmWriteCntpTval (\r
632 UINTN Val\r
633 );\r
634\r
635UINTN\r
636EFIAPI\r
637ArmReadCntpCtl (\r
638 VOID\r
639 );\r
640\r
641VOID\r
642EFIAPI\r
643ArmWriteCntpCtl (\r
644 UINTN Val\r
645 );\r
646\r
647UINTN\r
648EFIAPI\r
649ArmReadCntvTval (\r
650 VOID\r
651 );\r
652\r
653VOID\r
654EFIAPI\r
655ArmWriteCntvTval (\r
656 UINTN Val\r
657 );\r
658\r
659UINTN\r
660EFIAPI\r
661ArmReadCntvCtl (\r
662 VOID\r
663 );\r
664\r
665VOID\r
666EFIAPI\r
667ArmWriteCntvCtl (\r
668 UINTN Val\r
669 );\r
670\r
671UINT64\r
672EFIAPI\r
673ArmReadCntvCt (\r
674 VOID\r
675 );\r
676\r
677UINT64\r
678EFIAPI\r
679ArmReadCntpCval (\r
680 VOID\r
681 );\r
682\r
683VOID\r
684EFIAPI\r
685ArmWriteCntpCval (\r
686 UINT64 Val\r
687 );\r
688\r
689UINT64\r
690EFIAPI\r
691ArmReadCntvCval (\r
692 VOID\r
693 );\r
694\r
695VOID\r
696EFIAPI\r
697ArmWriteCntvCval (\r
698 UINT64 Val\r
699 );\r
700\r
701UINT64\r
702EFIAPI\r
703ArmReadCntvOff (\r
704 VOID\r
705 );\r
706\r
707VOID\r
708EFIAPI\r
709ArmWriteCntvOff (\r
710 UINT64 Val\r
711 );\r
712\r
95d04ebc
AB
713UINTN\r
714EFIAPI\r
715ArmGetPhysicalAddressBits (\r
716 VOID\r
717 );\r
718\r
5cc25cff
LL
719\r
720///\r
721/// ID Register Helper functions\r
722///\r
723\r
724/**\r
725 Check whether the CPU supports the GIC system register interface (any version)\r
726\r
727 @return Whether GIC System Register Interface is supported\r
728\r
729**/\r
730BOOLEAN\r
731EFIAPI\r
732ArmHasGicSystemRegisters (\r
733 VOID\r
734 );\r
735\r
1e57a462 736#endif // __ARM_LIB__\r