diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c index 188fd3289e..c2a3bd1a84 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c @@ -73,7 +73,7 @@ SendFfaMmCommunicate ( while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the StMM SP since it is UP. - Status = ArmFfaLibRun (mStMmPartId, 0x00); + Status = ArmFfaLibRun (mStMmPartId, 0x00, NULL); } return Status; diff --git a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c index fc29e99788..7032409f05 100644 --- a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c +++ b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c @@ -275,7 +275,7 @@ SendFfaMmCommunicate ( while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the StMM SP since it is UP. - Status = ArmFfaLibRun (mStMmPartId, 0x00); + Status = ArmFfaLibRun (mStMmPartId, 0x00, NULL); } return Status; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index 332628a5d5..0d6f0c1e40 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -535,6 +535,7 @@ ErrorHandler: @param [in] PartId Partition id @param [in] CpuNumber Cpu number in partition + @param [out] DirectMsgArg return arguments for direct msg resp/resp2 @retval EFI_SUCCESS @retval Other Error @@ -543,10 +544,12 @@ ErrorHandler: EFI_STATUS EFIAPI ArmFfaLibRun ( - IN UINT16 PartId, - IN UINT16 CpuNumber + IN UINT16 PartId, + IN UINT16 CpuNumber, + OUT DIRECT_MSG_ARGS *DirectMsgArg OPTIONAL ) { + EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); @@ -556,7 +559,39 @@ ArmFfaLibRun ( ArmCallFfa (&FfaArgs); - return FfaArgsToEfiStatus (&FfaArgs); + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + return Status; + } + + if (DirectMsgArg != NULL) { + ZeroMem (DirectMsgArg, sizeof (DIRECT_MSG_ARGS)); + + if (FfaArgs.Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_RESP) { + DirectMsgArg->Arg0 = FfaArgs.Arg3; + DirectMsgArg->Arg1 = FfaArgs.Arg4; + DirectMsgArg->Arg2 = FfaArgs.Arg5; + DirectMsgArg->Arg3 = FfaArgs.Arg6; + DirectMsgArg->Arg4 = FfaArgs.Arg7; + } else if (FfaArgs.Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_RESP2) { + DirectMsgArg->Arg0 = FfaArgs.Arg4; + DirectMsgArg->Arg1 = FfaArgs.Arg5; + DirectMsgArg->Arg2 = FfaArgs.Arg6; + DirectMsgArg->Arg3 = FfaArgs.Arg7; + DirectMsgArg->Arg4 = FfaArgs.Arg8; + DirectMsgArg->Arg5 = FfaArgs.Arg9; + DirectMsgArg->Arg6 = FfaArgs.Arg10; + DirectMsgArg->Arg7 = FfaArgs.Arg11; + DirectMsgArg->Arg8 = FfaArgs.Arg12; + DirectMsgArg->Arg9 = FfaArgs.Arg13; + DirectMsgArg->Arg10 = FfaArgs.Arg14; + DirectMsgArg->Arg11 = FfaArgs.Arg15; + DirectMsgArg->Arg12 = FfaArgs.Arg16; + DirectMsgArg->Arg13 = FfaArgs.Arg17; + } + } + + return Status; } /** diff --git a/MdePkg/Include/Library/ArmFfaLib.h b/MdePkg/Include/Library/ArmFfaLib.h index dd2ac41202..190a943e5b 100644 --- a/MdePkg/Include/Library/ArmFfaLib.h +++ b/MdePkg/Include/Library/ArmFfaLib.h @@ -301,6 +301,7 @@ ArmFfaLibSpmIdGet ( @param [in] PartId Partition id @param [in] CpuNumber Cpu number in partition + @param [out] DirectMsgArg return arguments for direct msg resp/resp2 @retval EFI_SUCCESS @retval Other Error @@ -309,8 +310,9 @@ ArmFfaLibSpmIdGet ( EFI_STATUS EFIAPI ArmFfaLibRun ( - IN UINT16 PartId, - IN UINT16 CpuNumber + IN UINT16 PartId, + IN UINT16 CpuNumber, + OUT DIRECT_MSG_ARGS *DirectMsgArg OPTIONAL ); /** diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c index 44159c9961..d6ece59f54 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c @@ -202,7 +202,7 @@ Tpm2GetInterfaceVersion ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -254,7 +254,7 @@ Tpm2GetFeatureInfo ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -298,7 +298,7 @@ Tpm2ServiceStart ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -343,7 +343,7 @@ Tpm2RegisterNotification ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -380,7 +380,7 @@ Tpm2UnregisterNotification ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -417,7 +417,7 @@ Tpm2FinishNotified ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c index ea01c9b815..73a0f9a944 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c @@ -69,7 +69,7 @@ Tpm2FfaCheckInterfaceVersion ( Status = ArmFfaLibMsgSendDirectReq2 (TpmPartId, &gTpm2ServiceFfaGuid, &TpmArgs); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (TpmPartId, 0x00); + Status = ArmFfaLibRun (TpmPartId, 0x00, &TpmArgs); } if (EFI_ERROR (Status) || (TpmArgs.Arg0 != TPM2_FFA_SUCCESS_OK_RESULTS_RETURNED)) {