From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web10.1282.1689086255159855820 for ; Tue, 11 Jul 2023 07:37:35 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: nishant.sharma@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1B1D32F4; Tue, 11 Jul 2023 07:38:17 -0700 (PDT) Received: from usa.arm.com (iss-desktop02.cambridge.arm.com [10.1.196.79]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D669B3F740; Tue, 11 Jul 2023 07:37:33 -0700 (PDT) From: "Nishant Sharma" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Sami Mujawar , Thomas Abraham , Sayanta Pattanayak , Achin Gupta , Aditya Angadi Subject: [edk2-platforms][PATCH V1 19/20] ArmPkg/MmCommunicationDxe: Use the FF-A transport for MM requests Date: Tue, 11 Jul 2023 15:36:57 +0100 Message-Id: <20230711143658.781597-20-nishant.sharma@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230711143658.781597-1-nishant.sharma@arm.com> References: <20230711143658.781597-1-nishant.sharma@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Achin Gupta This patch packages requests for accessing a Standalone MM driver through the MM communication protocol as FF-A direct messages. Corresponding changes in Standalone MM Core ensure that responses are packaged in the same way. Signed-off-by: Achin Gupta Co-developed-by: Aditya Angadi Signed-off-by: Nishant Sharma --- ArmPkg/Include/IndustryStandard/ArmFfaSvc.h | 2 + ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c | 141 +++++++++++++-= ------ 2 files changed, 97 insertions(+), 46 deletions(-) diff --git a/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h b/ArmPkg/Include= /IndustryStandard/ArmFfaSvc.h index 530af8bd3c2e..493997346143 100644 --- a/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h +++ b/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h @@ -23,6 +23,7 @@ #define ARM_SVC_ID_FFA_RXTX_UNMAP_AARCH32 0x84000067 #define ARM_SVC_ID_FFA_PARTITION_INFO_GET_AARCH32 0x84000068 #define ARM_SVC_ID_FFA_ID_GET_AARCH32 0x84000069 +#define ARM_SVC_ID_FFA_RUN_AARCH32 0x8400006D #define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH32 0x8400006F #define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH32 0x84000070 #define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64 0xC400006F @@ -31,6 +32,7 @@ #define ARM_SVC_ID_FFA_SUCCESS_AARCH64 0xC4000061 #define ARM_SVC_ID_FFA_MEM_PERM_SET_AARCH32 0x84000089 #define ARM_SVC_ID_FFA_MEM_PERM_GET_AARCH32 0x84000088 +#define ARM_SVC_ID_FFA_INTERRUPT_AARCH32 0x84000062 #define ARM_SVC_ID_FFA_ERROR_AARCH32 0x84000060 #define ARM_SVC_ID_FFA_ERROR_AARCH64 0xC4000060 #define ARM_SVC_ID_FFA_MSG_WAIT_AARCH32 0x8400006B diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg= /Drivers/MmCommunicationDxe/MmCommunication.c index 94a5d96c051d..a70318581bd2 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c @@ -100,6 +100,7 @@ MmCommunication2Communicate ( ARM_SMC_ARGS CommunicateSmcArgs; EFI_STATUS Status; UINTN BufferSize; + UINTN Ret; =20 Status =3D EFI_ACCESS_DENIED; BufferSize =3D 0; @@ -160,60 +161,108 @@ MmCommunication2Communicate ( return Status; } =20 - // SMC Function ID - CommunicateSmcArgs.Arg0 =3D ARM_SMC_ID_MM_COMMUNICATE_AARCH64; - - // Cookie - CommunicateSmcArgs.Arg1 =3D 0; - // Copy Communication Payload CopyMem ((VOID *)mNsCommBuffMemRegion.VirtualBase, CommBufferVirtual, = BufferSize); =20 - // comm_buffer_address (64-bit physical address) - CommunicateSmcArgs.Arg2 =3D (UINTN)mNsCommBuffMemRegion.PhysicalBase; + // Use the FF-A interface if enabled. + if (FixedPcdGet32 (PcdFfaEnable) !=3D 0) { + // FF-A Interface ID for direct message communication + CommunicateSmcArgs.Arg0 =3D ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH= 64; =20 - // comm_size_address (not used, indicated by setting to zero) - CommunicateSmcArgs.Arg3 =3D 0; + // FF-A Destination EndPoint ID, not used as of now + CommunicateSmcArgs.Arg1 =3D mFfaPartId << 16 | mStmmPartInfo.PartId; =20 + // Reserved for future use(MBZ) + CommunicateSmcArgs.Arg2 =3D 0x0; + + // comm_buffer_address (64-bit physical address) + CommunicateSmcArgs.Arg3 =3D (UINTN)mNsCommBuffMemRegion.PhysicalBase= ; + + // Cookie + CommunicateSmcArgs.Arg4 =3D 0x0; + + // Not Used + CommunicateSmcArgs.Arg5 =3D 0; + + // comm_size_address (not used, indicated by setting to zero) + CommunicateSmcArgs.Arg6 =3D 0; + } else { + // SMC Function ID + CommunicateSmcArgs.Arg0 =3D ARM_SMC_ID_MM_COMMUNICATE_AARCH64; + + // Cookie + CommunicateSmcArgs.Arg1 =3D 0; + + // comm_buffer_address (64-bit physical address) + CommunicateSmcArgs.Arg2 =3D (UINTN)mNsCommBuffMemRegion.PhysicalBase= ; + + // comm_size_address (not used, indicated by setting to zero) + CommunicateSmcArgs.Arg3 =3D 0; + } + +ffa_intr_loop: // Call the Standalone MM environment. ArmCallSmc (&CommunicateSmcArgs); =20 - switch (CommunicateSmcArgs.Arg0) { - case ARM_SMC_MM_RET_SUCCESS: - ZeroMem (CommBufferVirtual, BufferSize); - // On successful return, the size of data being returned is inferr= ed from - // MessageLength + Header. - CommunicateHeader =3D (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemR= egion.VirtualBase; - BufferSize =3D CommunicateHeader->MessageLength + - sizeof (CommunicateHeader->HeaderGuid) + - sizeof (CommunicateHeader->MessageLength); - - CopyMem ( - CommBufferVirtual, - (VOID *)mNsCommBuffMemRegion.VirtualBase, - BufferSize - ); - Status =3D EFI_SUCCESS; - break; - - case ARM_SMC_MM_RET_INVALID_PARAMS: - Status =3D EFI_INVALID_PARAMETER; - break; - - case ARM_SMC_MM_RET_DENIED: - Status =3D EFI_ACCESS_DENIED; - break; - - case ARM_SMC_MM_RET_NO_MEMORY: - // Unexpected error since the CommSize was checked for zero length - // prior to issuing the SMC - Status =3D EFI_OUT_OF_RESOURCES; - ASSERT (0); - break; - - default: - Status =3D EFI_ACCESS_DENIED; - ASSERT (0); + Ret =3D CommunicateSmcArgs.Arg0; + + if (FixedPcdGet32 (PcdFfaEnable) !=3D 0) { + if (Ret =3D=3D ARM_SVC_ID_FFA_INTERRUPT_AARCH32) { + DEBUG ((DEBUG_INFO, "Resuming interrupted FF-A call \n")); + + // FF-A Interface ID for running the interrupted partition + CommunicateSmcArgs.Arg0 =3D ARM_SVC_ID_FFA_RUN_AARCH32; + + // FF-A Destination EndPoint and vCPU ID, TODO: We are assuming vC= PU0 of the + // StMM SP since it is UP. + CommunicateSmcArgs.Arg1 =3D mStmmPartInfo.PartId << 16; + + // Loop if the call was interrupted + goto ffa_intr_loop; + } + } + + if (((FixedPcdGet32 (PcdFfaEnable) !=3D 0) && + (Ret =3D=3D ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP)) || + (Ret =3D=3D ARM_SMC_MM_RET_SUCCESS)) { + ZeroMem (CommBufferVirtual, BufferSize); + // On successful return, the size of data being returned is inferred= from + // MessageLength + Header. + CommunicateHeader =3D (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemReg= ion.VirtualBase; + BufferSize =3D CommunicateHeader->MessageLength + + sizeof (CommunicateHeader->HeaderGuid) + + sizeof (CommunicateHeader->MessageLength); + + CopyMem (CommBufferVirtual, (VOID *)mNsCommBuffMemRegion.VirtualBase= , + BufferSize); + Status =3D EFI_SUCCESS; + return Status; + } + + if (FixedPcdGet32 (PcdFfaEnable) !=3D 0) { + Ret =3D CommunicateSmcArgs.Arg2; + } + + // Error Codes are same for FF-A and SMC interface + switch (Ret) { + case ARM_SMC_MM_RET_INVALID_PARAMS: + Status =3D EFI_INVALID_PARAMETER; + break; + + case ARM_SMC_MM_RET_DENIED: + Status =3D EFI_ACCESS_DENIED; + break; + + case ARM_SMC_MM_RET_NO_MEMORY: + // Unexpected error since the CommSize was checked for zero length + // prior to issuing the SMC + Status =3D EFI_OUT_OF_RESOURCES; + ASSERT (0); + break; + + default: + Status =3D EFI_ACCESS_DENIED; + ASSERT (0); } =20 return Status; --=20 2.34.1