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