From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (NAM11-BN8-obe.outbound.protection.outlook.com [40.92.20.10]) by mx.groups.io with SMTP id smtpd.web10.2775.1689268606371480620 for ; Thu, 13 Jul 2023 10:16:46 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@outlook.com header.s=selector1 header.b=qr/kT3WS; spf=pass (domain: outlook.com, ip: 40.92.20.10, mailfrom: chris.fernald@outlook.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BUWswyfXvMlD2ra1bL69Sb3nKC1SPedZ+UG6YN3/0Vf7ii1aVZioEOPn0rxkN5/1LKqM/hWR/3RNhZ+MeurOItEA3QgGUM+7TR1U+52HK0/aEHbd/uTHBeiOTdzyCxMz7jeSbmgszSHzbD1+DBcW8CTjXbyTK1GFQ/xRh67V5C8iQk+dJPciTlotbCxYgrHYuOUMx4Kl6+tA82cQcy+BvZmKv/hEnMUn7mGsjMh5nF1sRXP8AASSgwJ0dJV23MlidCXCrssoC0w7u/Zm4+w7VBsf+sEP8JU7FFIrfIQqvQRdPwDB4b/JfT0PzDKtjuCiR+uRtk4a3TRX572tpXSQ6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=teRx1RSWY1i9BHHeUts/ZASYg/JiOvz3EK9lWjxkZrk=; b=FIbZYVWe/tVTtgki8qSODnU07wLvUqM/EnlPX44YoBL636iB4G1fZMoInYtc7USQpQBm8D2Yy7TVRFP+H+mU1mHbXsu1IyNAaAIPFtH1P463XUBJ/Wzvo1tpA63RcuoTDRvPM2KDood4V/OTgAMKrH84HuREG8dmOdwqsx7PQXHVsrXUzUCJlIQZP2cbVfGSUUmLslKy99IgvrgIAbOFsBHDNpHKGqgc619gMp1IQVNSfImcevwnBQ6Zb6sK6VyU2E9AJx0FuroGLkOS38qREdDJxuan+6VOB2/A+P3rZFEcNpbOsU9zgpKKd+3lV83a0zziPOo5ZLu5mXbZ3AV6nA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=teRx1RSWY1i9BHHeUts/ZASYg/JiOvz3EK9lWjxkZrk=; b=qr/kT3WSkjA+NnoE4kl+ocVXefyF/bj7EQQw6NGg7AV3++IUmBJlXPEOpVv4ylp/NK+PYSweQBaoFnm+FtP37xqy4GWxKLkL+MwC1N8gdi+Oxvy7nxASOSc8o+DdeF6XBKJ6QOG3Lx1HUN9fnn5AweMtRXumZRo5KelRKalfbuOE8mqBBKoIkn2Ak/3Z5MUDlgTysLWpA8z9qpRNxmBTlsCeX3wuwzNEAuCXwfDgaJZ0r+hvsdS0vjtrYQOCne1IgZnxTlmQ13+ppnGLjesMc38PBGWFwN9lVkimrVFUGHZbbZL4um0QcKFdB/sfvV9SoVOmI7XV4NQfMCQIQOJRLg== Received: from IA1PR19MB6275.namprd19.prod.outlook.com (2603:10b6:208:3e9::19) by SN4PR19MB5376.namprd19.prod.outlook.com (2603:10b6:806:207::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6565.30; Thu, 13 Jul 2023 17:16:44 +0000 Received: from IA1PR19MB6275.namprd19.prod.outlook.com ([fe80::f8b:7745:ff38:8b5c]) by IA1PR19MB6275.namprd19.prod.outlook.com ([fe80::f8b:7745:ff38:8b5c%7]) with mapi id 15.20.6588.025; Thu, 13 Jul 2023 17:16:43 +0000 Message-ID: Date: Thu, 13 Jul 2023 10:16:40 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [edk2-devel] [edk2-platforms][PATCH V1 18/20] ArmPkg/MmCommunicationDxe: Discover the StMM SP To: devel@edk2.groups.io, nishant.sharma@arm.com Cc: Ard Biesheuvel , Sami Mujawar , Thomas Abraham , Sayanta Pattanayak , Achin Gupta References: <20230711143658.781597-1-nishant.sharma@arm.com> <20230711143658.781597-19-nishant.sharma@arm.com> From: "Chris Fernald" In-Reply-To: <20230711143658.781597-19-nishant.sharma@arm.com> X-TMN: [CYL8xNs8U42623Rrtz56ynUFjAABElnRJCHlfQAG0hebYvLSLNhwIKEJsR8ZIHvs] X-ClientProxiedBy: MW4PR03CA0290.namprd03.prod.outlook.com (2603:10b6:303:b5::25) To IA1PR19MB6275.namprd19.prod.outlook.com (2603:10b6:208:3e9::19) Return-Path: chris.fernald@outlook.com X-Microsoft-Original-Message-ID: <7c52f308-c7bc-0122-224c-d9e7a9fb82ee@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: IA1PR19MB6275:EE_|SN4PR19MB5376:EE_ X-MS-Office365-Filtering-Correlation-Id: fba9cf08-da6c-4729-24ad-08db83c4ee32 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: YhYfdTklk66ntGt+IGeK+XxcNwzFGwW43fON/3RpiSg9CpqgW7qHTXWWNVmtsFDkiIBcRrz6TZSAnQpLMACYVEjBPSJiTg+dSNbZWEbL5W6HuoORU678BGrcxsh8FBil2+REVqjYjVJLdhTycDMbuTw4ThK7Ne1dRtaJWVj2LZI8qae8lVoWTxHjkzDgWgQbWSyuAAhUUgBW+RvqudPmeC+3p1QQtHq5gU0EQQ/R/EROqT0dN5cNeepn6/l8j3lzWmKoVb4wJDLgjV9e8BzA2KDPDSnm9EYJw4DysNcT/lTHZNDcR9HJaArQktn2kXx0F1fAFLjwWI325/jnpRVM5YVCdEX0q3TtHjUVthKuTXXPDNGzOHhAu7atUES6wYGGrE1ctNW/SD94uPt7FRiuuURHF+8NI3doIO6xV/2fZgYWosYiEyiaAVRzdjy3uYnRzW55gSywIv8iZTGc4JryLgDU5OufUF+z0TdCLaRDSYSPculD/Rs6m7dfSTHBybeylw68dmFl7GnDLZJYgopPlYaIgBoApMLcFRm3tgO/qZ6iPkR0k3rvRcY4jbZbLoVY X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SDRIVEFCdVQvVzFoNTB4U2wvc3hyMWd2ZS9pUzA3VnAvOHp2WktQcFg0QVNI?= =?utf-8?B?WGNGcUp2cjVSdzU4SmM3UkV6RHBNS1FYRTBsbDgwWklsNlBra2EvMFR6Ynp6?= =?utf-8?B?ZVRyZTBuSU1DV3doMEpKWWVGcU1iTnc4bnc4VHUzb25teEdwYVFLaTNSTlJI?= =?utf-8?B?UVd2NkhSZmZsN3NhREo5NGdRdXQ5YVh1UmJBTXlyK1hHYTUxTExoYURjT0N6?= =?utf-8?B?dERGa3F4OGYyN2txZ0MvcG1ZNHBiemNORWVyNzBKYzN2YzBKUStydVZjWnR6?= =?utf-8?B?Q25Nb3RlVVNnS282ZWRuOG5lckJieGY1NlZEZDdWWDhYMXhNQ21YUFM5blVt?= =?utf-8?B?ZlZFRWYvelNVUVpkMlVhdFB2TStHYllnMXNHV2V3cnRTRFFPdEZDVmFGQ3RW?= =?utf-8?B?SDVhRkNwSzNlMXdzZVpxbzZLaWVmQ0F0aHpIaWcyYzNRMGV4M2dDVVNoTSsr?= =?utf-8?B?NXBuMVJLeWJKalJkT1l2bFF6NUx6L0ZsL2xwU1gwZFFieHZVU2o1OUxNcUk2?= =?utf-8?B?L0djSTU1VWlXQVRQdlBmUVFMY3dYWXdnTjRzZnk5WUJQVzMvL3hJK1pCRStL?= =?utf-8?B?dzhYd0pLbGlFTE1MNkJGdklDancwRE1TN2VsbnRrMHgwV2NOSTVxRWZzL1Nw?= =?utf-8?B?SzIyMmNoSXBHS1BuTFVGQUMxOFo5Vi9ZL29XeVRaVXhvSE03VnBCOFlTZEp5?= =?utf-8?B?c0NwNHVsWFJCVHlxNFNPVC9JMHZYaFVPSmpaLzdHK0xqUjZpT2FaQ01CL0Yx?= =?utf-8?B?WjNYQndmaWdDS3pKODJWNkNWNVAreTErR2owRWtXUTdjc3lqUjlrQytZdUU3?= =?utf-8?B?VlRZZ2tmSlY5cEdFNDdKOGExOW9lYUl4ckRaaFk0S3VBYjBtak11TlVwZlBt?= =?utf-8?B?YkF6RXBuRW93UzBhYTAvL3A4Sy9SbHhTNUJxV3pNQ2FRMnNJQ3h0UUJyU2lv?= =?utf-8?B?SjhpZVBNUkIvVktaY01qWVlHcUVMcU1yVVJQWE9lbGRsMXJNclJQc0FXSVdu?= =?utf-8?B?MXpKRXZGVC9pMXVCN1FiVmlRd0RLS0Q5UnFCa0g0MWduRkZ2YnRWSWRyYlBJ?= =?utf-8?B?UUVuT2ppNUFJUG1kQlkwYWFDalcyOFF4N3BWUHdLRk40NzJmUWhoR3I3Nldl?= =?utf-8?B?MTg3WXFybUZlRUZaT1FjL1RhTVp5cnFzWDNJV1QvWG9ERkJLRlBIdUxISjFq?= =?utf-8?B?bDl0eW83SlNNM2Z4NnF2Rm0zK0haNWlhSHJUSXNvY1VDTmZyMk5vMjdVZHVI?= =?utf-8?B?MTVKVEt5M255NzJJZjU4SVZ4eTQ2ZGdPMnZmN0lVemdxRkVBYkJoQzJWcTdL?= =?utf-8?B?b2p1ZUZrVHNjUzQ4Y2wxbk1ad05aNHpkTFRkRnZnTjdsa3RaM2I4Vk5oMENN?= =?utf-8?B?ZnlrNUgzeHcyTHp0M0dtOWhsNTdWYkVZRHR5aGRpZDBWT1R0WUUxNmV3SFZJ?= =?utf-8?B?VUoxaWU2Nm5WdHl5NHl6UXVzSExDNW9LTlZKZ0QweDNvOHBaaEw3c2FLeVhw?= =?utf-8?B?bk9oM0RQYWd3M2JORzY5R0tnUkZlRUlkd1pmai9LRWZkcWFNbUVjTGJVM3B0?= =?utf-8?B?ZHVXSExJZEdIMkhvcnZsWWd3NmF3YWJzSTFWdkRPdFk1YVVBNjFxVkRNRncv?= =?utf-8?B?enB6VkV3aS9xQ0U5MGhOUVIxdWpteFF3eFAydHJoQlN4Ylp3MUtXMWN2aVFO?= =?utf-8?B?ZUpWZXloOUV6LzFDQ3FVbk5wTXkvRERGWWJwSW9xSmRqV2JqSFlQSmRtNDdP?= =?utf-8?Q?CgwmCKEPPGLLjxE8Z8=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: fba9cf08-da6c-4729-24ad-08db83c4ee32 X-MS-Exchange-CrossTenant-AuthSource: IA1PR19MB6275.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2023 17:16:43.8881 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN4PR19MB5376 Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Should |EFI_FFA_PART_INFO_DESC be packed since its used across an ABI? Also there are a few immediately actionable TODO's in this commit. | |-Chris | On 7/11/2023 7:36 AM, Nishant Sharma wrote: > From: Achin Gupta > > This patch adds support for discovering the presence of the SP using the > EFI_MM_COMMUNICATION_PROTOCOL GUID that implements Standalone MM > drivers. This is done by querying the framework through > FFA_PARTITION_INFO_GET whether any partition that implements the > EFI_MM_COMMUNICATION_PROTOCOL is present or not. The partition ID and > its properties are stashed for use in subsequent communication with the > StMM SP. > > Signed-off-by: Achin Gupta > Signed-off-by: Nishant Sharma > --- > ArmPkg/Include/IndustryStandard/ArmFfaSvc.h | 24 +++++ > ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c | 93 +++++++++++++++++++- > 2 files changed, 114 insertions(+), 3 deletions(-) > > diff --git a/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h b/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h > index f78442a465e1..530af8bd3c2e 100644 > --- a/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h > +++ b/ArmPkg/Include/IndustryStandard/ArmFfaSvc.h > @@ -19,6 +19,9 @@ > #define ARM_SVC_ID_FFA_VERSION_AARCH32 0x84000063 > #define ARM_SVC_ID_FFA_RXTX_MAP_AARCH32 0x84000066 > #define ARM_SVC_ID_FFA_RXTX_MAP_AARCH64 0xC4000066 > +#define ARM_SVC_ID_FFA_RX_RELEASE_AARCH32 0x84000065 > +#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_MSG_SEND_DIRECT_REQ_AARCH32 0x8400006F > #define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH32 0x84000070 > @@ -154,4 +157,25 @@ typedef struct { > UINT64 Reserved; > } EFI_FFA_BOOT_INFO_HEADER; > > +// FF-A partition information descriptor > +typedef struct { > + UINT16 PartId; > + UINT16 EcCnt; > + UINT32 PartProps; > + UINT32 PartGuid[4]; > +} EFI_FFA_PART_INFO_DESC; > + > +#define PART_INFO_PROP_MASK 0x3f > +#define PART_INFO_PROP_SHIFT 0 > +#define PART_INFO_PROP_DIR_MSG_RECV_BIT (1u << 0) > +#define PART_INFO_PROP_DIR_MSG_SEND_BIT (1u << 1) > +#define PART_INFO_PROP_INDIR_MSG_BIT (1u << 2) > +#define PART_INFO_PROP_NOTIFICATIONS_BIT (1u << 3) > +#define PART_INFO_PROP_EP_TYPE_MASK 0x3 > +#define PART_INFO_PROP_EP_TYPE_SHIFT 4 > +#define PART_INFO_PROP_EP_PE 0 > +#define PART_INFO_PROP_EP_SEPID_IND 1 > +#define PART_INFO_PROP_EP_SEPID_DEP 2 > +#define PART_INFO_PROP_EP_AUX 3 > + > #endif // ARM_FFA_SVC_H_ > diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c > index 39a1b329b9ea..94a5d96c051d 100644 > --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c > +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c > @@ -8,6 +8,7 @@ > > #include > #include > +#include > #include > #include > #include > @@ -28,6 +29,11 @@ > // > STATIC UINT16 mFfaPartId; > > +// Partition information of the StMM SP if FF-A support is enabled > +// TODO: Revisit assumption that there is only a single StMM SP > +// > +STATIC EFI_FFA_PART_INFO_DESC mStmmPartInfo; > + > // > // RX/TX pair if FF-A support is enabled > // > @@ -298,7 +304,9 @@ GetMmCompatibility ( > { > EFI_STATUS Status; > UINT32 MmVersion; > + UINT32 SmccUuid[4]; > ARM_SMC_ARGS SmcArgs = {0}; > + EFI_GUID MmCommProtGuid = EFI_MM_COMMUNICATION_PROTOCOL_GUID; > > if (FixedPcdGet32 (PcdFfaEnable) != 0) { > SmcArgs.Arg0 = ARM_SVC_ID_FFA_VERSION_AARCH32; > @@ -335,14 +343,21 @@ GetMmCompatibility ( > Status = EFI_UNSUPPORTED; > } > > - // If FF-A is supported then discover our ID and register our RX/TX buffers. > + // If FF-A is supported then discover the StMM SP's presence, ID, our ID and > + // register our RX/TX buffers. > if (FixedPcdGet32 (PcdFfaEnable) != 0) { > + EFI_FFA_PART_INFO_DESC *StmmPartInfo; > + > // Get our ID > ZeroMem(&SmcArgs, sizeof(SmcArgs)); > SmcArgs.Arg0 = ARM_SVC_ID_FFA_ID_GET_AARCH32; > ArmCallSmc (&SmcArgs); > if (SmcArgs.Arg0 == ARM_SVC_ID_FFA_ERROR_AARCH32) { > - DEBUG ((DEBUG_ERROR, "Unable to retrieve FF-A partition ID (%d).\n", SmcArgs.Arg2)); > + DEBUG (( > + DEBUG_ERROR, > + "Unable to retrieve FF-A partition ID (%d).\n", > + SmcArgs.Arg2 > + )); > return EFI_UNSUPPORTED; > } > DEBUG ((DEBUG_INFO, "FF-A partition ID = 0x%lx.\n", SmcArgs.Arg2)); > @@ -355,11 +370,83 @@ GetMmCompatibility ( > SmcArgs.Arg3 = EFI_PAGE_SIZE / SIZE_4KB; > ArmCallSmc (&SmcArgs); > if (SmcArgs.Arg0 == ARM_SVC_ID_FFA_ERROR_AARCH32) { > - DEBUG ((DEBUG_ERROR, "Unable to register FF-A RX/TX buffers (%d).\n", SmcArgs.Arg2)); > + DEBUG (( > + DEBUG_ERROR, > + "Unable to register FF-A RX/TX buffers (%d).\n", > + SmcArgs.Arg2 > + )); > return EFI_UNSUPPORTED; > } > > + // Discover the StMM SP after converting the EFI_GUID to a format TF-A will > + // understand. > + SmcArgs.Arg0 = ARM_SVC_ID_FFA_PARTITION_INFO_GET_AARCH32; > + MmCommProtGuid.Data2 += MmCommProtGuid.Data3; > + MmCommProtGuid.Data3 = MmCommProtGuid.Data2 - MmCommProtGuid.Data3; > + MmCommProtGuid.Data2 = MmCommProtGuid.Data2 - MmCommProtGuid.Data3; > + CopyMem ((VOID *) SmccUuid, (VOID *) &MmCommProtGuid, sizeof(EFI_GUID)); > + SmcArgs.Arg1 = SmccUuid[0]; > + SmcArgs.Arg2 = SmccUuid[1]; > + SmcArgs.Arg3 = SmccUuid[2]; > + SmcArgs.Arg3 = SwapBytes32(SmcArgs.Arg3); > + SmcArgs.Arg4 = SmccUuid[3]; > + SmcArgs.Arg4 = SwapBytes32(SmcArgs.Arg4); > + ArmCallSmc (&SmcArgs); > + if (SmcArgs.Arg0 == ARM_SVC_ID_FFA_ERROR_AARCH32) { > + DEBUG (( > + DEBUG_ERROR, > + "Unable to discover FF-A StMM SP (%d).\n", > + SmcArgs.Arg2 > + )); > + goto ffa_init_error; > + } > + > + // Retrieve the partition information from the RX buffer > + StmmPartInfo = (EFI_FFA_PART_INFO_DESC *) FfaRxBuf; > + > + // TODO: Sanity check the partition type. > + DEBUG ((DEBUG_INFO, "Discovered FF-A StMM SP.")); > + DEBUG (( > + DEBUG_INFO, > + "ID = 0x%lx, Execution contexts = %d, Properties = 0x%lx. \n", > + StmmPartInfo->PartId, > + StmmPartInfo->EcCnt, > + StmmPartInfo->PartProps > + )); > + > + // Make a local copy > + mStmmPartInfo = *StmmPartInfo; > + > + // Release the RX buffer > + ZeroMem(&SmcArgs, sizeof(SmcArgs)); > + SmcArgs.Arg0 = ARM_SVC_ID_FFA_RX_RELEASE_AARCH32; > + SmcArgs.Arg1 = mFfaPartId; > + ArmCallSmc (&SmcArgs); > + > + // This should really never fail since there is only a single CPU booting > + // and another CPU could not have released the RX buffer before us. > + if (SmcArgs.Arg0 == ARM_SVC_ID_FFA_ERROR_AARCH32) { > + DEBUG (( > + DEBUG_ERROR, > + "Unable to release FF-A RX buffer (%d).\n", > + SmcArgs.Arg2 > + )); > + ASSERT (0); > + goto ffa_init_error; > + } > + > return EFI_SUCCESS; > + > + ffa_init_error: > + // Release the RX/TX pair before exiting. > + ZeroMem(&SmcArgs, sizeof(SmcArgs)); > + SmcArgs.Arg0 = ARM_SVC_ID_FFA_RXTX_UNMAP_AARCH32; > + SmcArgs.Arg1 = mFfaPartId << 16; // TODO: Use a macro for shift > + ArmCallSmc (&SmcArgs); > + > + // We do not bother checking the error code of the RXTX_UNMAP invocation > + // since we did map the buffers and this call must succeed. > + return EFI_UNSUPPORTED; > } > > return Status;