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