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