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