]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/ArmVExpressPkg/ArmVExpressDxe/AArch64/ArmFvpDxeAArch64.c
ArmPlatformPkg/ArmVExpressDxe: Load FDT into the EFI Configuration Table
[mirror_edk2.git] / ArmPlatformPkg / ArmVExpressPkg / ArmVExpressDxe / AArch64 / ArmFvpDxeAArch64.c
index 2c7c5fa5ccc8a6d01d2172b9b4c56672185d85cb..09e859f0c5a0aa1e02891fd4e8d5d1b6df0fc93b 100644 (file)
 **/\r
 \r
 #include "ArmVExpressInternal.h"\r
+#include <Library/ArmGicLib.h>\r
 \r
 //\r
-// Description of the two AARCH64 model platforms :\r
+// Description of the AARCH64 model platforms :\r
 // just the platform id for the time being.\r
 // Platform ids are defined in ArmVExpressInternal.h for\r
 // all "ArmVExpress-like" platforms (AARCH64 or ARM architecture,\r
 // model or hardware platforms).\r
 //\r
 CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[] = {\r
-  { ARM_FVP_VEXPRESS_AEMv8x4 },\r
-  { ARM_FVP_BASE_AEMv8x4_AEMv8x4 },\r
-  { ARM_FVP_FOUNDATION },\r
-  { ARM_FVP_VEXPRESS_UNKNOWN }\r
+  { ARM_FVP_VEXPRESS_AEMv8x4, { 0x240d627e, 0xeb4d, 0x447d, { 0x86, 0x30, 0xf2, 0x12, 0x3b, 0xc3, 0x89, 0x3f } }, L"rtsm_ve-aemv8a.dtb" },\r
+  { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2, { 0xfbed0b94, 0x3c81, 0x49e4, { 0xbd, 0xec, 0xd4, 0xf4, 0xa8, 0x47, 0xeb, 0x51 } }, L"fvp-base-gicv2-psci.dtb" },\r
+  { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY, { 0x6d8dfd91, 0x431a, 0x4e6c, { 0x84, 0x5a, 0x15, 0xf1, 0xfc, 0x8d, 0x9b, 0xe2 } }, L"fvp-base-gicv2legacy-psci.dtb" },\r
+  { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3, { 0xa8ac2953, 0xc4bb, 0x4914, { 0x87, 0xf5, 0xc5, 0x97, 0x5d, 0x7b, 0x32, 0xd1 } }, L"fvp-base-gicv3-psci.dtb" },\r
+  { ARM_FVP_FOUNDATION_GICV2, { 0x4328cb83, 0x6e50, 0x4cb8, { 0xaa, 0x8c, 0xfb, 0x7a, 0xba, 0xba, 0x37, 0xd8 } }, L"fvp-foundation-gicv2-psci.dtb" },\r
+  { ARM_FVP_FOUNDATION_GICV2_LEGACY, { 0x6af00d18, 0x6dfe, 0x45ed, { 0xa6, 0xc4, 0xb4, 0x4d, 0x57, 0xfd, 0xd8, 0xf5 } }, L"fvp-foundation-gicv2legacy-psci.dtb" },\r
+  { ARM_FVP_FOUNDATION_GICV3, { 0x4a17b7fa, 0xf052, 0x4dc1, { 0x92, 0x79, 0x43, 0x80, 0x92, 0x41, 0xf9, 0x98 } }, L"fvp-foundation-gicv3-psci.dtb" },\r
+  { ARM_FVP_VEXPRESS_UNKNOWN, { 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } } }\r
 };\r
 \r
 /**\r
@@ -47,6 +52,9 @@ ArmVExpressGetPlatform (
 {\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
@@ -54,15 +62,46 @@ ArmVExpressGetPlatform (
 \r
   SysId = MmioRead32 (ARM_VE_SYS_ID_REG);\r
   if (SysId != ARM_RTSM_SYS_ID) {\r
-    // Take out the FVP GIC variant to reduce the permutations. The GIC driver\r
-    // detects the version and does the right thing.\r
-    SysId &= ~ARM_FVP_SYS_ID_VARIANT_MASK;\r
-    if (SysId == (ARM_FVP_BASE_SYS_ID & ~ARM_FVP_SYS_ID_VARIANT_MASK)) {\r
-      Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4, Platform);\r
-    } else if (SysId == (ARM_FVP_FOUNDATION_SYS_ID & ~ARM_FVP_SYS_ID_VARIANT_MASK)) {\r
-      Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION, Platform);\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
+      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
+      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
+    // FVP Versatile Express AEMv8\r
     Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_AEMv8x4, Platform);\r
   }\r
 \r