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:
parent
47b793f38c
commit
8d03c42d38
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue