]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Include/Library/ArmLib.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ArmPkg / Include / Library / ArmLib.h
index 2059a67bbf3c20287ee3f9abf9651359dcef4321..fa605f128bfd1e4db0294b69e56d603d971f313c 100644 (file)
@@ -1,31 +1,30 @@
 /** @file\r
 \r
   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
-  Copyright (c) 2011 - 2015, ARM Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2011 - 2016, ARM Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2020 - 2021, NUVIA Inc. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
-#ifndef __ARM_LIB__\r
-#define __ARM_LIB__\r
+#ifndef ARM_LIB_H_\r
+#define ARM_LIB_H_\r
 \r
 #include <Uefi/UefiBaseType.h>\r
 \r
 #ifdef MDE_CPU_ARM\r
   #include <Chipset/ArmV7.h>\r
-#elif defined(MDE_CPU_AARCH64)\r
+#elif defined (MDE_CPU_AARCH64)\r
   #include <Chipset/AArch64.h>\r
 #else\r
- #error "Unknown chipset."\r
 #error "Unknown chipset."\r
 #endif\r
 \r
+#define EFI_MEMORY_CACHETYPE_MASK  (EFI_MEMORY_UC | EFI_MEMORY_WC |  \\r
+                                     EFI_MEMORY_WT | EFI_MEMORY_WB | \\r
+                                     EFI_MEMORY_UCE)\r
+\r
 /**\r
  * The UEFI firmware must not use the ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_* attributes.\r
  *\r
@@ -37,23 +36,35 @@ typedef enum {
   ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED,\r
   ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK,\r
   ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK,\r
+\r
+  // On some platforms, memory mapped flash region is designed as not supporting\r
+  // shareable attribute, so WRITE_BACK_NONSHAREABLE is added for such special\r
+  // need.\r
+  // Do NOT use below two attributes if you are not sure.\r
+  ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_NONSHAREABLE,\r
+  ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK_NONSHAREABLE,\r
+\r
   ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH,\r
   ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH,\r
   ARM_MEMORY_REGION_ATTRIBUTE_DEVICE,\r
   ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE\r
 } ARM_MEMORY_REGION_ATTRIBUTES;\r
 \r
-#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1)\r
+#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr)  ((UINT32)(attr) & 1)\r
 \r
 typedef struct {\r
-  EFI_PHYSICAL_ADDRESS          PhysicalBase;\r
-  EFI_VIRTUAL_ADDRESS           VirtualBase;\r
-  UINT64                        Length;\r
-  ARM_MEMORY_REGION_ATTRIBUTES  Attributes;\r
+  EFI_PHYSICAL_ADDRESS            PhysicalBase;\r
+  EFI_VIRTUAL_ADDRESS             VirtualBase;\r
+  UINT64                          Length;\r
+  ARM_MEMORY_REGION_ATTRIBUTES    Attributes;\r
 } ARM_MEMORY_REGION_DESCRIPTOR;\r
 \r
-typedef VOID (*CACHE_OPERATION)(VOID);\r
-typedef VOID (*LINE_OPERATION)(UINTN);\r
+typedef VOID (*CACHE_OPERATION)(\r
+  VOID\r
+  );\r
+typedef VOID (*LINE_OPERATION)(\r
+  UINTN\r
+  );\r
 \r
 //\r
 // ARM Processor Mode\r
@@ -73,62 +84,94 @@ typedef enum {
 //\r
 // ARM Cpu IDs\r
 //\r
-#define ARM_CPU_IMPLEMENTER_MASK          (0xFFU << 24)\r
-#define ARM_CPU_IMPLEMENTER_ARMLTD        (0x41U << 24)\r
-#define ARM_CPU_IMPLEMENTER_DEC           (0x44U << 24)\r
-#define ARM_CPU_IMPLEMENTER_MOT           (0x4DU << 24)\r
-#define ARM_CPU_IMPLEMENTER_QUALCOMM      (0x51U << 24)\r
-#define ARM_CPU_IMPLEMENTER_MARVELL       (0x56U << 24)\r
-\r
-#define ARM_CPU_PRIMARY_PART_MASK         (0xFFF << 4)\r
-#define ARM_CPU_PRIMARY_PART_CORTEXA5     (0xC05 << 4)\r
-#define ARM_CPU_PRIMARY_PART_CORTEXA7     (0xC07 << 4)\r
-#define ARM_CPU_PRIMARY_PART_CORTEXA8     (0xC08 << 4)\r
-#define ARM_CPU_PRIMARY_PART_CORTEXA9     (0xC09 << 4)\r
-#define ARM_CPU_PRIMARY_PART_CORTEXA15    (0xC0F << 4)\r
+#define ARM_CPU_IMPLEMENTER_MASK      (0xFFU << 24)\r
+#define ARM_CPU_IMPLEMENTER_ARMLTD    (0x41U << 24)\r
+#define ARM_CPU_IMPLEMENTER_DEC       (0x44U << 24)\r
+#define ARM_CPU_IMPLEMENTER_MOT       (0x4DU << 24)\r
+#define ARM_CPU_IMPLEMENTER_QUALCOMM  (0x51U << 24)\r
+#define ARM_CPU_IMPLEMENTER_MARVELL   (0x56U << 24)\r
+\r
+#define ARM_CPU_PRIMARY_PART_MASK       (0xFFF << 4)\r
+#define ARM_CPU_PRIMARY_PART_CORTEXA5   (0xC05 << 4)\r
+#define ARM_CPU_PRIMARY_PART_CORTEXA7   (0xC07 << 4)\r
+#define ARM_CPU_PRIMARY_PART_CORTEXA8   (0xC08 << 4)\r
+#define ARM_CPU_PRIMARY_PART_CORTEXA9   (0xC09 << 4)\r
+#define ARM_CPU_PRIMARY_PART_CORTEXA15  (0xC0F << 4)\r
 \r
 //\r
 // ARM MP Core IDs\r
 //\r
-#define ARM_CORE_AFF0         0xFF\r
-#define ARM_CORE_AFF1         (0xFF << 8)\r
-#define ARM_CORE_AFF2         (0xFF << 16)\r
-#define ARM_CORE_AFF3         (0xFFULL << 32)\r
-\r
-#define ARM_CORE_MASK         ARM_CORE_AFF0\r
-#define ARM_CLUSTER_MASK      ARM_CORE_AFF1\r
-#define GET_CORE_ID(MpId)     ((MpId) & ARM_CORE_MASK)\r
-#define GET_CLUSTER_ID(MpId)  (((MpId) & ARM_CLUSTER_MASK) >> 8)\r
-#define GET_MPID(ClusterId, CoreId)   (((ClusterId) << 8) | (CoreId))\r
-#define PRIMARY_CORE_ID       (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)\r
-\r
+#define ARM_CORE_AFF0  0xFF\r
+#define ARM_CORE_AFF1  (0xFF << 8)\r
+#define ARM_CORE_AFF2  (0xFF << 16)\r
+#define ARM_CORE_AFF3  (0xFFULL << 32)\r
+\r
+#define ARM_CORE_MASK     ARM_CORE_AFF0\r
+#define ARM_CLUSTER_MASK  ARM_CORE_AFF1\r
+#define GET_CORE_ID(MpId)              ((MpId) & ARM_CORE_MASK)\r
+#define GET_CLUSTER_ID(MpId)           (((MpId) & ARM_CLUSTER_MASK) >> 8)\r
+#define GET_MPID(ClusterId, CoreId)    (((ClusterId) << 8) | (CoreId))\r
+#define GET_MPIDR_AFF0(MpId)           ((MpId) & ARM_CORE_AFF0)\r
+#define GET_MPIDR_AFF1(MpId)           (((MpId) & ARM_CORE_AFF1) >> 8)\r
+#define GET_MPIDR_AFF2(MpId)           (((MpId) & ARM_CORE_AFF2) >> 16)\r
+#define GET_MPIDR_AFF3(MpId)           (((MpId) & ARM_CORE_AFF3) >> 32)\r
+#define GET_MPIDR_AFFINITY_BITS(MpId)  ((MpId) & 0xFF00FFFFFF)\r
+#define PRIMARY_CORE_ID  (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)\r
+#define MPIDR_MT_BIT     BIT24\r
+\r
+/** Reads the CCSIDR register for the specified cache.\r
+\r
+  @param CSSELR The CSSELR cache selection register value.\r
+\r
+  @return The contents of the CCSIDR_EL1 register for the specified cache, when in AARCH64 mode.\r
+          Returns the contents of the CCSIDR register in AARCH32 mode.\r
+**/\r
 UINTN\r
-EFIAPI\r
-ArmDataCacheLineLength (\r
+ReadCCSIDR (\r
+  IN UINT32  CSSELR\r
+  );\r
+\r
+/** Reads the CCSIDR2 for the specified cache.\r
+\r
+  @param CSSELR The CSSELR cache selection register value\r
+\r
+  @return The contents of the CCSIDR2 register for the specified cache.\r
+**/\r
+UINT32\r
+ReadCCSIDR2 (\r
+  IN UINT32  CSSELR\r
+  );\r
+\r
+/** Reads the Cache Level ID (CLIDR) register.\r
+\r
+  @return The contents of the CLIDR_EL1 register.\r
+**/\r
+UINT32\r
+ReadCLIDR (\r
   VOID\r
   );\r
 \r
 UINTN\r
 EFIAPI\r
-ArmInstructionCacheLineLength (\r
+ArmDataCacheLineLength (\r
   VOID\r
   );\r
 \r
 UINTN\r
 EFIAPI\r
-ArmIsArchTimerImplemented (\r
+ArmInstructionCacheLineLength (\r
   VOID\r
   );\r
 \r
 UINTN\r
 EFIAPI\r
-ArmReadIdPfr0 (\r
+ArmCacheWritebackGranule (\r
   VOID\r
   );\r
 \r
 UINTN\r
 EFIAPI\r
-ArmReadIdPfr1 (\r
+ArmIsArchTimerImplemented (\r
   VOID\r
   );\r
 \r
@@ -150,7 +193,6 @@ ArmInvalidateDataCache (
   VOID\r
   );\r
 \r
-\r
 VOID\r
 EFIAPI\r
 ArmCleanInvalidateDataCache (\r
@@ -172,37 +214,31 @@ ArmInvalidateInstructionCache (
 VOID\r
 EFIAPI\r
 ArmInvalidateDataCacheEntryByMVA (\r
-  IN  UINTN   Address\r
+  IN  UINTN  Address\r
   );\r
 \r
 VOID\r
 EFIAPI\r
-ArmCleanDataCacheEntryByMVA (\r
-  IN  UINTN   Address\r
+ArmCleanDataCacheEntryToPoUByMVA (\r
+  IN  UINTN  Address\r
   );\r
 \r
 VOID\r
 EFIAPI\r
-ArmCleanInvalidateDataCacheEntryByMVA (\r
-  IN  UINTN   Address\r
+ArmInvalidateInstructionCacheEntryToPoUByMVA (\r
+  IN  UINTN  Address\r
   );\r
 \r
 VOID\r
 EFIAPI\r
-ArmInvalidateDataCacheEntryBySetWay (\r
-  IN  UINTN  SetWayFormat\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-ArmCleanDataCacheEntryBySetWay (\r
-  IN  UINTN  SetWayFormat\r
+ArmCleanDataCacheEntryByMVA (\r
+  IN  UINTN  Address\r
   );\r
 \r
 VOID\r
 EFIAPI\r
-ArmCleanInvalidateDataCacheEntryBySetWay (\r
-  IN  UINTN   SetWayFormat\r
+ArmCleanInvalidateDataCacheEntryByMVA (\r
+  IN  UINTN  Address\r
   );\r
 \r
 VOID\r
@@ -325,8 +361,8 @@ ArmInvalidateTlb (
 VOID\r
 EFIAPI\r
 ArmUpdateTranslationTableEntry (\r
-  IN  VOID     *TranslationTableEntry,\r
-  IN  VOID     *Mva\r
+  IN  VOID  *TranslationTableEntry,\r
+  IN  VOID  *Mva\r
   );\r
 \r
 VOID\r
@@ -341,18 +377,16 @@ ArmSetTTBR0 (
   IN  VOID  *TranslationTableBase\r
   );\r
 \r
-VOID *\r
+VOID\r
 EFIAPI\r
-ArmGetTTBR0BaseAddress (\r
-  VOID\r
+ArmSetTTBCR (\r
+  IN  UINT32  Bits\r
   );\r
 \r
-RETURN_STATUS\r
+VOID *\r
 EFIAPI\r
-ArmConfigureMmu (\r
-  IN  ARM_MEMORY_REGION_DESCRIPTOR  *MemoryTable,\r
-  OUT VOID                         **TranslationTableBase OPTIONAL,\r
-  OUT UINTN                         *TranslationTableSize  OPTIONAL\r
+ArmGetTTBR0BaseAddress (\r
+  VOID\r
   );\r
 \r
 BOOLEAN\r
@@ -385,12 +419,6 @@ ArmSetHighVectors (
   VOID\r
   );\r
 \r
-VOID\r
-EFIAPI\r
-ArmDrainWriteBuffer (\r
-  VOID\r
-  );\r
-\r
 VOID\r
 EFIAPI\r
 ArmDataMemoryBarrier (\r
@@ -412,7 +440,7 @@ ArmInstructionSynchronizationBarrier (
 VOID\r
 EFIAPI\r
 ArmWriteVBar (\r
-  IN  UINTN   VectorBase\r
+  IN  UINTN  VectorBase\r
   );\r
 \r
 UINTN\r
@@ -424,7 +452,7 @@ ArmReadVBar (
 VOID\r
 EFIAPI\r
 ArmWriteAuxCr (\r
-  IN  UINT32    Bit\r
+  IN  UINT32  Bit\r
   );\r
 \r
 UINT32\r
@@ -436,13 +464,13 @@ ArmReadAuxCr (
 VOID\r
 EFIAPI\r
 ArmSetAuxCrBit (\r
-  IN  UINT32    Bits\r
+  IN  UINT32  Bits\r
   );\r
 \r
 VOID\r
 EFIAPI\r
 ArmUnsetAuxCrBit (\r
-  IN  UINT32    Bits\r
+  IN  UINT32  Bits\r
   );\r
 \r
 VOID\r
@@ -485,7 +513,7 @@ ArmReadCpacr (
 VOID\r
 EFIAPI\r
 ArmWriteCpacr (\r
-  IN  UINT32   Access\r
+  IN  UINT32  Access\r
   );\r
 \r
 VOID\r
@@ -515,7 +543,7 @@ ArmReadScr (
 VOID\r
 EFIAPI\r
 ArmWriteScr (\r
-  IN  UINT32   Value\r
+  IN  UINT32  Value\r
   );\r
 \r
 UINT32\r
@@ -527,7 +555,7 @@ ArmReadMVBar (
 VOID\r
 EFIAPI\r
 ArmWriteMVBar (\r
-  IN  UINT32   VectorMonitorBase\r
+  IN  UINT32  VectorMonitorBase\r
   );\r
 \r
 UINT32\r
@@ -536,6 +564,12 @@ ArmReadSctlr (
   VOID\r
   );\r
 \r
+VOID\r
+EFIAPI\r
+ArmWriteSctlr (\r
+  IN  UINT32  Value\r
+  );\r
+\r
 UINTN\r
 EFIAPI\r
 ArmReadHVBar (\r
@@ -545,10 +579,9 @@ ArmReadHVBar (
 VOID\r
 EFIAPI\r
 ArmWriteHVBar (\r
-  IN  UINTN   HypModeVectorBase\r
+  IN  UINTN  HypModeVectorBase\r
   );\r
 \r
-\r
 //\r
 // Helper functions for accessing CPU ACTLR\r
 //\r
@@ -562,43 +595,199 @@ ArmReadCpuActlr (
 VOID\r
 EFIAPI\r
 ArmWriteCpuActlr (\r
-  IN  UINTN Val\r
+  IN  UINTN  Val\r
   );\r
 \r
 VOID\r
 EFIAPI\r
 ArmSetCpuActlrBit (\r
-  IN  UINTN    Bits\r
+  IN  UINTN  Bits\r
   );\r
 \r
 VOID\r
 EFIAPI\r
 ArmUnsetCpuActlrBit (\r
-  IN  UINTN    Bits\r
+  IN  UINTN  Bits\r
+  );\r
+\r
+//\r
+// Accessors for the architected generic timer registers\r
+//\r
+\r
+#define ARM_ARCH_TIMER_ENABLE   (1 << 0)\r
+#define ARM_ARCH_TIMER_IMASK    (1 << 1)\r
+#define ARM_ARCH_TIMER_ISTATUS  (1 << 2)\r
+\r
+UINTN\r
+EFIAPI\r
+ArmReadCntFrq (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+ArmWriteCntFrq (\r
+  UINTN  FreqInHz\r
   );\r
 \r
-RETURN_STATUS\r
-ArmSetMemoryRegionNoExec (\r
-  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,\r
-  IN  UINT64                    Length\r
+UINT64\r
+EFIAPI\r
+ArmReadCntPct (\r
+  VOID\r
   );\r
 \r
-RETURN_STATUS\r
-ArmClearMemoryRegionNoExec (\r
-  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,\r
-  IN  UINT64                    Length\r
+UINTN\r
+EFIAPI\r
+ArmReadCntkCtl (\r
+  VOID\r
   );\r
 \r
-RETURN_STATUS\r
-ArmSetMemoryRegionReadOnly (\r
-  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,\r
-  IN  UINT64                    Length\r
+VOID\r
+EFIAPI\r
+ArmWriteCntkCtl (\r
+  UINTN  Val\r
   );\r
 \r
-RETURN_STATUS\r
-ArmClearMemoryRegionReadOnly (\r
-  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,\r
-  IN  UINT64                    Length\r
+UINTN\r
+EFIAPI\r
+ArmReadCntpTval (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+ArmWriteCntpTval (\r
+  UINTN  Val\r
+  );\r
+\r
+UINTN\r
+EFIAPI\r
+ArmReadCntpCtl (\r
+  VOID\r
   );\r
 \r
-#endif // __ARM_LIB__\r
+VOID\r
+EFIAPI\r
+ArmWriteCntpCtl (\r
+  UINTN  Val\r
+  );\r
+\r
+UINTN\r
+EFIAPI\r
+ArmReadCntvTval (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+ArmWriteCntvTval (\r
+  UINTN  Val\r
+  );\r
+\r
+UINTN\r
+EFIAPI\r
+ArmReadCntvCtl (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+ArmWriteCntvCtl (\r
+  UINTN  Val\r
+  );\r
+\r
+UINT64\r
+EFIAPI\r
+ArmReadCntvCt (\r
+  VOID\r
+  );\r
+\r
+UINT64\r
+EFIAPI\r
+ArmReadCntpCval (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+ArmWriteCntpCval (\r
+  UINT64  Val\r
+  );\r
+\r
+UINT64\r
+EFIAPI\r
+ArmReadCntvCval (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+ArmWriteCntvCval (\r
+  UINT64  Val\r
+  );\r
+\r
+UINT64\r
+EFIAPI\r
+ArmReadCntvOff (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+ArmWriteCntvOff (\r
+  UINT64  Val\r
+  );\r
+\r
+UINTN\r
+EFIAPI\r
+ArmGetPhysicalAddressBits (\r
+  VOID\r
+  );\r
+\r
+///\r
+///  ID Register Helper functions\r
+///\r
+\r
+/**\r
+  Check whether the CPU supports the GIC system register interface (any version)\r
+\r
+  @return   Whether GIC System Register Interface is supported\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+ArmHasGicSystemRegisters (\r
+  VOID\r
+  );\r
+\r
+/** Checks if CCIDX is implemented.\r
+\r
+   @retval TRUE  CCIDX is implemented.\r
+   @retval FALSE CCIDX is not implemented.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+ArmHasCcidx (\r
+  VOID\r
+  );\r
+\r
+#ifdef MDE_CPU_ARM\r
+///\r
+/// AArch32-only ID Register Helper functions\r
+///\r
+\r
+/**\r
+  Check whether the CPU supports the Security extensions\r
+\r
+  @return   Whether the Security extensions are implemented\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+ArmHasSecurityExtensions (\r
+  VOID\r
+  );\r
+\r
+#endif // MDE_CPU_ARM\r
+\r
+#endif // ARM_LIB_H_\r