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>
This commit is contained in:
Kun Qin 2025-01-24 16:33:19 -08:00 committed by mergify[bot]
parent 47b793f38c
commit 8d03c42d38
3 changed files with 93 additions and 16 deletions

View File

@ -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;
/**

View File

@ -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 R4R7 as return register
// - Permits calls to use X4X17 as return registers
// - Permits calls to use X8X17 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,

View File

@ -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;