#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
#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
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
// 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