diff options
author | Kun Qin <kuqin@microsoft.com> | 2025-01-24 16:33:19 -0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2025-04-02 16:25:45 +0000 |
commit | 8d03c42d38d1301510f26864d4eaea9d2f81698b (patch) | |
tree | f9d0b76230792e0d573fc8d91bc0307a2363ed29 | |
parent | 47b793f38c8f0f227c89fccbf3fe7b329212fb40 (diff) | |
download | edk2-8d03c42d38d1301510f26864d4eaea9d2f81698b.zip edk2-8d03c42d38d1301510f26864d4eaea9d2f81698b.tar.gz edk2-8d03c42d38d1301510f26864d4eaea9d2f81698b.tar.bz2 |
ArmPkg: ArmFfaLib: Update FF-A direct message to support 18 registers
This change expands the support of FF-A direct message 2 call to use the
full 18 registers.
It also adds a check in the contructors to ensure the SMCCC meets the
minimal requirement of v1.2 to support FF-A v1.2 usage.
Signed-off-by: Kun Qin <kun.qin@microsoft.com>
-rw-r--r-- | ArmPkg/Include/Library/ArmFfaLib.h | 29 | ||||
-rw-r--r-- | ArmPkg/Library/ArmFfaLib/ArmFfaCommon.c | 70 | ||||
-rw-r--r-- | ArmPkg/Library/ArmFfaLib/ArmFfaCommon.h | 10 |
3 files changed, 93 insertions, 16 deletions
diff --git a/ArmPkg/Include/Library/ArmFfaLib.h b/ArmPkg/Include/Library/ArmFfaLib.h index 1f7bd58..977f325 100644 --- a/ArmPkg/Include/Library/ArmFfaLib.h +++ b/ArmPkg/Include/Library/ArmFfaLib.h @@ -42,8 +42,35 @@ typedef struct DirectMsgArgs { /// Implementation define argument 3, this will be set to/from x6(v1) or x7(v2)
UINTN Arg3;
- /// Implementation define argument 4, this will be set to/from x7(v1) or ignored (v2)
+ /// Implementation define argument 4, this will be set to/from x7(v1) or x8(v2)
UINTN Arg4;
+
+ /// Implementation define argument 5, this will be set to/from x9(v2)
+ UINTN Arg5;
+
+ /// Implementation define argument 6, this will be set to/from x10(v2)
+ UINTN Arg6;
+
+ /// Implementation define argument 7, this will be set to/from x11(v2)
+ UINTN Arg7;
+
+ /// Implementation define argument 8, this will be set to/from x12(v2)
+ UINTN Arg8;
+
+ /// Implementation define argument 9, this will be set to/from x13(v2)
+ UINTN Arg9;
+
+ /// Implementation define argument 10, this will be set to/from x14(v2)
+ UINTN Arg10;
+
+ /// Implementation define argument 11, this will be set to/from x15(v2)
+ UINTN Arg11;
+
+ /// Implementation define argument 12, this will be set to/from x16(v2)
+ UINTN Arg12;
+
+ /// Implementation define argument 13, this will be set to/from x17(v2)
+ UINTN Arg13;
} DIRECT_MSG_ARGS;
/**
diff --git a/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.c b/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.c index 4a7c3fb..8f66a4a 100644 --- a/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -25,6 +25,7 @@ #include <IndustryStandard/ArmFfaSvc.h>
#include <IndustryStandard/ArmFfaPartInfo.h>
+#include <IndustryStandard/ArmStdSmc.h>
#include "ArmFfaCommon.h"
@@ -695,14 +696,24 @@ ArmFfaLibMsgSendDirectReq2 ( ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS));
- FfaArgs.Arg0 = ARM_FID_FFA_MSG_SEND_DIRECT_REQ2;
- FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (gPartId, DestPartId);
- FfaArgs.Arg2 = Uuid[0];
- FfaArgs.Arg3 = Uuid[1];
- FfaArgs.Arg4 = ImpDefArgs->Arg0;
- FfaArgs.Arg5 = ImpDefArgs->Arg1;
- FfaArgs.Arg6 = ImpDefArgs->Arg2;
- FfaArgs.Arg7 = ImpDefArgs->Arg3;
+ FfaArgs.Arg0 = ARM_FID_FFA_MSG_SEND_DIRECT_REQ2;
+ FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (gPartId, DestPartId);
+ FfaArgs.Arg2 = Uuid[0];
+ FfaArgs.Arg3 = Uuid[1];
+ FfaArgs.Arg4 = ImpDefArgs->Arg0;
+ FfaArgs.Arg5 = ImpDefArgs->Arg1;
+ FfaArgs.Arg6 = ImpDefArgs->Arg2;
+ FfaArgs.Arg7 = ImpDefArgs->Arg3;
+ FfaArgs.Arg8 = ImpDefArgs->Arg4;
+ FfaArgs.Arg9 = ImpDefArgs->Arg5;
+ FfaArgs.Arg10 = ImpDefArgs->Arg6;
+ FfaArgs.Arg11 = ImpDefArgs->Arg7;
+ FfaArgs.Arg12 = ImpDefArgs->Arg8;
+ FfaArgs.Arg13 = ImpDefArgs->Arg9;
+ FfaArgs.Arg14 = ImpDefArgs->Arg10;
+ FfaArgs.Arg15 = ImpDefArgs->Arg11;
+ FfaArgs.Arg16 = ImpDefArgs->Arg12;
+ FfaArgs.Arg17 = ImpDefArgs->Arg13;
ArmCallFfa (&FfaArgs);
@@ -711,10 +722,20 @@ ArmFfaLibMsgSendDirectReq2 ( return Status;
}
- ImpDefArgs->Arg0 = FfaArgs.Arg4;
- ImpDefArgs->Arg1 = FfaArgs.Arg5;
- ImpDefArgs->Arg2 = FfaArgs.Arg6;
- ImpDefArgs->Arg3 = FfaArgs.Arg7;
+ ImpDefArgs->Arg0 = FfaArgs.Arg4;
+ ImpDefArgs->Arg1 = FfaArgs.Arg5;
+ ImpDefArgs->Arg2 = FfaArgs.Arg6;
+ ImpDefArgs->Arg3 = FfaArgs.Arg7;
+ ImpDefArgs->Arg4 = FfaArgs.Arg8;
+ ImpDefArgs->Arg5 = FfaArgs.Arg9;
+ ImpDefArgs->Arg6 = FfaArgs.Arg10;
+ ImpDefArgs->Arg7 = FfaArgs.Arg11;
+ ImpDefArgs->Arg8 = FfaArgs.Arg12;
+ ImpDefArgs->Arg9 = FfaArgs.Arg13;
+ ImpDefArgs->Arg10 = FfaArgs.Arg14;
+ ImpDefArgs->Arg11 = FfaArgs.Arg15;
+ ImpDefArgs->Arg12 = FfaArgs.Arg16;
+ ImpDefArgs->Arg13 = FfaArgs.Arg17;
return EFI_SUCCESS;
}
@@ -733,12 +754,31 @@ ArmFfaLibCommonInit ( IN VOID
)
{
- EFI_STATUS Status;
- UINT16 CurrentMajorVersion;
- UINT16 CurrentMinorVersion;
+ EFI_STATUS Status;
+ UINT16 CurrentMajorVersion;
+ UINT16 CurrentMinorVersion;
+ ARM_FFA_ARGS FfaArgs;
gFfaSupported = FALSE;
+ ZeroMem (&FfaArgs, sizeof (ARM_SMC_ARGS));
+ FfaArgs.Arg0 = SMCCC_VERSION;
+ ArmCallFfa (&FfaArgs);
+ if ((INT32)FfaArgs.Arg0 < 0) {
+ DEBUG ((DEBUG_ERROR, "%a: SMCCC_VERSION not supported\n", __func__));
+ return EFI_UNSUPPORTED;
+ }
+
+ // According to SMCCC Specification v1.6 G BET0
+ // Table F0-1: Changelog: Starting from SMCCC_VERSION v1.2, the interface
+ // - Permits calls to use R4–R7 as return register
+ // - Permits calls to use X4–X17 as return registers
+ // - Permits calls to use X8–X17 as argument registers
+ if ((INT32)FfaArgs.Arg0 < 0x10002) {
+ DEBUG ((DEBUG_ERROR, "%a: SMCCC_VERSION %x < 1.2\n", __func__, (UINT32)FfaArgs.Arg0));
+ return EFI_UNSUPPORTED;
+ }
+
Status = ArmFfaLibGetVersion (
ARM_FFA_MAJOR_VERSION,
ARM_FFA_MINOR_VERSION,
diff --git a/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.h b/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.h index f87c7f3..663d2d3 100644 --- a/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.h +++ b/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.h @@ -29,6 +29,16 @@ typedef struct ArmFfaArgs { UINTN Arg5;
UINTN Arg6;
UINTN Arg7;
+ UINTN Arg8;
+ UINTN Arg9;
+ UINTN Arg10;
+ UINTN Arg11;
+ UINTN Arg12;
+ UINTN Arg13;
+ UINTN Arg14;
+ UINTN Arg15;
+ UINTN Arg16;
+ UINTN Arg17;
} ARM_FFA_ARGS;
extern BOOLEAN gFfaSupported;
|