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