]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Library/ArmLib.h
ArmPkg/ArmLib: Added new functions to access ARM coprocessors
[mirror_edk2.git] / ArmPkg / Include / Library / ArmLib.h
CommitLineData
2ef2b01e
A
1/** @file
2
d6ebcab7 3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
7fffeef9 4 Copyright (c) 2011 - 2012, ARM Ltd. All rights reserved.<BR>
2ef2b01e 5
d6ebcab7 6 This program and the accompanying materials
2ef2b01e
A
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14**/
15
16#ifndef __ARM_LIB__
17#define __ARM_LIB__
18
916666c0 19#include <Uefi/UefiBaseType.h>
20
bd6b9799 21#ifdef ARM_CPU_ARMv6
22#include <Chipset/ARM1176JZ-S.h>
23#else
24#include <Chipset/ArmV7.h>
25#endif
26
2ef2b01e
A
27typedef enum {
28 ARM_CACHE_TYPE_WRITE_BACK,
29 ARM_CACHE_TYPE_UNKNOWN
30} ARM_CACHE_TYPE;
31
32typedef enum {
33 ARM_CACHE_ARCHITECTURE_UNIFIED,
34 ARM_CACHE_ARCHITECTURE_SEPARATE,
35 ARM_CACHE_ARCHITECTURE_UNKNOWN
36} ARM_CACHE_ARCHITECTURE;
37
38typedef struct {
39 ARM_CACHE_TYPE Type;
40 ARM_CACHE_ARCHITECTURE Architecture;
41 BOOLEAN DataCachePresent;
42 UINTN DataCacheSize;
43 UINTN DataCacheAssociativity;
44 UINTN DataCacheLineLength;
45 BOOLEAN InstructionCachePresent;
46 UINTN InstructionCacheSize;
47 UINTN InstructionCacheAssociativity;
48 UINTN InstructionCacheLineLength;
49} ARM_CACHE_INFO;
50
7fffeef9 51/**
52 * The UEFI firmware must not use the ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_* attributes.
53 *
54 * The Non Secure memory attribute (ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_*) should only
55 * be used in Secure World to distinguished Secure to Non-Secure memory.
56 */
2ef2b01e 57typedef enum {
1e6a5cfc 58 ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED = 0,
7fffeef9 59 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED,
1e6a5cfc 60 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK,
7fffeef9 61 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK,
1e6a5cfc 62 ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH,
7fffeef9 63 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH,
1e6a5cfc 64 ARM_MEMORY_REGION_ATTRIBUTE_DEVICE,
7fffeef9 65 ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE
2ef2b01e
A
66} ARM_MEMORY_REGION_ATTRIBUTES;
67
1e6a5cfc 68#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1)
69
2ef2b01e 70typedef struct {
916666c0 71 EFI_PHYSICAL_ADDRESS PhysicalBase;
72 EFI_VIRTUAL_ADDRESS VirtualBase;
3b73c91b 73 UINTN Length;
2ef2b01e
A
74 ARM_MEMORY_REGION_ATTRIBUTES Attributes;
75} ARM_MEMORY_REGION_DESCRIPTOR;
76
77typedef VOID (*CACHE_OPERATION)(VOID);
78typedef VOID (*LINE_OPERATION)(UINTN);
79
80typedef enum {
81 ARM_PROCESSOR_MODE_USER = 0x10,
82 ARM_PROCESSOR_MODE_FIQ = 0x11,
83 ARM_PROCESSOR_MODE_IRQ = 0x12,
84 ARM_PROCESSOR_MODE_SUPERVISOR = 0x13,
85 ARM_PROCESSOR_MODE_ABORT = 0x17,
0e9674e5 86 ARM_PROCESSOR_MODE_HYP = 0x1A,
2ef2b01e
A
87 ARM_PROCESSOR_MODE_UNDEFINED = 0x1B,
88 ARM_PROCESSOR_MODE_SYSTEM = 0x1F,
89 ARM_PROCESSOR_MODE_MASK = 0x1F
90} ARM_PROCESSOR_MODE;
91
0787bc61 92#define IS_PRIMARY_CORE(MpId) (((MpId) & PcdGet32(PcdArmPrimaryCoreMask)) == PcdGet32(PcdArmPrimaryCore))
69f60552 93#define GET_CORE_ID(MpId) ((MpId) & 0xFF)
94#define GET_CLUSTER_ID(MpId) (((MpId) >> 8) & 0xFF)
0787bc61 95// Get the position of the core for the Stack Offset (4 Core per Cluster)
96// Position = (ClusterId * 4) + CoreId
69f60552 97#define GET_CORE_POS(MpId) ((((MpId) >> 6) & 0xFF) + ((MpId) & 0xFF))
98#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & 0xFF)
0787bc61 99
2ef2b01e
A
100ARM_CACHE_TYPE
101EFIAPI
102ArmCacheType (
103 VOID
104 );
105
106ARM_CACHE_ARCHITECTURE
107EFIAPI
108ArmCacheArchitecture (
109 VOID
110 );
111
112VOID
113EFIAPI
114ArmCacheInformation (
115 OUT ARM_CACHE_INFO *CacheInfo
116 );
117
118BOOLEAN
119EFIAPI
120ArmDataCachePresent (
121 VOID
122 );
123
124UINTN
125EFIAPI
126ArmDataCacheSize (
127 VOID
128 );
129
130UINTN
131EFIAPI
132ArmDataCacheAssociativity (
133 VOID
134 );
135
136UINTN
137EFIAPI
138ArmDataCacheLineLength (
139 VOID
140 );
141
142BOOLEAN
143EFIAPI
144ArmInstructionCachePresent (
145 VOID
146 );
147
148UINTN
149EFIAPI
150ArmInstructionCacheSize (
151 VOID
152 );
153
154UINTN
155EFIAPI
156ArmInstructionCacheAssociativity (
157 VOID
158 );
159
160UINTN
161EFIAPI
162ArmInstructionCacheLineLength (
163 VOID
164 );
165
166UINT32
167EFIAPI
168Cp15IdCode (
169 VOID
170 );
171
172UINT32
173EFIAPI
174Cp15CacheInfo (
175 VOID
176 );
177
1bfda055 178BOOLEAN
179EFIAPI
da9675a2 180ArmIsMpCore (
1bfda055 181 VOID
182 );
183
2ef2b01e
A
184VOID
185EFIAPI
186ArmInvalidateDataCache (
187 VOID
188 );
189
f45ce9d9 190
2ef2b01e
A
191VOID
192EFIAPI
193ArmCleanInvalidateDataCache (
194 VOID
195 );
196
197VOID
198EFIAPI
199ArmCleanDataCache (
200 VOID
201 );
202
d60f6af4 203VOID
204EFIAPI
205ArmCleanDataCacheToPoU (
206 VOID
207 );
208
2ef2b01e
A
209VOID
210EFIAPI
211ArmInvalidateInstructionCache (
212 VOID
213 );
214
215VOID
216EFIAPI
217ArmInvalidateDataCacheEntryByMVA (
218 IN UINTN Address
219 );
220
221VOID
222EFIAPI
223ArmCleanDataCacheEntryByMVA (
224 IN UINTN Address
225 );
226
227VOID
228EFIAPI
229ArmCleanInvalidateDataCacheEntryByMVA (
230 IN UINTN Address
231 );
232
233VOID
234EFIAPI
235ArmEnableDataCache (
236 VOID
237 );
238
239VOID
240EFIAPI
241ArmDisableDataCache (
242 VOID
243 );
244
245VOID
246EFIAPI
247ArmEnableInstructionCache (
248 VOID
249 );
250
251VOID
252EFIAPI
253ArmDisableInstructionCache (
254 VOID
255 );
256
257VOID
258EFIAPI
259ArmEnableMmu (
260 VOID
261 );
262
263VOID
264EFIAPI
265ArmDisableMmu (
266 VOID
267 );
268
1bfda055 269VOID
270EFIAPI
271ArmDisableCachesAndMmu (
272 VOID
273 );
274
bd6b9799 275VOID
276EFIAPI
277ArmInvalidateInstructionAndDataTlb (
278 VOID
279 );
280
2ef2b01e
A
281VOID
282EFIAPI
283ArmEnableInterrupts (
284 VOID
285 );
286
287UINTN
288EFIAPI
289ArmDisableInterrupts (
290 VOID
291 );
292
293BOOLEAN
294EFIAPI
295ArmGetInterruptState (
296 VOID
297 );
1bfda055 298
0416278c 299VOID
300EFIAPI
301ArmEnableFiq (
302 VOID
303 );
304
305UINTN
306EFIAPI
307ArmDisableFiq (
308 VOID
309 );
310
311BOOLEAN
312EFIAPI
313ArmGetFiqState (
314 VOID
315 );
2ef2b01e
A
316
317VOID
318EFIAPI
319ArmInvalidateTlb (
320 VOID
321 );
322
6f72e28d 323VOID
324EFIAPI
325ArmUpdateTranslationTableEntry (
bb02cb80 326 IN VOID *TranslationTableEntry,
327 IN VOID *Mva
6f72e28d 328 );
329
2ef2b01e
A
330VOID
331EFIAPI
332ArmSetDomainAccessControl (
333 IN UINT32 Domain
334 );
335
336VOID
337EFIAPI
1bfda055 338ArmSetTTBR0 (
2ef2b01e
A
339 IN VOID *TranslationTableBase
340 );
341
f45ce9d9
A
342VOID *
343EFIAPI
1bfda055 344ArmGetTTBR0BaseAddress (
f659880b 345 VOID
f45ce9d9
A
346 );
347
2ef2b01e
A
348VOID
349EFIAPI
350ArmConfigureMmu (
351 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,
352 OUT VOID **TranslationTableBase OPTIONAL,
353 OUT UINTN *TranslationTableSize OPTIONAL
354 );
355
f45ce9d9
A
356BOOLEAN
357EFIAPI
358ArmMmuEnabled (
359 VOID
360 );
361
2ef2b01e
A
362VOID
363EFIAPI
364ArmSwitchProcessorMode (
365 IN ARM_PROCESSOR_MODE Mode
366 );
367
368ARM_PROCESSOR_MODE
369EFIAPI
370ArmProcessorMode (
371 VOID
372 );
373
374VOID
375EFIAPI
376ArmEnableBranchPrediction (
377 VOID
378 );
379
380VOID
381EFIAPI
382ArmDisableBranchPrediction (
383 VOID
384 );
f0fef790 385
386VOID
387EFIAPI
388ArmSetLowVectors (
389 VOID
390 );
391
392VOID
393EFIAPI
394ArmSetHighVectors (
395 VOID
396 );
397
026c3d34 398VOID
399EFIAPI
400ArmDataMemoryBarrier (
401 VOID
402 );
403
404VOID
405EFIAPI
406ArmDataSyncronizationBarrier (
407 VOID
408 );
409
410VOID
411EFIAPI
412ArmInstructionSynchronizationBarrier (
413 VOID
414 );
bd6b9799 415
416VOID
417EFIAPI
418ArmWriteVBar (
419 IN UINT32 VectorBase
420 );
421
422UINT32
423EFIAPI
424ArmReadVBar (
425 VOID
426 );
427
428VOID
429EFIAPI
430ArmWriteAuxCr (
431 IN UINT32 Bit
432 );
433
434UINT32
435EFIAPI
436ArmReadAuxCr (
437 VOID
438 );
439
440VOID
441EFIAPI
442ArmSetAuxCrBit (
443 IN UINT32 Bits
444 );
445
836c3500 446VOID
447EFIAPI
448ArmUnsetAuxCrBit (
449 IN UINT32 Bits
450 );
451
bd6b9799 452VOID
453EFIAPI
b1d41be7 454ArmCallSEV (
455 VOID
456 );
457
458VOID
459EFIAPI
460ArmCallWFE (
461 VOID
462 );
463
836c3500 464VOID
465EFIAPI
bd6b9799 466ArmCallWFI (
467 VOID
468 );
469
470UINTN
471EFIAPI
472ArmReadMpidr (
473 VOID
474 );
475
836c3500 476UINT32
477EFIAPI
478ArmReadCpacr (
479 VOID
480 );
481
bd6b9799 482VOID
483EFIAPI
836c3500 484ArmWriteCpacr (
bd6b9799 485 IN UINT32 Access
486 );
487
488VOID
489EFIAPI
490ArmEnableVFP (
491 VOID
492 );
493
836c3500 494UINT32
495EFIAPI
496ArmReadNsacr (
497 VOID
498 );
499
bd6b9799 500VOID
501EFIAPI
502ArmWriteNsacr (
503 IN UINT32 SetWayFormat
504 );
505
836c3500 506UINT32
507EFIAPI
508ArmReadScr (
509 VOID
510 );
511
bd6b9799 512VOID
513EFIAPI
514ArmWriteScr (
515 IN UINT32 SetWayFormat
516 );
517
836c3500 518UINT32
519EFIAPI
520ArmReadMVBar (
521 VOID
522 );
523
bd6b9799 524VOID
525EFIAPI
836c3500 526ArmWriteMVBar (
bd6b9799 527 IN UINT32 VectorMonitorBase
528 );
bb02cb80 529
836c3500 530UINT32
531EFIAPI
532ArmReadSctlr (
533 VOID
534 );
535
2ef2b01e 536#endif // __ARM_LIB__