From d0c1d371fba83b380326bc97a9e267070a4e725e Mon Sep 17 00:00:00 2001 From: Olivier Martin Date: Wed, 25 Feb 2015 19:15:39 +0000 Subject: ArmPlatformPkg/ArmVExpressPkg: Added support to differentiate ARMv8 FVP variants There are three FVP variants for the Base and Foundation models: - model with GICv2 legacy memory map (same location as the Versatile Express model) - model with GICv2 and Base model memory map - model with GICv3 and Base model memory map The new code detects the variants to load the appropriate device tree. 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@16932 6f19259b-4bc3-4df7-8a09-765794883524 --- .../ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c | 59 ++++++++++++++++++---- .../ArmVExpressPkg/ArmVExpressDxe/ArmFvpDxe.inf | 5 +- .../ArmVExpressDxe/ArmVExpressInternal.h | 8 ++- 3 files changed, 59 insertions(+), 13 deletions(-) (limited to 'ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe') diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c index 2c7c5fa5cc..41d94eda1d 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c @@ -13,9 +13,10 @@ **/ #include "ArmVExpressInternal.h" +#include // -// Description of the two AARCH64 model platforms : +// Description of the 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, @@ -23,8 +24,12 @@ // CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[] = { { ARM_FVP_VEXPRESS_AEMv8x4 }, - { ARM_FVP_BASE_AEMv8x4_AEMv8x4 }, - { ARM_FVP_FOUNDATION }, + { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2 }, + { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY }, + { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3 }, + { ARM_FVP_FOUNDATION_GICV2 }, + { ARM_FVP_FOUNDATION_GICV2_LEGACY }, + { ARM_FVP_FOUNDATION_GICV3 }, { ARM_FVP_VEXPRESS_UNKNOWN } }; @@ -47,6 +52,9 @@ ArmVExpressGetPlatform ( { EFI_STATUS Status; UINT32 SysId; + UINT32 FvpSysId; + UINT32 VariantSysId; + ARM_GIC_ARCH_REVISION GicRevision; ASSERT (Platform != NULL); @@ -54,15 +62,46 @@ ArmVExpressGetPlatform ( 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); + // Remove the GIC variant to identify if we are running on the FVP Base or + // Foundation models + FvpSysId = SysId & (ARM_FVP_SYS_ID_HBI_MASK | + ARM_FVP_SYS_ID_PLAT_MASK ); + // Extract the variant from the SysId + VariantSysId = SysId & ARM_FVP_SYS_ID_VARIANT_MASK; + + if (FvpSysId == ARM_FVP_BASE_BOARD_SYS_ID) { + if (VariantSysId == ARM_FVP_GIC_VE_MMAP) { + // FVP Base Model with legacy GIC memory map + Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY, Platform); + } else { + GicRevision = ArmGicGetSupportedArchRevision (); + + if (GicRevision == ARM_GIC_ARCH_REVISION_2) { + // FVP Base Model with GICv2 support + Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2, Platform); + } else { + // FVP Base Model with GICv3 support + Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3, Platform); + } + } + } else if (FvpSysId == ARM_FVP_FOUNDATION_BOARD_SYS_ID) { + if (VariantSysId == ARM_FVP_GIC_VE_MMAP) { + // FVP Foundation Model with legacy GIC memory map + Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV2_LEGACY, Platform); + } else { + GicRevision = ArmGicGetSupportedArchRevision (); + + if (GicRevision == ARM_GIC_ARCH_REVISION_2) { + // FVP Foundation Model with GICv2 + Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV2, Platform); + } else { + // FVP Foundation Model with GICv3 + Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV3, Platform); + } + } } } else { + // FVP Versatile Express AEMv8 Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_AEMv8x4, Platform); } diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmFvpDxe.inf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmFvpDxe.inf index 8a096baae2..a69601ba12 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmFvpDxe.inf +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmFvpDxe.inf @@ -1,6 +1,6 @@ #/** @file # -# Copyright (c) 2013-2014, ARM Ltd. All rights reserved.
+# Copyright (c) 2013-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 @@ -45,3 +45,6 @@ UefiDriverEntryPoint UefiBootServicesTableLib VirtioMmioDeviceLib + +[LibraryClasses.AARCH64] + ArmGicLib diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmVExpressInternal.h b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmVExpressInternal.h index 2e9335047a..075ced8e89 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmVExpressInternal.h +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/ArmVExpressInternal.h @@ -36,8 +36,12 @@ typedef enum { ARM_FVP_VEXPRESS_A15x1_A7x1, ARM_FVP_VEXPRESS_A15x4_A7x4, ARM_FVP_VEXPRESS_AEMv8x4, - ARM_FVP_BASE_AEMv8x4_AEMv8x4, - ARM_FVP_FOUNDATION, + ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2, + ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY, + ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3, + ARM_FVP_FOUNDATION_GICV2, + ARM_FVP_FOUNDATION_GICV2_LEGACY, + ARM_FVP_FOUNDATION_GICV3, ARM_HW_A9x4, ARM_HW_A15x2_A7x3, ARM_HW_A15, -- cgit v1.2.3