]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - ArmPkg/Include/Library/ArmLib.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ArmPkg / Include / Library / ArmLib.h
... / ...
CommitLineData
1/** @file\r
2\r
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
4 Copyright (c) 2011 - 2016, ARM Ltd. All rights reserved.<BR>\r
5 Copyright (c) 2020 - 2021, NUVIA Inc. All rights reserved.<BR>\r
6\r
7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9**/\r
10\r
11#ifndef ARM_LIB_H_\r
12#define ARM_LIB_H_\r
13\r
14#include <Uefi/UefiBaseType.h>\r
15\r
16#ifdef MDE_CPU_ARM\r
17 #include <Chipset/ArmV7.h>\r
18#elif defined (MDE_CPU_AARCH64)\r
19 #include <Chipset/AArch64.h>\r
20#else\r
21 #error "Unknown chipset."\r
22#endif\r
23\r
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
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
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
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
58 UINT64 Length;\r
59 ARM_MEMORY_REGION_ATTRIBUTES Attributes;\r
60} ARM_MEMORY_REGION_DESCRIPTOR;\r
61\r
62typedef VOID (*CACHE_OPERATION)(\r
63 VOID\r
64 );\r
65typedef VOID (*LINE_OPERATION)(\r
66 UINTN\r
67 );\r
68\r
69//\r
70// ARM Processor Mode\r
71//\r
72typedef enum {\r
73 ARM_PROCESSOR_MODE_USER = 0x10,\r
74 ARM_PROCESSOR_MODE_FIQ = 0x11,\r
75 ARM_PROCESSOR_MODE_IRQ = 0x12,\r
76 ARM_PROCESSOR_MODE_SUPERVISOR = 0x13,\r
77 ARM_PROCESSOR_MODE_ABORT = 0x17,\r
78 ARM_PROCESSOR_MODE_HYP = 0x1A,\r
79 ARM_PROCESSOR_MODE_UNDEFINED = 0x1B,\r
80 ARM_PROCESSOR_MODE_SYSTEM = 0x1F,\r
81 ARM_PROCESSOR_MODE_MASK = 0x1F\r
82} ARM_PROCESSOR_MODE;\r
83\r
84//\r
85// ARM Cpu IDs\r
86//\r
87#define ARM_CPU_IMPLEMENTER_MASK (0xFFU << 24)\r
88#define ARM_CPU_IMPLEMENTER_ARMLTD (0x41U << 24)\r
89#define ARM_CPU_IMPLEMENTER_DEC (0x44U << 24)\r
90#define ARM_CPU_IMPLEMENTER_MOT (0x4DU << 24)\r
91#define ARM_CPU_IMPLEMENTER_QUALCOMM (0x51U << 24)\r
92#define ARM_CPU_IMPLEMENTER_MARVELL (0x56U << 24)\r
93\r
94#define ARM_CPU_PRIMARY_PART_MASK (0xFFF << 4)\r
95#define ARM_CPU_PRIMARY_PART_CORTEXA5 (0xC05 << 4)\r
96#define ARM_CPU_PRIMARY_PART_CORTEXA7 (0xC07 << 4)\r
97#define ARM_CPU_PRIMARY_PART_CORTEXA8 (0xC08 << 4)\r
98#define ARM_CPU_PRIMARY_PART_CORTEXA9 (0xC09 << 4)\r
99#define ARM_CPU_PRIMARY_PART_CORTEXA15 (0xC0F << 4)\r
100\r
101//\r
102// ARM MP Core IDs\r
103//\r
104#define ARM_CORE_AFF0 0xFF\r
105#define ARM_CORE_AFF1 (0xFF << 8)\r
106#define ARM_CORE_AFF2 (0xFF << 16)\r
107#define ARM_CORE_AFF3 (0xFFULL << 32)\r
108\r
109#define ARM_CORE_MASK ARM_CORE_AFF0\r
110#define ARM_CLUSTER_MASK ARM_CORE_AFF1\r
111#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)\r
112#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)\r
113#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))\r
114#define GET_MPIDR_AFF0(MpId) ((MpId) & ARM_CORE_AFF0)\r
115#define GET_MPIDR_AFF1(MpId) (((MpId) & ARM_CORE_AFF1) >> 8)\r
116#define GET_MPIDR_AFF2(MpId) (((MpId) & ARM_CORE_AFF2) >> 16)\r
117#define GET_MPIDR_AFF3(MpId) (((MpId) & ARM_CORE_AFF3) >> 32)\r
118#define GET_MPIDR_AFFINITY_BITS(MpId) ((MpId) & 0xFF00FFFFFF)\r
119#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)\r
120#define MPIDR_MT_BIT BIT24\r
121\r
122/** Reads the CCSIDR register for the specified cache.\r
123\r
124 @param CSSELR The CSSELR cache selection register value.\r
125\r
126 @return The contents of the CCSIDR_EL1 register for the specified cache, when in AARCH64 mode.\r
127 Returns the contents of the CCSIDR register in AARCH32 mode.\r
128**/\r
129UINTN\r
130ReadCCSIDR (\r
131 IN UINT32 CSSELR\r
132 );\r
133\r
134/** Reads the CCSIDR2 for the specified cache.\r
135\r
136 @param CSSELR The CSSELR cache selection register value\r
137\r
138 @return The contents of the CCSIDR2 register for the specified cache.\r
139**/\r
140UINT32\r
141ReadCCSIDR2 (\r
142 IN UINT32 CSSELR\r
143 );\r
144\r
145/** Reads the Cache Level ID (CLIDR) register.\r
146\r
147 @return The contents of the CLIDR_EL1 register.\r
148**/\r
149UINT32\r
150ReadCLIDR (\r
151 VOID\r
152 );\r
153\r
154UINTN\r
155EFIAPI\r
156ArmDataCacheLineLength (\r
157 VOID\r
158 );\r
159\r
160UINTN\r
161EFIAPI\r
162ArmInstructionCacheLineLength (\r
163 VOID\r
164 );\r
165\r
166UINTN\r
167EFIAPI\r
168ArmCacheWritebackGranule (\r
169 VOID\r
170 );\r
171\r
172UINTN\r
173EFIAPI\r
174ArmIsArchTimerImplemented (\r
175 VOID\r
176 );\r
177\r
178UINTN\r
179EFIAPI\r
180ArmCacheInfo (\r
181 VOID\r
182 );\r
183\r
184BOOLEAN\r
185EFIAPI\r
186ArmIsMpCore (\r
187 VOID\r
188 );\r
189\r
190VOID\r
191EFIAPI\r
192ArmInvalidateDataCache (\r
193 VOID\r
194 );\r
195\r
196VOID\r
197EFIAPI\r
198ArmCleanInvalidateDataCache (\r
199 VOID\r
200 );\r
201\r
202VOID\r
203EFIAPI\r
204ArmCleanDataCache (\r
205 VOID\r
206 );\r
207\r
208VOID\r
209EFIAPI\r
210ArmInvalidateInstructionCache (\r
211 VOID\r
212 );\r
213\r
214VOID\r
215EFIAPI\r
216ArmInvalidateDataCacheEntryByMVA (\r
217 IN UINTN Address\r
218 );\r
219\r
220VOID\r
221EFIAPI\r
222ArmCleanDataCacheEntryToPoUByMVA (\r
223 IN UINTN Address\r
224 );\r
225\r
226VOID\r
227EFIAPI\r
228ArmInvalidateInstructionCacheEntryToPoUByMVA (\r
229 IN UINTN Address\r
230 );\r
231\r
232VOID\r
233EFIAPI\r
234ArmCleanDataCacheEntryByMVA (\r
235 IN UINTN Address\r
236 );\r
237\r
238VOID\r
239EFIAPI\r
240ArmCleanInvalidateDataCacheEntryByMVA (\r
241 IN UINTN Address\r
242 );\r
243\r
244VOID\r
245EFIAPI\r
246ArmEnableDataCache (\r
247 VOID\r
248 );\r
249\r
250VOID\r
251EFIAPI\r
252ArmDisableDataCache (\r
253 VOID\r
254 );\r
255\r
256VOID\r
257EFIAPI\r
258ArmEnableInstructionCache (\r
259 VOID\r
260 );\r
261\r
262VOID\r
263EFIAPI\r
264ArmDisableInstructionCache (\r
265 VOID\r
266 );\r
267\r
268VOID\r
269EFIAPI\r
270ArmEnableMmu (\r
271 VOID\r
272 );\r
273\r
274VOID\r
275EFIAPI\r
276ArmDisableMmu (\r
277 VOID\r
278 );\r
279\r
280VOID\r
281EFIAPI\r
282ArmEnableCachesAndMmu (\r
283 VOID\r
284 );\r
285\r
286VOID\r
287EFIAPI\r
288ArmDisableCachesAndMmu (\r
289 VOID\r
290 );\r
291\r
292VOID\r
293EFIAPI\r
294ArmEnableInterrupts (\r
295 VOID\r
296 );\r
297\r
298UINTN\r
299EFIAPI\r
300ArmDisableInterrupts (\r
301 VOID\r
302 );\r
303\r
304BOOLEAN\r
305EFIAPI\r
306ArmGetInterruptState (\r
307 VOID\r
308 );\r
309\r
310VOID\r
311EFIAPI\r
312ArmEnableAsynchronousAbort (\r
313 VOID\r
314 );\r
315\r
316UINTN\r
317EFIAPI\r
318ArmDisableAsynchronousAbort (\r
319 VOID\r
320 );\r
321\r
322VOID\r
323EFIAPI\r
324ArmEnableIrq (\r
325 VOID\r
326 );\r
327\r
328UINTN\r
329EFIAPI\r
330ArmDisableIrq (\r
331 VOID\r
332 );\r
333\r
334VOID\r
335EFIAPI\r
336ArmEnableFiq (\r
337 VOID\r
338 );\r
339\r
340UINTN\r
341EFIAPI\r
342ArmDisableFiq (\r
343 VOID\r
344 );\r
345\r
346BOOLEAN\r
347EFIAPI\r
348ArmGetFiqState (\r
349 VOID\r
350 );\r
351\r
352/**\r
353 * Invalidate Data and Instruction TLBs\r
354 */\r
355VOID\r
356EFIAPI\r
357ArmInvalidateTlb (\r
358 VOID\r
359 );\r
360\r
361VOID\r
362EFIAPI\r
363ArmUpdateTranslationTableEntry (\r
364 IN VOID *TranslationTableEntry,\r
365 IN VOID *Mva\r
366 );\r
367\r
368VOID\r
369EFIAPI\r
370ArmSetDomainAccessControl (\r
371 IN UINT32 Domain\r
372 );\r
373\r
374VOID\r
375EFIAPI\r
376ArmSetTTBR0 (\r
377 IN VOID *TranslationTableBase\r
378 );\r
379\r
380VOID\r
381EFIAPI\r
382ArmSetTTBCR (\r
383 IN UINT32 Bits\r
384 );\r
385\r
386VOID *\r
387EFIAPI\r
388ArmGetTTBR0BaseAddress (\r
389 VOID\r
390 );\r
391\r
392BOOLEAN\r
393EFIAPI\r
394ArmMmuEnabled (\r
395 VOID\r
396 );\r
397\r
398VOID\r
399EFIAPI\r
400ArmEnableBranchPrediction (\r
401 VOID\r
402 );\r
403\r
404VOID\r
405EFIAPI\r
406ArmDisableBranchPrediction (\r
407 VOID\r
408 );\r
409\r
410VOID\r
411EFIAPI\r
412ArmSetLowVectors (\r
413 VOID\r
414 );\r
415\r
416VOID\r
417EFIAPI\r
418ArmSetHighVectors (\r
419 VOID\r
420 );\r
421\r
422VOID\r
423EFIAPI\r
424ArmDataMemoryBarrier (\r
425 VOID\r
426 );\r
427\r
428VOID\r
429EFIAPI\r
430ArmDataSynchronizationBarrier (\r
431 VOID\r
432 );\r
433\r
434VOID\r
435EFIAPI\r
436ArmInstructionSynchronizationBarrier (\r
437 VOID\r
438 );\r
439\r
440VOID\r
441EFIAPI\r
442ArmWriteVBar (\r
443 IN UINTN VectorBase\r
444 );\r
445\r
446UINTN\r
447EFIAPI\r
448ArmReadVBar (\r
449 VOID\r
450 );\r
451\r
452VOID\r
453EFIAPI\r
454ArmWriteAuxCr (\r
455 IN UINT32 Bit\r
456 );\r
457\r
458UINT32\r
459EFIAPI\r
460ArmReadAuxCr (\r
461 VOID\r
462 );\r
463\r
464VOID\r
465EFIAPI\r
466ArmSetAuxCrBit (\r
467 IN UINT32 Bits\r
468 );\r
469\r
470VOID\r
471EFIAPI\r
472ArmUnsetAuxCrBit (\r
473 IN UINT32 Bits\r
474 );\r
475\r
476VOID\r
477EFIAPI\r
478ArmCallSEV (\r
479 VOID\r
480 );\r
481\r
482VOID\r
483EFIAPI\r
484ArmCallWFE (\r
485 VOID\r
486 );\r
487\r
488VOID\r
489EFIAPI\r
490ArmCallWFI (\r
491\r
492 VOID\r
493 );\r
494\r
495UINTN\r
496EFIAPI\r
497ArmReadMpidr (\r
498 VOID\r
499 );\r
500\r
501UINTN\r
502EFIAPI\r
503ArmReadMidr (\r
504 VOID\r
505 );\r
506\r
507UINT32\r
508EFIAPI\r
509ArmReadCpacr (\r
510 VOID\r
511 );\r
512\r
513VOID\r
514EFIAPI\r
515ArmWriteCpacr (\r
516 IN UINT32 Access\r
517 );\r
518\r
519VOID\r
520EFIAPI\r
521ArmEnableVFP (\r
522 VOID\r
523 );\r
524\r
525/**\r
526 Get the Secure Configuration Register value\r
527\r
528 @return Value read from the Secure Configuration Register\r
529\r
530**/\r
531UINT32\r
532EFIAPI\r
533ArmReadScr (\r
534 VOID\r
535 );\r
536\r
537/**\r
538 Set the Secure Configuration Register\r
539\r
540 @param Value Value to write to the Secure Configuration Register\r
541\r
542**/\r
543VOID\r
544EFIAPI\r
545ArmWriteScr (\r
546 IN UINT32 Value\r
547 );\r
548\r
549UINT32\r
550EFIAPI\r
551ArmReadMVBar (\r
552 VOID\r
553 );\r
554\r
555VOID\r
556EFIAPI\r
557ArmWriteMVBar (\r
558 IN UINT32 VectorMonitorBase\r
559 );\r
560\r
561UINT32\r
562EFIAPI\r
563ArmReadSctlr (\r
564 VOID\r
565 );\r
566\r
567VOID\r
568EFIAPI\r
569ArmWriteSctlr (\r
570 IN UINT32 Value\r
571 );\r
572\r
573UINTN\r
574EFIAPI\r
575ArmReadHVBar (\r
576 VOID\r
577 );\r
578\r
579VOID\r
580EFIAPI\r
581ArmWriteHVBar (\r
582 IN UINTN HypModeVectorBase\r
583 );\r
584\r
585//\r
586// Helper functions for accessing CPU ACTLR\r
587//\r
588\r
589UINTN\r
590EFIAPI\r
591ArmReadCpuActlr (\r
592 VOID\r
593 );\r
594\r
595VOID\r
596EFIAPI\r
597ArmWriteCpuActlr (\r
598 IN UINTN Val\r
599 );\r
600\r
601VOID\r
602EFIAPI\r
603ArmSetCpuActlrBit (\r
604 IN UINTN Bits\r
605 );\r
606\r
607VOID\r
608EFIAPI\r
609ArmUnsetCpuActlrBit (\r
610 IN UINTN Bits\r
611 );\r
612\r
613//\r
614// Accessors for the architected generic timer registers\r
615//\r
616\r
617#define ARM_ARCH_TIMER_ENABLE (1 << 0)\r
618#define ARM_ARCH_TIMER_IMASK (1 << 1)\r
619#define ARM_ARCH_TIMER_ISTATUS (1 << 2)\r
620\r
621UINTN\r
622EFIAPI\r
623ArmReadCntFrq (\r
624 VOID\r
625 );\r
626\r
627VOID\r
628EFIAPI\r
629ArmWriteCntFrq (\r
630 UINTN FreqInHz\r
631 );\r
632\r
633UINT64\r
634EFIAPI\r
635ArmReadCntPct (\r
636 VOID\r
637 );\r
638\r
639UINTN\r
640EFIAPI\r
641ArmReadCntkCtl (\r
642 VOID\r
643 );\r
644\r
645VOID\r
646EFIAPI\r
647ArmWriteCntkCtl (\r
648 UINTN Val\r
649 );\r
650\r
651UINTN\r
652EFIAPI\r
653ArmReadCntpTval (\r
654 VOID\r
655 );\r
656\r
657VOID\r
658EFIAPI\r
659ArmWriteCntpTval (\r
660 UINTN Val\r
661 );\r
662\r
663UINTN\r
664EFIAPI\r
665ArmReadCntpCtl (\r
666 VOID\r
667 );\r
668\r
669VOID\r
670EFIAPI\r
671ArmWriteCntpCtl (\r
672 UINTN Val\r
673 );\r
674\r
675UINTN\r
676EFIAPI\r
677ArmReadCntvTval (\r
678 VOID\r
679 );\r
680\r
681VOID\r
682EFIAPI\r
683ArmWriteCntvTval (\r
684 UINTN Val\r
685 );\r
686\r
687UINTN\r
688EFIAPI\r
689ArmReadCntvCtl (\r
690 VOID\r
691 );\r
692\r
693VOID\r
694EFIAPI\r
695ArmWriteCntvCtl (\r
696 UINTN Val\r
697 );\r
698\r
699UINT64\r
700EFIAPI\r
701ArmReadCntvCt (\r
702 VOID\r
703 );\r
704\r
705UINT64\r
706EFIAPI\r
707ArmReadCntpCval (\r
708 VOID\r
709 );\r
710\r
711VOID\r
712EFIAPI\r
713ArmWriteCntpCval (\r
714 UINT64 Val\r
715 );\r
716\r
717UINT64\r
718EFIAPI\r
719ArmReadCntvCval (\r
720 VOID\r
721 );\r
722\r
723VOID\r
724EFIAPI\r
725ArmWriteCntvCval (\r
726 UINT64 Val\r
727 );\r
728\r
729UINT64\r
730EFIAPI\r
731ArmReadCntvOff (\r
732 VOID\r
733 );\r
734\r
735VOID\r
736EFIAPI\r
737ArmWriteCntvOff (\r
738 UINT64 Val\r
739 );\r
740\r
741UINTN\r
742EFIAPI\r
743ArmGetPhysicalAddressBits (\r
744 VOID\r
745 );\r
746\r
747///\r
748/// ID Register Helper functions\r
749///\r
750\r
751/**\r
752 Check whether the CPU supports the GIC system register interface (any version)\r
753\r
754 @return Whether GIC System Register Interface is supported\r
755\r
756**/\r
757BOOLEAN\r
758EFIAPI\r
759ArmHasGicSystemRegisters (\r
760 VOID\r
761 );\r
762\r
763/** Checks if CCIDX is implemented.\r
764\r
765 @retval TRUE CCIDX is implemented.\r
766 @retval FALSE CCIDX is not implemented.\r
767**/\r
768BOOLEAN\r
769EFIAPI\r
770ArmHasCcidx (\r
771 VOID\r
772 );\r
773\r
774#ifdef MDE_CPU_ARM\r
775///\r
776/// AArch32-only ID Register Helper functions\r
777///\r
778\r
779/**\r
780 Check whether the CPU supports the Security extensions\r
781\r
782 @return Whether the Security extensions are implemented\r
783\r
784**/\r
785BOOLEAN\r
786EFIAPI\r
787ArmHasSecurityExtensions (\r
788 VOID\r
789 );\r
790\r
791#endif // MDE_CPU_ARM\r
792\r
793#endif // ARM_LIB_H_\r