]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Library/ArmLib.h
ArmVirtPkg/PrePi: do not invalidate the entire data cache at startup
[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
OM
116\r
117UINTN\r
118EFIAPI\r
119ArmIsArchTimerImplemented (\r
120 VOID\r
121 );\r
122\r
123UINTN\r
124EFIAPI\r
125ArmReadIdPfr0 (\r
126 VOID\r
127 );\r
128\r
129UINTN\r
130EFIAPI\r
131ArmReadIdPfr1 (\r
132 VOID\r
133 );\r
134\r
64751727 135UINTN\r
1e57a462 136EFIAPI\r
64751727 137ArmCacheInfo (\r
1e57a462 138 VOID\r
139 );\r
140\r
141BOOLEAN\r
142EFIAPI\r
143ArmIsMpCore (\r
144 VOID\r
145 );\r
146\r
147VOID\r
148EFIAPI\r
149ArmInvalidateDataCache (\r
150 VOID\r
151 );\r
152\r
153\r
154VOID\r
155EFIAPI\r
156ArmCleanInvalidateDataCache (\r
157 VOID\r
158 );\r
159\r
160VOID\r
161EFIAPI\r
162ArmCleanDataCache (\r
163 VOID\r
164 );\r
165\r
1e57a462 166VOID\r
167EFIAPI\r
168ArmInvalidateInstructionCache (\r
169 VOID\r
170 );\r
171\r
172VOID\r
173EFIAPI\r
174ArmInvalidateDataCacheEntryByMVA (\r
175 IN UINTN Address\r
176 );\r
177\r
178VOID\r
179EFIAPI\r
180ArmCleanDataCacheEntryByMVA (\r
181 IN UINTN Address\r
182 );\r
183\r
184VOID\r
185EFIAPI\r
186ArmCleanInvalidateDataCacheEntryByMVA (\r
187 IN UINTN Address\r
188 );\r
189\r
0ff0e414
OM
190VOID\r
191EFIAPI\r
192ArmInvalidateDataCacheEntryBySetWay (\r
193 IN UINTN SetWayFormat\r
194 );\r
195\r
196VOID\r
197EFIAPI\r
198ArmCleanDataCacheEntryBySetWay (\r
199 IN UINTN SetWayFormat\r
200 );\r
201\r
202VOID\r
203EFIAPI\r
204ArmCleanInvalidateDataCacheEntryBySetWay (\r
205 IN UINTN SetWayFormat\r
206 );\r
207\r
1e57a462 208VOID\r
209EFIAPI\r
210ArmEnableDataCache (\r
211 VOID\r
212 );\r
213\r
214VOID\r
215EFIAPI\r
216ArmDisableDataCache (\r
217 VOID\r
218 );\r
219\r
220VOID\r
221EFIAPI\r
222ArmEnableInstructionCache (\r
223 VOID\r
224 );\r
225\r
226VOID\r
227EFIAPI\r
228ArmDisableInstructionCache (\r
229 VOID\r
230 );\r
3402aac7 231\r
1e57a462 232VOID\r
233EFIAPI\r
234ArmEnableMmu (\r
235 VOID\r
236 );\r
237\r
238VOID\r
239EFIAPI\r
240ArmDisableMmu (\r
241 VOID\r
242 );\r
243\r
0ff0e414
OM
244VOID\r
245EFIAPI\r
246ArmEnableCachesAndMmu (\r
247 VOID\r
248 );\r
249\r
1e57a462 250VOID\r
251EFIAPI\r
252ArmDisableCachesAndMmu (\r
253 VOID\r
254 );\r
255\r
1e57a462 256VOID\r
257EFIAPI\r
258ArmEnableInterrupts (\r
259 VOID\r
260 );\r
261\r
262UINTN\r
263EFIAPI\r
264ArmDisableInterrupts (\r
265 VOID\r
266 );\r
47585ed5 267\r
1e57a462 268BOOLEAN\r
269EFIAPI\r
270ArmGetInterruptState (\r
271 VOID\r
272 );\r
273\r
0ff0e414
OM
274VOID\r
275EFIAPI\r
276ArmEnableAsynchronousAbort (\r
277 VOID\r
278 );\r
279\r
47585ed5 280UINTN\r
281EFIAPI\r
0ff0e414 282ArmDisableAsynchronousAbort (\r
47585ed5 283 VOID\r
284 );\r
285\r
286VOID\r
287EFIAPI\r
288ArmEnableIrq (\r
289 VOID\r
290 );\r
291\r
0ff0e414
OM
292UINTN\r
293EFIAPI\r
294ArmDisableIrq (\r
295 VOID\r
296 );\r
297\r
1e57a462 298VOID\r
299EFIAPI\r
300ArmEnableFiq (\r
301 VOID\r
302 );\r
303\r
304UINTN\r
305EFIAPI\r
306ArmDisableFiq (\r
307 VOID\r
308 );\r
3402aac7 309\r
1e57a462 310BOOLEAN\r
311EFIAPI\r
312ArmGetFiqState (\r
313 VOID\r
314 );\r
315\r
8dd618d2
OM
316/**\r
317 * Invalidate Data and Instruction TLBs\r
318 */\r
1e57a462 319VOID\r
320EFIAPI\r
321ArmInvalidateTlb (\r
322 VOID\r
323 );\r
3402aac7 324\r
1e57a462 325VOID\r
326EFIAPI\r
327ArmUpdateTranslationTableEntry (\r
328 IN VOID *TranslationTableEntry,\r
329 IN VOID *Mva\r
330 );\r
3402aac7 331\r
1e57a462 332VOID\r
333EFIAPI\r
334ArmSetDomainAccessControl (\r
335 IN UINT32 Domain\r
336 );\r
337\r
338VOID\r
339EFIAPI\r
340ArmSetTTBR0 (\r
341 IN VOID *TranslationTableBase\r
342 );\r
343\r
344VOID *\r
345EFIAPI\r
346ArmGetTTBR0BaseAddress (\r
347 VOID\r
348 );\r
349\r
6f050ad6 350RETURN_STATUS\r
1e57a462 351EFIAPI\r
352ArmConfigureMmu (\r
353 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,\r
6f050ad6 354 OUT VOID **TranslationTableBase OPTIONAL,\r
1e57a462 355 OUT UINTN *TranslationTableSize OPTIONAL\r
356 );\r
3402aac7 357\r
1e57a462 358BOOLEAN\r
359EFIAPI\r
360ArmMmuEnabled (\r
361 VOID\r
362 );\r
3402aac7 363\r
1e57a462 364VOID\r
365EFIAPI\r
366ArmEnableBranchPrediction (\r
367 VOID\r
368 );\r
369\r
370VOID\r
371EFIAPI\r
372ArmDisableBranchPrediction (\r
373 VOID\r
374 );\r
375\r
376VOID\r
377EFIAPI\r
378ArmSetLowVectors (\r
379 VOID\r
380 );\r
381\r
382VOID\r
383EFIAPI\r
384ArmSetHighVectors (\r
385 VOID\r
386 );\r
387\r
0ff0e414
OM
388VOID\r
389EFIAPI\r
390ArmDrainWriteBuffer (\r
391 VOID\r
392 );\r
393\r
1e57a462 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