]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Library/ArmLib.h
OvmfPkg/PlatformBootManagerLib: Postpone the shell registration
[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
1e57a462 29/**\r
30 * The UEFI firmware must not use the ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_* attributes.\r
31 *\r
32 * The Non Secure memory attribute (ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_*) should only\r
33 * be used in Secure World to distinguished Secure to Non-Secure memory.\r
34 */\r
35typedef enum {\r
36 ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED = 0,\r
37 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED,\r
38 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK,\r
39 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK,\r
40 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH,\r
41 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH,\r
42 ARM_MEMORY_REGION_ATTRIBUTE_DEVICE,\r
43 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE\r
44} ARM_MEMORY_REGION_ATTRIBUTES;\r
45\r
46#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1)\r
47\r
48typedef struct {\r
49 EFI_PHYSICAL_ADDRESS PhysicalBase;\r
50 EFI_VIRTUAL_ADDRESS VirtualBase;\r
c357fd6a 51 UINT64 Length;\r
1e57a462 52 ARM_MEMORY_REGION_ATTRIBUTES Attributes;\r
53} ARM_MEMORY_REGION_DESCRIPTOR;\r
54\r
55typedef VOID (*CACHE_OPERATION)(VOID);\r
56typedef VOID (*LINE_OPERATION)(UINTN);\r
57\r
58//\r
59// ARM Processor Mode\r
60//\r
61typedef enum {\r
62 ARM_PROCESSOR_MODE_USER = 0x10,\r
63 ARM_PROCESSOR_MODE_FIQ = 0x11,\r
64 ARM_PROCESSOR_MODE_IRQ = 0x12,\r
65 ARM_PROCESSOR_MODE_SUPERVISOR = 0x13,\r
66 ARM_PROCESSOR_MODE_ABORT = 0x17,\r
67 ARM_PROCESSOR_MODE_HYP = 0x1A,\r
68 ARM_PROCESSOR_MODE_UNDEFINED = 0x1B,\r
69 ARM_PROCESSOR_MODE_SYSTEM = 0x1F,\r
70 ARM_PROCESSOR_MODE_MASK = 0x1F\r
71} ARM_PROCESSOR_MODE;\r
72\r
73//\r
74// ARM Cpu IDs\r
75//\r
76#define ARM_CPU_IMPLEMENTER_MASK (0xFFU << 24)\r
77#define ARM_CPU_IMPLEMENTER_ARMLTD (0x41U << 24)\r
78#define ARM_CPU_IMPLEMENTER_DEC (0x44U << 24)\r
79#define ARM_CPU_IMPLEMENTER_MOT (0x4DU << 24)\r
80#define ARM_CPU_IMPLEMENTER_QUALCOMM (0x51U << 24)\r
81#define ARM_CPU_IMPLEMENTER_MARVELL (0x56U << 24)\r
82\r
83#define ARM_CPU_PRIMARY_PART_MASK (0xFFF << 4)\r
84#define ARM_CPU_PRIMARY_PART_CORTEXA5 (0xC05 << 4)\r
85#define ARM_CPU_PRIMARY_PART_CORTEXA7 (0xC07 << 4)\r
86#define ARM_CPU_PRIMARY_PART_CORTEXA8 (0xC08 << 4)\r
87#define ARM_CPU_PRIMARY_PART_CORTEXA9 (0xC09 << 4)\r
88#define ARM_CPU_PRIMARY_PART_CORTEXA15 (0xC0F << 4)\r
89\r
90//\r
91// ARM MP Core IDs\r
92//\r
90ed18ca
OM
93#define ARM_CORE_AFF0 0xFF\r
94#define ARM_CORE_AFF1 (0xFF << 8)\r
95#define ARM_CORE_AFF2 (0xFF << 16)\r
96#define ARM_CORE_AFF3 (0xFFULL << 32)\r
97\r
98#define ARM_CORE_MASK ARM_CORE_AFF0\r
99#define ARM_CLUSTER_MASK ARM_CORE_AFF1\r
1e57a462 100#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)\r
101#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)\r
e359565e 102#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))\r
1e57a462 103#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)\r
104\r
1e57a462 105UINTN\r
106EFIAPI\r
107ArmDataCacheLineLength (\r
108 VOID\r
109 );\r
3402aac7 110\r
1e57a462 111UINTN\r
112EFIAPI\r
113ArmInstructionCacheLineLength (\r
114 VOID\r
115 );\r
168d7245 116\r
c653fc2a
AB
117UINTN\r
118EFIAPI\r
119ArmCacheWritebackGranule (\r
120 VOID\r
121 );\r
122\r
168d7245
OM
123UINTN\r
124EFIAPI\r
125ArmIsArchTimerImplemented (\r
126 VOID\r
127 );\r
128\r
129UINTN\r
130EFIAPI\r
131ArmReadIdPfr0 (\r
132 VOID\r
133 );\r
134\r
135UINTN\r
136EFIAPI\r
137ArmReadIdPfr1 (\r
138 VOID\r
139 );\r
140\r
64751727 141UINTN\r
1e57a462 142EFIAPI\r
64751727 143ArmCacheInfo (\r
1e57a462 144 VOID\r
145 );\r
146\r
147BOOLEAN\r
148EFIAPI\r
149ArmIsMpCore (\r
150 VOID\r
151 );\r
152\r
153VOID\r
154EFIAPI\r
155ArmInvalidateDataCache (\r
156 VOID\r
157 );\r
158\r
159\r
160VOID\r
161EFIAPI\r
162ArmCleanInvalidateDataCache (\r
163 VOID\r
164 );\r
165\r
166VOID\r
167EFIAPI\r
168ArmCleanDataCache (\r
169 VOID\r
170 );\r
171\r
1e57a462 172VOID\r
173EFIAPI\r
174ArmInvalidateInstructionCache (\r
175 VOID\r
176 );\r
177\r
178VOID\r
179EFIAPI\r
180ArmInvalidateDataCacheEntryByMVA (\r
181 IN UINTN Address\r
182 );\r
183\r
184VOID\r
185EFIAPI\r
b7de7e3c 186ArmCleanDataCacheEntryToPoUByMVA(\r
1e57a462 187 IN UINTN Address\r
188 );\r
189\r
b7de7e3c
EC
190VOID\r
191EFIAPI\r
192ArmCleanDataCacheEntryByMVA(\r
193IN UINTN Address\r
194);\r
195\r
1e57a462 196VOID\r
197EFIAPI\r
198ArmCleanInvalidateDataCacheEntryByMVA (\r
199 IN UINTN Address\r
200 );\r
201\r
0ff0e414
OM
202VOID\r
203EFIAPI\r
204ArmInvalidateDataCacheEntryBySetWay (\r
205 IN UINTN SetWayFormat\r
206 );\r
207\r
208VOID\r
209EFIAPI\r
210ArmCleanDataCacheEntryBySetWay (\r
211 IN UINTN SetWayFormat\r
212 );\r
213\r
214VOID\r
215EFIAPI\r
216ArmCleanInvalidateDataCacheEntryBySetWay (\r
217 IN UINTN SetWayFormat\r
218 );\r
219\r
1e57a462 220VOID\r
221EFIAPI\r
222ArmEnableDataCache (\r
223 VOID\r
224 );\r
225\r
226VOID\r
227EFIAPI\r
228ArmDisableDataCache (\r
229 VOID\r
230 );\r
231\r
232VOID\r
233EFIAPI\r
234ArmEnableInstructionCache (\r
235 VOID\r
236 );\r
237\r
238VOID\r
239EFIAPI\r
240ArmDisableInstructionCache (\r
241 VOID\r
242 );\r
3402aac7 243\r
1e57a462 244VOID\r
245EFIAPI\r
246ArmEnableMmu (\r
247 VOID\r
248 );\r
249\r
250VOID\r
251EFIAPI\r
252ArmDisableMmu (\r
253 VOID\r
254 );\r
255\r
0ff0e414
OM
256VOID\r
257EFIAPI\r
258ArmEnableCachesAndMmu (\r
259 VOID\r
260 );\r
261\r
1e57a462 262VOID\r
263EFIAPI\r
264ArmDisableCachesAndMmu (\r
265 VOID\r
266 );\r
267\r
1e57a462 268VOID\r
269EFIAPI\r
270ArmEnableInterrupts (\r
271 VOID\r
272 );\r
273\r
274UINTN\r
275EFIAPI\r
276ArmDisableInterrupts (\r
277 VOID\r
278 );\r
47585ed5 279\r
1e57a462 280BOOLEAN\r
281EFIAPI\r
282ArmGetInterruptState (\r
283 VOID\r
284 );\r
285\r
0ff0e414
OM
286VOID\r
287EFIAPI\r
288ArmEnableAsynchronousAbort (\r
289 VOID\r
290 );\r
291\r
47585ed5 292UINTN\r
293EFIAPI\r
0ff0e414 294ArmDisableAsynchronousAbort (\r
47585ed5 295 VOID\r
296 );\r
297\r
298VOID\r
299EFIAPI\r
300ArmEnableIrq (\r
301 VOID\r
302 );\r
303\r
0ff0e414
OM
304UINTN\r
305EFIAPI\r
306ArmDisableIrq (\r
307 VOID\r
308 );\r
309\r
1e57a462 310VOID\r
311EFIAPI\r
312ArmEnableFiq (\r
313 VOID\r
314 );\r
315\r
316UINTN\r
317EFIAPI\r
318ArmDisableFiq (\r
319 VOID\r
320 );\r
3402aac7 321\r
1e57a462 322BOOLEAN\r
323EFIAPI\r
324ArmGetFiqState (\r
325 VOID\r
326 );\r
327\r
8dd618d2
OM
328/**\r
329 * Invalidate Data and Instruction TLBs\r
330 */\r
1e57a462 331VOID\r
332EFIAPI\r
333ArmInvalidateTlb (\r
334 VOID\r
335 );\r
3402aac7 336\r
1e57a462 337VOID\r
338EFIAPI\r
339ArmUpdateTranslationTableEntry (\r
340 IN VOID *TranslationTableEntry,\r
341 IN VOID *Mva\r
342 );\r
3402aac7 343\r
1e57a462 344VOID\r
345EFIAPI\r
346ArmSetDomainAccessControl (\r
347 IN UINT32 Domain\r
348 );\r
349\r
350VOID\r
351EFIAPI\r
352ArmSetTTBR0 (\r
353 IN VOID *TranslationTableBase\r
354 );\r
355\r
ff1f27c0
EL
356VOID\r
357EFIAPI\r
358ArmSetTTBCR (\r
359 IN UINT32 Bits\r
360 );\r
361\r
1e57a462 362VOID *\r
363EFIAPI\r
364ArmGetTTBR0BaseAddress (\r
365 VOID\r
366 );\r
367\r
6f050ad6 368RETURN_STATUS\r
1e57a462 369EFIAPI\r
370ArmConfigureMmu (\r
371 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,\r
6f050ad6 372 OUT VOID **TranslationTableBase OPTIONAL,\r
1e57a462 373 OUT UINTN *TranslationTableSize OPTIONAL\r
374 );\r
3402aac7 375\r
1e57a462 376BOOLEAN\r
377EFIAPI\r
378ArmMmuEnabled (\r
379 VOID\r
380 );\r
3402aac7 381\r
1e57a462 382VOID\r
383EFIAPI\r
384ArmEnableBranchPrediction (\r
385 VOID\r
386 );\r
387\r
388VOID\r
389EFIAPI\r
390ArmDisableBranchPrediction (\r
391 VOID\r
392 );\r
393\r
394VOID\r
395EFIAPI\r
396ArmSetLowVectors (\r
397 VOID\r
398 );\r
399\r
400VOID\r
401EFIAPI\r
402ArmSetHighVectors (\r
403 VOID\r
404 );\r
405\r
406VOID\r
407EFIAPI\r
408ArmDataMemoryBarrier (\r
409 VOID\r
410 );\r
3402aac7 411\r
1e57a462 412VOID\r
413EFIAPI\r
cf93a378 414ArmDataSynchronizationBarrier (\r
1e57a462 415 VOID\r
416 );\r
3402aac7 417\r
1e57a462 418VOID\r
419EFIAPI\r
420ArmInstructionSynchronizationBarrier (\r
421 VOID\r
422 );\r
423\r
424VOID\r
425EFIAPI\r
426ArmWriteVBar (\r
4e57d6d7 427 IN UINTN VectorBase\r
1e57a462 428 );\r
429\r
4e57d6d7 430UINTN\r
1e57a462 431EFIAPI\r
432ArmReadVBar (\r
433 VOID\r
434 );\r
435\r
436VOID\r
437EFIAPI\r
438ArmWriteAuxCr (\r
439 IN UINT32 Bit\r
440 );\r
441\r
442UINT32\r
443EFIAPI\r
444ArmReadAuxCr (\r
445 VOID\r
446 );\r
447\r
448VOID\r
449EFIAPI\r
450ArmSetAuxCrBit (\r
451 IN UINT32 Bits\r
452 );\r
453\r
454VOID\r
455EFIAPI\r
456ArmUnsetAuxCrBit (\r
457 IN UINT32 Bits\r
458 );\r
459\r
460VOID\r
461EFIAPI\r
462ArmCallSEV (\r
463 VOID\r
464 );\r
465\r
466VOID\r
467EFIAPI\r
468ArmCallWFE (\r
469 VOID\r
470 );\r
471\r
472VOID\r
473EFIAPI\r
474ArmCallWFI (\r
25402f5d 475\r
1e57a462 476 VOID\r
477 );\r
478\r
479UINTN\r
480EFIAPI\r
481ArmReadMpidr (\r
482 VOID\r
483 );\r
484\r
9401d6f4
OM
485UINTN\r
486EFIAPI\r
487ArmReadMidr (\r
488 VOID\r
489 );\r
490\r
1e57a462 491UINT32\r
492EFIAPI\r
493ArmReadCpacr (\r
494 VOID\r
495 );\r
496\r
497VOID\r
498EFIAPI\r
499ArmWriteCpacr (\r
500 IN UINT32 Access\r
501 );\r
502\r
503VOID\r
504EFIAPI\r
505ArmEnableVFP (\r
506 VOID\r
507 );\r
508\r
46d4d75c
OM
509/**\r
510 Get the Secure Configuration Register value\r
511\r
512 @return Value read from the Secure Configuration Register\r
513\r
514**/\r
1e57a462 515UINT32\r
516EFIAPI\r
517ArmReadScr (\r
518 VOID\r
519 );\r
520\r
46d4d75c
OM
521/**\r
522 Set the Secure Configuration Register\r
523\r
524 @param Value Value to write to the Secure Configuration Register\r
525\r
526**/\r
1e57a462 527VOID\r
528EFIAPI\r
529ArmWriteScr (\r
46d4d75c 530 IN UINT32 Value\r
1e57a462 531 );\r
532\r
533UINT32\r
534EFIAPI\r
535ArmReadMVBar (\r
536 VOID\r
537 );\r
538\r
539VOID\r
540EFIAPI\r
541ArmWriteMVBar (\r
542 IN UINT32 VectorMonitorBase\r
543 );\r
544\r
545UINT32\r
546EFIAPI\r
547ArmReadSctlr (\r
548 VOID\r
549 );\r
550\r
5ea2c2d3 551UINTN\r
552EFIAPI\r
553ArmReadHVBar (\r
554 VOID\r
555 );\r
556\r
557VOID\r
558EFIAPI\r
559ArmWriteHVBar (\r
560 IN UINTN HypModeVectorBase\r
561 );\r
562\r
52d44f77
OM
563\r
564//\r
565// Helper functions for accessing CPU ACTLR\r
566//\r
567\r
568UINTN\r
569EFIAPI\r
570ArmReadCpuActlr (\r
571 VOID\r
572 );\r
573\r
574VOID\r
575EFIAPI\r
576ArmWriteCpuActlr (\r
577 IN UINTN Val\r
578 );\r
579\r
580VOID\r
581EFIAPI\r
582ArmSetCpuActlrBit (\r
583 IN UINTN Bits\r
584 );\r
585\r
586VOID\r
587EFIAPI\r
588ArmUnsetCpuActlrBit (\r
589 IN UINTN Bits\r
590 );\r
591\r
4d9a4f62
AB
592RETURN_STATUS\r
593ArmSetMemoryRegionNoExec (\r
594 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
595 IN UINT64 Length\r
596 );\r
597\r
598RETURN_STATUS\r
599ArmClearMemoryRegionNoExec (\r
600 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
601 IN UINT64 Length\r
602 );\r
603\r
604RETURN_STATUS\r
605ArmSetMemoryRegionReadOnly (\r
606 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
607 IN UINT64 Length\r
608 );\r
609\r
610RETURN_STATUS\r
611ArmClearMemoryRegionReadOnly (\r
612 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
613 IN UINT64 Length\r
614 );\r
615\r
61b02ba1
AB
616VOID\r
617ArmReplaceLiveTranslationEntry (\r
618 IN UINT64 *Entry,\r
619 IN UINT64 Value\r
620 );\r
621\r
1e57a462 622#endif // __ARM_LIB__\r