From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.10406.1603280007632875457 for ; Wed, 21 Oct 2020 04:33:27 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=softfail (domain: linaro.org, ip: 217.140.110.172, mailfrom: sughosh.ganu@linaro.org) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5202F1FB; Wed, 21 Oct 2020 04:33:27 -0700 (PDT) Received: from a076522.blr.arm.com (a076522.blr.arm.com [10.162.16.44]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 986273F66E; Wed, 21 Oct 2020 04:33:25 -0700 (PDT) From: "Sughosh Ganu" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Sami Mujawar , Jiewen Yao , Achin Gupta Subject: [PATCH v1 06/12] StandaloneMmPkg: Add option to use FF-A calls for getting SPM version Date: Wed, 21 Oct 2020 17:02:27 +0530 Message-Id: <20201021113233.25548-7-sughosh.ganu@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201021113233.25548-1-sughosh.ganu@linaro.org> References: <20201021113233.25548-1-sughosh.ganu@linaro.org> From: Achin Gupta 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: Achin Gupta Co-developed-by: Sughosh Ganu --- StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf | 3 ++ StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c | 31 ++++++++++++++------ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf index 7d6ee4e08e..f8184f501b 100644 --- a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf +++ b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf @@ -49,5 +49,8 @@ gEfiStandaloneMmNonSecureBufferGuid gEfiArmTfCpuDriverEpDescriptorGuid +[Pcd] + gArmTokenSpaceGuid.PcdFfaEnable + [BuildOptions] GCC:*_*_*_CC_FLAGS = -fpie diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c index 33f0db654f..7d1e3c4d7c 100644 --- a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c +++ b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c @@ -23,6 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include @@ -165,19 +166,31 @@ EFI_STATUS GetSpmVersion (VOID) { EFI_STATUS Status; - UINT16 SpmMajorVersion; - UINT16 SpmMinorVersion; + UINT16 CurSpmMajorVer; + UINT16 SpmMajorVer; + UINT16 CurSpmMinorVer; + UINT16 SpmMinorVer; UINT32 SpmVersion; ARM_SVC_ARGS SpmVersionArgs; - SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32; + if (FeaturePcdGet (PcdFfaEnable)) { + SpmVersionArgs.Arg0 = ARM_SVC_ID_FFA_VERSION_AARCH32; + SpmVersionArgs.Arg1 = SPM_MAJOR_VER << SPM_MAJOR_VER_SHIFT; + SpmVersionArgs.Arg1 |= SPM_MINOR_VER; + SpmMajorVer = SPM_MAJOR_VER_FFA; + SpmMinorVer = SPM_MINOR_VER_FFA; + } else { + SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32; + SpmMajorVer = SPM_MAJOR_VER; + SpmMinorVer = SPM_MINOR_VER; + } ArmCallSvc (&SpmVersionArgs); SpmVersion = SpmVersionArgs.Arg0; - SpmMajorVersion = ((SpmVersion & SPM_MAJOR_VER_MASK) >> SPM_MAJOR_VER_SHIFT); - SpmMinorVersion = ((SpmVersion & SPM_MINOR_VER_MASK) >> 0); + CurSpmMajorVer = ((SpmVersion & SPM_MAJOR_VER_MASK) >> SPM_MAJOR_VER_SHIFT); + CurSpmMinorVer = ((SpmVersion & SPM_MINOR_VER_MASK) >> 0); // Different major revision values indicate possibly incompatible functions. // For two revisions, A and B, for which the major revision values are @@ -186,17 +199,17 @@ GetSpmVersion (VOID) // revision A must work in a compatible way with revision B. // However, it is possible for revision B to have a higher // function count than revision A. - if ((SpmMajorVersion == SPM_MAJOR_VER) && - (SpmMinorVersion >= SPM_MINOR_VER)) + if ((CurSpmMajorVer == SpmMajorVer) && + (CurSpmMinorVer >= SpmMinorVer)) { DEBUG ((DEBUG_INFO, "SPM Version: Major=0x%x, Minor=0x%x\n", - SpmMajorVersion, SpmMinorVersion)); + CurSpmMajorVer, CurSpmMinorVer)); Status = EFI_SUCCESS; } else { DEBUG ((DEBUG_INFO, "Incompatible SPM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n", - SpmMajorVersion, SpmMinorVersion, SPM_MAJOR_VER, SPM_MINOR_VER)); + CurSpmMajorVer, CurSpmMinorVer, SpmMajorVer, SpmMinorVer)); Status = EFI_UNSUPPORTED; } -- 2.17.1