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