mirror of https://github.com/acidanthera/audk.git
StandaloneMmPkg: Add option to use FF-A calls for communication with SPM
Add support for reporting completion of a MM request using either the Firmware Framework(FF-A) ABI transport or through the earlier used SVC calls. Signed-off-by: Achin Gupta <achin.gupta@arm.com> Co-developed-by: Sughosh Ganu <sughosh.ganu@linaro.org> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Acked-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
parent
cb4267d4c2
commit
388dfe02fb
|
@ -120,6 +120,7 @@ DelegatedEventLoop (
|
|||
IN ARM_SVC_ARGS *EventCompleteSvcArgs
|
||||
)
|
||||
{
|
||||
BOOLEAN FfaEnabled;
|
||||
EFI_STATUS Status;
|
||||
UINTN SvcStatus;
|
||||
|
||||
|
@ -131,16 +132,32 @@ DelegatedEventLoop (
|
|||
DEBUG ((DEBUG_INFO, "X1 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg1));
|
||||
DEBUG ((DEBUG_INFO, "X2 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg2));
|
||||
DEBUG ((DEBUG_INFO, "X3 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg3));
|
||||
DEBUG ((DEBUG_INFO, "X4 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg4));
|
||||
DEBUG ((DEBUG_INFO, "X5 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg5));
|
||||
DEBUG ((DEBUG_INFO, "X6 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg6));
|
||||
DEBUG ((DEBUG_INFO, "X7 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg7));
|
||||
|
||||
Status = CpuDriverEntryPoint (
|
||||
EventCompleteSvcArgs->Arg0,
|
||||
EventCompleteSvcArgs->Arg3,
|
||||
EventCompleteSvcArgs->Arg1
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",
|
||||
EventCompleteSvcArgs->Arg0, Status));
|
||||
FfaEnabled = FeaturePcdGet (PcdFfaEnable);
|
||||
if (FfaEnabled) {
|
||||
Status = CpuDriverEntryPoint (
|
||||
EventCompleteSvcArgs->Arg0,
|
||||
EventCompleteSvcArgs->Arg6,
|
||||
EventCompleteSvcArgs->Arg3
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",
|
||||
EventCompleteSvcArgs->Arg3, Status));
|
||||
}
|
||||
} else {
|
||||
Status = CpuDriverEntryPoint (
|
||||
EventCompleteSvcArgs->Arg0,
|
||||
EventCompleteSvcArgs->Arg3,
|
||||
EventCompleteSvcArgs->Arg1
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",
|
||||
EventCompleteSvcArgs->Arg0, Status));
|
||||
}
|
||||
}
|
||||
|
||||
switch (Status) {
|
||||
|
@ -164,8 +181,16 @@ DelegatedEventLoop (
|
|||
break;
|
||||
}
|
||||
|
||||
EventCompleteSvcArgs->Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
|
||||
EventCompleteSvcArgs->Arg1 = SvcStatus;
|
||||
if (FfaEnabled) {
|
||||
EventCompleteSvcArgs->Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64;
|
||||
EventCompleteSvcArgs->Arg1 = 0;
|
||||
EventCompleteSvcArgs->Arg2 = 0;
|
||||
EventCompleteSvcArgs->Arg3 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
|
||||
EventCompleteSvcArgs->Arg4 = SvcStatus;
|
||||
} else {
|
||||
EventCompleteSvcArgs->Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
|
||||
EventCompleteSvcArgs->Arg1 = SvcStatus;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -233,6 +258,32 @@ GetSpmVersion (VOID)
|
|||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize parameters to be sent via SVC call.
|
||||
|
||||
@param[out] InitMmFoundationSvcArgs Args structure
|
||||
@param[out] Ret Return Code
|
||||
|
||||
**/
|
||||
STATIC
|
||||
VOID
|
||||
InitArmSvcArgs (
|
||||
OUT ARM_SVC_ARGS *InitMmFoundationSvcArgs,
|
||||
OUT INT32 *Ret
|
||||
)
|
||||
{
|
||||
if (FeaturePcdGet (PcdFfaEnable)) {
|
||||
InitMmFoundationSvcArgs->Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64;
|
||||
InitMmFoundationSvcArgs->Arg1 = 0;
|
||||
InitMmFoundationSvcArgs->Arg2 = 0;
|
||||
InitMmFoundationSvcArgs->Arg3 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
|
||||
InitMmFoundationSvcArgs->Arg4 = *Ret;
|
||||
} else {
|
||||
InitMmFoundationSvcArgs->Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
|
||||
InitMmFoundationSvcArgs->Arg1 = *Ret;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
The entry point of Standalone MM Foundation.
|
||||
|
||||
|
@ -255,6 +306,7 @@ _ModuleEntryPoint (
|
|||
EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo;
|
||||
ARM_SVC_ARGS InitMmFoundationSvcArgs;
|
||||
EFI_STATUS Status;
|
||||
INT32 Ret;
|
||||
UINT32 SectionHeaderOffset;
|
||||
UINT16 NumberOfSections;
|
||||
VOID *HobStart;
|
||||
|
@ -346,8 +398,16 @@ _ModuleEntryPoint (
|
|||
DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP 0x%lx\n", (UINT64) CpuDriverEntryPoint));
|
||||
|
||||
finish:
|
||||
if (Status == RETURN_UNSUPPORTED) {
|
||||
Ret = -1;
|
||||
} else if (Status == RETURN_INVALID_PARAMETER) {
|
||||
Ret = -2;
|
||||
} else if (Status == EFI_NOT_FOUND) {
|
||||
Ret = -7;
|
||||
} else {
|
||||
Ret = 0;
|
||||
}
|
||||
ZeroMem (&InitMmFoundationSvcArgs, sizeof(InitMmFoundationSvcArgs));
|
||||
InitMmFoundationSvcArgs.Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
|
||||
InitMmFoundationSvcArgs.Arg1 = Status;
|
||||
InitArmSvcArgs (&InitMmFoundationSvcArgs, &Ret);
|
||||
DelegatedEventLoop (&InitMmFoundationSvcArgs);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue