From nobody Thu May 2 04:24:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+84602+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84602+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1639042381; cv=none; d=zohomail.com; s=zohoarc; b=Oyx7QdybBW2fivJrBUhh0Reokkqb2kxGEatxWsv0dBqdiWBOsf3zkaLJrX2ZoarRZWpFRTea0864NO/YLhFgFtifgxdPQBx3yeyO6c0VuKE0sZy5HwY6skhh/4aE0QQbRD10AYHmPyOOTY9AhSWEY71GpeyKrjavmU0dhLb/IXQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1639042381; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=Dvbg0YdXr/RaXV4E+EEhoym+XtBRJ7Ttq3yZubY6/vc=; b=MZdNyxJIi9P6UCIOTNW37GOUTn6ow8Oj1RJp9PZjD0zjXLxxmUtI7lWNjv/XR1aqKKGkZm1PJL7Dab8HHAeVjO2k/lf8JcpZ/bJ8Od2MlI/fxEr9GA/KeXRqlQU7dRmgO9MC0ld11nIYBWm5mok71LBhCueXSYUo2bSU03c6HGU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84602+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1639042381731279.40745428361276; Thu, 9 Dec 2021 01:33:01 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 22NMYY1788612xhUBPlrw26H; Thu, 09 Dec 2021 01:33:01 -0800 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web09.9543.1639042380655999130 for ; Thu, 09 Dec 2021 01:33:00 -0800 X-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 5B9AC1474; Thu, 9 Dec 2021 01:33:00 -0800 (PST) X-Received: from e126645.nice.arm.com (unknown [10.34.129.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 782703F73B; Thu, 9 Dec 2021 01:32:59 -0800 (PST) From: "PierreGondois" To: devel@edk2.groups.io Cc: Sami Mujawar , Alexei Fedorov Subject: [edk2-devel] [PATCH v3 1/5] DynamicTablesPkg: Definition for DynamicPlatRepoLib interface Date: Thu, 9 Dec 2021 10:32:47 +0100 Message-Id: <20211209093251.1249368-2-Pierre.Gondois@arm.com> In-Reply-To: <20211209093251.1249368-1-Pierre.Gondois@arm.com> References: <20211209093251.1249368-1-Pierre.Gondois@arm.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,pierre.gondois@arm.com X-Gm-Message-State: mv354GClsEEP9x9mWMnUapBpx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1639042381; bh=qw0D1Kx1lOLFUTL8zEs8F7auUxWWRRDgCjla3LjfmC4=; h=Cc:Date:From:Reply-To:Subject:To; b=w2VapI7I5k9t9siH5rSHzbz6J+LMuub2vzws8mWAOdwVqOoCDTULhNvYdrR4W2M9MAw h19U5NDmg68hQqTD+dAK0CzjKsG+LVCx8U/S09smhJhfuYm26i/bmzqIGg/xdMOg6jnk3 6tzabJXRlxA831O6kdWq+jxg+lNJpH0q5kc= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1639042383051100008 Content-Type: text/plain; charset="utf-8" From: Pierre Gondois The DynamicPlatRepoLib library allows to handle dynamically created CmObj. The dynamic platform repository can be in the following states: 1 - Non-initialised 2 - Transient: Possibility to add CmObj to the platform, but not to query them. 3 - Finalised: Possibility to query CmObj, but not to add new. A token is allocated to each CmObj added to the dynamic platform repository (except for reference tokens CmObj). This allows to retrieve dynamic CmObjs among all CmObj (static CmObj for instance). This patch defines the library interface of the DynamicPlatRepo. Signed-off-by: Pierre Gondois Reviewed-by: Sami Mujawar --- DynamicTablesPkg/DynamicTablesPkg.dec | 3 + .../Include/Library/DynamicPlatRepoLib.h | 114 ++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 DynamicTablesPkg/Include/Library/DynamicPlatRepoLib.h diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/Dynam= icTablesPkg.dec index 80a61dd2dbac..9b74c5a67178 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -24,6 +24,9 @@ [LibraryClasses] ## @libraryclass Defines a set of APIs for Dynamic AML generation. AmlLib|Include/Library/AmlLib/AmlLib.h =20 + ## @libraryclass Defines a set of APIs to handle dynamically created C= mObj. + DynamicPlatRepoLib|Include/Library/DynamicPlatRepoLib.h + ## @libraryclass Defines a set of APIs to a hardware information parse= r. HwInfoParserLib|Include/Library/HwInfoParserLib.h =20 diff --git a/DynamicTablesPkg/Include/Library/DynamicPlatRepoLib.h b/Dynami= cTablesPkg/Include/Library/DynamicPlatRepoLib.h new file mode 100644 index 000000000000..bb18215b08bc --- /dev/null +++ b/DynamicTablesPkg/Include/Library/DynamicPlatRepoLib.h @@ -0,0 +1,114 @@ +/** @file + Dynamic Platform Info Repository + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#ifndef DYNAMIC_PLAT_REPO_H_ +#define DYNAMIC_PLAT_REPO_H_ + +#include + +/** A structure describing the platform configuration + manager repository information +*/ +typedef VOID *DYNAMIC_PLATFORM_REPOSITORY_INFO; + +/** Add an object to the dynamic platform repository. + + @param [in] This This dynamic platform repository. + @param [in] CmObjDesc CmObj to add. The data is copied. + @param [out] Token If not NULL, token allocated to this CmObj. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_OUT_OF_RESOURCES An allocation has failed. +**/ +EFI_STATUS +EFIAPI +DynPlatRepoAddObject ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This, + IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc, + OUT CM_OBJECT_TOKEN *Token OPTIONAL + ); + +/** Finalise the dynamic repository. + + Finalising means: + - Preventing any further objects from being added. + - Allowing to get objects from the dynamic repository + (not possible before a call to this function). + + @param [in] This This dynamic platform repository. + + @retval EFI_SUCCESS Success. + @retval EFI_ALREADY_STARTED Instance already initialised. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_BUFFER_TOO_SMALL Buffer too small. + @retval EFI_OUT_OF_RESOURCES An allocation has failed. +**/ +EFI_STATUS +EFIAPI +DynamicPlatRepoFinalise ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This + ); + +/** Get a CmObj from the dynamic repository. + + @param [in] This Pointer to the Dynamic Platform Repository. + @param [in] CmObjectId The Configuration Manager Object ID. + @param [in] Token An optional token identifying the object. If + unused this must be CM_NULL_TOKEN. + @param [in, out] CmObjDesc Pointer to the Configuration Manager Object + descriptor describing the requested Object. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object information is not fou= nd. +**/ +EFI_STATUS +EFIAPI +DynamicPlatRepoGetObject ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This, + IN CM_OBJECT_ID CmObjectId, + IN CM_OBJECT_TOKEN Token OPTIONAL, + IN OUT CM_OBJ_DESCRIPTOR *CmObjDesc + ); + +/** Initialize the dynamic platform repository. + + @param [out] DynPlatRepo If success, contains the initialised dynamic + platform repository. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_OUT_OF_RESOURCES An allocation has failed. +**/ +EFI_STATUS +EFIAPI +DynamicPlatRepoInit ( + OUT DYNAMIC_PLATFORM_REPOSITORY_INFO **DynPlatRepo + ); + +/** Shutdown the dynamic platform repository. + + Free all the memory allocated for the dynamic platform repository. + + @param [in] DynPlatRepo The dynamic platform repository. + + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_SUCCESS Success. +**/ +EFI_STATUS +EFIAPI +DynamicPlatRepoShutdown ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *DynPlatRepo + ); + +#endif // DYNAMIC_PLAT_REPO_H_ --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#84602): https://edk2.groups.io/g/devel/message/84602 Mute This Topic: https://groups.io/mt/87608924/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 2 04:24:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+84603+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84603+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1639042383; cv=none; d=zohomail.com; s=zohoarc; b=L1BP0YK8g+FDa0lgAyaKGHIkeA31TIZhBCQS9NuW/vZvxK0A5CRvByfbaa3uppNCk1SxnLaENytpg3UC/5KzRgTmd0gBA9BWJKYrrgb9rmdRQKCjL6FBhaonT0Cj7ldTQ/7g5o4/e+IjZKeFlUfgApo9DUvgzoTK7uINgsICb6M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1639042383; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=S1jSvOdC4Oc3w/GVBei9a7H+nJCnYAEGOne3/zUWGH8=; b=ac9niGSq2HgIOT0V1+DyH+yIgA//DALssGR3QazZt2rsAvSCRqnbaLN+4qyxXJqtm99e6VXcAiQCHLFFPxBDsPlYqg31e5gjQEvZiN5scasMBZGgGmlBxz7B2GY63zCS278Ok4jwRqEI4XZjus7+BowfUtuY/MTsj0bsXuzCOjo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84603+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1639042383034697.4374510676473; Thu, 9 Dec 2021 01:33:03 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id gTYkYY1788612xn7VnT6iSdv; Thu, 09 Dec 2021 01:33:02 -0800 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.9276.1639042381947593976 for ; Thu, 09 Dec 2021 01:33:02 -0800 X-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 A1B1611FB; Thu, 9 Dec 2021 01:33:01 -0800 (PST) X-Received: from e126645.nice.arm.com (unknown [10.34.129.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id B01BB3F73B; Thu, 9 Dec 2021 01:33:00 -0800 (PST) From: "PierreGondois" To: devel@edk2.groups.io Cc: Sami Mujawar , Alexei Fedorov Subject: [edk2-devel] [PATCH v3 2/5] DynamicTablesPkg: DynamicPlatRepo: Add TokenGenerator Date: Thu, 9 Dec 2021 10:32:48 +0100 Message-Id: <20211209093251.1249368-3-Pierre.Gondois@arm.com> In-Reply-To: <20211209093251.1249368-1-Pierre.Gondois@arm.com> References: <20211209093251.1249368-1-Pierre.Gondois@arm.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,pierre.gondois@arm.com X-Gm-Message-State: n0hwbupFOSwYrqhU6MOPL6Ixx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1639042382; bh=DLNatd4h1mEDi5l4S1Ys4LRpvH60oslqqPXgVQ+XDoI=; h=Cc:Date:From:Reply-To:Subject:To; b=kmtfWYRie9F07oeOMsUxFKIOFRZwgWIWOJyQYGhQEUhfKr0aziLMIak7jpx4mRybtpJ h2QSOiD6AsPDT9qSCQWfIvnTtBDLzQ5gmm08yS4gHorgMUEaXAg5SVLtRFoA7xkLnoej4 HtenYXUikC7ukUhniJaSrNT44mLACGC/Op0= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1639042383554100011 Content-Type: text/plain; charset="utf-8" From: Pierre Gondois The DynamicPlatRepo library allows to handle dynamically created CmObj. The dynamic platform repository can be in the following states: 1 - Non-initialised 2 - Transient: Possibility to add CmObj to the platform, but not to query them. 3 - Finalised: Possibility to query CmObj, but not to add new. A token is allocated to each CmObj added to the dynamic platform repository (except for reference tokens CmObj). This allows to retrieve dynamic CmObjs among all CmObj (static CmObj for instance). This patch add the TokenGenerator files. Signed-off-by: Pierre Gondois Reviewed-by: Sami Mujawar --- .../DynamicPlatRepoLib/TokenGenerator.c | 29 +++++++++++++++++++ .../DynamicPlatRepoLib/TokenGenerator.h | 26 +++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Toke= nGenerator.c create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Toke= nGenerator.h diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenera= tor.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenerator.c new file mode 100644 index 000000000000..7033b5f1b5dd --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenerator.c @@ -0,0 +1,29 @@ +/** @file + Token Generator + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#include + +/** Generate a token. + + @return A token. +**/ +CM_OBJECT_TOKEN +EFIAPI +GenerateToken ( + VOID + ) +{ + // Start Tokens at 1 to avoid collisions with CM_NULL_TOKEN. + STATIC UINTN CurrentToken =3D 1; + + return (CM_OBJECT_TOKEN)(CurrentToken++); +} diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenera= tor.h b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenerator.h new file mode 100644 index 000000000000..44d32e5b41a1 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenerator.h @@ -0,0 +1,26 @@ +/** @file + Token Generator + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#ifndef TOKEN_GENERATOR_H_ +#define TOKEN_GENERATOR_H_ + +/** Generate a token. + + @return A token. +**/ +CM_OBJECT_TOKEN +EFIAPI +GenerateToken ( + VOID + ); + +#endif // TOKEN_GENERATOR_H_ --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#84603): https://edk2.groups.io/g/devel/message/84603 Mute This Topic: https://groups.io/mt/87608925/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 2 04:24:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+84604+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84604+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1639042384; cv=none; d=zohomail.com; s=zohoarc; b=CguRhmQuBiAzcQtZLkVorfy0MutySPjdurmvoJoe5nymfqulLNTw/UiWOjkXIJQQ4Camp84qk6X9UNSfrhmTtmQz20eFy5DoH+W+JmrR9PIy9wgVSTXC1HW+BxYPCbsrlI3eErrkjd3PlbzZbZl/ImRMHKzYJRXfwd3ys3YAhZk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1639042384; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=FCnHAGjXDfwVm6XF+ixhEwFlSGxlZTsmREkfOBKPamA=; b=GI6hyI4fqP0mrsTFOfWXyQnnVuZJ1iu9yxus0KLIw+Pxruabjde8LQfRlReKBoOrIIfCX0jyZQ2/77JvfbYTtno9J7IWkxBv2vYOcVfl0hqkFKG/8u8/NlJ6YrvU/sJmdUsPBg/Q6UsFnbPFrBDClUkNs3cp43VExD/st2yu/j4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84604+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 16390423842661023.2800323789116; Thu, 9 Dec 2021 01:33:04 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id oTOGYY1788612x4TvP9nPaZt; Thu, 09 Dec 2021 01:33:03 -0800 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web08.9312.1639042383338114117 for ; Thu, 09 Dec 2021 01:33:03 -0800 X-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 0655A1474; Thu, 9 Dec 2021 01:33:03 -0800 (PST) X-Received: from e126645.nice.arm.com (unknown [10.34.129.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 0CD803F73B; Thu, 9 Dec 2021 01:33:01 -0800 (PST) From: "PierreGondois" To: devel@edk2.groups.io Cc: Sami Mujawar , Alexei Fedorov Subject: [edk2-devel] [PATCH v3 3/5] DynamicTablesPkg: DynamicPlatRepo: Add TokenFixer Date: Thu, 9 Dec 2021 10:32:49 +0100 Message-Id: <20211209093251.1249368-4-Pierre.Gondois@arm.com> In-Reply-To: <20211209093251.1249368-1-Pierre.Gondois@arm.com> References: <20211209093251.1249368-1-Pierre.Gondois@arm.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,pierre.gondois@arm.com X-Gm-Message-State: nk7ruqiCtw5O0xjvOoXae09wx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1639042383; bh=n8wTgchTi9hBdJig3/V3Nu5NZTKi1wScDMzlCwFw/FQ=; h=Cc:Date:From:Reply-To:Subject:To; b=UGNcprFpwVM3QtOeoZ+GA7FDQUSBA+5ZjuLlOJLeStH5piH8fDJfXbswDb06C9eMDwy 6uHjToleXU3xaGnN+Cf9uGuK0tPYyzSkr4OQeS+7dKKGYo2jq1oBrCy5OrcqMdM9vV9ZL boUrc13keHUGCj+mucapwZK1xUPw0TNdJt0= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1639042385778100018 Content-Type: text/plain; charset="utf-8" From: Pierre Gondois The DynamicPlatRepo library allows to handle dynamically created CmObj. The dynamic platform repository can be in the following states: 1 - Non-initialised 2 - Transient: Possibility to add CmObj to the platform, but not to query them. 3 - Finalised: Possibility to query CmObj, but not to add new. A token is allocated to each CmObj added to the dynamic platform repository (except for reference tokens CmObj). This allows to retrieve dynamic CmObjs among all CmObj (static CmObj for instance). This patch add the TokenFixer files, allowing to update the self-token some CmObj have. Signed-off-by: Pierre Gondois Reviewed-by: Sami Mujawar --- .../DynamicPlatRepoLib/CmObjectTokenFixer.c | 165 ++++++++++++++++++ .../DynamicPlatRepoLib/CmObjectTokenFixer.h | 52 ++++++ 2 files changed, 217 insertions(+) create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmOb= jectTokenFixer.c create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmOb= jectTokenFixer.h diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTok= enFixer.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectToke= nFixer.c new file mode 100644 index 000000000000..80d0aa17bc1a --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer= .c @@ -0,0 +1,165 @@ +/** @file + Configuration Manager object token fixer + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#include +#include +#include "CmObjectTokenFixer.h" + +/** Token fixer not implemented. + + Most of the objects are not generated by this parser. Add the missing + functions when needed. + + CmObjectToken fixer function that updates the Tokens in the CmObjects. + + @param [in] CmObject Pointer to the Configuration Manager Object. + @param [in] Token Token to be updated in the CmObject. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Not supported. +**/ +STATIC +EFI_STATUS +EFIAPI +TokenFixerNotImplemented ( + IN CM_OBJ_DESCRIPTOR *CmObject, + IN CM_OBJECT_TOKEN Token + ) +{ + ASSERT (0); + return EFI_UNSUPPORTED; +} + +/** EArmObjItsGroup token fixer. + + CmObjectToken fixer function that updates the Tokens in the CmObjects. + + @param [in] CmObject Pointer to the Configuration Manager Object. + @param [in] Token Token to be updated in the CmObject. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Not supported. +**/ +STATIC +EFI_STATUS +EFIAPI +TokenFixerItsGroup ( + IN CM_OBJ_DESCRIPTOR *CmObject, + IN CM_OBJECT_TOKEN Token + ) +{ + ASSERT (CmObject !=3D NULL); + ((CM_ARM_ITS_GROUP_NODE *)CmObject)->Token =3D Token; + return EFI_SUCCESS; +} + +/** TokenFixer functions table. + + A CmObj having a CM_OBJECT_TOKEN field might need to have its + Token fixed. Each CmObj can have its Token in a specific way. +*/ +CONST +CM_OBJECT_TOKEN_FIXER TokenFixer[EArmObjMax] =3D { + NULL, ///< 0 - Reserved + NULL, ///< 1 - Boot Architecture Info + NULL, ///< 2 - CPU Info + NULL, ///< 3 - Power Management Profile Info + NULL, ///< 4 - GIC CPU Interface Info + NULL, ///< 5 - GIC Distributor Info + NULL, ///< 6 - GIC MSI Frame Info + NULL, ///< 7 - GIC Redistributor Info + NULL, ///< 8 - GIC ITS Info + NULL, ///< 9 - Serial Console Port Info + NULL, ///< 10 - Serial Debug Port Info + NULL, ///< 11 - Generic Timer Info + NULL, ///< 12 - Platform GT Block Info + NULL, ///< 13 - Generic Timer Block Frame In= fo + NULL, ///< 14 - Platform Generic Watchdog + NULL, ///< 15 - PCI Configuration Space Info + NULL, ///< 16 - Hypervisor Vendor Id + NULL, ///< 17 - Fixed feature flags for FADT + TokenFixerItsGroup, ///< 18 - ITS Group + TokenFixerNotImplemented, ///< 19 - Named Component + TokenFixerNotImplemented, ///< 20 - Root Complex + TokenFixerNotImplemented, ///< 21 - SMMUv1 or SMMUv2 + TokenFixerNotImplemented, ///< 22 - SMMUv3 + TokenFixerNotImplemented, ///< 23 - PMCG + NULL, ///< 24 - GIC ITS Identifier Array + NULL, ///< 25 - ID Mapping Array + NULL, ///< 26 - SMMU Interrupt Array + TokenFixerNotImplemented, ///< 27 - Processor Hierarchy Info + TokenFixerNotImplemented, ///< 28 - Cache Info + TokenFixerNotImplemented, ///< 29 - Processor Node ID Info + NULL, ///< 30 - CM Object Reference + NULL, ///< 31 - Memory Affinity Info + NULL, ///< 32 - Device Handle Acpi + NULL, ///< 33 - Device Handle Pci + NULL, ///< 34 - Generic Initiator Affinity + NULL, ///< 35 - Generic Serial Port Info + NULL, ///< 36 - CMN-600 Info + NULL, ///< 37 - Lpi Info + NULL, ///< 38 - Pci Address Map Info + NULL, ///< 39 - Pci Interrupt Map Info +}; + +/** CmObj token fixer. + + Some CmObj structures have a self-token, i.e. they are storing their own + token value in the CmObj. Dynamically created CmObj need to have their + self-token assigned at some point. + + @param [in] CmObjDesc Pointer to the Configuration Manager Object. + @param [in] Token Token to update the CmObjDesc with. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Not supported. +**/ +EFI_STATUS +EFIAPI +FixupCmObjectSelfToken ( + IN CM_OBJ_DESCRIPTOR *CmObjDesc, + IN CM_OBJECT_TOKEN Token + ) +{ + EFI_STATUS Status; + CM_OBJECT_TOKEN_FIXER TokenFixerFunc; + CM_OBJECT_ID ArmNamespaceObjId; + + // Only support Arm objects for now. + if ((CmObjDesc =3D=3D NULL) || + (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) !=3D EObjNameSpaceArm)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + ArmNamespaceObjId =3D GET_CM_OBJECT_ID (CmObjDesc->ObjectId); + if (ArmNamespaceObjId >=3D EArmObjMax) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Fixup self-token if necessary. + TokenFixerFunc =3D TokenFixer[ArmNamespaceObjId]; + if (TokenFixerFunc !=3D NULL) { + Status =3D TokenFixerFunc (CmObjDesc, Token); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + } + + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTok= enFixer.h b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectToke= nFixer.h new file mode 100644 index 000000000000..33f4b045190d --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer= .h @@ -0,0 +1,52 @@ +/** @file + Configuration Manager object token fixer + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#ifndef CM_OBJECT_TOKEN_FIXER_H_ +#define CM_OBJECT_TOKEN_FIXER_H_ + +/** CmObjectToken fixer function that updates the Tokens in the CmObjects. + + @param [in] CmObject Pointer to the Configuration Manager Object. + @param [in] Token Token to be updated in the CmObject. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Not supported. +**/ +typedef +EFI_STATUS +(EFIAPI *CM_OBJECT_TOKEN_FIXER)( + IN CM_OBJ_DESCRIPTOR *CmObject, + IN CM_OBJECT_TOKEN Token + ); + +/** CmObj token fixer. + + Some CmObj structures have a self-token, i.e. they are storing their own + token value in the CmObj. Dynamically created CmObj need to have their + self-token assigned at some point. + + @param [in] CmObjDesc Pointer to the Configuration Manager Object. + @param [in] Token Token to update the CmObjDesc with. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Not supported. +**/ +EFI_STATUS +EFIAPI +FixupCmObjectSelfToken ( + IN CM_OBJ_DESCRIPTOR *CmObjDesc, + IN CM_OBJECT_TOKEN Token + ); + +#endif // CM_OBJECT_TOKEN_FIXER_H_ --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#84604): https://edk2.groups.io/g/devel/message/84604 Mute This Topic: https://groups.io/mt/87608926/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 2 04:24:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+84605+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84605+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1639042385; cv=none; d=zohomail.com; s=zohoarc; b=BbzaXCgLI7HJzvfltuKLH3FgT42vJ7x7smK4BhhPXDGMQxNRhTRPAw+NNOhV5pYstUcDsYh1fHIOhSNpNGKAOZrh0a+BmspixjBr/G+17GOiMccycgaWfThCyzC2SlR8pmJFJtZV5y+c9RcV4fb2HJcKWpKvi4Kr30pe7Tr0Po8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1639042385; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=4P/NabWCOro0mre3C/DlETMbkq+u+AQDbu5o6AqIjYM=; b=EX3YsfupUZ1m9N0DehX9MJn9KpuZBx4elnGxhIgkF9ZTxHjYRslXSS5jiscnhNGDwJQmKxLDYSEz+3iuOawXLBab3zlFAe26U5uPMPibCBPoYi/QYFw5pm1R9NcN2M/Aun5waBkGT9J8CAeVukRdFx098s64MMsppioeCgLAtrg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84605+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1639042385586876.7448761606132; Thu, 9 Dec 2021 01:33:05 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 18AeYY1788612xeSp1ftUGNg; Thu, 09 Dec 2021 01:33:05 -0800 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.9486.1639042384549523933 for ; Thu, 09 Dec 2021 01:33:04 -0800 X-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 35A3E1476; Thu, 9 Dec 2021 01:33:04 -0800 (PST) X-Received: from e126645.nice.arm.com (unknown [10.34.129.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 44C1A3F73B; Thu, 9 Dec 2021 01:33:03 -0800 (PST) From: "PierreGondois" To: devel@edk2.groups.io Cc: Sami Mujawar , Alexei Fedorov Subject: [edk2-devel] [PATCH v3 4/5] DynamicTablesPkg: DynamicPlatRepo: Add TokenMapper Date: Thu, 9 Dec 2021 10:32:50 +0100 Message-Id: <20211209093251.1249368-5-Pierre.Gondois@arm.com> In-Reply-To: <20211209093251.1249368-1-Pierre.Gondois@arm.com> References: <20211209093251.1249368-1-Pierre.Gondois@arm.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,pierre.gondois@arm.com X-Gm-Message-State: bY9qWxw63v9cZa93iY8t1dFSx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1639042385; bh=PLgg5WQECcVVpKNA+Zz2imITMEO2SREMylyw0tDav1c=; h=Cc:Date:From:Reply-To:Subject:To; b=bXT3u58DMJOWSWD+y0W7GVxPfbJKMBlcSRBOR9Sd0Y6l70aNoe4aSU6MFMfmC/SCdAD /OjX/ytg0SavCmD7KKbZirURldzs40pSbbjYBOk+l7Q8QWJstAWEpjyCeBZz5T5krtSbi Ewhb+cQZNNmYQe6bDmllTKNt/3RqUtsLdzA= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1639042386081100022 Content-Type: text/plain; charset="utf-8" From: Pierre Gondois The DynamicPlatRepo library allows to handle dynamically created CmObj. The dynamic platform repository can be in the following states: 1 - Non-initialised 2 - Transient: Possibility to add CmObj to the platform, but not to query them. 3 - Finalised: Possibility to query CmObj, but not to add new. A token is allocated to each CmObj added to the dynamic platform repository (except for reference tokens CmObj). This allows to retrieve dynamic CmObjs among all CmObj (static CmObj for instance). This patch add the TokenMapper files, allowing to retrieve a CmObj from a token/CmObjId couple. Signed-off-by: Pierre Gondois Reviewed-by: Sami Mujawar --- .../Common/DynamicPlatRepoLib/TokenMapper.c | 224 ++++++++++++++++++ .../Common/DynamicPlatRepoLib/TokenMapper.h | 123 ++++++++++ 2 files changed, 347 insertions(+) create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Toke= nMapper.c create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Toke= nMapper.h diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper= .c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.c new file mode 100644 index 000000000000..9391e935eee0 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.c @@ -0,0 +1,224 @@ +/** @file + Token Mapper + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#include +#include +#include +#include + +#include "TokenMapper.h" + +/** Add a CmObjDesc to the TokenMapper. + + @param [in] TokenMapper The TokenMapper instance. + @param [in] Token CmObj token. + @param [in] ObjectId CmObj ObjectId. + @param [in] Size CmObj Size. + @param [in] Data CmObj Data. + This memory is referenced, not copied. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_BUFFER_TOO_SMALL Buffer too small. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +TokenMapperAddObject ( + IN TOKEN_MAPPER *TokenMapper, + IN CM_OBJECT_TOKEN Token, + IN CM_OBJECT_ID ObjectId, + IN UINT32 Size, + IN VOID *Data + ) +{ + TOKEN_MAP_DESCRIPTOR *TokenMapDesc; + CM_OBJ_DESCRIPTOR *CmObjDesc; + + if ((TokenMapper =3D=3D NULL) || + (TokenMapper->TokenDescArray =3D=3D NULL) || + (Size =3D=3D 0) || + (Data =3D=3D NULL)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + if (TokenMapper->ItemCount >=3D TokenMapper->MaxTokenDescCount) { + ASSERT (0); + return EFI_BUFFER_TOO_SMALL; + } + + TokenMapDesc =3D &TokenMapper->TokenDescArray[TokenMapper->ItemCo= unt++]; + TokenMapDesc->Token =3D Token; + CmObjDesc =3D &TokenMapDesc->CmObjDesc; + CmObjDesc->ObjectId =3D ObjectId; + CmObjDesc->Size =3D Size; + + // Point inside the finalized array. + CmObjDesc->Data =3D Data; + + // Only EArmObjCmRef CmObj can be added as arrays (more than 1 elements). + if ((GET_CM_NAMESPACE_ID (ObjectId) =3D=3D EObjNameSpaceArm) && + (GET_CM_OBJECT_ID (ObjectId) =3D=3D EArmObjCmRef)) + { + CmObjDesc->Count =3D Size / sizeof (CM_ARM_OBJ_REF); + } else { + CmObjDesc->Count =3D 1; + } + + return EFI_SUCCESS; +} + +/** Get a CmObjDesc from a ObjectId/Token couple. + + The Token parameter is not optional. An existing token must be provided. + + @param [in] TokenMapper The TokenMapper instance. + @param [in] Token Token of the CmObj to search. + @param [in] ObjectId Object Id of the CmObj to search. + @param [out] CmObjDesc CM_OBJ_DESCRIPTOR containing the CmObj search= ed. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Not found. +**/ +EFI_STATUS +EFIAPI +TokenMapperGetObject ( + IN TOKEN_MAPPER *TokenMapper, + IN CM_OBJECT_TOKEN Token, + IN CM_OBJECT_ID ObjectId, + OUT CM_OBJ_DESCRIPTOR *CmObjDesc + ) +{ + UINTN Index; + UINTN MaxCount; + TOKEN_MAP_DESCRIPTOR *TokenMapDesc; + + // Nothing to do. + if ((TokenMapper !=3D NULL) && (TokenMapper->MaxTokenDescCount =3D=3D 0)= ) { + goto exit_handler; + } + + if ((Token =3D=3D CM_NULL_TOKEN) || + (CmObjDesc =3D=3D NULL) || + (TokenMapper =3D=3D NULL) || + (TokenMapper->TokenDescArray =3D=3D NULL)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + TokenMapDesc =3D TokenMapper->TokenDescArray; + MaxCount =3D TokenMapper->MaxTokenDescCount; + for (Index =3D 0; Index < MaxCount; Index++) { + if ((TokenMapDesc->CmObjDesc.ObjectId =3D=3D ObjectId) && + (TokenMapDesc->Token =3D=3D Token)) + { + CopyMem ( + CmObjDesc, + &TokenMapDesc->CmObjDesc, + sizeof (CM_OBJ_DESCRIPTOR) + ); + return EFI_SUCCESS; + } + + TokenMapDesc++; + } // for + +exit_handler: + DEBUG (( + DEBUG_INFO, + "INFO: Requested CmObj of type 0x%x with token 0x%x" + " not found in the dynamic repository\n.", + ObjectId, + Token + )); + return EFI_NOT_FOUND; +} + +/** Initialise a TokenMapper. + + @param [in] TokenMapper The TokenMapper to initialise. + @param [in] DescriptorCount Number of entries to allocate. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ALREADY_STARTED Instance already initialised. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +TokenMapperInitialise ( + IN TOKEN_MAPPER *TokenMapper, + IN UINTN DescriptorCount + ) +{ + if (TokenMapper =3D=3D NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Nothing to do. + if (DescriptorCount =3D=3D 0) { + return EFI_SUCCESS; + } + + if (TokenMapper->TokenDescArray !=3D NULL) { + DEBUG ((DEBUG_ERROR, "ERROR: Token mapper already initialised\n.")); + ASSERT (0); + return EFI_ALREADY_STARTED; + } + + TokenMapper->TokenDescArray =3D + AllocateZeroPool (sizeof (TOKEN_MAP_DESCRIPTOR) * DescriptorCount); + if (TokenMapper->TokenDescArray =3D=3D NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + TokenMapper->MaxTokenDescCount =3D DescriptorCount; + TokenMapper->ItemCount =3D 0; + + return EFI_SUCCESS; +} + +/** Shutdown a TokenMapper. + + @param [in] TokenMapper The TokenMapper to shutdown. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +TokenMapperShutdown ( + IN TOKEN_MAPPER *TokenMapper + ) +{ + // Nothing to do. + if ((TokenMapper !=3D NULL) && (TokenMapper->MaxTokenDescCount =3D=3D 0)= ) { + return EFI_SUCCESS; + } + + if ((TokenMapper =3D=3D NULL) || + (TokenMapper->TokenDescArray =3D=3D NULL)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + FreePool (TokenMapper->TokenDescArray); + TokenMapper->TokenDescArray =3D NULL; + TokenMapper->MaxTokenDescCount =3D 0; + + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper= .h b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.h new file mode 100644 index 000000000000..a7b1590903b3 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.h @@ -0,0 +1,123 @@ +/** @file + Token Mapper + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#ifndef TOKEN_MAPPER_H_ +#define TOKEN_MAPPER_H_ + +#pragma pack(1) + +/** Token mapping descriptor. + + Bind a token and a CmObj together. +*/ +typedef struct TokenMapDescriptor { + /// Object Token. + CM_OBJECT_TOKEN Token; + + /// CmObjectDescriptor CM_OBJ_DESCRIPTOR.Data is a reference copy + /// and not allocated. It points to the individual objects in the + /// Dynamic Plat Repo ArmNameSpaceObjectArray. + CM_OBJ_DESCRIPTOR CmObjDesc; +} TOKEN_MAP_DESCRIPTOR; + +/** Token mapper. + + Contain all the Token/CmObj couple mapping. +**/ +typedef struct TokenMapper { + /// Maximum number of TOKEN_MAP_DESCRIPTOR entries in TokenDescArray. + UINTN MaxTokenDescCount; + + /// Next TOKEN_MAP_DESCRIPTOR entry to use in TokenDescArray. + UINTN ItemCount; + + /// Array of TOKEN_MAP_DESCRIPTOR. + TOKEN_MAP_DESCRIPTOR *TokenDescArray; +} TOKEN_MAPPER; + +#pragma pack() + +/** Add a CmObjDesc to the TokenMapper. + + @param [in] TokenMapper The TokenMapper instance. + @param [in] Token CmObj token. + @param [in] ObjectId CmObj ObjectId. + @param [in] Size CmObj Size. + @param [in] Data CmObj Data. + This memory is referenced, not copied. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_BUFFER_TOO_SMALL Buffer too small. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +TokenMapperAddObject ( + IN TOKEN_MAPPER *TokenMapper, + IN CM_OBJECT_TOKEN Token, + IN CM_OBJECT_ID ObjectId, + IN UINT32 Size, + IN VOID *Data + ); + +/** Get a CmObjDesc from a ObjectId/Token couple. + + The Token parameter is not optional. An existing token must be provided. + + @param [in] TokenMapper The TokenMapper instance. + @param [in] Token Token of the CmObj to search. + @param [in] ObjectId Object Id of the CmObj to search. + @param [out] CmObjDesc CM_OBJ_DESCRIPTOR containing the CmObj search= ed. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Not found. +**/ +EFI_STATUS +EFIAPI +TokenMapperGetObject ( + IN TOKEN_MAPPER *TokenMapper, + IN CM_OBJECT_TOKEN Token, + IN CM_OBJECT_ID ObjectId, + OUT CM_OBJ_DESCRIPTOR *CmObjDesc + ); + +/** Initialise a TokenMapper. + + @param [in] TokenMapper The TokenMapper to initialise. + @param [in] DescriptorCount Number of entries to allocate. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ALREADY_STARTED Instance already initialised. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +TokenMapperInitialise ( + IN TOKEN_MAPPER *TokenMapper, + IN UINTN DescriptorCount + ); + +/** Shutdown a TokenMapper. + + @param [in] TokenMapper The TokenMapper to shutdown. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +TokenMapperShutdown ( + IN TOKEN_MAPPER *TokenMapper + ); + +#endif // TOKEN_MAPPER_H_ --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#84605): https://edk2.groups.io/g/devel/message/84605 Mute This Topic: https://groups.io/mt/87608927/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Thu May 2 04:24:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+84606+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84606+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1639042386; cv=none; d=zohomail.com; s=zohoarc; b=GBiSdP1ST1Nb/qXv+Z1c/uWk1Rqot+1hVEQtgCd9Ui4LK5fsNOvKKBYcoH4VZrzewrX8VGAmh75YoErfMQmyijbnf2IJpZWJTld1WQOBwTO+hV/QUu1DmgVq3UWQ+B6i03jij4uboR/9KsdBOdWWxMFe+Or7RiMf/tVPkP7Q8ZM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1639042386; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=3eSQoo1cs3HiI8HSdP3nu2MzNiVRgwznP4A+fDv3YDM=; b=ifoLA5RLacb31yYMkgda99hIQ2dM1hip/e0vOtpfcZfbtx4hiZFpjiGdgX2wxZtnqeQNqxsrb2tCgcp8wJlRHFDJkge6QUpnKn9ereVR/k3mVK6oI+XC/q7JmaXvfgebreP2aNTQb2g1QYbBfMqdYC2ZPx9/Cf4A717pPgEL+ZE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+84606+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1639042386974218.1316631331399; Thu, 9 Dec 2021 01:33:06 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id mpWOYY1788612xxrRx5tNcGE; Thu, 09 Dec 2021 01:33:06 -0800 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web09.9545.1639042385895066617 for ; Thu, 09 Dec 2021 01:33:06 -0800 X-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 94C251474; Thu, 9 Dec 2021 01:33:05 -0800 (PST) X-Received: from e126645.nice.arm.com (unknown [10.34.129.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 7C8B83F73B; Thu, 9 Dec 2021 01:33:04 -0800 (PST) From: "PierreGondois" To: devel@edk2.groups.io Cc: Sami Mujawar , Alexei Fedorov Subject: [edk2-devel] [PATCH v3 5/5] DynamicTablesPkg: Add DynamicPlatRepo library Date: Thu, 9 Dec 2021 10:32:51 +0100 Message-Id: <20211209093251.1249368-6-Pierre.Gondois@arm.com> In-Reply-To: <20211209093251.1249368-1-Pierre.Gondois@arm.com> References: <20211209093251.1249368-1-Pierre.Gondois@arm.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,pierre.gondois@arm.com X-Gm-Message-State: PqkMR4OdmXmklNSiI7ARTrdGx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1639042386; bh=x1M66fKSGsVkVNQMquzizXTvga47c1Lp22mqHXBgr1Q=; h=Cc:Date:From:Reply-To:Subject:To; b=souHWHgEdd3BXzZ9QtjLG0eD+S8IzHc6MkJRDxfNs8tMQwdq6aFtffGHGHGLCaQpyla tpm0Z9wSwKhDLWwPcU7ePx7zOscjv1ac1k4awmORoEEUX3XV1oURDbIQQYpsJs6P7mjTk A+8AT8Y4pXWaPx1tYB918TGNP1mti9CW/DE= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1639042388395100002 Content-Type: text/plain; charset="utf-8" From: Pierre Gondois The DynamicPlatRepo library allows to handle dynamically created CmObj. The dynamic platform repository can be in the following states: 1 - Non-initialised 2 - Transient: Possibility to add CmObj to the platform, but not to query them. 3 - Finalised: Possibility to query CmObj, but not to add new. A token is allocated to each CmObj added to the dynamic platform repository (except for reference tokens CmObj). This allows to retrieve dynamic CmObjs among all CmObj (static CmObj for instance). This patch add the inf file of the module and the main module functionnalities and update the dsc file of the package. Signed-off-by: Pierre Gondois Reviewed-by: Sami Mujawar --- DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + .../DynamicPlatRepoLib/DynamicPlatRepo.c | 521 ++++++++++++++++++ .../DynamicPlatRepoInternal.h | 78 +++ .../DynamicPlatRepoLib/DynamicPlatRepoLib.inf | 33 ++ 4 files changed, 633 insertions(+) create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Dyna= micPlatRepo.c create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Dyna= micPlatRepoInternal.h create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Dyna= micPlatRepoLib.inf diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/Dynam= icTablesPkg.dsc index a2a1b8d004d2..068f0bc63080 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -44,6 +44,7 @@ [Components.common] DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFix= upLib.inf DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf + DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoLib.inf =20 [BuildOptions] *_*_*_CC_FLAGS =3D -D DISABLE_NEW_DEPRECATED_INTERFACES diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlat= Repo.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo= .c new file mode 100644 index 000000000000..bc713f30b2fe --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c @@ -0,0 +1,521 @@ +/** @file + Dynamic Platform Info Repository + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#include +#include +#include +#include +#include + +#include "CmObjectTokenFixer.h" +#include "DynamicPlatRepoInternal.h" +#include "TokenGenerator.h" + +/** Allocate a CM_OBJ_NODE. + + @param [in] CmObjDesc CmObj to wrap in a node. + All the fields of the CmObj (Data field included= ), + are copied. + @param [in] Token Token to assign to this CmObj/node. + @param [out] ObjNode Allocated ObjNode. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_OUT_OF_RESOURCES An allocation has failed. +**/ +STATIC +EFI_STATUS +EFIAPI +AllocCmObjNode ( + IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc, + IN CM_OBJECT_TOKEN Token, + OUT CM_OBJ_NODE **ObjNode + ) +{ + CM_OBJ_NODE *Node; + CM_OBJ_DESCRIPTOR *Desc; + + if ((CmObjDesc =3D=3D NULL) || (ObjNode =3D=3D NULL)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Node =3D AllocateZeroPool (sizeof (CM_OBJ_NODE)); + if (Node =3D=3D NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + // Initialise the list head. + InitializeListHead (&Node->Link); + Node->Token =3D Token; + Desc =3D &Node->CmObjDesc; + Desc->ObjectId =3D CmObjDesc->ObjectId; + Desc->Size =3D CmObjDesc->Size; + Desc->Count =3D CmObjDesc->Count; + + // Allocate and copy the CmObject Data. + Desc->Data =3D AllocateCopyPool (CmObjDesc->Size, CmObjDesc->Data); + if (Desc->Data =3D=3D NULL) { + FreePool (Node); + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + *ObjNode =3D Node; + return EFI_SUCCESS; +} + +/** Free a CM_OBJ_NODE. + + @param [in] ObjNode ObjNode to free. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +STATIC +EFI_STATUS +EFIAPI +FreeCmObjNode ( + IN CM_OBJ_NODE *ObjNode + ) +{ + CM_OBJ_DESCRIPTOR *Desc; + + if (ObjNode =3D=3D NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Unlink Node + RemoveEntryList (&ObjNode->Link); + + Desc =3D &ObjNode->CmObjDesc; + if (Desc->Data !=3D NULL) { + FreePool (Desc->Data); + } + + FreePool (ObjNode); + return EFI_SUCCESS; +} + +/** Add an object to the dynamic platform repository. + + @param [in] This This dynamic platform repository. + @param [in] CmObjDesc CmObj to add. The data is copied. + @param [out] Token If not NULL, token allocated to this CmObj. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_OUT_OF_RESOURCES An allocation has failed. +**/ +EFI_STATUS +EFIAPI +DynPlatRepoAddObject ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This, + IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc, + OUT CM_OBJECT_TOKEN *Token OPTIONAL + ) +{ + EFI_STATUS Status; + CM_OBJ_NODE *ObjNode; + CM_OBJECT_ID ArmNamespaceObjId; + CM_OBJECT_TOKEN NewToken; + + // The dynamic repository must be able to receive objects. + if ((This =3D=3D NULL) || + (CmObjDesc =3D=3D NULL) || + (This->RepoState !=3D DynRepoTransient)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Check the CmObjDesc: + // - only Arm objects are supported for now. + // - only EArmObjCmRef objects can be added as arrays. + ArmNamespaceObjId =3D GET_CM_OBJECT_ID (CmObjDesc->ObjectId); + if ((CmObjDesc->Size =3D=3D 0) || + (CmObjDesc->Count =3D=3D 0) || + (ArmNamespaceObjId >=3D EArmObjMax) || + ((CmObjDesc->Count > 1) && (ArmNamespaceObjId !=3D EArmObjCmRef)) = || + (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) !=3D EObjNameSpaceArm)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Generate a token. + NewToken =3D GenerateToken (); + + // Create an ObjNode. + Status =3D AllocCmObjNode (CmObjDesc, NewToken, &ObjNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // Fixup self-token if necessary. + Status =3D FixupCmObjectSelfToken (&ObjNode->CmObjDesc, NewToken); + if (EFI_ERROR (Status)) { + FreeCmObjNode (ObjNode); + ASSERT (0); + return Status; + } + + // Add to link list. + InsertTailList (&This->ArmCmObjList[ArmNamespaceObjId], &ObjNode->Link); + This->ObjectCount +=3D 1; + + if (Token !=3D NULL) { + *Token =3D NewToken; + } + + return EFI_SUCCESS; +} + +/** Group lists of CmObjNode from the ArmNameSpace to one array. + + @param [in] This This dynamic platform repository. + @param [in] ArmObjIndex Index in EARM_OBJECT_ID + (must be < EArmObjMax). + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_BUFFER_TOO_SMALL Buffer too small. + @retval EFI_OUT_OF_RESOURCES An allocation has failed. +**/ +STATIC +EFI_STATUS +EFIAPI +GroupCmObjNodes ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This, + IN UINT32 ArmObjIndex + ) +{ + EFI_STATUS Status; + UINTN Count; + UINTN Size; + UINT32 CmObjId; + UINT8 *GroupedData; + UINT8 *Data; + CM_OBJ_DESCRIPTOR *CmObjDesc; + LIST_ENTRY *ListHead; + LIST_ENTRY *Link; + + if ((This =3D=3D NULL) || + (ArmObjIndex >=3D EArmObjMax)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Count =3D 0; + Size =3D 0; + CmObjId =3D CREATE_CM_ARM_OBJECT_ID (ArmObjIndex); + ListHead =3D &This->ArmCmObjList[ArmObjIndex]; + Link =3D GetFirstNode (ListHead); + + // Compute the total count and size of the CmObj in the list. + while (Link !=3D ListHead) { + CmObjDesc =3D &((CM_OBJ_NODE *)Link)->CmObjDesc; + + if (CmObjDesc->ObjectId !=3D CmObjId) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + if ((CmObjDesc->Count !=3D 1) && (ArmObjIndex !=3D EArmObjCmRef)) { + // We expect each descriptor to contain an individual object. + // EArmObjCmRef objects are counted as groups, so +1 as well. + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Count++; + Size +=3D CmObjDesc->Size; + + // Next Link + Link =3D GetNextNode (ListHead, Link); + } // while + + if (Count =3D=3D 0) { + // No objects found. + return EFI_SUCCESS; + } + + GroupedData =3D AllocateZeroPool (Size); + if (GroupedData =3D=3D NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + // Copy the Object Data and add to the TokenMapper. + Data =3D GroupedData; + Link =3D GetFirstNode (ListHead); + while (Link !=3D ListHead) { + CmObjDesc =3D &((CM_OBJ_NODE *)Link)->CmObjDesc; + CopyMem (Data, CmObjDesc->Data, CmObjDesc->Size); + + // Add the object to the Token Mapper. + // Note: The CmObject Data field of objects in the Token Mapper point + // to the memory in the GroupedData array. + Status =3D TokenMapperAddObject ( + &This->TokenMapper, + ((CM_OBJ_NODE *)Link)->Token, + CmObjDesc->ObjectId, + CmObjDesc->Size, + Data + ); + if (EFI_ERROR (Status)) { + FreePool (GroupedData); + return Status; + } + + Data +=3D CmObjDesc->Size; + Link =3D GetNextNode (ListHead, Link); + } // while + + CmObjDesc =3D &This->ArmCmObjArray[ArmObjIndex]; + CmObjDesc->ObjectId =3D CmObjId; + CmObjDesc->Size =3D Size; + CmObjDesc->Count =3D Count; + CmObjDesc->Data =3D GroupedData; + + return Status; +} + +/** Finalise the dynamic repository. + + Finalising means: + - Preventing any further objects from being added. + - Allowing to get objects from the dynamic repository + (not possible before a call to this function). + + @param [in] This This dynamic platform repository. + + @retval EFI_SUCCESS Success. + @retval EFI_ALREADY_STARTED Instance already initialised. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_BUFFER_TOO_SMALL Buffer too small. + @retval EFI_OUT_OF_RESOURCES An allocation has failed. +**/ +EFI_STATUS +EFIAPI +DynamicPlatRepoFinalise ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This + ) +{ + EFI_STATUS Status; + UINTN ArmObjIndex; + + if ((This =3D=3D NULL) || + (This->RepoState !=3D DynRepoTransient)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Prevent any further objects from being added. + This->RepoState =3D DynRepoFinalized; + + // Initialise the token mapper. + Status =3D TokenMapperInitialise (&This->TokenMapper, This->ObjectCount); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // For each CM_OBJECT_ID: + // - Convert the list of nodes to an array + // (the array is wrapped in a CmObjDesc). + // - Add the Token/CmObj binding to the token mapper. + for (ArmObjIndex =3D 0; ArmObjIndex < EArmObjMax; ArmObjIndex++) { + Status =3D GroupCmObjNodes (This, ArmObjIndex); + if (EFI_ERROR (Status)) { + ASSERT (0); + // Free the TokenMapper. + // Ignore the returned Status since we already failed. + TokenMapperShutdown (&This->TokenMapper); + return Status; + } + } // for + + return EFI_SUCCESS; +} + +/** Get a CmObj from the dynamic repository. + + @param [in] This Pointer to the Dynamic Platform Repository. + @param [in] CmObjectId The Configuration Manager Object ID. + @param [in] Token An optional token identifying the object. If + unused this must be CM_NULL_TOKEN. + @param [in, out] CmObjDesc Pointer to the Configuration Manager Object + descriptor describing the requested Object. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object information is not fou= nd. +**/ +EFI_STATUS +EFIAPI +DynamicPlatRepoGetObject ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This, + IN CM_OBJECT_ID CmObjectId, + IN CM_OBJECT_TOKEN Token OPTIONAL, + IN OUT CM_OBJ_DESCRIPTOR *CmObjDesc + ) +{ + EFI_STATUS Status; + CM_OBJ_DESCRIPTOR *Desc; + CM_OBJECT_ID ArmNamespaceObjId; + + if ((This =3D=3D NULL) || + (CmObjDesc =3D=3D NULL) || + (This->RepoState !=3D DynRepoFinalized)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + ArmNamespaceObjId =3D GET_CM_OBJECT_ID (CmObjectId); + if (ArmNamespaceObjId >=3D EArmObjMax) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + if (Token !=3D CM_NULL_TOKEN) { + // Search in the Token Mapper and return the object. + Status =3D TokenMapperGetObject ( + &This->TokenMapper, + Token, + CmObjectId, + CmObjDesc + ); + ASSERT_EFI_ERROR (Status); + return Status; + } + + if (ArmNamespaceObjId =3D=3D EArmObjCmRef) { + // EArmObjCmRef object must be requested using a valid token. + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Desc =3D &This->ArmCmObjArray[ArmNamespaceObjId]; + + // Nothing here. + if (Desc->Count =3D=3D 0) { + return EFI_NOT_FOUND; + } else { + // Return the full array. + CmObjDesc->ObjectId =3D Desc->ObjectId; + CmObjDesc->Size =3D Desc->Size; + CmObjDesc->Data =3D Desc->Data; + CmObjDesc->Count =3D Desc->Count; + } + + return EFI_SUCCESS; +} + +/** Initialize the dynamic platform repository. + + @param [out] DynPlatRepo If success, contains the initialised dynamic + platform repository. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_OUT_OF_RESOURCES An allocation has failed. +**/ +EFI_STATUS +EFIAPI +DynamicPlatRepoInit ( + OUT DYNAMIC_PLATFORM_REPOSITORY_INFO **DynPlatRepo + ) +{ + UINTN Index; + DYNAMIC_PLATFORM_REPOSITORY_INFO *Repo; + + if (DynPlatRepo =3D=3D NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Repo =3D AllocateZeroPool (sizeof (DYNAMIC_PLATFORM_REPOSITORY_INFO)); + if (Repo =3D=3D NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + // Initialise the CmObject List. + for (Index =3D 0; Index < EArmObjMax; Index++) { + InitializeListHead (&Repo->ArmCmObjList[Index]); + } + + Repo->ObjectCount =3D 0; + Repo->RepoState =3D DynRepoTransient; + + *DynPlatRepo =3D Repo; + + return EFI_SUCCESS; +} + +/** Shutdown the dynamic platform repository. + + Free all the memory allocated for the dynamic platform repository. + + @param [in] DynPlatRepo The dynamic platform repository. + + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_SUCCESS Success. +**/ +EFI_STATUS +EFIAPI +DynamicPlatRepoShutdown ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *DynPlatRepo + ) +{ + EFI_STATUS Status; + UINT32 Index; + LIST_ENTRY *ListHead; + CM_OBJ_DESCRIPTOR *CmObjDesc; + VOID *Data; + + if (DynPlatRepo =3D=3D NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Free the list of objects. + for (Index =3D 0; Index < EArmObjMax; Index++) { + // Free all the nodes with this object Id. + ListHead =3D &DynPlatRepo->ArmCmObjList[Index]; + while (!IsListEmpty (ListHead)) { + FreeCmObjNode ((CM_OBJ_NODE *)GetFirstNode (ListHead)); + } // while + } // for + + // Free the arrays. + CmObjDesc =3D DynPlatRepo->ArmCmObjArray; + for (Index =3D 0; Index < EArmObjMax; Index++) { + Data =3D CmObjDesc[Index].Data; + if (Data !=3D NULL) { + FreePool (Data); + } + } // for + + // Free the TokenMapper + Status =3D TokenMapperShutdown (&DynPlatRepo->TokenMapper); + ASSERT_EFI_ERROR (Status); + FreePool (DynPlatRepo); + return Status; +} diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlat= RepoInternal.h b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Dynamic= PlatRepoInternal.h new file mode 100644 index 000000000000..eaee5d4ce9d9 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoInt= ernal.h @@ -0,0 +1,78 @@ +/** @file + Dynamic Platform Info Repository Internal + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#ifndef DYNAMIC_PLAT_REPO_INTERNAL_H_ +#define DYNAMIC_PLAT_REPO_INTERNAL_H_ + +#include "TokenMapper.h" + +#pragma pack(1) + +/** CmObj node. + + This is a node wrapper around the CM_OBJ_DESCRIPTOR structure. + It also allows to bind a token to the CM_OBJ_DESCRIPTOR. +*/ +typedef struct CmObjectNode { + /// This must be the first field in this structure. + LIST_ENTRY Link; + + /// Token associated with the CmObjDesc. + CM_OBJECT_TOKEN Token; + + /// CmObjDesc wrapped. + /// Note: the CM_OBJ_DESCRIPTOR.Data field is allocated and copied. + CM_OBJ_DESCRIPTOR CmObjDesc; +} CM_OBJ_NODE; + +/** Dynamic repository states. + + The states must progress as: + UnInitialised -> Transient -> Finalized +*/ +typedef enum DynRepoState { + DynRepoUnInitialised, ///< Un-Initialised state + DynRepoTransient, ///< Transient state - CmObjects can be added. + DynRepoFinalized, ///< Repo Locked - No further CmObjects can be add= ed. + ///< Getting objects is now possible. + DynRepoMax ///< Max value. +} EDYNAMIC_REPO_STATE; + +/** A structure describing the platform configuration + manager repository information +*/ +typedef struct DynamicPlatformRepositoryInfo { + /// Repo state machine. + EDYNAMIC_REPO_STATE RepoState; + + /// Count of all the objects added to the Dynamic Platform Repo + /// during the Transient state. + UINTN ObjectCount; + + /// Link lists of CmObj from the ArmNameSpace + /// that are added in the Transient state. + LIST_ENTRY ArmCmObjList[EArmObjMax]; + + /// Structure Members used in Finalized state. + /// An array of CmObj Descriptors from the ArmNameSpace + /// This array is populated when the Repo is finalized. + CM_OBJ_DESCRIPTOR ArmCmObjArray[EArmObjMax]; + + /// A token mapper for the objects in the ArmNamespaceObjectArray + /// The Token mapper is populated when the Repo is finalized in + /// a call to DynamicPlatRepoFinalise (). + TOKEN_MAPPER TokenMapper; +} DYNAMIC_PLATFORM_REPOSITORY_INFO; + +#pragma pack() + +#endif // DYNAMIC_PLAT_REPO_INTERNAL_H_ diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlat= RepoLib.inf b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPla= tRepoLib.inf new file mode 100644 index 000000000000..9a3cc87fd91d --- /dev/null +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoLib= .inf @@ -0,0 +1,33 @@ +## @file +# Dynamic Platform Repository +# +# Copyright (c) 2021, Arm Limited. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x0001001B + BASE_NAME =3D DynamicPlatRepoLib + FILE_GUID =3D 836D253D-3144-4A89-9BEE-BC55AFDC814E + VERSION_STRING =3D 1.0 + MODULE_TYPE =3D DXE_DRIVER + LIBRARY_CLASS =3D DynamicPlatRepoLib + +[Sources] + CmObjectTokenFixer.c + CmObjectTokenFixer.h + DynamicPlatRepo.c + DynamicPlatRepoInternal.h + TokenGenerator.c + TokenGenerator.h + TokenMapper.c + TokenMapper.h + +[Packages] + MdePkg/MdePkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[LibraryClasses] + AcpiHelperLib + BaseLib --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#84606): https://edk2.groups.io/g/devel/message/84606 Mute This Topic: https://groups.io/mt/87608928/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-