From dff720276a3ee19af0cb658340ac8514ffce8359 Mon Sep 17 00:00:00 2001 From: Olivier Martin Date: Wed, 25 Feb 2015 19:14:26 +0000 Subject: 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 git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16931 6f19259b-4bc3-4df7-8a09-765794883524 --- .../ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c | 75 ++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c (limited to 'ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64') diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c new file mode 100644 index 0000000000..2c7c5fa5cc --- /dev/null +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c @@ -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; +} -- cgit v1.2.3