2009-12-06 02:57:05 +01:00
|
|
|
/** @file
|
|
|
|
|
2010-04-29 14:15:47 +02:00
|
|
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
2009-12-06 02:57:05 +01:00
|
|
|
|
2010-04-29 14:15:47 +02:00
|
|
|
This program and the accompanying materials
|
2009-12-06 02:57:05 +01:00
|
|
|
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.
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
#ifndef __ARM_LIB__
|
|
|
|
#define __ARM_LIB__
|
|
|
|
|
2011-09-27 18:31:20 +02:00
|
|
|
#ifdef ARM_CPU_ARMv6
|
|
|
|
#include <Chipset/ARM1176JZ-S.h>
|
|
|
|
#else
|
|
|
|
#include <Chipset/ArmV7.h>
|
|
|
|
#endif
|
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
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;
|
|
|
|
|
|
|
|
typedef enum {
|
2011-03-31 13:33:42 +02:00
|
|
|
ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED = 0,
|
2011-02-02 23:35:30 +01:00
|
|
|
ARM_MEMORY_REGION_ATTRIBUTE_SECURE_UNCACHED_UNBUFFERED,
|
2011-03-31 13:33:42 +02:00
|
|
|
ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK,
|
2011-02-02 23:35:30 +01:00
|
|
|
ARM_MEMORY_REGION_ATTRIBUTE_SECURE_WRITE_BACK,
|
2011-03-31 13:33:42 +02:00
|
|
|
ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH,
|
2011-02-02 23:35:30 +01:00
|
|
|
ARM_MEMORY_REGION_ATTRIBUTE_SECURE_WRITE_THROUGH,
|
2011-03-31 13:33:42 +02:00
|
|
|
ARM_MEMORY_REGION_ATTRIBUTE_DEVICE,
|
2011-02-02 23:35:30 +01:00
|
|
|
ARM_MEMORY_REGION_ATTRIBUTE_SECURE_DEVICE
|
2009-12-06 02:57:05 +01:00
|
|
|
} ARM_MEMORY_REGION_ATTRIBUTES;
|
|
|
|
|
2011-03-31 13:33:42 +02:00
|
|
|
#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1)
|
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
typedef struct {
|
|
|
|
UINT32 PhysicalBase;
|
|
|
|
UINT32 VirtualBase;
|
|
|
|
UINT32 Length;
|
|
|
|
ARM_MEMORY_REGION_ATTRIBUTES Attributes;
|
|
|
|
} ARM_MEMORY_REGION_DESCRIPTOR;
|
|
|
|
|
|
|
|
typedef VOID (*CACHE_OPERATION)(VOID);
|
|
|
|
typedef VOID (*LINE_OPERATION)(UINTN);
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
ARM_PROCESSOR_MODE_USER = 0x10,
|
|
|
|
ARM_PROCESSOR_MODE_FIQ = 0x11,
|
|
|
|
ARM_PROCESSOR_MODE_IRQ = 0x12,
|
|
|
|
ARM_PROCESSOR_MODE_SUPERVISOR = 0x13,
|
|
|
|
ARM_PROCESSOR_MODE_ABORT = 0x17,
|
|
|
|
ARM_PROCESSOR_MODE_UNDEFINED = 0x1B,
|
|
|
|
ARM_PROCESSOR_MODE_SYSTEM = 0x1F,
|
|
|
|
ARM_PROCESSOR_MODE_MASK = 0x1F
|
|
|
|
} ARM_PROCESSOR_MODE;
|
|
|
|
|
2011-09-23 01:01:13 +02:00
|
|
|
#define IS_PRIMARY_CORE(MpId) (((MpId) & PcdGet32(PcdArmPrimaryCoreMask)) == PcdGet32(PcdArmPrimaryCore))
|
|
|
|
#define GET_CORE_ID(MpId) ((MpId) & 0x3)
|
|
|
|
#define GET_CLUSTER_ID(MpId) (((MpId) >> 6) & 0x3C)
|
|
|
|
// Get the position of the core for the Stack Offset (4 Core per Cluster)
|
|
|
|
// Position = (ClusterId * 4) + CoreId
|
|
|
|
#define GET_CORE_POS(MpId) ((((MpId) >> 6) & 0x3C) + ((MpId) & 0x3))
|
|
|
|
#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & 0x3)
|
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
ARM_CACHE_TYPE
|
|
|
|
EFIAPI
|
|
|
|
ArmCacheType (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
ARM_CACHE_ARCHITECTURE
|
|
|
|
EFIAPI
|
|
|
|
ArmCacheArchitecture (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmCacheInformation (
|
|
|
|
OUT ARM_CACHE_INFO *CacheInfo
|
|
|
|
);
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
ArmDataCachePresent (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmDataCacheSize (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmDataCacheAssociativity (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmDataCacheLineLength (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
ArmInstructionCachePresent (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmInstructionCacheSize (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmInstructionCacheAssociativity (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmInstructionCacheLineLength (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINT32
|
|
|
|
EFIAPI
|
|
|
|
Cp15IdCode (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINT32
|
|
|
|
EFIAPI
|
|
|
|
Cp15CacheInfo (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2011-02-02 23:35:30 +01:00
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
2011-09-27 18:35:16 +02:00
|
|
|
ArmIsMpCore (
|
2011-02-02 23:35:30 +01:00
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmInvalidateDataCache (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2010-01-12 19:49:41 +01:00
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmCleanInvalidateDataCache (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmCleanDataCache (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmInvalidateInstructionCache (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmInvalidateDataCacheEntryByMVA (
|
|
|
|
IN UINTN Address
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmCleanDataCacheEntryByMVA (
|
|
|
|
IN UINTN Address
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmCleanInvalidateDataCacheEntryByMVA (
|
|
|
|
IN UINTN Address
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmEnableDataCache (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmDisableDataCache (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmEnableInstructionCache (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmDisableInstructionCache (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmEnableMmu (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmDisableMmu (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2011-02-02 23:35:30 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmDisableCachesAndMmu (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2011-09-27 18:31:20 +02:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmInvalidateInstructionAndDataTlb (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmEnableInterrupts (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmDisableInterrupts (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
ArmGetInterruptState (
|
|
|
|
VOID
|
|
|
|
);
|
2011-02-02 23:35:30 +01:00
|
|
|
|
2010-03-05 03:15:41 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmEnableFiq (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmDisableFiq (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
ArmGetFiqState (
|
|
|
|
VOID
|
|
|
|
);
|
2009-12-06 02:57:05 +01:00
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmInvalidateTlb (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2010-01-27 03:47:47 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmUpdateTranslationTableEntry (
|
2010-04-13 21:27:03 +02:00
|
|
|
IN VOID *TranslationTableEntry,
|
|
|
|
IN VOID *Mva
|
2010-01-27 03:47:47 +01:00
|
|
|
);
|
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmSetDomainAccessControl (
|
|
|
|
IN UINT32 Domain
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
2011-02-02 23:35:30 +01:00
|
|
|
ArmSetTTBR0 (
|
2009-12-06 02:57:05 +01:00
|
|
|
IN VOID *TranslationTableBase
|
|
|
|
);
|
|
|
|
|
2010-01-12 19:49:41 +01:00
|
|
|
VOID *
|
|
|
|
EFIAPI
|
2011-02-02 23:35:30 +01:00
|
|
|
ArmGetTTBR0BaseAddress (
|
2010-01-14 04:25:08 +01:00
|
|
|
VOID
|
2010-01-12 19:49:41 +01:00
|
|
|
);
|
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmConfigureMmu (
|
|
|
|
IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,
|
|
|
|
OUT VOID **TranslationTableBase OPTIONAL,
|
|
|
|
OUT UINTN *TranslationTableSize OPTIONAL
|
|
|
|
);
|
|
|
|
|
2010-01-12 19:49:41 +01:00
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
ArmMmuEnabled (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmSwitchProcessorMode (
|
|
|
|
IN ARM_PROCESSOR_MODE Mode
|
|
|
|
);
|
|
|
|
|
|
|
|
ARM_PROCESSOR_MODE
|
|
|
|
EFIAPI
|
|
|
|
ArmProcessorMode (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmEnableBranchPrediction (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmDisableBranchPrediction (
|
|
|
|
VOID
|
|
|
|
);
|
2011-06-03 11:25:01 +02:00
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmSetLowVectors (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmSetHighVectors (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2010-02-24 23:38:46 +01:00
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmDataMemoryBarrier (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmDataSyncronizationBarrier (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmInstructionSynchronizationBarrier (
|
|
|
|
VOID
|
|
|
|
);
|
2011-09-27 18:31:20 +02:00
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmWriteVBar (
|
|
|
|
IN UINT32 VectorBase
|
|
|
|
);
|
|
|
|
|
|
|
|
UINT32
|
|
|
|
EFIAPI
|
|
|
|
ArmReadVBar (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmWriteAuxCr (
|
|
|
|
IN UINT32 Bit
|
|
|
|
);
|
|
|
|
|
|
|
|
UINT32
|
|
|
|
EFIAPI
|
|
|
|
ArmReadAuxCr (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmSetAuxCrBit (
|
|
|
|
IN UINT32 Bits
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmCallWFI (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
EFIAPI
|
|
|
|
ArmReadMpidr (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmWriteCPACR (
|
|
|
|
IN UINT32 Access
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmEnableVFP (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmWriteNsacr (
|
|
|
|
IN UINT32 SetWayFormat
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmWriteScr (
|
|
|
|
IN UINT32 SetWayFormat
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
EFIAPI
|
|
|
|
ArmWriteVMBar (
|
|
|
|
IN UINT32 VectorMonitorBase
|
|
|
|
);
|
2010-04-13 21:27:03 +02:00
|
|
|
|
2009-12-06 02:57:05 +01:00
|
|
|
#endif // __ARM_LIB__
|