From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) by mx.groups.io with SMTP id smtpd.web11.5063.1689103329580529646 for ; Tue, 11 Jul 2023 12:22:09 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20221208 header.b=F7NNU6Az; spf=pass (domain: gmail.com, ip: 209.85.214.170, mailfrom: kuqin12@gmail.com) Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-1b89cfb4571so45534805ad.3 for ; Tue, 11 Jul 2023 12:22:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1689103329; x=1691695329; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=8s1qBsx9djUMyJQFUDbFnxjHccR4dTzhxIDdudxxfow=; b=F7NNU6AzljO3tDgmgSKEDenNQJa71iWavPoVD80zUgai1LtbV5E9VAihSyelppckhr clGj1HRyJ7HaBFfSsXwPR8fIxnc6xn7wUv04tyJmJLAKeyiDWKO4Jy1dHRNW5FRMFnmW Yh9CTljbBAGq2lpN6rhs5lAIdcpDh5TreuGWRehk+cC53ZsfB7nbObCltLVMvpr3ja+0 MeLaHzTJYAdgpbdAKj3QKjZSSh0X/5MVQcY/8ZbHn5AOCZcYrUElFraDTGq7yr0idyF6 6bj+t2lw1quA5rjG2Z5zHfBfXV3JPdP/5/RUM+0f5Ge7XhCzgvH++0V6eGiD/0eNFSos vUGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689103329; x=1691695329; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=8s1qBsx9djUMyJQFUDbFnxjHccR4dTzhxIDdudxxfow=; b=QDcAZvTfUKGHEZsSplfFi2Zy4EFZXb7DDQcdImbvGI6v7S1QUqdzG2gXZCvvZotBlQ ZFh0hG0hf5dQqTqKk3xCxJHLV1UrixUYLD1e7wktblpM68l78X3dBIBA0Xjxi2nHwKY3 KF/yEu5q6CBdvvyvKvt0W1mDYf/cxziEgTahP+eEGFPuc/aLnW74uDhmt0UIlAC+UJcz NrwJ+2rN5UI4GtgmmQBG6FuuCdUpYDMbvHtLBNML+ilGwLzB8IdLaRxtJgRHL0nYHF1I fXbo1KJTNqYs6Rz1u4WEO2AhYYCtoyWn+khgg7s9pdd6kSIYDpqMeNvl/S3euzZ19lAl 6rRA== X-Gm-Message-State: ABy/qLZ8wrr57JUo+eYEjWmMmaJAIdsBhSj9yxiiVj77Yf3+OD2l53xz Tn4HLgYwwEK18c+kou+sBIJvSqJr/TQ= X-Google-Smtp-Source: APBJJlF2AzBhyRkkSdlQoi0db11XSKMNaPigKABnNnveKbcu/OgJNHg8z1TMsq3pGzv860g8YNHKhg== X-Received: by 2002:a17:903:1c5:b0:1ac:451d:34a with SMTP id e5-20020a17090301c500b001ac451d034amr19116236plh.33.1689103328608; Tue, 11 Jul 2023 12:22:08 -0700 (PDT) Return-Path: Received: from ?IPV6:2001:4898:d8:33:a558:554a:9dec:2e23? ([2001:4898:80e8:37:2544:554a:9dec:2e23]) by smtp.gmail.com with ESMTPSA id w16-20020a170902e89000b001b89a6164desm2300212plg.118.2023.07.11.12.22.07 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 11 Jul 2023 12:22:08 -0700 (PDT) Message-ID: Date: Tue, 11 Jul 2023 12:22:07 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: [edk2-devel] [edk2-platforms][PATCH V1 19/20] ArmPkg/MmCommunicationDxe: Use the FF-A transport for MM requests To: devel@edk2.groups.io, nishant.sharma@arm.com Cc: Ard Biesheuvel , Sami Mujawar , Thomas Abraham , Sayanta Pattanayak , Achin Gupta , Aditya Angadi References: <20230711143658.781597-1-nishant.sharma@arm.com> <20230711143658.781597-20-nishant.sharma@arm.com> From: "Kun Qin" In-Reply-To: <20230711143658.781597-20-nishant.sharma@arm.com> Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Nishant, Thank you for sending out the patch. Can you please evaluate how much effort it would be to support the same for MmCommunicatePei? I think it would provide better coverage for the FFA support if we can have that change. Thanks, Kun On 7/11/2023 7:36 AM, Nishant Sharma wrote: > 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; > > Status = EFI_ACCESS_DENIED; > BufferSize = 0; > @@ -160,60 +161,108 @@ MmCommunication2Communicate ( > return Status; > } > > - // SMC Function ID > - CommunicateSmcArgs.Arg0 = ARM_SMC_ID_MM_COMMUNICATE_AARCH64; > - > - // Cookie > - CommunicateSmcArgs.Arg1 = 0; > - > // Copy Communication Payload > CopyMem ((VOID *)mNsCommBuffMemRegion.VirtualBase, CommBufferVirtual, BufferSize); > > - // comm_buffer_address (64-bit physical address) > - CommunicateSmcArgs.Arg2 = (UINTN)mNsCommBuffMemRegion.PhysicalBase; > + // Use the FF-A interface if enabled. > + if (FixedPcdGet32 (PcdFfaEnable) != 0) { > + // FF-A Interface ID for direct message communication > + CommunicateSmcArgs.Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64; > > - // comm_size_address (not used, indicated by setting to zero) > - CommunicateSmcArgs.Arg3 = 0; > + // FF-A Destination EndPoint ID, not used as of now > + CommunicateSmcArgs.Arg1 = mFfaPartId << 16 | mStmmPartInfo.PartId; > > + // Reserved for future use(MBZ) > + CommunicateSmcArgs.Arg2 = 0x0; > + > + // comm_buffer_address (64-bit physical address) > + CommunicateSmcArgs.Arg3 = (UINTN)mNsCommBuffMemRegion.PhysicalBase; > + > + // Cookie > + CommunicateSmcArgs.Arg4 = 0x0; > + > + // Not Used > + CommunicateSmcArgs.Arg5 = 0; > + > + // comm_size_address (not used, indicated by setting to zero) > + CommunicateSmcArgs.Arg6 = 0; > + } else { > + // SMC Function ID > + CommunicateSmcArgs.Arg0 = ARM_SMC_ID_MM_COMMUNICATE_AARCH64; > + > + // Cookie > + CommunicateSmcArgs.Arg1 = 0; > + > + // comm_buffer_address (64-bit physical address) > + CommunicateSmcArgs.Arg2 = (UINTN)mNsCommBuffMemRegion.PhysicalBase; > + > + // comm_size_address (not used, indicated by setting to zero) > + CommunicateSmcArgs.Arg3 = 0; > + } > + > +ffa_intr_loop: > // Call the Standalone MM environment. > ArmCallSmc (&CommunicateSmcArgs); > > - switch (CommunicateSmcArgs.Arg0) { > - case ARM_SMC_MM_RET_SUCCESS: > - ZeroMem (CommBufferVirtual, BufferSize); > - // On successful return, the size of data being returned is inferred from > - // MessageLength + Header. > - CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase; > - BufferSize = CommunicateHeader->MessageLength + > - sizeof (CommunicateHeader->HeaderGuid) + > - sizeof (CommunicateHeader->MessageLength); > - > - CopyMem ( > - CommBufferVirtual, > - (VOID *)mNsCommBuffMemRegion.VirtualBase, > - BufferSize > - ); > - Status = EFI_SUCCESS; > - break; > - > - case ARM_SMC_MM_RET_INVALID_PARAMS: > - Status = EFI_INVALID_PARAMETER; > - break; > - > - case ARM_SMC_MM_RET_DENIED: > - Status = 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 = EFI_OUT_OF_RESOURCES; > - ASSERT (0); > - break; > - > - default: > - Status = EFI_ACCESS_DENIED; > - ASSERT (0); > + Ret = CommunicateSmcArgs.Arg0; > + > + if (FixedPcdGet32 (PcdFfaEnable) != 0) { > + if (Ret == 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 = ARM_SVC_ID_FFA_RUN_AARCH32; > + > + // FF-A Destination EndPoint and vCPU ID, TODO: We are assuming vCPU0 of the > + // StMM SP since it is UP. > + CommunicateSmcArgs.Arg1 = mStmmPartInfo.PartId << 16; > + > + // Loop if the call was interrupted > + goto ffa_intr_loop; > + } > + } > + > + if (((FixedPcdGet32 (PcdFfaEnable) != 0) && > + (Ret == ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP)) || > + (Ret == ARM_SMC_MM_RET_SUCCESS)) { > + ZeroMem (CommBufferVirtual, BufferSize); > + // On successful return, the size of data being returned is inferred from > + // MessageLength + Header. > + CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase; > + BufferSize = CommunicateHeader->MessageLength + > + sizeof (CommunicateHeader->HeaderGuid) + > + sizeof (CommunicateHeader->MessageLength); > + > + CopyMem (CommBufferVirtual, (VOID *)mNsCommBuffMemRegion.VirtualBase, > + BufferSize); > + Status = EFI_SUCCESS; > + return Status; > + } > + > + if (FixedPcdGet32 (PcdFfaEnable) != 0) { > + Ret = CommunicateSmcArgs.Arg2; > + } > + > + // Error Codes are same for FF-A and SMC interface > + switch (Ret) { > + case ARM_SMC_MM_RET_INVALID_PARAMS: > + Status = EFI_INVALID_PARAMETER; > + break; > + > + case ARM_SMC_MM_RET_DENIED: > + Status = 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 = EFI_OUT_OF_RESOURCES; > + ASSERT (0); > + break; > + > + default: > + Status = EFI_ACCESS_DENIED; > + ASSERT (0); > } > > return Status;