mirror of https://github.com/acidanthera/audk.git
ArmPlatformPkg/ArmVExpressDxe: Identify the current platform
Add a function to ArmVExpressDxe to identify the current platform we are running on. This includes ARM32 and AArch64 models and hardware. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16931 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
df320b1084
commit
dff720276a
|
@ -0,0 +1,75 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2014-2015, ARM Ltd. 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.
|
||||
|
||||
**/
|
||||
|
||||
#include "ArmVExpressInternal.h"
|
||||
|
||||
//
|
||||
// Description of the two AARCH64 model platforms :
|
||||
// just the platform id for the time being.
|
||||
// Platform ids are defined in ArmVExpressInternal.h for
|
||||
// all "ArmVExpress-like" platforms (AARCH64 or ARM architecture,
|
||||
// model or hardware platforms).
|
||||
//
|
||||
CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[] = {
|
||||
{ ARM_FVP_VEXPRESS_AEMv8x4 },
|
||||
{ ARM_FVP_BASE_AEMv8x4_AEMv8x4 },
|
||||
{ ARM_FVP_FOUNDATION },
|
||||
{ ARM_FVP_VEXPRESS_UNKNOWN }
|
||||
};
|
||||
|
||||
/**
|
||||
Get information about the VExpress platform the firmware is running on.
|
||||
|
||||
@param[out] Platform Address where the pointer to the platform information
|
||||
(type ARM_VEXPRESS_PLATFORM*) should be stored.
|
||||
The returned pointer does not point to an allocated
|
||||
memory area.
|
||||
|
||||
@retval EFI_SUCCESS The platform information was returned.
|
||||
@retval EFI_NOT_FOUND The platform was not recognised.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
ArmVExpressGetPlatform (
|
||||
OUT CONST ARM_VEXPRESS_PLATFORM** Platform
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 SysId;
|
||||
|
||||
ASSERT (Platform != NULL);
|
||||
|
||||
Status = EFI_NOT_FOUND;
|
||||
|
||||
SysId = MmioRead32 (ARM_VE_SYS_ID_REG);
|
||||
if (SysId != ARM_RTSM_SYS_ID) {
|
||||
// Take out the FVP GIC variant to reduce the permutations. The GIC driver
|
||||
// detects the version and does the right thing.
|
||||
SysId &= ~ARM_FVP_SYS_ID_VARIANT_MASK;
|
||||
if (SysId == (ARM_FVP_BASE_SYS_ID & ~ARM_FVP_SYS_ID_VARIANT_MASK)) {
|
||||
Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4, Platform);
|
||||
} else if (SysId == (ARM_FVP_FOUNDATION_SYS_ID & ~ARM_FVP_SYS_ID_VARIANT_MASK)) {
|
||||
Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION, Platform);
|
||||
}
|
||||
} else {
|
||||
Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_AEMv8x4, Platform);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((EFI_D_ERROR, "Unsupported AArch64 RTSM (SysId:0x%X).\n", SysId));
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2014, ARM Ltd. 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.
|
||||
|
||||
**/
|
||||
|
||||
#include "ArmVExpressInternal.h"
|
||||
#include <Library/ArmPlatformLib.h> // To get Core Count
|
||||
|
||||
//
|
||||
// Description of the four ARM model platforms :
|
||||
// just the platform id for the time being.
|
||||
// Platform ids are defined in ArmVExpressInternal.h for
|
||||
// all "ArmVExpress-like" platforms (AARCH64 or ARM architecture,
|
||||
// model or hardware platforms).
|
||||
//
|
||||
CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[] = {
|
||||
{ ARM_FVP_VEXPRESS_A9x4 },
|
||||
{ ARM_FVP_VEXPRESS_A15x1 },
|
||||
{ ARM_FVP_VEXPRESS_A15x2 },
|
||||
{ ARM_FVP_VEXPRESS_A15x4 },
|
||||
{ ARM_FVP_VEXPRESS_UNKNOWN }
|
||||
};
|
||||
|
||||
/**
|
||||
Get information about the VExpress platform the firmware is running on.
|
||||
|
||||
@param[out] Platform Address where the pointer to the platform information
|
||||
(type ARM_VEXPRESS_PLATFORM*) should be stored.
|
||||
The returned pointer does not point to an allocated
|
||||
memory area.
|
||||
|
||||
@retval EFI_SUCCESS The platform information was returned.
|
||||
@retval EFI_NOT_FOUND The platform was not recognised.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
ArmVExpressGetPlatform (
|
||||
OUT CONST ARM_VEXPRESS_PLATFORM** Platform
|
||||
)
|
||||
{
|
||||
UINT32 SysId;
|
||||
UINTN CpuType;
|
||||
EFI_STATUS Status;
|
||||
UINTN CoreCount;
|
||||
|
||||
ASSERT (Platform != NULL);
|
||||
|
||||
CpuType = 0;
|
||||
Status = EFI_NOT_FOUND;
|
||||
*Platform = NULL;
|
||||
|
||||
SysId = MmioRead32 (ARM_VE_SYS_ID_REG);
|
||||
if (SysId == ARM_RTSM_SYS_ID) {
|
||||
// Get the Cortex-A version
|
||||
CpuType = (ArmReadMidr () >> 4) & ARM_CPU_TYPE_MASK;
|
||||
if (CpuType == ARM_CPU_TYPE_A9) {
|
||||
Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A9x4, Platform);
|
||||
} else if (CpuType == ARM_CPU_TYPE_A15) {
|
||||
CoreCount = ArmGetCpuCountPerCluster ();
|
||||
if (CoreCount == 1) {
|
||||
Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x1, Platform);
|
||||
} else if (CoreCount == 2) {
|
||||
Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x2, Platform);
|
||||
} else if (CoreCount == 4) {
|
||||
Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_A15x4, Platform);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((EFI_D_ERROR, "Unsupported platform (SysId:0x%X, CpuType:0x%X)\n", SysId, CpuType));
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
|
@ -12,10 +12,9 @@
|
|||
|
||||
**/
|
||||
|
||||
#include <Library/UefiLib.h>
|
||||
#include "ArmVExpressInternal.h"
|
||||
|
||||
#include <Library/VirtioMmioDeviceLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/ArmShellCmdLib.h>
|
||||
|
||||
#define ARM_FVP_BASE_VIRTIO_BLOCK_BASE 0x1c130000
|
||||
|
|
|
@ -22,15 +22,26 @@
|
|||
|
||||
[Sources.common]
|
||||
ArmFvpDxe.c
|
||||
ArmVExpressCommon.c
|
||||
|
||||
[Sources.ARM]
|
||||
Arm/ArmFvpDxeArm.c
|
||||
|
||||
[Sources.AARCH64]
|
||||
AArch64/ArmFvpDxeAArch64.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
ArmPlatformPkg/ArmVExpressPkg/ArmVExpressPkg.dec
|
||||
OvmfPkg/OvmfPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
ArmShellCmdRunAxfLib
|
||||
ArmLib
|
||||
ArmPlatformLib
|
||||
BaseMemoryLib
|
||||
UefiDriverEntryPoint
|
||||
UefiBootServicesTableLib
|
||||
VirtioMmioDeviceLib
|
||||
BaseMemoryLib
|
||||
|
|
|
@ -12,10 +12,43 @@
|
|||
|
||||
**/
|
||||
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include "ArmVExpressInternal.h"
|
||||
#include <Library/ArmShellCmdLib.h>
|
||||
|
||||
//
|
||||
// Description of the four hardware platforms :
|
||||
// just the platform id for the time being.
|
||||
// Platform ids are defined in ArmVExpressInternal.h for
|
||||
// all "ArmVExpress-like" platforms (AARCH64 or ARM architecture,
|
||||
// model or hardware platforms).
|
||||
//
|
||||
CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[] = {
|
||||
{ ARM_HW_A9x4 },
|
||||
{ ARM_HW_A15x2_A7x3 },
|
||||
{ ARM_HW_A15 },
|
||||
{ ARM_HW_A5 },
|
||||
{ ARM_FVP_VEXPRESS_UNKNOWN }
|
||||
};
|
||||
|
||||
/**
|
||||
Get information about the VExpress platform the firmware is running on.
|
||||
|
||||
@param[out] Platform Address where the pointer to the platform information
|
||||
(type ARM_VEXPRESS_PLATFORM*) should be stored.
|
||||
The returned pointer does not point to an allocated
|
||||
memory area. Not used here.
|
||||
|
||||
@retval EFI_NOT_FOUND The platform was not recognised.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
ArmVExpressGetPlatform (
|
||||
OUT CONST ARM_VEXPRESS_PLATFORM** Platform
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ArmHwInitialise (
|
||||
|
|
|
@ -22,10 +22,12 @@
|
|||
|
||||
[Sources.common]
|
||||
ArmHwDxe.c
|
||||
ArmVExpressCommon.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
MdePkg/MdePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
ArmShellCmdRunAxfLib
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2014, ARM Ltd. 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.
|
||||
|
||||
**/
|
||||
|
||||
#include "ArmVExpressInternal.h"
|
||||
|
||||
/**
|
||||
Get information about the VExpress platform the firmware is running on given its Id.
|
||||
|
||||
@param[in] PlatformId Id of the VExpress platform.
|
||||
@param[out] Platform Address where the pointer to the platform information
|
||||
(type ARM_VEXPRESS_PLATFORM*) should be stored.
|
||||
The returned pointer does not point to an allocated
|
||||
memory area.
|
||||
|
||||
@retval EFI_SUCCESS The platform information was returned.
|
||||
@retval EFI_NOT_FOUND The platform was not recognised.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
ArmVExpressGetPlatformFromId (
|
||||
IN CONST ARM_VEXPRESS_PLATFORM_ID PlatformId,
|
||||
OUT CONST ARM_VEXPRESS_PLATFORM** Platform
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
ASSERT (Platform != NULL);
|
||||
|
||||
for (Index = 0; ArmVExpressPlatforms[Index].Id != ARM_FVP_VEXPRESS_UNKNOWN; Index++) {
|
||||
if (ArmVExpressPlatforms[Index].Id == PlatformId) {
|
||||
*Platform = &ArmVExpressPlatforms[Index];
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2014, ARM Ltd. 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.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __ARM_VEXPRESS_INTERNAL_H__
|
||||
#define __ARM_VEXPRESS_INTERNAL_H__
|
||||
|
||||
#include <Uefi.h>
|
||||
|
||||
#include <Library/ArmLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
|
||||
#include <VExpressMotherBoard.h>
|
||||
|
||||
// This 'enum' is needed as variations based on existing platform exist
|
||||
typedef enum {
|
||||
ARM_FVP_VEXPRESS_UNKNOWN = 0,
|
||||
ARM_FVP_VEXPRESS_A9x4,
|
||||
ARM_FVP_VEXPRESS_A15x1,
|
||||
ARM_FVP_VEXPRESS_A15x2,
|
||||
ARM_FVP_VEXPRESS_A15x4,
|
||||
ARM_FVP_VEXPRESS_A15x1_A7x1,
|
||||
ARM_FVP_VEXPRESS_A15x4_A7x4,
|
||||
ARM_FVP_VEXPRESS_AEMv8x4,
|
||||
ARM_FVP_BASE_AEMv8x4_AEMv8x4,
|
||||
ARM_FVP_FOUNDATION,
|
||||
ARM_HW_A9x4,
|
||||
ARM_HW_A15x2_A7x3,
|
||||
ARM_HW_A15,
|
||||
ARM_HW_A5
|
||||
} ARM_VEXPRESS_PLATFORM_ID;
|
||||
|
||||
typedef struct {
|
||||
ARM_VEXPRESS_PLATFORM_ID Id;
|
||||
// Will be extended with platform specific information
|
||||
} ARM_VEXPRESS_PLATFORM;
|
||||
|
||||
// Array that contains the list of the VExpress based platform supported by this DXE driver
|
||||
extern CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[];
|
||||
|
||||
/**
|
||||
Get information about the VExpress platform the firmware is running on given its Id.
|
||||
|
||||
@param[in] PlatformId Id of the VExpress platform.
|
||||
@param[out] Platform Address where the pointer to the platform information
|
||||
(type ARM_VEXPRESS_PLATFORM*) should be stored.
|
||||
The returned pointer does not point to an allocated
|
||||
memory area.
|
||||
|
||||
@retval EFI_SUCCESS The platform information was returned.
|
||||
@retval EFI_NOT_FOUND The platform was not recognised.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
ArmVExpressGetPlatformFromId (
|
||||
IN CONST ARM_VEXPRESS_PLATFORM_ID PlatformId,
|
||||
OUT CONST ARM_VEXPRESS_PLATFORM** Platform
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
Get information about the VExpress platform the firmware is running on.
|
||||
|
||||
@param[out] Platform Address where the pointer to the platform information
|
||||
(type ARM_VEXPRESS_PLATFORM*) should be stored.
|
||||
The returned pointer does not point to an allocated
|
||||
memory area.
|
||||
|
||||
@retval EFI_SUCCESS The platform information was returned.
|
||||
@retval EFI_NOT_FOUND The platform was not recognised.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
ArmVExpressGetPlatform (
|
||||
OUT CONST ARM_VEXPRESS_PLATFORM** Platform
|
||||
);
|
||||
|
||||
#endif // __ARM_VEXPRESS_INTERNAL_H__
|
|
@ -21,11 +21,6 @@
|
|||
|
||||
#include <ArmPlatform.h>
|
||||
|
||||
UINTN
|
||||
ArmGetCpuCountPerCluster (
|
||||
VOID
|
||||
);
|
||||
|
||||
ARM_CORE_INFO mVersatileExpressMpCoreInfoTable[] = {
|
||||
{
|
||||
// Cluster 0, Core 0
|
||||
|
|
|
@ -21,12 +21,6 @@
|
|||
|
||||
#include <ArmPlatform.h>
|
||||
|
||||
|
||||
UINTN
|
||||
ArmGetCpuCountPerCluster (
|
||||
VOID
|
||||
);
|
||||
|
||||
ARM_CORE_INFO mVersatileExpressMpCoreInfoTable[] = {
|
||||
{
|
||||
// Cluster 0, Core 0
|
||||
|
|
|
@ -40,6 +40,19 @@ typedef struct {
|
|||
UINT64 NumberOfBytes;
|
||||
} ARM_SYSTEM_MEMORY_REGION_DESCRIPTOR;
|
||||
|
||||
/**
|
||||
Return the core per cluster. The method may differ per core type
|
||||
|
||||
This function might be called from assembler before any stack is set.
|
||||
|
||||
@return Return the core count per cluster
|
||||
|
||||
**/
|
||||
UINTN
|
||||
ArmGetCpuCountPerCluster (
|
||||
VOID
|
||||
);
|
||||
|
||||
/**
|
||||
Return the core position from the value of its MpId register
|
||||
|
||||
|
|
Loading…
Reference in New Issue