]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Library/ArmLib.h
ArmPkg/ArmLib: move ArmReadIdPfr0/1 into private header ArmV7Lib.h
[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
64751727 136UINTN\r
1e57a462 137EFIAPI\r
64751727 138ArmCacheInfo (\r
1e57a462 139 VOID\r
140 );\r
141\r
142BOOLEAN\r
143EFIAPI\r
144ArmIsMpCore (\r
145 VOID\r
146 );\r
147\r
148VOID\r
149EFIAPI\r
150ArmInvalidateDataCache (\r
151 VOID\r
152 );\r
153\r
154\r
155VOID\r
156EFIAPI\r
157ArmCleanInvalidateDataCache (\r
158 VOID\r
159 );\r
160\r
161VOID\r
162EFIAPI\r
163ArmCleanDataCache (\r
164 VOID\r
165 );\r
166\r
1e57a462 167VOID\r
168EFIAPI\r
169ArmInvalidateInstructionCache (\r
170 VOID\r
171 );\r
172\r
173VOID\r
174EFIAPI\r
175ArmInvalidateDataCacheEntryByMVA (\r
176 IN UINTN Address\r
177 );\r
178\r
179VOID\r
180EFIAPI\r
cf580da1 181ArmCleanDataCacheEntryToPoUByMVA (\r
1e57a462 182 IN UINTN Address\r
183 );\r
184\r
b7de7e3c
EC
185VOID\r
186EFIAPI\r
cf580da1
AB
187ArmInvalidateInstructionCacheEntryToPoUByMVA (\r
188 IN UINTN Address\r
189 );\r
190\r
191VOID\r
192EFIAPI\r
193ArmCleanDataCacheEntryByMVA (\r
b7de7e3c
EC
194IN UINTN Address\r
195);\r
196\r
1e57a462 197VOID\r
198EFIAPI\r
199ArmCleanInvalidateDataCacheEntryByMVA (\r
200 IN UINTN Address\r
201 );\r
202\r
203VOID\r
204EFIAPI\r
205ArmEnableDataCache (\r
206 VOID\r
207 );\r
208\r
209VOID\r
210EFIAPI\r
211ArmDisableDataCache (\r
212 VOID\r
213 );\r
214\r
215VOID\r
216EFIAPI\r
217ArmEnableInstructionCache (\r
218 VOID\r
219 );\r
220\r
221VOID\r
222EFIAPI\r
223ArmDisableInstructionCache (\r
224 VOID\r
225 );\r
3402aac7 226\r
1e57a462 227VOID\r
228EFIAPI\r
229ArmEnableMmu (\r
230 VOID\r
231 );\r
232\r
233VOID\r
234EFIAPI\r
235ArmDisableMmu (\r
236 VOID\r
237 );\r
238\r
0ff0e414
OM
239VOID\r
240EFIAPI\r
241ArmEnableCachesAndMmu (\r
242 VOID\r
243 );\r
244\r
1e57a462 245VOID\r
246EFIAPI\r
247ArmDisableCachesAndMmu (\r
248 VOID\r
249 );\r
250\r
1e57a462 251VOID\r
252EFIAPI\r
253ArmEnableInterrupts (\r
254 VOID\r
255 );\r
256\r
257UINTN\r
258EFIAPI\r
259ArmDisableInterrupts (\r
260 VOID\r
261 );\r
47585ed5 262\r
1e57a462 263BOOLEAN\r
264EFIAPI\r
265ArmGetInterruptState (\r
266 VOID\r
267 );\r
268\r
0ff0e414
OM
269VOID\r
270EFIAPI\r
271ArmEnableAsynchronousAbort (\r
272 VOID\r
273 );\r
274\r
47585ed5 275UINTN\r
276EFIAPI\r
0ff0e414 277ArmDisableAsynchronousAbort (\r
47585ed5 278 VOID\r
279 );\r
280\r
281VOID\r
282EFIAPI\r
283ArmEnableIrq (\r
284 VOID\r
285 );\r
286\r
0ff0e414
OM
287UINTN\r
288EFIAPI\r
289ArmDisableIrq (\r
290 VOID\r
291 );\r
292\r
1e57a462 293VOID\r
294EFIAPI\r
295ArmEnableFiq (\r
296 VOID\r
297 );\r
298\r
299UINTN\r
300EFIAPI\r
301ArmDisableFiq (\r
302 VOID\r
303 );\r
3402aac7 304\r
1e57a462 305BOOLEAN\r
306EFIAPI\r
307ArmGetFiqState (\r
308 VOID\r
309 );\r
310\r
8dd618d2
OM
311/**\r
312 * Invalidate Data and Instruction TLBs\r
313 */\r
1e57a462 314VOID\r
315EFIAPI\r
316ArmInvalidateTlb (\r
317 VOID\r
318 );\r
3402aac7 319\r
1e57a462 320VOID\r
321EFIAPI\r
322ArmUpdateTranslationTableEntry (\r
323 IN VOID *TranslationTableEntry,\r
324 IN VOID *Mva\r
325 );\r
3402aac7 326\r
1e57a462 327VOID\r
328EFIAPI\r
329ArmSetDomainAccessControl (\r
330 IN UINT32 Domain\r
331 );\r
332\r
333VOID\r
334EFIAPI\r
335ArmSetTTBR0 (\r
336 IN VOID *TranslationTableBase\r
337 );\r
338\r
ff1f27c0
EL
339VOID\r
340EFIAPI\r
341ArmSetTTBCR (\r
342 IN UINT32 Bits\r
343 );\r
344\r
1e57a462 345VOID *\r
346EFIAPI\r
347ArmGetTTBR0BaseAddress (\r
348 VOID\r
349 );\r
350\r
1e57a462 351BOOLEAN\r
352EFIAPI\r
353ArmMmuEnabled (\r
354 VOID\r
355 );\r
3402aac7 356\r
1e57a462 357VOID\r
358EFIAPI\r
359ArmEnableBranchPrediction (\r
360 VOID\r
361 );\r
362\r
363VOID\r
364EFIAPI\r
365ArmDisableBranchPrediction (\r
366 VOID\r
367 );\r
368\r
369VOID\r
370EFIAPI\r
371ArmSetLowVectors (\r
372 VOID\r
373 );\r
374\r
375VOID\r
376EFIAPI\r
377ArmSetHighVectors (\r
378 VOID\r
379 );\r
380\r
381VOID\r
382EFIAPI\r
383ArmDataMemoryBarrier (\r
384 VOID\r
385 );\r
3402aac7 386\r
1e57a462 387VOID\r
388EFIAPI\r
cf93a378 389ArmDataSynchronizationBarrier (\r
1e57a462 390 VOID\r
391 );\r
3402aac7 392\r
1e57a462 393VOID\r
394EFIAPI\r
395ArmInstructionSynchronizationBarrier (\r
396 VOID\r
397 );\r
398\r
399VOID\r
400EFIAPI\r
401ArmWriteVBar (\r
4e57d6d7 402 IN UINTN VectorBase\r
1e57a462 403 );\r
404\r
4e57d6d7 405UINTN\r
1e57a462 406EFIAPI\r
407ArmReadVBar (\r
408 VOID\r
409 );\r
410\r
411VOID\r
412EFIAPI\r
413ArmWriteAuxCr (\r
414 IN UINT32 Bit\r
415 );\r
416\r
417UINT32\r
418EFIAPI\r
419ArmReadAuxCr (\r
420 VOID\r
421 );\r
422\r
423VOID\r
424EFIAPI\r
425ArmSetAuxCrBit (\r
426 IN UINT32 Bits\r
427 );\r
428\r
429VOID\r
430EFIAPI\r
431ArmUnsetAuxCrBit (\r
432 IN UINT32 Bits\r
433 );\r
434\r
435VOID\r
436EFIAPI\r
437ArmCallSEV (\r
438 VOID\r
439 );\r
440\r
441VOID\r
442EFIAPI\r
443ArmCallWFE (\r
444 VOID\r
445 );\r
446\r
447VOID\r
448EFIAPI\r
449ArmCallWFI (\r
25402f5d 450\r
1e57a462 451 VOID\r
452 );\r
453\r
454UINTN\r
455EFIAPI\r
456ArmReadMpidr (\r
457 VOID\r
458 );\r
459\r
9401d6f4
OM
460UINTN\r
461EFIAPI\r
462ArmReadMidr (\r
463 VOID\r
464 );\r
465\r
1e57a462 466UINT32\r
467EFIAPI\r
468ArmReadCpacr (\r
469 VOID\r
470 );\r
471\r
472VOID\r
473EFIAPI\r
474ArmWriteCpacr (\r
475 IN UINT32 Access\r
476 );\r
477\r
478VOID\r
479EFIAPI\r
480ArmEnableVFP (\r
481 VOID\r
482 );\r
483\r
46d4d75c
OM
484/**\r
485 Get the Secure Configuration Register value\r
486\r
487 @return Value read from the Secure Configuration Register\r
488\r
489**/\r
1e57a462 490UINT32\r
491EFIAPI\r
492ArmReadScr (\r
493 VOID\r
494 );\r
495\r
46d4d75c
OM
496/**\r
497 Set the Secure Configuration Register\r
498\r
499 @param Value Value to write to the Secure Configuration Register\r
500\r
501**/\r
1e57a462 502VOID\r
503EFIAPI\r
504ArmWriteScr (\r
46d4d75c 505 IN UINT32 Value\r
1e57a462 506 );\r
507\r
508UINT32\r
509EFIAPI\r
510ArmReadMVBar (\r
511 VOID\r
512 );\r
513\r
514VOID\r
515EFIAPI\r
516ArmWriteMVBar (\r
517 IN UINT32 VectorMonitorBase\r
518 );\r
519\r
520UINT32\r
521EFIAPI\r
522ArmReadSctlr (\r
523 VOID\r
524 );\r
525\r
1e1d1697
MZ
526VOID\r
527EFIAPI\r
528ArmWriteSctlr (\r
529 IN UINT32 Value\r
530 );\r
531\r
5ea2c2d3 532UINTN\r
533EFIAPI\r
534ArmReadHVBar (\r
535 VOID\r
536 );\r
537\r
538VOID\r
539EFIAPI\r
540ArmWriteHVBar (\r
541 IN UINTN HypModeVectorBase\r
542 );\r
543\r
52d44f77
OM
544\r
545//\r
546// Helper functions for accessing CPU ACTLR\r
547//\r
548\r
549UINTN\r
550EFIAPI\r
551ArmReadCpuActlr (\r
552 VOID\r
553 );\r
554\r
555VOID\r
556EFIAPI\r
557ArmWriteCpuActlr (\r
558 IN UINTN Val\r
559 );\r
560\r
561VOID\r
562EFIAPI\r
563ArmSetCpuActlrBit (\r
564 IN UINTN Bits\r
565 );\r
566\r
567VOID\r
568EFIAPI\r
569ArmUnsetCpuActlrBit (\r
570 IN UINTN Bits\r
571 );\r
572\r
734bd6cc
AB
573//\r
574// Accessors for the architected generic timer registers\r
575//\r
576\r
577#define ARM_ARCH_TIMER_ENABLE (1 << 0)\r
578#define ARM_ARCH_TIMER_IMASK (1 << 1)\r
579#define ARM_ARCH_TIMER_ISTATUS (1 << 2)\r
580\r
581UINTN\r
582EFIAPI\r
583ArmReadCntFrq (\r
584 VOID\r
585 );\r
586\r
587VOID\r
588EFIAPI\r
589ArmWriteCntFrq (\r
590 UINTN FreqInHz\r
591 );\r
592\r
593UINT64\r
594EFIAPI\r
595ArmReadCntPct (\r
596 VOID\r
597 );\r
598\r
599UINTN\r
600EFIAPI\r
601ArmReadCntkCtl (\r
602 VOID\r
603 );\r
604\r
605VOID\r
606EFIAPI\r
607ArmWriteCntkCtl (\r
608 UINTN Val\r
609 );\r
610\r
611UINTN\r
612EFIAPI\r
613ArmReadCntpTval (\r
614 VOID\r
615 );\r
616\r
617VOID\r
618EFIAPI\r
619ArmWriteCntpTval (\r
620 UINTN Val\r
621 );\r
622\r
623UINTN\r
624EFIAPI\r
625ArmReadCntpCtl (\r
626 VOID\r
627 );\r
628\r
629VOID\r
630EFIAPI\r
631ArmWriteCntpCtl (\r
632 UINTN Val\r
633 );\r
634\r
635UINTN\r
636EFIAPI\r
637ArmReadCntvTval (\r
638 VOID\r
639 );\r
640\r
641VOID\r
642EFIAPI\r
643ArmWriteCntvTval (\r
644 UINTN Val\r
645 );\r
646\r
647UINTN\r
648EFIAPI\r
649ArmReadCntvCtl (\r
650 VOID\r
651 );\r
652\r
653VOID\r
654EFIAPI\r
655ArmWriteCntvCtl (\r
656 UINTN Val\r
657 );\r
658\r
659UINT64\r
660EFIAPI\r
661ArmReadCntvCt (\r
662 VOID\r
663 );\r
664\r
665UINT64\r
666EFIAPI\r
667ArmReadCntpCval (\r
668 VOID\r
669 );\r
670\r
671VOID\r
672EFIAPI\r
673ArmWriteCntpCval (\r
674 UINT64 Val\r
675 );\r
676\r
677UINT64\r
678EFIAPI\r
679ArmReadCntvCval (\r
680 VOID\r
681 );\r
682\r
683VOID\r
684EFIAPI\r
685ArmWriteCntvCval (\r
686 UINT64 Val\r
687 );\r
688\r
689UINT64\r
690EFIAPI\r
691ArmReadCntvOff (\r
692 VOID\r
693 );\r
694\r
695VOID\r
696EFIAPI\r
697ArmWriteCntvOff (\r
698 UINT64 Val\r
699 );\r
700\r
95d04ebc
AB
701UINTN\r
702EFIAPI\r
703ArmGetPhysicalAddressBits (\r
704 VOID\r
705 );\r
706\r
5cc25cff
LL
707\r
708///\r
709/// ID Register Helper functions\r
710///\r
711\r
712/**\r
713 Check whether the CPU supports the GIC system register interface (any version)\r
714\r
715 @return Whether GIC System Register Interface is supported\r
716\r
717**/\r
718BOOLEAN\r
719EFIAPI\r
720ArmHasGicSystemRegisters (\r
721 VOID\r
722 );\r
723\r
740b870d
LL
724#ifdef MDE_CPU_ARM\r
725///\r
726/// AArch32-only ID Register Helper functions\r
727///\r
728/**\r
729 Check whether the CPU supports the Security extensions\r
730\r
731 @return Whether the Security extensions are implemented\r
732\r
733**/\r
734BOOLEAN\r
735EFIAPI\r
736ArmHasSecurityExtensions (\r
737 VOID\r
738 );\r
739#endif // MDE_CPU_ARM\r
740\r
1e57a462 741#endif // __ARM_LIB__\r