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
|
IN ARM_SVC_ARGS *EventCompleteSvcArgs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
BOOLEAN FfaEnabled;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN SvcStatus;
|
UINTN SvcStatus;
|
||||||
|
|
||||||
|
@ -131,16 +132,32 @@ DelegatedEventLoop (
|
||||||
DEBUG ((DEBUG_INFO, "X1 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg1));
|
DEBUG ((DEBUG_INFO, "X1 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg1));
|
||||||
DEBUG ((DEBUG_INFO, "X2 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg2));
|
DEBUG ((DEBUG_INFO, "X2 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg2));
|
||||||
DEBUG ((DEBUG_INFO, "X3 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg3));
|
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 (
|
FfaEnabled = FeaturePcdGet (PcdFfaEnable);
|
||||||
EventCompleteSvcArgs->Arg0,
|
if (FfaEnabled) {
|
||||||
EventCompleteSvcArgs->Arg3,
|
Status = CpuDriverEntryPoint (
|
||||||
EventCompleteSvcArgs->Arg1
|
EventCompleteSvcArgs->Arg0,
|
||||||
);
|
EventCompleteSvcArgs->Arg6,
|
||||||
|
EventCompleteSvcArgs->Arg3
|
||||||
if (EFI_ERROR (Status)) {
|
);
|
||||||
DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",
|
if (EFI_ERROR (Status)) {
|
||||||
EventCompleteSvcArgs->Arg0, 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) {
|
switch (Status) {
|
||||||
|
@ -164,8 +181,16 @@ DelegatedEventLoop (
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventCompleteSvcArgs->Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
|
if (FfaEnabled) {
|
||||||
EventCompleteSvcArgs->Arg1 = SvcStatus;
|
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;
|
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.
|
The entry point of Standalone MM Foundation.
|
||||||
|
|
||||||
|
@ -255,6 +306,7 @@ _ModuleEntryPoint (
|
||||||
EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo;
|
EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo;
|
||||||
ARM_SVC_ARGS InitMmFoundationSvcArgs;
|
ARM_SVC_ARGS InitMmFoundationSvcArgs;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
INT32 Ret;
|
||||||
UINT32 SectionHeaderOffset;
|
UINT32 SectionHeaderOffset;
|
||||||
UINT16 NumberOfSections;
|
UINT16 NumberOfSections;
|
||||||
VOID *HobStart;
|
VOID *HobStart;
|
||||||
|
@ -346,8 +398,16 @@ _ModuleEntryPoint (
|
||||||
DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP 0x%lx\n", (UINT64) CpuDriverEntryPoint));
|
DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP 0x%lx\n", (UINT64) CpuDriverEntryPoint));
|
||||||
|
|
||||||
finish:
|
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));
|
ZeroMem (&InitMmFoundationSvcArgs, sizeof(InitMmFoundationSvcArgs));
|
||||||
InitMmFoundationSvcArgs.Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;
|
InitArmSvcArgs (&InitMmFoundationSvcArgs, &Ret);
|
||||||
InitMmFoundationSvcArgs.Arg1 = Status;
|
|
||||||
DelegatedEventLoop (&InitMmFoundationSvcArgs);
|
DelegatedEventLoop (&InitMmFoundationSvcArgs);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue