X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=ArmPkg%2FInclude%2FLibrary%2FArmLib.h;h=6566deebdde20861c8d93fd401cd14fe4f93a269;hp=9effb3eea9bfa96f05addb7b451a27518d5d5e76;hb=HEAD;hpb=90ed18ca87ef876848d479ac1c314af15169b712 diff --git a/ArmPkg/Include/Library/ArmLib.h b/ArmPkg/Include/Library/ArmLib.h index 9effb3eea9..fa605f128b 100644 --- a/ArmPkg/Include/Library/ArmLib.h +++ b/ArmPkg/Include/Library/ArmLib.h @@ -1,58 +1,29 @@ /** @file Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
- Copyright (c) 2011 - 2015, ARM Ltd. All rights reserved.
+ Copyright (c) 2011 - 2016, ARM Ltd. All rights reserved.
+ Copyright (c) 2020 - 2021, NUVIA Inc. All rights reserved.
- This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#ifndef __ARM_LIB__ -#define __ARM_LIB__ +#ifndef ARM_LIB_H_ +#define ARM_LIB_H_ #include #ifdef MDE_CPU_ARM - #ifdef ARM_CPU_ARMv6 - #include - #else - #include - #endif -#elif defined(MDE_CPU_AARCH64) + #include +#elif defined (MDE_CPU_AARCH64) #include #else - #error "Unknown chipset." + #error "Unknown chipset." #endif -typedef enum { - ARM_CACHE_TYPE_WRITE_BACK, - ARM_CACHE_TYPE_UNKNOWN -} ARM_CACHE_TYPE; - -typedef enum { - ARM_CACHE_ARCHITECTURE_UNIFIED, - ARM_CACHE_ARCHITECTURE_SEPARATE, - ARM_CACHE_ARCHITECTURE_UNKNOWN -} ARM_CACHE_ARCHITECTURE; - -typedef struct { - ARM_CACHE_TYPE Type; - ARM_CACHE_ARCHITECTURE Architecture; - BOOLEAN DataCachePresent; - UINTN DataCacheSize; - UINTN DataCacheAssociativity; - UINTN DataCacheLineLength; - BOOLEAN InstructionCachePresent; - UINTN InstructionCacheSize; - UINTN InstructionCacheAssociativity; - UINTN InstructionCacheLineLength; -} ARM_CACHE_INFO; +#define EFI_MEMORY_CACHETYPE_MASK (EFI_MEMORY_UC | EFI_MEMORY_WC | \ + EFI_MEMORY_WT | EFI_MEMORY_WB | \ + EFI_MEMORY_UCE) /** * The UEFI firmware must not use the ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_* attributes. @@ -65,23 +36,35 @@ typedef enum { ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED, ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK, ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK, + + // On some platforms, memory mapped flash region is designed as not supporting + // shareable attribute, so WRITE_BACK_NONSHAREABLE is added for such special + // need. + // Do NOT use below two attributes if you are not sure. + ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_NONSHAREABLE, + ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK_NONSHAREABLE, + ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH, ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH, ARM_MEMORY_REGION_ATTRIBUTE_DEVICE, ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE } ARM_MEMORY_REGION_ATTRIBUTES; -#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1) +#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1) typedef struct { - EFI_PHYSICAL_ADDRESS PhysicalBase; - EFI_VIRTUAL_ADDRESS VirtualBase; - UINT64 Length; - ARM_MEMORY_REGION_ATTRIBUTES Attributes; + EFI_PHYSICAL_ADDRESS PhysicalBase; + EFI_VIRTUAL_ADDRESS VirtualBase; + UINT64 Length; + ARM_MEMORY_REGION_ATTRIBUTES Attributes; } ARM_MEMORY_REGION_DESCRIPTOR; -typedef VOID (*CACHE_OPERATION)(VOID); -typedef VOID (*LINE_OPERATION)(UINTN); +typedef VOID (*CACHE_OPERATION)( + VOID + ); +typedef VOID (*LINE_OPERATION)( + UINTN + ); // // ARM Processor Mode @@ -101,68 +84,70 @@ typedef enum { // // ARM Cpu IDs // -#define ARM_CPU_IMPLEMENTER_MASK (0xFFU << 24) -#define ARM_CPU_IMPLEMENTER_ARMLTD (0x41U << 24) -#define ARM_CPU_IMPLEMENTER_DEC (0x44U << 24) -#define ARM_CPU_IMPLEMENTER_MOT (0x4DU << 24) -#define ARM_CPU_IMPLEMENTER_QUALCOMM (0x51U << 24) -#define ARM_CPU_IMPLEMENTER_MARVELL (0x56U << 24) - -#define ARM_CPU_PRIMARY_PART_MASK (0xFFF << 4) -#define ARM_CPU_PRIMARY_PART_CORTEXA5 (0xC05 << 4) -#define ARM_CPU_PRIMARY_PART_CORTEXA7 (0xC07 << 4) -#define ARM_CPU_PRIMARY_PART_CORTEXA8 (0xC08 << 4) -#define ARM_CPU_PRIMARY_PART_CORTEXA9 (0xC09 << 4) -#define ARM_CPU_PRIMARY_PART_CORTEXA15 (0xC0F << 4) +#define ARM_CPU_IMPLEMENTER_MASK (0xFFU << 24) +#define ARM_CPU_IMPLEMENTER_ARMLTD (0x41U << 24) +#define ARM_CPU_IMPLEMENTER_DEC (0x44U << 24) +#define ARM_CPU_IMPLEMENTER_MOT (0x4DU << 24) +#define ARM_CPU_IMPLEMENTER_QUALCOMM (0x51U << 24) +#define ARM_CPU_IMPLEMENTER_MARVELL (0x56U << 24) + +#define ARM_CPU_PRIMARY_PART_MASK (0xFFF << 4) +#define ARM_CPU_PRIMARY_PART_CORTEXA5 (0xC05 << 4) +#define ARM_CPU_PRIMARY_PART_CORTEXA7 (0xC07 << 4) +#define ARM_CPU_PRIMARY_PART_CORTEXA8 (0xC08 << 4) +#define ARM_CPU_PRIMARY_PART_CORTEXA9 (0xC09 << 4) +#define ARM_CPU_PRIMARY_PART_CORTEXA15 (0xC0F << 4) // // ARM MP Core IDs // -#define ARM_CORE_AFF0 0xFF -#define ARM_CORE_AFF1 (0xFF << 8) -#define ARM_CORE_AFF2 (0xFF << 16) -#define ARM_CORE_AFF3 (0xFFULL << 32) - -#define ARM_CORE_MASK ARM_CORE_AFF0 -#define ARM_CLUSTER_MASK ARM_CORE_AFF1 -#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK) -#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8) -#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId)) -#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK) - -ARM_CACHE_TYPE -EFIAPI -ArmCacheType ( - VOID +#define ARM_CORE_AFF0 0xFF +#define ARM_CORE_AFF1 (0xFF << 8) +#define ARM_CORE_AFF2 (0xFF << 16) +#define ARM_CORE_AFF3 (0xFFULL << 32) + +#define ARM_CORE_MASK ARM_CORE_AFF0 +#define ARM_CLUSTER_MASK ARM_CORE_AFF1 +#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK) +#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8) +#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId)) +#define GET_MPIDR_AFF0(MpId) ((MpId) & ARM_CORE_AFF0) +#define GET_MPIDR_AFF1(MpId) (((MpId) & ARM_CORE_AFF1) >> 8) +#define GET_MPIDR_AFF2(MpId) (((MpId) & ARM_CORE_AFF2) >> 16) +#define GET_MPIDR_AFF3(MpId) (((MpId) & ARM_CORE_AFF3) >> 32) +#define GET_MPIDR_AFFINITY_BITS(MpId) ((MpId) & 0xFF00FFFFFF) +#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK) +#define MPIDR_MT_BIT BIT24 + +/** Reads the CCSIDR register for the specified cache. + + @param CSSELR The CSSELR cache selection register value. + + @return The contents of the CCSIDR_EL1 register for the specified cache, when in AARCH64 mode. + Returns the contents of the CCSIDR register in AARCH32 mode. +**/ +UINTN +ReadCCSIDR ( + IN UINT32 CSSELR ); -ARM_CACHE_ARCHITECTURE -EFIAPI -ArmCacheArchitecture ( - VOID - ); +/** Reads the CCSIDR2 for the specified cache. -VOID -EFIAPI -ArmCacheInformation ( - OUT ARM_CACHE_INFO *CacheInfo - ); + @param CSSELR The CSSELR cache selection register value -BOOLEAN -EFIAPI -ArmDataCachePresent ( - VOID + @return The contents of the CCSIDR2 register for the specified cache. +**/ +UINT32 +ReadCCSIDR2 ( + IN UINT32 CSSELR ); -UINTN -EFIAPI -ArmDataCacheSize ( - VOID - ); +/** Reads the Cache Level ID (CLIDR) register. -UINTN -EFIAPI -ArmDataCacheAssociativity ( + @return The contents of the CLIDR_EL1 register. +**/ +UINT32 +ReadCLIDR ( VOID ); @@ -172,24 +157,6 @@ ArmDataCacheLineLength ( VOID ); -BOOLEAN -EFIAPI -ArmInstructionCachePresent ( - VOID - ); - -UINTN -EFIAPI -ArmInstructionCacheSize ( - VOID - ); - -UINTN -EFIAPI -ArmInstructionCacheAssociativity ( - VOID - ); - UINTN EFIAPI ArmInstructionCacheLineLength ( @@ -198,19 +165,13 @@ ArmInstructionCacheLineLength ( UINTN EFIAPI -ArmIsArchTimerImplemented ( +ArmCacheWritebackGranule ( VOID ); UINTN EFIAPI -ArmReadIdPfr0 ( - VOID - ); - -UINTN -EFIAPI -ArmReadIdPfr1 ( +ArmIsArchTimerImplemented ( VOID ); @@ -232,7 +193,6 @@ ArmInvalidateDataCache ( VOID ); - VOID EFIAPI ArmCleanInvalidateDataCache ( @@ -245,12 +205,6 @@ ArmCleanDataCache ( VOID ); -VOID -EFIAPI -ArmCleanDataCacheToPoU ( - VOID - ); - VOID EFIAPI ArmInvalidateInstructionCache ( @@ -260,37 +214,31 @@ ArmInvalidateInstructionCache ( VOID EFIAPI ArmInvalidateDataCacheEntryByMVA ( - IN UINTN Address + IN UINTN Address ); VOID EFIAPI -ArmCleanDataCacheEntryByMVA ( - IN UINTN Address +ArmCleanDataCacheEntryToPoUByMVA ( + IN UINTN Address ); VOID EFIAPI -ArmCleanInvalidateDataCacheEntryByMVA ( - IN UINTN Address +ArmInvalidateInstructionCacheEntryToPoUByMVA ( + IN UINTN Address ); VOID EFIAPI -ArmInvalidateDataCacheEntryBySetWay ( - IN UINTN SetWayFormat - ); - -VOID -EFIAPI -ArmCleanDataCacheEntryBySetWay ( - IN UINTN SetWayFormat +ArmCleanDataCacheEntryByMVA ( + IN UINTN Address ); VOID EFIAPI -ArmCleanInvalidateDataCacheEntryBySetWay ( - IN UINTN SetWayFormat +ArmCleanInvalidateDataCacheEntryByMVA ( + IN UINTN Address ); VOID @@ -413,8 +361,8 @@ ArmInvalidateTlb ( VOID EFIAPI ArmUpdateTranslationTableEntry ( - IN VOID *TranslationTableEntry, - IN VOID *Mva + IN VOID *TranslationTableEntry, + IN VOID *Mva ); VOID @@ -429,18 +377,16 @@ ArmSetTTBR0 ( IN VOID *TranslationTableBase ); -VOID * +VOID EFIAPI -ArmGetTTBR0BaseAddress ( - VOID +ArmSetTTBCR ( + IN UINT32 Bits ); -RETURN_STATUS +VOID * EFIAPI -ArmConfigureMmu ( - IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable, - OUT VOID **TranslationTableBase OPTIONAL, - OUT UINTN *TranslationTableSize OPTIONAL +ArmGetTTBR0BaseAddress ( + VOID ); BOOLEAN @@ -473,12 +419,6 @@ ArmSetHighVectors ( VOID ); -VOID -EFIAPI -ArmDrainWriteBuffer ( - VOID - ); - VOID EFIAPI ArmDataMemoryBarrier ( @@ -487,7 +427,7 @@ ArmDataMemoryBarrier ( VOID EFIAPI -ArmDataSyncronizationBarrier ( +ArmDataSynchronizationBarrier ( VOID ); @@ -500,7 +440,7 @@ ArmInstructionSynchronizationBarrier ( VOID EFIAPI ArmWriteVBar ( - IN UINTN VectorBase + IN UINTN VectorBase ); UINTN @@ -512,7 +452,7 @@ ArmReadVBar ( VOID EFIAPI ArmWriteAuxCr ( - IN UINT32 Bit + IN UINT32 Bit ); UINT32 @@ -524,13 +464,13 @@ ArmReadAuxCr ( VOID EFIAPI ArmSetAuxCrBit ( - IN UINT32 Bits + IN UINT32 Bits ); VOID EFIAPI ArmUnsetAuxCrBit ( - IN UINT32 Bits + IN UINT32 Bits ); VOID @@ -573,7 +513,7 @@ ArmReadCpacr ( VOID EFIAPI ArmWriteCpacr ( - IN UINT32 Access + IN UINT32 Access ); VOID @@ -603,7 +543,7 @@ ArmReadScr ( VOID EFIAPI ArmWriteScr ( - IN UINT32 Value + IN UINT32 Value ); UINT32 @@ -615,7 +555,7 @@ ArmReadMVBar ( VOID EFIAPI ArmWriteMVBar ( - IN UINT32 VectorMonitorBase + IN UINT32 VectorMonitorBase ); UINT32 @@ -624,6 +564,12 @@ ArmReadSctlr ( VOID ); +VOID +EFIAPI +ArmWriteSctlr ( + IN UINT32 Value + ); + UINTN EFIAPI ArmReadHVBar ( @@ -633,10 +579,9 @@ ArmReadHVBar ( VOID EFIAPI ArmWriteHVBar ( - IN UINTN HypModeVectorBase + IN UINTN HypModeVectorBase ); - // // Helper functions for accessing CPU ACTLR // @@ -650,19 +595,199 @@ ArmReadCpuActlr ( VOID EFIAPI ArmWriteCpuActlr ( - IN UINTN Val + IN UINTN Val ); VOID EFIAPI ArmSetCpuActlrBit ( - IN UINTN Bits + IN UINTN Bits ); VOID EFIAPI ArmUnsetCpuActlrBit ( - IN UINTN Bits + IN UINTN Bits + ); + +// +// Accessors for the architected generic timer registers +// + +#define ARM_ARCH_TIMER_ENABLE (1 << 0) +#define ARM_ARCH_TIMER_IMASK (1 << 1) +#define ARM_ARCH_TIMER_ISTATUS (1 << 2) + +UINTN +EFIAPI +ArmReadCntFrq ( + VOID ); -#endif // __ARM_LIB__ +VOID +EFIAPI +ArmWriteCntFrq ( + UINTN FreqInHz + ); + +UINT64 +EFIAPI +ArmReadCntPct ( + VOID + ); + +UINTN +EFIAPI +ArmReadCntkCtl ( + VOID + ); + +VOID +EFIAPI +ArmWriteCntkCtl ( + UINTN Val + ); + +UINTN +EFIAPI +ArmReadCntpTval ( + VOID + ); + +VOID +EFIAPI +ArmWriteCntpTval ( + UINTN Val + ); + +UINTN +EFIAPI +ArmReadCntpCtl ( + VOID + ); + +VOID +EFIAPI +ArmWriteCntpCtl ( + UINTN Val + ); + +UINTN +EFIAPI +ArmReadCntvTval ( + VOID + ); + +VOID +EFIAPI +ArmWriteCntvTval ( + UINTN Val + ); + +UINTN +EFIAPI +ArmReadCntvCtl ( + VOID + ); + +VOID +EFIAPI +ArmWriteCntvCtl ( + UINTN Val + ); + +UINT64 +EFIAPI +ArmReadCntvCt ( + VOID + ); + +UINT64 +EFIAPI +ArmReadCntpCval ( + VOID + ); + +VOID +EFIAPI +ArmWriteCntpCval ( + UINT64 Val + ); + +UINT64 +EFIAPI +ArmReadCntvCval ( + VOID + ); + +VOID +EFIAPI +ArmWriteCntvCval ( + UINT64 Val + ); + +UINT64 +EFIAPI +ArmReadCntvOff ( + VOID + ); + +VOID +EFIAPI +ArmWriteCntvOff ( + UINT64 Val + ); + +UINTN +EFIAPI +ArmGetPhysicalAddressBits ( + VOID + ); + +/// +/// ID Register Helper functions +/// + +/** + Check whether the CPU supports the GIC system register interface (any version) + + @return Whether GIC System Register Interface is supported + +**/ +BOOLEAN +EFIAPI +ArmHasGicSystemRegisters ( + VOID + ); + +/** Checks if CCIDX is implemented. + + @retval TRUE CCIDX is implemented. + @retval FALSE CCIDX is not implemented. +**/ +BOOLEAN +EFIAPI +ArmHasCcidx ( + VOID + ); + +#ifdef MDE_CPU_ARM +/// +/// AArch32-only ID Register Helper functions +/// + +/** + Check whether the CPU supports the Security extensions + + @return Whether the Security extensions are implemented + +**/ +BOOLEAN +EFIAPI +ArmHasSecurityExtensions ( + VOID + ); + +#endif // MDE_CPU_ARM + +#endif // ARM_LIB_H_