Home | History | Annotate | Download | only in Library
      1 /** @file
      2 
      3   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
      4   Copyright (c) 2011 - 2015, 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 ArmGetTTBR0BaseAddress (
    359   VOID
    360   );
    361 
    362 RETURN_STATUS
    363 EFIAPI
    364 ArmConfigureMmu (
    365   IN  ARM_MEMORY_REGION_DESCRIPTOR  *MemoryTable,
    366   OUT VOID                         **TranslationTableBase OPTIONAL,
    367   OUT UINTN                         *TranslationTableSize  OPTIONAL
    368   );
    369 
    370 BOOLEAN
    371 EFIAPI
    372 ArmMmuEnabled (
    373   VOID
    374   );
    375 
    376 VOID
    377 EFIAPI
    378 ArmEnableBranchPrediction (
    379   VOID
    380   );
    381 
    382 VOID
    383 EFIAPI
    384 ArmDisableBranchPrediction (
    385   VOID
    386   );
    387 
    388 VOID
    389 EFIAPI
    390 ArmSetLowVectors (
    391   VOID
    392   );
    393 
    394 VOID
    395 EFIAPI
    396 ArmSetHighVectors (
    397   VOID
    398   );
    399 
    400 VOID
    401 EFIAPI
    402 ArmDataMemoryBarrier (
    403   VOID
    404   );
    405 
    406 VOID
    407 EFIAPI
    408 ArmDataSynchronizationBarrier (
    409   VOID
    410   );
    411 
    412 VOID
    413 EFIAPI
    414 ArmInstructionSynchronizationBarrier (
    415   VOID
    416   );
    417 
    418 VOID
    419 EFIAPI
    420 ArmWriteVBar (
    421   IN  UINTN   VectorBase
    422   );
    423 
    424 UINTN
    425 EFIAPI
    426 ArmReadVBar (
    427   VOID
    428   );
    429 
    430 VOID
    431 EFIAPI
    432 ArmWriteAuxCr (
    433   IN  UINT32    Bit
    434   );
    435 
    436 UINT32
    437 EFIAPI
    438 ArmReadAuxCr (
    439   VOID
    440   );
    441 
    442 VOID
    443 EFIAPI
    444 ArmSetAuxCrBit (
    445   IN  UINT32    Bits
    446   );
    447 
    448 VOID
    449 EFIAPI
    450 ArmUnsetAuxCrBit (
    451   IN  UINT32    Bits
    452   );
    453 
    454 VOID
    455 EFIAPI
    456 ArmCallSEV (
    457   VOID
    458   );
    459 
    460 VOID
    461 EFIAPI
    462 ArmCallWFE (
    463   VOID
    464   );
    465 
    466 VOID
    467 EFIAPI
    468 ArmCallWFI (
    469 
    470   VOID
    471   );
    472 
    473 UINTN
    474 EFIAPI
    475 ArmReadMpidr (
    476   VOID
    477   );
    478 
    479 UINTN
    480 EFIAPI
    481 ArmReadMidr (
    482   VOID
    483   );
    484 
    485 UINT32
    486 EFIAPI
    487 ArmReadCpacr (
    488   VOID
    489   );
    490 
    491 VOID
    492 EFIAPI
    493 ArmWriteCpacr (
    494   IN  UINT32   Access
    495   );
    496 
    497 VOID
    498 EFIAPI
    499 ArmEnableVFP (
    500   VOID
    501   );
    502 
    503 /**
    504   Get the Secure Configuration Register value
    505 
    506   @return   Value read from the Secure Configuration Register
    507 
    508 **/
    509 UINT32
    510 EFIAPI
    511 ArmReadScr (
    512   VOID
    513   );
    514 
    515 /**
    516   Set the Secure Configuration Register
    517 
    518   @param Value   Value to write to the Secure Configuration Register
    519 
    520 **/
    521 VOID
    522 EFIAPI
    523 ArmWriteScr (
    524   IN  UINT32   Value
    525   );
    526 
    527 UINT32
    528 EFIAPI
    529 ArmReadMVBar (
    530   VOID
    531   );
    532 
    533 VOID
    534 EFIAPI
    535 ArmWriteMVBar (
    536   IN  UINT32   VectorMonitorBase
    537   );
    538 
    539 UINT32
    540 EFIAPI
    541 ArmReadSctlr (
    542   VOID
    543   );
    544 
    545 UINTN
    546 EFIAPI
    547 ArmReadHVBar (
    548   VOID
    549   );
    550 
    551 VOID
    552 EFIAPI
    553 ArmWriteHVBar (
    554   IN  UINTN   HypModeVectorBase
    555   );
    556 
    557 
    558 //
    559 // Helper functions for accessing CPU ACTLR
    560 //
    561 
    562 UINTN
    563 EFIAPI
    564 ArmReadCpuActlr (
    565   VOID
    566   );
    567 
    568 VOID
    569 EFIAPI
    570 ArmWriteCpuActlr (
    571   IN  UINTN Val
    572   );
    573 
    574 VOID
    575 EFIAPI
    576 ArmSetCpuActlrBit (
    577   IN  UINTN    Bits
    578   );
    579 
    580 VOID
    581 EFIAPI
    582 ArmUnsetCpuActlrBit (
    583   IN  UINTN    Bits
    584   );
    585 
    586 RETURN_STATUS
    587 ArmSetMemoryRegionNoExec (
    588   IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
    589   IN  UINT64                    Length
    590   );
    591 
    592 RETURN_STATUS
    593 ArmClearMemoryRegionNoExec (
    594   IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
    595   IN  UINT64                    Length
    596   );
    597 
    598 RETURN_STATUS
    599 ArmSetMemoryRegionReadOnly (
    600   IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
    601   IN  UINT64                    Length
    602   );
    603 
    604 RETURN_STATUS
    605 ArmClearMemoryRegionReadOnly (
    606   IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
    607   IN  UINT64                    Length
    608   );
    609 
    610 #endif // __ARM_LIB__
    611