]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Library/ArmLib.h
MdeModulePkg: Update SMBIOS revision to 3.0.
[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#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)\r
127\r
128ARM_CACHE_TYPE\r
129EFIAPI\r
130ArmCacheType (\r
131 VOID\r
132 );\r
133\r
134ARM_CACHE_ARCHITECTURE\r
135EFIAPI\r
136ArmCacheArchitecture (\r
137 VOID\r
138 );\r
139\r
140VOID\r
141EFIAPI\r
142ArmCacheInformation (\r
143 OUT ARM_CACHE_INFO *CacheInfo\r
144 );\r
145\r
146BOOLEAN\r
147EFIAPI\r
148ArmDataCachePresent (\r
149 VOID\r
150 );\r
3402aac7 151\r
1e57a462 152UINTN\r
153EFIAPI\r
154ArmDataCacheSize (\r
155 VOID\r
156 );\r
3402aac7 157\r
1e57a462 158UINTN\r
159EFIAPI\r
160ArmDataCacheAssociativity (\r
161 VOID\r
162 );\r
3402aac7 163\r
1e57a462 164UINTN\r
165EFIAPI\r
166ArmDataCacheLineLength (\r
167 VOID\r
168 );\r
3402aac7 169\r
1e57a462 170BOOLEAN\r
171EFIAPI\r
172ArmInstructionCachePresent (\r
173 VOID\r
174 );\r
3402aac7 175\r
1e57a462 176UINTN\r
177EFIAPI\r
178ArmInstructionCacheSize (\r
179 VOID\r
180 );\r
3402aac7 181\r
1e57a462 182UINTN\r
183EFIAPI\r
184ArmInstructionCacheAssociativity (\r
185 VOID\r
186 );\r
3402aac7 187\r
1e57a462 188UINTN\r
189EFIAPI\r
190ArmInstructionCacheLineLength (\r
191 VOID\r
192 );\r
168d7245
OM
193\r
194UINTN\r
195EFIAPI\r
196ArmIsArchTimerImplemented (\r
197 VOID\r
198 );\r
199\r
200UINTN\r
201EFIAPI\r
202ArmReadIdPfr0 (\r
203 VOID\r
204 );\r
205\r
206UINTN\r
207EFIAPI\r
208ArmReadIdPfr1 (\r
209 VOID\r
210 );\r
211\r
64751727 212UINTN\r
1e57a462 213EFIAPI\r
64751727 214ArmCacheInfo (\r
1e57a462 215 VOID\r
216 );\r
217\r
218BOOLEAN\r
219EFIAPI\r
220ArmIsMpCore (\r
221 VOID\r
222 );\r
223\r
224VOID\r
225EFIAPI\r
226ArmInvalidateDataCache (\r
227 VOID\r
228 );\r
229\r
230\r
231VOID\r
232EFIAPI\r
233ArmCleanInvalidateDataCache (\r
234 VOID\r
235 );\r
236\r
237VOID\r
238EFIAPI\r
239ArmCleanDataCache (\r
240 VOID\r
241 );\r
242\r
243VOID\r
244EFIAPI\r
245ArmCleanDataCacheToPoU (\r
246 VOID\r
247 );\r
248\r
249VOID\r
250EFIAPI\r
251ArmInvalidateInstructionCache (\r
252 VOID\r
253 );\r
254\r
255VOID\r
256EFIAPI\r
257ArmInvalidateDataCacheEntryByMVA (\r
258 IN UINTN Address\r
259 );\r
260\r
261VOID\r
262EFIAPI\r
263ArmCleanDataCacheEntryByMVA (\r
264 IN UINTN Address\r
265 );\r
266\r
267VOID\r
268EFIAPI\r
269ArmCleanInvalidateDataCacheEntryByMVA (\r
270 IN UINTN Address\r
271 );\r
272\r
0ff0e414
OM
273VOID\r
274EFIAPI\r
275ArmInvalidateDataCacheEntryBySetWay (\r
276 IN UINTN SetWayFormat\r
277 );\r
278\r
279VOID\r
280EFIAPI\r
281ArmCleanDataCacheEntryBySetWay (\r
282 IN UINTN SetWayFormat\r
283 );\r
284\r
285VOID\r
286EFIAPI\r
287ArmCleanInvalidateDataCacheEntryBySetWay (\r
288 IN UINTN SetWayFormat\r
289 );\r
290\r
1e57a462 291VOID\r
292EFIAPI\r
293ArmEnableDataCache (\r
294 VOID\r
295 );\r
296\r
297VOID\r
298EFIAPI\r
299ArmDisableDataCache (\r
300 VOID\r
301 );\r
302\r
303VOID\r
304EFIAPI\r
305ArmEnableInstructionCache (\r
306 VOID\r
307 );\r
308\r
309VOID\r
310EFIAPI\r
311ArmDisableInstructionCache (\r
312 VOID\r
313 );\r
3402aac7 314\r
1e57a462 315VOID\r
316EFIAPI\r
317ArmEnableMmu (\r
318 VOID\r
319 );\r
320\r
321VOID\r
322EFIAPI\r
323ArmDisableMmu (\r
324 VOID\r
325 );\r
326\r
0ff0e414
OM
327VOID\r
328EFIAPI\r
329ArmEnableCachesAndMmu (\r
330 VOID\r
331 );\r
332\r
1e57a462 333VOID\r
334EFIAPI\r
335ArmDisableCachesAndMmu (\r
336 VOID\r
337 );\r
338\r
1e57a462 339VOID\r
340EFIAPI\r
341ArmEnableInterrupts (\r
342 VOID\r
343 );\r
344\r
345UINTN\r
346EFIAPI\r
347ArmDisableInterrupts (\r
348 VOID\r
349 );\r
47585ed5 350\r
1e57a462 351BOOLEAN\r
352EFIAPI\r
353ArmGetInterruptState (\r
354 VOID\r
355 );\r
356\r
0ff0e414
OM
357VOID\r
358EFIAPI\r
359ArmEnableAsynchronousAbort (\r
360 VOID\r
361 );\r
362\r
47585ed5 363UINTN\r
364EFIAPI\r
0ff0e414 365ArmDisableAsynchronousAbort (\r
47585ed5 366 VOID\r
367 );\r
368\r
369VOID\r
370EFIAPI\r
371ArmEnableIrq (\r
372 VOID\r
373 );\r
374\r
0ff0e414
OM
375UINTN\r
376EFIAPI\r
377ArmDisableIrq (\r
378 VOID\r
379 );\r
380\r
1e57a462 381VOID\r
382EFIAPI\r
383ArmEnableFiq (\r
384 VOID\r
385 );\r
386\r
387UINTN\r
388EFIAPI\r
389ArmDisableFiq (\r
390 VOID\r
391 );\r
3402aac7 392\r
1e57a462 393BOOLEAN\r
394EFIAPI\r
395ArmGetFiqState (\r
396 VOID\r
397 );\r
398\r
8dd618d2
OM
399/**\r
400 * Invalidate Data and Instruction TLBs\r
401 */\r
1e57a462 402VOID\r
403EFIAPI\r
404ArmInvalidateTlb (\r
405 VOID\r
406 );\r
3402aac7 407\r
1e57a462 408VOID\r
409EFIAPI\r
410ArmUpdateTranslationTableEntry (\r
411 IN VOID *TranslationTableEntry,\r
412 IN VOID *Mva\r
413 );\r
3402aac7 414\r
1e57a462 415VOID\r
416EFIAPI\r
417ArmSetDomainAccessControl (\r
418 IN UINT32 Domain\r
419 );\r
420\r
421VOID\r
422EFIAPI\r
423ArmSetTTBR0 (\r
424 IN VOID *TranslationTableBase\r
425 );\r
426\r
427VOID *\r
428EFIAPI\r
429ArmGetTTBR0BaseAddress (\r
430 VOID\r
431 );\r
432\r
6f050ad6 433RETURN_STATUS\r
1e57a462 434EFIAPI\r
435ArmConfigureMmu (\r
436 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,\r
6f050ad6 437 OUT VOID **TranslationTableBase OPTIONAL,\r
1e57a462 438 OUT UINTN *TranslationTableSize OPTIONAL\r
439 );\r
3402aac7 440\r
1e57a462 441BOOLEAN\r
442EFIAPI\r
443ArmMmuEnabled (\r
444 VOID\r
445 );\r
3402aac7 446\r
1e57a462 447VOID\r
448EFIAPI\r
449ArmEnableBranchPrediction (\r
450 VOID\r
451 );\r
452\r
453VOID\r
454EFIAPI\r
455ArmDisableBranchPrediction (\r
456 VOID\r
457 );\r
458\r
459VOID\r
460EFIAPI\r
461ArmSetLowVectors (\r
462 VOID\r
463 );\r
464\r
465VOID\r
466EFIAPI\r
467ArmSetHighVectors (\r
468 VOID\r
469 );\r
470\r
0ff0e414
OM
471VOID\r
472EFIAPI\r
473ArmDrainWriteBuffer (\r
474 VOID\r
475 );\r
476\r
1e57a462 477VOID\r
478EFIAPI\r
479ArmDataMemoryBarrier (\r
480 VOID\r
481 );\r
3402aac7 482\r
1e57a462 483VOID\r
484EFIAPI\r
485ArmDataSyncronizationBarrier (\r
486 VOID\r
487 );\r
3402aac7 488\r
1e57a462 489VOID\r
490EFIAPI\r
491ArmInstructionSynchronizationBarrier (\r
492 VOID\r
493 );\r
494\r
495VOID\r
496EFIAPI\r
497ArmWriteVBar (\r
4e57d6d7 498 IN UINTN VectorBase\r
1e57a462 499 );\r
500\r
4e57d6d7 501UINTN\r
1e57a462 502EFIAPI\r
503ArmReadVBar (\r
504 VOID\r
505 );\r
506\r
507VOID\r
508EFIAPI\r
509ArmWriteAuxCr (\r
510 IN UINT32 Bit\r
511 );\r
512\r
513UINT32\r
514EFIAPI\r
515ArmReadAuxCr (\r
516 VOID\r
517 );\r
518\r
519VOID\r
520EFIAPI\r
521ArmSetAuxCrBit (\r
522 IN UINT32 Bits\r
523 );\r
524\r
525VOID\r
526EFIAPI\r
527ArmUnsetAuxCrBit (\r
528 IN UINT32 Bits\r
529 );\r
530\r
531VOID\r
532EFIAPI\r
533ArmCallSEV (\r
534 VOID\r
535 );\r
536\r
537VOID\r
538EFIAPI\r
539ArmCallWFE (\r
540 VOID\r
541 );\r
542\r
543VOID\r
544EFIAPI\r
545ArmCallWFI (\r
25402f5d 546\r
1e57a462 547 VOID\r
548 );\r
549\r
550UINTN\r
551EFIAPI\r
552ArmReadMpidr (\r
553 VOID\r
554 );\r
555\r
9401d6f4
OM
556UINTN\r
557EFIAPI\r
558ArmReadMidr (\r
559 VOID\r
560 );\r
561\r
1e57a462 562UINT32\r
563EFIAPI\r
564ArmReadCpacr (\r
565 VOID\r
566 );\r
567\r
568VOID\r
569EFIAPI\r
570ArmWriteCpacr (\r
571 IN UINT32 Access\r
572 );\r
573\r
574VOID\r
575EFIAPI\r
576ArmEnableVFP (\r
577 VOID\r
578 );\r
579\r
46d4d75c
OM
580/**\r
581 Get the Secure Configuration Register value\r
582\r
583 @return Value read from the Secure Configuration Register\r
584\r
585**/\r
1e57a462 586UINT32\r
587EFIAPI\r
588ArmReadScr (\r
589 VOID\r
590 );\r
591\r
46d4d75c
OM
592/**\r
593 Set the Secure Configuration Register\r
594\r
595 @param Value Value to write to the Secure Configuration Register\r
596\r
597**/\r
1e57a462 598VOID\r
599EFIAPI\r
600ArmWriteScr (\r
46d4d75c 601 IN UINT32 Value\r
1e57a462 602 );\r
603\r
604UINT32\r
605EFIAPI\r
606ArmReadMVBar (\r
607 VOID\r
608 );\r
609\r
610VOID\r
611EFIAPI\r
612ArmWriteMVBar (\r
613 IN UINT32 VectorMonitorBase\r
614 );\r
615\r
616UINT32\r
617EFIAPI\r
618ArmReadSctlr (\r
619 VOID\r
620 );\r
621\r
5ea2c2d3 622UINTN\r
623EFIAPI\r
624ArmReadHVBar (\r
625 VOID\r
626 );\r
627\r
628VOID\r
629EFIAPI\r
630ArmWriteHVBar (\r
631 IN UINTN HypModeVectorBase\r
632 );\r
633\r
52d44f77
OM
634\r
635//\r
636// Helper functions for accessing CPU ACTLR\r
637//\r
638\r
639UINTN\r
640EFIAPI\r
641ArmReadCpuActlr (\r
642 VOID\r
643 );\r
644\r
645VOID\r
646EFIAPI\r
647ArmWriteCpuActlr (\r
648 IN UINTN Val\r
649 );\r
650\r
651VOID\r
652EFIAPI\r
653ArmSetCpuActlrBit (\r
654 IN UINTN Bits\r
655 );\r
656\r
657VOID\r
658EFIAPI\r
659ArmUnsetCpuActlrBit (\r
660 IN UINTN Bits\r
661 );\r
662\r
1e57a462 663#endif // __ARM_LIB__\r