]> git.proxmox.com Git - mirror_edk2.git/commitdiff
StandaloneMmPkg: Add option to use FF-A calls for getting SPM version
authorSughosh Ganu <sughosh.ganu@linaro.org>
Fri, 19 Feb 2021 06:36:01 +0000 (12:06 +0530)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 23 Feb 2021 15:40:37 +0000 (15:40 +0000)
With the introduction of Firmware Framework(FF-A), a Secure Partition
can get the SPM version either using FF-A calls or through the
existing svc calls. Use a runtime check to use either of the two
methods based on the Pcd feature flag value.

Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
Co-developed-by: Achin Gupta <achin.gupta@arm.com>
Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf

index 2643473e88973298b9df75b4740dfaa73bcecb52..25ead004e610c562d584c1a651d2bba8978999bf 100644 (file)
@@ -23,6 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/BaseLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/SerialPortLib.h>\r
+#include <Library/PcdLib.h>\r
 \r
 #include <IndustryStandard/ArmStdSmc.h>\r
 #include <IndustryStandard/ArmMmSvc.h>\r
@@ -31,10 +32,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #define SPM_MAJOR_VER_MASK        0xFFFF0000\r
 #define SPM_MINOR_VER_MASK        0x0000FFFF\r
 #define SPM_MAJOR_VER_SHIFT       16\r
+#define FFA_NOT_SUPPORTED         -1\r
 \r
 STATIC CONST UINT32 mSpmMajorVer = SPM_MAJOR_VERSION;\r
 STATIC CONST UINT32 mSpmMinorVer = SPM_MINOR_VERSION;\r
 \r
+STATIC CONST UINT32 mSpmMajorVerFfa = SPM_MAJOR_VERSION_FFA;\r
+STATIC CONST UINT32 mSpmMinorVerFfa = SPM_MINOR_VERSION_FFA;\r
+\r
 #define BOOT_PAYLOAD_VERSION      1\r
 \r
 PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT      CpuDriverEntryPoint = NULL;\r
@@ -175,19 +180,34 @@ EFI_STATUS
 GetSpmVersion (VOID)\r
 {\r
   EFI_STATUS   Status;\r
-  UINT16       SpmMajorVersion;\r
-  UINT16       SpmMinorVersion;\r
+  UINT16       CalleeSpmMajorVer;\r
+  UINT16       CallerSpmMajorVer;\r
+  UINT16       CalleeSpmMinorVer;\r
+  UINT16       CallerSpmMinorVer;\r
   UINT32       SpmVersion;\r
   ARM_SVC_ARGS SpmVersionArgs;\r
 \r
-  SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32;\r
+  if (FeaturePcdGet (PcdFfaEnable)) {\r
+    SpmVersionArgs.Arg0 = ARM_SVC_ID_FFA_VERSION_AARCH32;\r
+    SpmVersionArgs.Arg1 = mSpmMajorVerFfa << SPM_MAJOR_VER_SHIFT;\r
+    SpmVersionArgs.Arg1 |= mSpmMinorVerFfa;\r
+    CallerSpmMajorVer = mSpmMajorVerFfa;\r
+    CallerSpmMinorVer = mSpmMinorVerFfa;\r
+  } else {\r
+    SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32;\r
+    CallerSpmMajorVer = mSpmMajorVer;\r
+    CallerSpmMinorVer = mSpmMinorVer;\r
+  }\r
 \r
   ArmCallSvc (&SpmVersionArgs);\r
 \r
   SpmVersion = SpmVersionArgs.Arg0;\r
+  if (SpmVersion == FFA_NOT_SUPPORTED) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
 \r
-  SpmMajorVersion = ((SpmVersion & SPM_MAJOR_VER_MASK) >> SPM_MAJOR_VER_SHIFT);\r
-  SpmMinorVersion = ((SpmVersion & SPM_MINOR_VER_MASK) >> 0);\r
+  CalleeSpmMajorVer = ((SpmVersion & SPM_MAJOR_VER_MASK) >> SPM_MAJOR_VER_SHIFT);\r
+  CalleeSpmMinorVer = ((SpmVersion & SPM_MINOR_VER_MASK) >> 0);\r
 \r
   // Different major revision values indicate possibly incompatible functions.\r
   // For two revisions, A and B, for which the major revision values are\r
@@ -196,17 +216,17 @@ GetSpmVersion (VOID)
   // revision A must work in a compatible way with revision B.\r
   // However, it is possible for revision B to have a higher\r
   // function count than revision A.\r
-  if ((SpmMajorVersion == mSpmMajorVer) &&\r
-      (SpmMinorVersion >= mSpmMinorVer))\r
+  if ((CalleeSpmMajorVer == CallerSpmMajorVer) &&\r
+      (CalleeSpmMinorVer >= CallerSpmMinorVer))\r
   {\r
     DEBUG ((DEBUG_INFO, "SPM Version: Major=0x%x, Minor=0x%x\n",\r
-           SpmMajorVersion, SpmMinorVersion));\r
+           CalleeSpmMajorVer, CalleeSpmMinorVer));\r
     Status = EFI_SUCCESS;\r
   }\r
   else\r
   {\r
-    DEBUG ((DEBUG_INFO, "Incompatible SPM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",\r
-            SpmMajorVersion, SpmMinorVersion, mSpmMajorVer, mSpmMinorVer));\r
+    DEBUG ((DEBUG_INFO, "Incompatible SPM Versions.\n Callee Version: Major=0x%x, Minor=0x%x.\n Caller: Major=0x%x, Minor>=0x%x.\n",\r
+            CalleeSpmMajorVer, CalleeSpmMinorVer, CallerSpmMajorVer, CallerSpmMinorVer));\r
     Status = EFI_UNSUPPORTED;\r
   }\r
 \r
index 313bc6f7bdad357326ac8edc5b2f04aace5ad2eb..4fa426f58ef432d8c38a4b1b4f585b6c6cee8834 100644 (file)
@@ -51,5 +51,8 @@
   gEfiStandaloneMmNonSecureBufferGuid\r
   gEfiArmTfCpuDriverEpDescriptorGuid\r
 \r
+[FeaturePcd.AARCH64]\r
+  gArmTokenSpaceGuid.PcdFfaEnable\r
+\r
 [BuildOptions]\r
   GCC:*_*_*_CC_FLAGS = -fpie\r