From 8d03c42d38d1301510f26864d4eaea9d2f81698b Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 24 Jan 2025 16:33:19 -0800 Subject: [PATCH] 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 --- ArmPkg/Include/Library/ArmFfaLib.h | 29 +++++++++- ArmPkg/Library/ArmFfaLib/ArmFfaCommon.c | 70 +++++++++++++++++++------ 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 1f7bd5800f..977f3252fc 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 4a7c3fbd67..8f66a4a245 100644 --- a/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/ArmPkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -25,6 +25,7 @@ #include #include +#include #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 f87c7f3b04..663d2d330a 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;