// model or hardware platforms).\r
//\r
CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[] = {\r
- { ARM_FVP_VEXPRESS_AEMv8x4, FixedPcdGetPtr (PcdFdtFvpVExpressAEMv8x4), L"rtsm_ve-aemv8a.dtb" },\r
- { ARM_FVP_BASE, FixedPcdGetPtr (PcdFdtFvpBaseAEMv8x4), L"fvp-base.dtb" },\r
- { ARM_FVP_FOUNDATION, FixedPcdGetPtr (PcdFdtFvpFoundation), L"fvp-foundation.dtb" },\r
- { ARM_FVP_VEXPRESS_UNKNOWN, &gZeroGuid }\r
+ { ARM_FVP_VEXPRESS_AEMv8x4, FixedPcdGetPtr (PcdFdtFvpVExpressAEMv8x4), L"rtsm_ve-aemv8a.dtb" },\r
+ { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2, FixedPcdGetPtr (PcdFdtFvpBaseAEMv8x4GicV2), L"fvp-base-gicv2-psci.dtb" },\r
+ { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY, FixedPcdGetPtr (PcdFdtFvpBaseAEMv8x4GicV2Legacy), L"fvp-base-gicv2legacy-psci.dtb" },\r
+ { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3, FixedPcdGetPtr (PcdFdtFvpBaseAEMv8x4GicV3), L"fvp-base-gicv3-psci.dtb" },\r
+ { ARM_FVP_FOUNDATION_GICV2, FixedPcdGetPtr (PcdFdtFvpFoundationGicV2), L"fvp-foundation-gicv2-psci.dtb" },\r
+ { ARM_FVP_FOUNDATION_GICV2_LEGACY, FixedPcdGetPtr (PcdFdtFvpFoundationGicV2Legacy), L"fvp-foundation-gicv2legacy-psci.dtb" },\r
+ { ARM_FVP_FOUNDATION_GICV3, FixedPcdGetPtr (PcdFdtFvpFoundationGicV3), L"fvp-foundation-gicv3-psci.dtb" },\r
+ { ARM_FVP_VEXPRESS_UNKNOWN }\r
};\r
\r
/**\r
OUT CONST ARM_VEXPRESS_PLATFORM** Platform\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT32 SysId;\r
- UINT32 FvpSysId;\r
+ EFI_STATUS Status;\r
+ UINT32 SysId;\r
+ UINT32 FvpSysId;\r
+ UINT32 VariantSysId;\r
+ ARM_GIC_ARCH_REVISION GicRevision;\r
\r
ASSERT (Platform != NULL);\r
\r
\r
SysId = MmioRead32 (ARM_VE_SYS_ID_REG);\r
if (SysId != ARM_RTSM_SYS_ID) {\r
- //\r
- // Keep only the HBI board number and the platform type fields of the\r
- // system id register to identify if we are running on the FVP base or\r
- // foundation model.\r
- //\r
- FvpSysId = SysId & (ARM_FVP_SYS_ID_HBI_MASK |\r
- ARM_FVP_SYS_ID_PLAT_MASK );\r
+ // Remove the GIC variant to identify if we are running on the FVP Base or\r
+ // Foundation models\r
+ FvpSysId = SysId & (ARM_FVP_SYS_ID_HBI_MASK |\r
+ ARM_FVP_SYS_ID_PLAT_MASK );\r
+ // Extract the variant from the SysId\r
+ VariantSysId = SysId & ARM_FVP_SYS_ID_VARIANT_MASK;\r
\r
if (FvpSysId == ARM_FVP_BASE_BOARD_SYS_ID) {\r
- Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE, Platform);\r
+ if (VariantSysId == ARM_FVP_GIC_VE_MMAP) {\r
+ // FVP Base Model with legacy GIC memory map\r
+ Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY, Platform);\r
+ } else {\r
+ GicRevision = ArmGicGetSupportedArchRevision ();\r
+\r
+ if (GicRevision == ARM_GIC_ARCH_REVISION_2) {\r
+ // FVP Base Model with GICv2 support\r
+ Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2, Platform);\r
+ } else {\r
+ // FVP Base Model with GICv3 support\r
+ Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3, Platform);\r
+ }\r
+ }\r
} else if (FvpSysId == ARM_FVP_FOUNDATION_BOARD_SYS_ID) {\r
- Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION, Platform);\r
+ if (VariantSysId == ARM_FVP_GIC_VE_MMAP) {\r
+ // FVP Foundation Model with legacy GIC memory map\r
+ Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV2_LEGACY, Platform);\r
+ } else {\r
+ GicRevision = ArmGicGetSupportedArchRevision ();\r
+\r
+ if (GicRevision == ARM_GIC_ARCH_REVISION_2) {\r
+ // FVP Foundation Model with GICv2\r
+ Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV2, Platform);\r
+ } else {\r
+ // FVP Foundation Model with GICv3\r
+ Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV3, Platform);\r
+ }\r
+ }\r
}\r
} else {\r
- //\r
// FVP Versatile Express AEMv8\r
- //\r
Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_AEMv8x4, Platform);\r
}\r
\r
#include <Protocol/FirmwareVolume2.h>\r
\r
#define ARM_FVP_BASE_VIRTIO_BLOCK_BASE 0x1c130000\r
-STATIC CONST CHAR16 *mFdtFallbackName = L"fdt.dtb";\r
\r
#pragma pack(1)\r
typedef struct {\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
+ CONST ARM_VEXPRESS_PLATFORM* Platform;\r
EFI_STATUS Status;\r
- CONST ARM_VEXPRESS_PLATFORM *Platform;\r
- BOOLEAN NeedFallback;\r
- UINTN TextDevicePathBaseSize;\r
- UINTN TextDevicePathSize;\r
CHAR16 *TextDevicePath;\r
+ UINTN TextDevicePathSize;\r
VOID *Buffer;\r
EFI_DEVICE_PATH *FdtDevicePath;\r
\r
- Status = gBS->InstallProtocolInterface (\r
- &ImageHandle,\r
- &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE,\r
- &mVirtioBlockDevicePath\r
- );\r
+ Status = gBS->InstallProtocolInterface (&ImageHandle,\r
+ &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE,\r
+ &mVirtioBlockDevicePath);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
}\r
FreePool (FdtDevicePath);\r
} else {\r
- //\r
- // In the case of the FVP base and foundation platforms, two default\r
- // text device paths for the FDT are defined. The first one, like every\r
- // other platform, ends with a file name that identifies the platform. The\r
- // second one ends with the fallback file name "fdt.dtb" for historical\r
- // backward compatibility reasons.\r
- //\r
- NeedFallback = (Platform->Id == ARM_FVP_BASE) ||\r
- (Platform->Id == ARM_FVP_FOUNDATION);\r
-\r
- TextDevicePathBaseSize = StrSize ((CHAR16*)PcdGetPtr (PcdFvpFdtDevicePathsBase)) - sizeof (CHAR16);\r
- TextDevicePathSize = TextDevicePathBaseSize + StrSize (Platform->FdtName);\r
- if (NeedFallback) {\r
- TextDevicePathSize += TextDevicePathBaseSize + StrSize (mFdtFallbackName);\r
- }\r
+ TextDevicePathSize = StrSize ((CHAR16*)PcdGetPtr (PcdFvpFdtDevicePathsBase)) - sizeof (CHAR16);\r
+ TextDevicePathSize += StrSize (Platform->FdtName);\r
\r
TextDevicePath = AllocatePool (TextDevicePathSize);\r
if (TextDevicePath != NULL) {\r
StrCpy (TextDevicePath, ((CHAR16*)PcdGetPtr (PcdFvpFdtDevicePathsBase)));\r
StrCat (TextDevicePath, Platform->FdtName);\r
-\r
- if (NeedFallback) {\r
- StrCat (TextDevicePath, L";");\r
- StrCat (TextDevicePath, ((CHAR16*)PcdGetPtr (PcdFvpFdtDevicePathsBase)));\r
- StrCat (TextDevicePath, mFdtFallbackName);\r
- }\r
}\r
}\r
if (TextDevicePath != NULL) {\r
));\r
}\r
FreePool (TextDevicePath);\r
- } else {\r
- DEBUG ((\r
- EFI_D_ERROR,\r
- "ArmFvpDxe: Setting of FDT device path in PcdFdtDevicePaths failed - %r\n", EFI_OUT_OF_RESOURCES\r
- ));\r
}\r
}\r
\r
\r
[Packages]\r
MdePkg/MdePkg.dec\r
- MdeModulePkg/MdeModulePkg.dec\r
ArmPkg/ArmPkg.dec\r
ArmPlatformPkg/ArmPlatformPkg.dec\r
ArmPlatformPkg/ArmVExpressPkg/ArmVExpressPkg.dec\r
[LibraryClasses.AARCH64]\r
ArmGicLib\r
\r
-[Guids]\r
- gZeroGuid\r
-\r
[Protocols]\r
gEfiFirmwareVolume2ProtocolGuid\r
gEfiDevicePathProtocolGuid\r
\r
[FixedPcd.AARCH64]\r
gArmVExpressTokenSpaceGuid.PcdFdtFvpVExpressAEMv8x4\r
- gArmVExpressTokenSpaceGuid.PcdFdtFvpBaseAEMv8x4\r
- gArmVExpressTokenSpaceGuid.PcdFdtFvpFoundation\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpBaseAEMv8x4GicV2\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpBaseAEMv8x4GicV2Legacy\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpBaseAEMv8x4GicV3\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpFoundationGicV2\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpFoundationGicV2Legacy\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpFoundationGicV3\r
\r
[Pcd]\r
gEmbeddedTokenSpaceGuid.PcdFdtDevicePaths\r
CONST EFI_GUID ArmHwA15x2A7x3Guid = { 0xd5e606eb, 0x83df, 0x4e90, { 0x81, 0xe8, 0xc3, 0xdb, 0x2f, 0x77, 0x17, 0x9a } };\r
CONST EFI_GUID ArmHwA15Guid = { 0x6b8947c2, 0x4287, 0x4d91, { 0x8f, 0xe0, 0xa3, 0x81, 0xea, 0x5b, 0x56, 0x8f } };\r
CONST EFI_GUID ArmHwA5Guid = { 0xa2cc7663, 0x4d7c, 0x448a, { 0xaa, 0xb5, 0x4c, 0x03, 0x4b, 0x6f, 0xda, 0xb7 } };\r
+CONST EFI_GUID NullGuid = { 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } };\r
\r
//\r
// Description of the four hardware platforms :\r
{ ARM_HW_A15x2_A7x3, &ArmHwA15x2A7x3Guid, L"ca15a7" },\r
{ ARM_HW_A15, &ArmHwA15Guid, L"ca15a7" },\r
{ ARM_HW_A5, &ArmHwA5Guid, L"ca5s" },\r
- { ARM_FVP_VEXPRESS_UNKNOWN, &gZeroGuid, NULL }\r
+ { ARM_FVP_VEXPRESS_UNKNOWN, &NullGuid, NULL }\r
};\r
\r
/**\r
ArmPlatformPkg/ArmPlatformPkg.dec\r
EmbeddedPkg/EmbeddedPkg.dec\r
MdePkg/MdePkg.dec\r
- MdeModulePkg/MdeModulePkg.dec\r
\r
[LibraryClasses]\r
ArmShellCmdRunAxfLib\r
MemoryAllocationLib\r
UefiDriverEntryPoint\r
\r
-[Guids]\r
- gZeroGuid\r
-\r
[Protocols]\r
gEfiDevicePathProtocolGuid\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/UefiLib.h>\r
\r
-#include <Guid/ZeroGuid.h>\r
-\r
#include <VExpressMotherBoard.h>\r
\r
// This 'enum' is needed as variations based on existing platform exist\r
ARM_FVP_VEXPRESS_A15x1_A7x1,\r
ARM_FVP_VEXPRESS_A15x4_A7x4,\r
ARM_FVP_VEXPRESS_AEMv8x4,\r
- ARM_FVP_BASE,\r
- ARM_FVP_FOUNDATION,\r
+ ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2,\r
+ ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY,\r
+ ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3,\r
+ ARM_FVP_FOUNDATION_GICV2,\r
+ ARM_FVP_FOUNDATION_GICV2_LEGACY,\r
+ ARM_FVP_FOUNDATION_GICV3,\r
ARM_HW_A9x4,\r
ARM_HW_A15x2_A7x3,\r
ARM_HW_A15,\r
\r
# AArch64 FVP platforms\r
gArmVExpressTokenSpaceGuid.PcdFdtFvpVExpressAEMv8x4|{ 0xa8, 0x95, 0x5f, 0xf6, 0x32, 0x7b, 0xf3, 0x16, 0x12, 0x32, 0x45, 0x50, 0xbd, 0x54, 0xca, 0xe5 }|VOID*|0x00000010\r
- gArmVExpressTokenSpaceGuid.PcdFdtFvpBaseAEMv8x4|{ 0x66, 0xcf, 0x57, 0xa4, 0xac, 0x7e, 0x7f, 0x3d, 0x21, 0x88, 0x3a, 0x58, 0x3c, 0x27, 0xd7, 0xe8 }|VOID*|0x00000011\r
- gArmVExpressTokenSpaceGuid.PcdFdtFvpFoundation|{ 0x36, 0x4f, 0x61, 0x92, 0x86, 0xb1, 0xa2, 0x16, 0x32, 0x65, 0x35, 0x3f, 0x01, 0xf3, 0x3b, 0x64 }|VOID*|0x00000014\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpBaseAEMv8x4GicV2|{ 0x66, 0xcf, 0x57, 0xa4, 0xac, 0x7e, 0x7f, 0x3d, 0x21, 0x88, 0x3a, 0x58, 0x3c, 0x27, 0xd7, 0xe8 }|VOID*|0x00000011\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpBaseAEMv8x4GicV2Legacy|{ 0x8b, 0xcb, 0xe0, 0x14, 0xd1, 0x46, 0x79, 0xae, 0x7f, 0x20, 0xcf, 0x84, 0x22, 0xc7, 0x94, 0x4a }|VOID*|0x00000012\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpBaseAEMv8x4GicV3|{ 0x4d, 0x03, 0xb8, 0x77, 0x63, 0x25, 0x0a, 0x7f, 0xe9, 0x72, 0xfa, 0x68, 0x74, 0xc7, 0x5e, 0xb5 }|VOID*|0x00000013\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpFoundationGicV2|{ 0x36, 0x4f, 0x61, 0x92, 0x86, 0xb1, 0xa2, 0x16, 0x32, 0x65, 0x35, 0x3f, 0x01, 0xf3, 0x3b, 0x64 }|VOID*|0x00000014\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpFoundationGicV2Legacy|{ 0xf6, 0xcb, 0x9d, 0x86, 0x38, 0x74, 0x8a, 0xb0, 0xfe, 0x40, 0x08, 0x0f, 0x3f, 0xb3, 0x50, 0x7c }|VOID*|0x00000015\r
+ gArmVExpressTokenSpaceGuid.PcdFdtFvpFoundationGicV3|{ 0x51, 0xd0, 0x75, 0x6b, 0x9d, 0x35, 0x1b, 0x1b, 0xa6, 0xc6, 0xab, 0xa0, 0x90, 0xf9, 0xf0, 0x0a }|VOID*|0x00000016\r