]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Library/ArmLib.h
ArmPlatformPkg/ArmVExpress-CTA15-A7: remove stale ArmPlatformGlobalVariable PCD
[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
90ed18ca 4 Copyright (c) 2011 - 2015, 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
186ArmCleanDataCacheEntryByMVA (\r
187 IN UINTN Address\r
188 );\r
189\r
190VOID\r
191EFIAPI\r
192ArmCleanInvalidateDataCacheEntryByMVA (\r
193 IN UINTN Address\r
194 );\r
195\r
0ff0e414
OM
196VOID\r
197EFIAPI\r
198ArmInvalidateDataCacheEntryBySetWay (\r
199 IN UINTN SetWayFormat\r
200 );\r
201\r
202VOID\r
203EFIAPI\r
204ArmCleanDataCacheEntryBySetWay (\r
205 IN UINTN SetWayFormat\r
206 );\r
207\r
208VOID\r
209EFIAPI\r
210ArmCleanInvalidateDataCacheEntryBySetWay (\r
211 IN UINTN SetWayFormat\r
212 );\r
213\r
1e57a462 214VOID\r
215EFIAPI\r
216ArmEnableDataCache (\r
217 VOID\r
218 );\r
219\r
220VOID\r
221EFIAPI\r
222ArmDisableDataCache (\r
223 VOID\r
224 );\r
225\r
226VOID\r
227EFIAPI\r
228ArmEnableInstructionCache (\r
229 VOID\r
230 );\r
231\r
232VOID\r
233EFIAPI\r
234ArmDisableInstructionCache (\r
235 VOID\r
236 );\r
3402aac7 237\r
1e57a462 238VOID\r
239EFIAPI\r
240ArmEnableMmu (\r
241 VOID\r
242 );\r
243\r
244VOID\r
245EFIAPI\r
246ArmDisableMmu (\r
247 VOID\r
248 );\r
249\r
0ff0e414
OM
250VOID\r
251EFIAPI\r
252ArmEnableCachesAndMmu (\r
253 VOID\r
254 );\r
255\r
1e57a462 256VOID\r
257EFIAPI\r
258ArmDisableCachesAndMmu (\r
259 VOID\r
260 );\r
261\r
1e57a462 262VOID\r
263EFIAPI\r
264ArmEnableInterrupts (\r
265 VOID\r
266 );\r
267\r
268UINTN\r
269EFIAPI\r
270ArmDisableInterrupts (\r
271 VOID\r
272 );\r
47585ed5 273\r
1e57a462 274BOOLEAN\r
275EFIAPI\r
276ArmGetInterruptState (\r
277 VOID\r
278 );\r
279\r
0ff0e414
OM
280VOID\r
281EFIAPI\r
282ArmEnableAsynchronousAbort (\r
283 VOID\r
284 );\r
285\r
47585ed5 286UINTN\r
287EFIAPI\r
0ff0e414 288ArmDisableAsynchronousAbort (\r
47585ed5 289 VOID\r
290 );\r
291\r
292VOID\r
293EFIAPI\r
294ArmEnableIrq (\r
295 VOID\r
296 );\r
297\r
0ff0e414
OM
298UINTN\r
299EFIAPI\r
300ArmDisableIrq (\r
301 VOID\r
302 );\r
303\r
1e57a462 304VOID\r
305EFIAPI\r
306ArmEnableFiq (\r
307 VOID\r
308 );\r
309\r
310UINTN\r
311EFIAPI\r
312ArmDisableFiq (\r
313 VOID\r
314 );\r
3402aac7 315\r
1e57a462 316BOOLEAN\r
317EFIAPI\r
318ArmGetFiqState (\r
319 VOID\r
320 );\r
321\r
8dd618d2
OM
322/**\r
323 * Invalidate Data and Instruction TLBs\r
324 */\r
1e57a462 325VOID\r
326EFIAPI\r
327ArmInvalidateTlb (\r
328 VOID\r
329 );\r
3402aac7 330\r
1e57a462 331VOID\r
332EFIAPI\r
333ArmUpdateTranslationTableEntry (\r
334 IN VOID *TranslationTableEntry,\r
335 IN VOID *Mva\r
336 );\r
3402aac7 337\r
1e57a462 338VOID\r
339EFIAPI\r
340ArmSetDomainAccessControl (\r
341 IN UINT32 Domain\r
342 );\r
343\r
344VOID\r
345EFIAPI\r
346ArmSetTTBR0 (\r
347 IN VOID *TranslationTableBase\r
348 );\r
349\r
350VOID *\r
351EFIAPI\r
352ArmGetTTBR0BaseAddress (\r
353 VOID\r
354 );\r
355\r
6f050ad6 356RETURN_STATUS\r
1e57a462 357EFIAPI\r
358ArmConfigureMmu (\r
359 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,\r
6f050ad6 360 OUT VOID **TranslationTableBase OPTIONAL,\r
1e57a462 361 OUT UINTN *TranslationTableSize OPTIONAL\r
362 );\r
3402aac7 363\r
1e57a462 364BOOLEAN\r
365EFIAPI\r
366ArmMmuEnabled (\r
367 VOID\r
368 );\r
3402aac7 369\r
1e57a462 370VOID\r
371EFIAPI\r
372ArmEnableBranchPrediction (\r
373 VOID\r
374 );\r
375\r
376VOID\r
377EFIAPI\r
378ArmDisableBranchPrediction (\r
379 VOID\r
380 );\r
381\r
382VOID\r
383EFIAPI\r
384ArmSetLowVectors (\r
385 VOID\r
386 );\r
387\r
388VOID\r
389EFIAPI\r
390ArmSetHighVectors (\r
391 VOID\r
392 );\r
393\r
394VOID\r
395EFIAPI\r
396ArmDataMemoryBarrier (\r
397 VOID\r
398 );\r
3402aac7 399\r
1e57a462 400VOID\r
401EFIAPI\r
cf93a378 402ArmDataSynchronizationBarrier (\r
1e57a462 403 VOID\r
404 );\r
3402aac7 405\r
1e57a462 406VOID\r
407EFIAPI\r
408ArmInstructionSynchronizationBarrier (\r
409 VOID\r
410 );\r
411\r
412VOID\r
413EFIAPI\r
414ArmWriteVBar (\r
4e57d6d7 415 IN UINTN VectorBase\r
1e57a462 416 );\r
417\r
4e57d6d7 418UINTN\r
1e57a462 419EFIAPI\r
420ArmReadVBar (\r
421 VOID\r
422 );\r
423\r
424VOID\r
425EFIAPI\r
426ArmWriteAuxCr (\r
427 IN UINT32 Bit\r
428 );\r
429\r
430UINT32\r
431EFIAPI\r
432ArmReadAuxCr (\r
433 VOID\r
434 );\r
435\r
436VOID\r
437EFIAPI\r
438ArmSetAuxCrBit (\r
439 IN UINT32 Bits\r
440 );\r
441\r
442VOID\r
443EFIAPI\r
444ArmUnsetAuxCrBit (\r
445 IN UINT32 Bits\r
446 );\r
447\r
448VOID\r
449EFIAPI\r
450ArmCallSEV (\r
451 VOID\r
452 );\r
453\r
454VOID\r
455EFIAPI\r
456ArmCallWFE (\r
457 VOID\r
458 );\r
459\r
460VOID\r
461EFIAPI\r
462ArmCallWFI (\r
25402f5d 463\r
1e57a462 464 VOID\r
465 );\r
466\r
467UINTN\r
468EFIAPI\r
469ArmReadMpidr (\r
470 VOID\r
471 );\r
472\r
9401d6f4
OM
473UINTN\r
474EFIAPI\r
475ArmReadMidr (\r
476 VOID\r
477 );\r
478\r
1e57a462 479UINT32\r
480EFIAPI\r
481ArmReadCpacr (\r
482 VOID\r
483 );\r
484\r
485VOID\r
486EFIAPI\r
487ArmWriteCpacr (\r
488 IN UINT32 Access\r
489 );\r
490\r
491VOID\r
492EFIAPI\r
493ArmEnableVFP (\r
494 VOID\r
495 );\r
496\r
46d4d75c
OM
497/**\r
498 Get the Secure Configuration Register value\r
499\r
500 @return Value read from the Secure Configuration Register\r
501\r
502**/\r
1e57a462 503UINT32\r
504EFIAPI\r
505ArmReadScr (\r
506 VOID\r
507 );\r
508\r
46d4d75c
OM
509/**\r
510 Set the Secure Configuration Register\r
511\r
512 @param Value Value to write to the Secure Configuration Register\r
513\r
514**/\r
1e57a462 515VOID\r
516EFIAPI\r
517ArmWriteScr (\r
46d4d75c 518 IN UINT32 Value\r
1e57a462 519 );\r
520\r
521UINT32\r
522EFIAPI\r
523ArmReadMVBar (\r
524 VOID\r
525 );\r
526\r
527VOID\r
528EFIAPI\r
529ArmWriteMVBar (\r
530 IN UINT32 VectorMonitorBase\r
531 );\r
532\r
533UINT32\r
534EFIAPI\r
535ArmReadSctlr (\r
536 VOID\r
537 );\r
538\r
5ea2c2d3 539UINTN\r
540EFIAPI\r
541ArmReadHVBar (\r
542 VOID\r
543 );\r
544\r
545VOID\r
546EFIAPI\r
547ArmWriteHVBar (\r
548 IN UINTN HypModeVectorBase\r
549 );\r
550\r
52d44f77
OM
551\r
552//\r
553// Helper functions for accessing CPU ACTLR\r
554//\r
555\r
556UINTN\r
557EFIAPI\r
558ArmReadCpuActlr (\r
559 VOID\r
560 );\r
561\r
562VOID\r
563EFIAPI\r
564ArmWriteCpuActlr (\r
565 IN UINTN Val\r
566 );\r
567\r
568VOID\r
569EFIAPI\r
570ArmSetCpuActlrBit (\r
571 IN UINTN Bits\r
572 );\r
573\r
574VOID\r
575EFIAPI\r
576ArmUnsetCpuActlrBit (\r
577 IN UINTN Bits\r
578 );\r
579\r
4d9a4f62
AB
580RETURN_STATUS\r
581ArmSetMemoryRegionNoExec (\r
582 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
583 IN UINT64 Length\r
584 );\r
585\r
586RETURN_STATUS\r
587ArmClearMemoryRegionNoExec (\r
588 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
589 IN UINT64 Length\r
590 );\r
591\r
592RETURN_STATUS\r
593ArmSetMemoryRegionReadOnly (\r
594 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
595 IN UINT64 Length\r
596 );\r
597\r
598RETURN_STATUS\r
599ArmClearMemoryRegionReadOnly (\r
600 IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
601 IN UINT64 Length\r
602 );\r
603\r
1e57a462 604#endif // __ARM_LIB__\r