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