From: "Jose Marinho" <jose.marinho@arm.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"gmahadevan@nvidia.com" <gmahadevan@nvidia.com>,
Sami Mujawar <Sami.Mujawar@arm.com>
Cc: Alexei Fedorov <Alexei.Fedorov@arm.com>,
Pierre Gondois <Pierre.Gondois@arm.com>,
"Jeff Brasen (jbrasen@nvidia.com)" <jbrasen@nvidia.com>,
"ashishsingha@nvidia.com" <ashishsingha@nvidia.com>,
"nramirez@nvidia.com" <nramirez@nvidia.com>, nd <nd@arm.com>
Subject: Re: [edk2-devel] [PATCH v3 1/5] DynamicTablesPkg: Add SMBIOS table generation
Date: Thu, 24 Aug 2023 19:02:28 +0000 [thread overview]
Message-ID: <DBBPR08MB6012003D7C88E47927B2DD98881DA@DBBPR08MB6012.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <20230725233805.646668-2-gmahadevan@nvidia.com>
Hi,
I have a couple of minor comments.
reviewed-by: Jose Marinho <jose.marinho@arm.com>
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Girish
> Mahadevan via groups.io
> Sent: Wednesday, July 26, 2023 12:38 AM
> To: devel@edk2.groups.io; Sami Mujawar <Sami.Mujawar@arm.com>
> Cc: gmahadevan@nvidia.com; Alexei Fedorov <Alexei.Fedorov@arm.com>;
> Pierre Gondois <Pierre.Gondois@arm.com>; Jeff Brasen (jbrasen@nvidia.com)
> <jbrasen@nvidia.com>; ashishsingha@nvidia.com; nramirez@nvidia.com
> Subject: [edk2-devel] [PATCH v3 1/5] DynamicTablesPkg: Add SMBIOS table
> generation
>
> Add the SMBIOS Table generator code to the DynamicTablesPkg.
>
> This change includes adding new logic to the DynamicTableManager to
> process and add SMBIOS tables and augmenting the existing SMBIOS Factory
> generator to include installing multiple SMBIOS tables .
> Also included is running the SMBIOS and ACPI table generation as part of the
> SMBIOS and ACPI protocol GUID callback notifications respectively.
>
> Change-Id: Icc090108c16e87657260af6daf856f3d69b602e3
> Signed-off-by: Girish Mahadevan <gmahadevan@nvidia.com>
> Reviewed-by: Jeff Brasen <jbrasen@nvidia.com>
> ---
> .../DynamicTableFactory.h | 5 +
> .../DynamicTableFactoryDxe.c | 10 +
> .../SmbiosTableFactory/SmbiosTableFactory.c | 108 +++
> .../DynamicTableManagerDxe.c | 677 +++++++++++++++++-
> .../DynamicTableManagerDxe.inf | 3 +-
> .../Protocol/DynamicTableFactoryProtocol.h | 10 +
> .../Include/SmbiosTableGenerator.h | 204 +++++-
> MdePkg/Include/IndustryStandard/SmBios.h | 8 +
> 8 files changed, 994 insertions(+), 31 deletions(-)
>
> diff --git
> a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactory.h
> b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactory.
> h
> index b160dcf8ad..20e438ea70 100644
> ---
> a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactory.h
> +++
> b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactor
> +++ y.h
> @@ -49,6 +49,11 @@ typedef struct DynamicTableFactoryInfo {
> CustomDtTableGeneratorList[FixedPcdGet16 (
> PcdMaxCustomDTGenerators
> )];
> +
> + /// An array for holding a map of SMBIOS handles and the CM Object
> + /// token used to build the SMBIOS record.
> + SMBIOS_HANDLE_MAP
> + SmbiosHandleMap[MAX_SMBIOS_HANDLES];
> } EDKII_DYNAMIC_TABLE_FACTORY_INFO;
>
> /** Return a pointer to the ACPI table generator.
> diff --git
> a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryD
> xe.c
> b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryD
> xe.c
> index 6d6d3fa746..577cdb576e 100644
> ---
> a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryD
> xe.c
> +++
> b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactor
> +++ yDxe.c
> @@ -1,6 +1,7 @@
> /** @file
> Dynamic Table Factory Dxe
>
> + Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
>
> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -44,6 +45,9 @@
> EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL DynamicTableFactoryProtocol =
> {
> GetDtTableGenerator,
> RegisterDtTableGenerator,
> DeregisterDtTableGenerator,
> + AddSmbiosHandle,
> + FindSmbiosHandle,
> + FindSmbiosHandleEx,
> &TableFactoryInfo
> };
>
> @@ -65,6 +69,12 @@ DynamicTableFactoryDxeInitialize (
> )
> {
> EFI_STATUS Status;
> + UINTN Idx;
> +
> + for (Idx = 0; Idx < MAX_SMBIOS_HANDLES; Idx++) {
> + TableFactoryInfo.SmbiosHandleMap[Idx].SmbiosTblHandle =
> SMBIOS_HANDLE_PI_RESERVED;
> + TableFactoryInfo.SmbiosHandleMap[Idx].SmbiosCmToken = 0;
> + }
>
> Status = gBS->InstallProtocolInterface (
> &ImageHandle,
> diff --git
> a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/S
> mbiosTableFactory.c
> b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/S
> mbiosTableFactory.c
> index 87795919f8..b928c28a14 100644
> ---
> a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/S
> mbiosTableFactory.c
> +++
> b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory
> +++ /SmbiosTableFactory.c
> @@ -1,6 +1,7 @@
> /** @file
> SMBIOS Table Factory
>
> + Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
>
> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -12,6 +13,7 @@ #include
> <IndustryStandard/SmBios.h> #include <Library/BaseLib.h> #include
> <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> #include <Library/DebugLib.h>
>
> // Module specific include files.
> @@ -24,6 +26,71 @@
>
> extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo;
>
> +/** Add a new entry to the SMBIOS table Map.
> +
> + @param [in] Smbios SMBIOS Protocol pointer.
> + @param [in] SmbiosHandle SMBIOS Handle to be added, if the value
> SMBIOS_HANDLE_PI_RESERVED
> + is passed then a new SmbiosHandle is assigned.
> + @param [in] CmObjectToken CmObjectToken of the CM_OBJECT used to
> build the SMBIOS Table
> + @param [in] GeneratorId Smbios Table Generator Id.
> +
> + @retval EFI_SUCCESS Successfully added/generated the handle.
> + @retval EFI_OUT_OF_RESOURCESNULL Failure to add/generate the handle.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AddSmbiosHandle (
> + IN EFI_SMBIOS_PROTOCOL *Smbios,
> + IN SMBIOS_HANDLE *SmbiosHandle,
> + IN CM_OBJECT_TOKEN CmObjectToken,
> + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId
> + )
> +{
> + EFI_STATUS Status;
> + UINTN Index;
nit: Does it make sense to name index variables in a coherent way? You used "Idx" above.
> +
> + Status = EFI_OUT_OF_RESOURCES;
> +
> + for (Index = 0; Index < MAX_SMBIOS_HANDLES; Index++) {
> + if (TableFactoryInfo.SmbiosHandleMap[Index].SmbiosTblHandle ==
> SMBIOS_HANDLE_PI_RESERVED) {
> + TableFactoryInfo.SmbiosHandleMap[Index].SmbiosTblHandle =
> *SmbiosHandle;
> + TableFactoryInfo.SmbiosHandleMap[Index].SmbiosCmToken =
> CmObjectToken;
> + TableFactoryInfo.SmbiosHandleMap[Index].SmbiosGeneratorId =
> GeneratorId;
> + Status = EFI_SUCCESS;
> + break;
> + }
> + }
> +
> + return Status;
> +}
> +
> +/** Return a pointer to the SMBIOS table Map.
> +
> + @param [in] GeneratorId The CmObjectToken to look up an SMBIOS
> Handle.
> +
> + @retval SMBIOS_HANDLE_MAP if the CmObjectToken is found.
> + @retval NULL if not found.
> +**/
> +SMBIOS_HANDLE_MAP *
> +EFIAPI
> +FindSmbiosHandle (
> + CM_OBJECT_TOKEN CmObjectToken
> + )
> +{
> + UINTN Index;
> + SMBIOS_HANDLE_MAP *SmbiosHandleMap;
> +
> + SmbiosHandleMap = NULL;
> + for (Index = 0; Index < MAX_SMBIOS_HANDLES; Index++) {
> + if (TableFactoryInfo.SmbiosHandleMap[Index].SmbiosCmToken ==
> CmObjectToken) {
> + SmbiosHandleMap = &TableFactoryInfo.SmbiosHandleMap[Index];
> + break;
> + }
> + }
> +
> + return SmbiosHandleMap;
> +}
> +
> /** Return a pointer to the SMBIOS table generator.
>
> @param [in] This Pointer to the Dynamic Table Factory Protocol.
> @@ -229,3 +296,44 @@ DeregisterSmbiosTableGenerator (
> DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description));
> return EFI_SUCCESS;
> }
> +
> +/** Find and return SMBIOS handle based on associated CM object token.
> +
> + @param [in] GeneratorId SMBIOS generator ID used to build the SMBIOS
> Table.
> + @param [in] CmObjectToken Token of the CM_OBJECT used to build the
> SMBIOS Table.
> +
> + @return SMBIOS handle of the table associated with SmbiosGeneratorId
> and
> + CmObjectToken if found. Otherwise, returns 0xFFFF.
> +**/
> +UINT16
> +EFIAPI
> +FindSmbiosHandleEx (
> + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId,
> + IN CM_OBJECT_TOKEN CmObjToken
> + )
> +{
> + SMBIOS_HANDLE_MAP *HandleMap;
> +
> + if (CmObjToken == CM_NULL_TOKEN) {
> + return SMBIOS_HANDLE_INVALID;
> + }
> +
> + HandleMap = FindSmbiosHandle (CmObjToken); if (HandleMap == NULL) {
> + return SMBIOS_HANDLE_INVALID;
> + }
> +
> + if (HandleMap->SmbiosGeneratorId != GeneratorId) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "%a: Expect ID %d but get %d\n",
> + __FUNCTION__,
> + GeneratorId,
> + HandleMap->SmbiosGeneratorId
> + ));
> + ASSERT (FALSE);
> + return SMBIOS_HANDLE_INVALID;
> + }
> +
> + return HandleMap->SmbiosTblHandle;
> +}
> diff --git
> a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManag
> erDxe.c
> b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManag
> erDxe.c
> index 1e9b811c40..26aa9b55cf 100644
> ---
> a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManag
> erDxe.c
> +++
> b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManag
> e
> +++ rDxe.c
> @@ -8,10 +8,13 @@
> **/
>
> #include <Library/DebugLib.h>
> +#include <Library/UefiLib.h>
> #include <Library/PcdLib.h>
> #include <Library/UefiBootServicesTableLib.h>
> #include <Protocol/AcpiSystemDescriptionTable.h>
> #include <Protocol/AcpiTable.h>
> +#include <Protocol/Smbios.h>
> +#include <Library/BaseMemoryLib.h>
>
> // Module specific include files.
> #include <AcpiTableGenerator.h>
> @@ -22,6 +25,7 @@
> #include <Protocol/ConfigurationManagerProtocol.h>
> #include <Protocol/DynamicTableFactoryProtocol.h>
> #include <SmbiosTableGenerator.h>
> +#include <SmbiosTableDispatcher.h>
>
> ///
> /// Bit definitions for acceptable ACPI table presence formats.
> @@ -84,6 +88,18 @@ GET_OBJECT_LIST (
> CM_STD_OBJ_ACPI_TABLE_INFO
> )
>
> +/** This macro expands to a function that retrieves the SMBIOS Table
> + List from the Configuration Manager.
> +*/
> +GET_OBJECT_LIST (
> + EObjNameSpaceStandard,
> + EStdObjSmbiosTableList,
> + CM_STD_OBJ_SMBIOS_TABLE_INFO
> + )
> +
> +STATIC VOID *AcpiTableProtocolRegistration; STATIC VOID
> +*SmbiosProtocolRegistration;
> +
> /** A helper function to build and install a single ACPI table.
>
> This is a helper function that invokes the Table generator interface @@ -
> 530,6 +546,490 @@ VerifyMandatoryTablesArePresent (
> return Status;
> }
>
> +/** A helper function to build and install an SMBIOS table.
> +
> + This is a helper function that invokes the Table generator interface
> + for building an SMBIOS table. It uses the SmbiosProtocol to install
> + the table, then frees the resources allocated for generating it.
> +
> + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol
> + interface.
> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager
> + Protocol Interface.
> + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol.
> + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND Required object is not found.
> + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration
> Manager
> + is less than the Object size for the
> + requested object.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +BuildAndInstallSingleSmbiosTable (
> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST
> +TableFactoryProtocol,
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
> CfgMgrProtocol,
> + IN CONST SMBIOS_TABLE_GENERATOR *CONST Generator,
> + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol,
> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo
> + )
> +{
> + EFI_STATUS Status;
> + EFI_STATUS Status1;
> + SMBIOS_STRUCTURE *SmbiosTable;
> + CM_OBJECT_TOKEN CmObjToken;
> + EFI_SMBIOS_HANDLE TableHandle;
> +
> + SmbiosTable = NULL;
> + Status = Generator->BuildSmbiosTable (
> + Generator,
> + TableFactoryProtocol,
> + SmbiosTableInfo,
> + CfgMgrProtocol,
> + &SmbiosTable,
> + &CmObjToken
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to Build Table." \
> + " TableGeneratorId = 0x%x. Status = %r\n",
> + SmbiosTableInfo->TableGeneratorId,
> + Status
> + ));
> + // Free any allocated resources.
> + goto exit_handler;
> + }
> +
> + if (SmbiosTable == NULL) {
> + Status = EFI_NOT_FOUND;
> + goto exit_handler;
> + }
> +
> + TableHandle = SMBIOS_HANDLE_PI_RESERVED; // Install SMBIOS table
> + Status = SmbiosProtocol->Add (
> + SmbiosProtocol,
> + NULL,
> + &TableHandle,
> + SmbiosTable
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to Install SMBIOS Table. Status = %r\n",
> + Status
> + ));
> + // Free any allocated resources.
> + goto exit_handler;
> + }
> +
> + Status = TableFactoryProtocol->AddSmbiosHandle (
> + SmbiosProtocol,
> + &TableHandle,
> + CmObjToken,
> + SmbiosTableInfo->TableGeneratorId
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to Add SMBIOS Handle. Status = %r\n",
> + Status
> + ));
> + // Free any allocated resources.
> + goto exit_handler;
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: SMBIOS Table installed. Status = %r\n",
> + Status
> + ));
> +
> +exit_handler:
> + // Free any resources allocated for generating the tables.
> + if (Generator->FreeTableResources != NULL) {
> + Status1 = Generator->FreeTableResources (
> + Generator,
> + TableFactoryProtocol,
> + SmbiosTableInfo,
> + CfgMgrProtocol,
> + &SmbiosTable
> + );
> + if (EFI_ERROR (Status1)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to Free Table Resources." \
> + "TableGeneratorId = 0x%x. Status = %r\n",
> + SmbiosTableInfo->TableGeneratorId,
> + Status1
> + ));
> + }
> +
> + // Return the first error status in case of failure
> + if (!EFI_ERROR (Status)) {
> + Status = Status1;
> + }
> + }
> +
> + return Status;
> +}
> +
> +/** A helper function to build and install multiple SMBIOS tables.
> +
> + This is a helper function that invokes the Table generator interface
> + for building SMBIOS tables. It uses the SmbiosProtocol to install the
> + tables, then frees the resources allocated for generating it.
> +
> + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol
> + interface.
> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager
> + Protocol Interface.
> + @param [in] Generator Pointer to the SmbiosTable generator.
> + @param [in] SmbiosProtocol Pointer to the Smbios protocol.
> + @param [in] AcpiTableInfo Pointer to the SMBIOS table Info.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND Required object is not found.
> + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration
> Manager
> + is less than the Object size for the
> + requested object.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +BuildAndInstallMultipleSmbiosTables (
> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST
> +TableFactoryProtocol,
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
> CfgMgrProtocol,
> + IN CONST SMBIOS_TABLE_GENERATOR *CONST Generator,
> + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol,
> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo
> + )
> +{
> + EFI_STATUS Status;
> + EFI_STATUS Status1;
> + SMBIOS_STRUCTURE **SmbiosTable;
> + CM_OBJECT_TOKEN *CmObjToken;
> + EFI_SMBIOS_HANDLE TableHandle;
> + UINTN TableCount;
> + UINTN Index;
> +
> + TableCount = 0;
> + Status = Generator->BuildSmbiosTableEx (
> + Generator,
> + TableFactoryProtocol,
> + SmbiosTableInfo,
> + CfgMgrProtocol,
> + &SmbiosTable,
> + &CmObjToken,
> + &TableCount
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to Build Table." \
> + " TableGeneratorId = 0x%x. Status = %r\n",
> + SmbiosTableInfo->TableGeneratorId,
> + Status
> + ));
> + // Free any allocated resources.
> + goto exit_handler;
> + }
> +
> + if ((SmbiosTable == NULL) || (TableCount == 0)) {
> + Status = EFI_NOT_FOUND;
> + DEBUG ((
> + DEBUG_ERROR,
> + "%a: TableCount %u SmbiosTable %p \n",
> + __FUNCTION__,
> + TableCount,
> + SmbiosTable
> + ));
> + goto exit_handler;
> + }
> +
> + for (Index = 0; Index < TableCount; Index++) {
> + TableHandle = SMBIOS_HANDLE_PI_RESERVED;
> +
Does the logic below reimplement BuildAndInstallSingleSmbiosTable?
If yes, could that function be called here instead?
> + // Install SMBIOS table
> + Status = SmbiosProtocol->Add (
> + SmbiosProtocol,
> + NULL,
> + &TableHandle,
> + SmbiosTable[Index]
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to Install SMBIOS Table. Status = %r\n",
> + Status
> + ));
> + // Free any allocated resources.
> + goto exit_handler;
> + }
> +
> + Status = TableFactoryProtocol->AddSmbiosHandle (
> + SmbiosProtocol,
> + &TableHandle,
> + CmObjToken[Index],
> + SmbiosTableInfo->TableGeneratorId
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to Add SMBIOS Handle. Status = %r\n",
> + Status
> + ));
> + // Free any allocated resources.
> + goto exit_handler;
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: SMBIOS Table installed. Status = %r\n",
> + Status
> + ));
> + }
> +
> +exit_handler:
> + // Free any resources allocated for generating the tables.
> + if (Generator->FreeTableResourcesEx != NULL) {
> + Status1 = Generator->FreeTableResourcesEx (
> + Generator,
> + TableFactoryProtocol,
> + SmbiosTableInfo,
> + CfgMgrProtocol,
> + &SmbiosTable,
> + &CmObjToken,
> + TableCount
> + );
> + if (EFI_ERROR (Status1)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to Free Table Resources." \
> + "TableGeneratorId = 0x%x. Status = %r\n",
> + SmbiosTableInfo->TableGeneratorId,
> + Status1
> + ));
> + }
> +
> + // Return the first error status in case of failure
> + if (!EFI_ERROR (Status)) {
> + Status = Status1;
> + }
> + }
> +
> + DEBUG ((DEBUG_ERROR, "%a: Returning %r\n", __FUNCTION__, Status));
> + return Status;
> +}
> +
> +/** A helper function to invoke a Table generator
> +
> + This is a helper function that invokes the Table generator interface
> + for building an SMBIOS table. It uses the SmbiosProtocol to install
> + the table, then frees the resources allocated for generating it.
> +
> + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol
> + interface.
> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager
> + Protocol Interface.
> + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol.
> + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND Required object is not found.
> + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration
> Manager
> + is less than the Object size for the
> + requested object.
> +**/
> +EFI_STATUS
> +EFIAPI
> +BuildAndInstallSmbiosTable (
> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST
> +TableFactoryProtocol,
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
> CfgMgrProtocol,
> + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol,
> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo
> + )
> +{
> + EFI_STATUS Status;
> + CONST SMBIOS_TABLE_GENERATOR *Generator;
> +
> + ASSERT (TableFactoryProtocol != NULL); ASSERT (CfgMgrProtocol !=
> + NULL); ASSERT (SmbiosProtocol != NULL); ASSERT (SmbiosTableInfo !=
> + NULL);
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: EStdObjSmbiosTableList: Address = 0x%p," \
> + " TableGeneratorId = 0x%x\n",
> + SmbiosTableInfo,
> + SmbiosTableInfo->TableGeneratorId
> + ));
> +
> + Generator = NULL;
> + Status = TableFactoryProtocol->GetSmbiosTableGenerator (
> + TableFactoryProtocol,
> + SmbiosTableInfo->TableGeneratorId,
> + &Generator
> + ); if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Table Generator not found." \
> + " TableGeneratorId = 0x%x. Status = %r\n",
> + SmbiosTableInfo->TableGeneratorId,
> + Status
> + ));
> + return Status;
> + }
> +
> + if (Generator == NULL) {
> + return EFI_NOT_FOUND;
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: Generator found : %s\n",
> + Generator->Description
> + ));
> +
> + if (Generator->BuildSmbiosTableEx != NULL) {
> + Status = BuildAndInstallMultipleSmbiosTables (
> + TableFactoryProtocol,
> + CfgMgrProtocol,
> + Generator,
> + SmbiosProtocol,
> + SmbiosTableInfo
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to find build and install SMBIOS Tables." \
> + " Status = %r\n",
> + Status
> + ));
> + }
> + } else if (Generator->BuildSmbiosTable != NULL) {
> + Status = BuildAndInstallSingleSmbiosTable (
> + TableFactoryProtocol,
> + CfgMgrProtocol,
> + Generator,
> + SmbiosProtocol,
> + SmbiosTableInfo
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to find build and install SMBIOS Table." \
> + " Status = %r\n",
> + Status
> + ));
> + }
> + } else {
> + Status = EFI_INVALID_PARAMETER;
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Table Generator does not implement the" \
> + "SMBIOS_TABLE_GENERATOR_BUILD_TABLE interface." \
> + " TableGeneratorId = 0x%x. Status = %r\n",
> + SmbiosTableInfo->TableGeneratorId,
> + Status
> + ));
> + }
> +
> + DEBUG ((DEBUG_ERROR, "%a: Returning %r\n", __FUNCTION__, Status));
> + return Status;
> +}
> +
> +/** Generate and install SMBIOS tables.
> +
> + The function gathers the information necessary for installing the
> + SMBIOS tables from the Configuration Manager, invokes the generators
> + and installs them (via BuildAndInstallAcpiTable).
> +
> + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol
> + interface.
> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager
> + Protocol Interface.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_NOT_FOUND If a mandatory table or a generator is not found.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +ProcessSmbiosTables (
> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST
> +TableFactoryProtocol,
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
> CfgMgrProtocol
> + )
> +{
> + EFI_STATUS Status;
> + EFI_SMBIOS_PROTOCOL *SmbiosProtocol;
> + CM_STD_OBJ_SMBIOS_TABLE_INFO *SmbiosTableInfo;
> + UINT32 SmbiosTableCount;
> +
> + Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID
> + **)&SmbiosProtocol); if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_ERROR, "Could not locate SMBIOS protocol. %r\n",
> Status));
> + return Status;
> + }
> +
> + Status = GetEStdObjSmbiosTableList (
> + CfgMgrProtocol,
> + CM_NULL_TOKEN,
> + &SmbiosTableInfo,
> + &SmbiosTableCount
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to get SMBIOS Table List. Status = %r\n",
> + Status
> + ));
> + return Status;
> + }
> +
> + if (SmbiosTableCount == 0) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: EStdObjSmbiosTableList: SmbiosTableCount = %d\n",
> + SmbiosTableCount
> + ));
> + return EFI_NOT_FOUND;
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: EStdObjSmbiosTableList: SmbiosTableCount = %d\n",
> + SmbiosTableCount
> + ));
> +
> + InitSmbiosTableDispatcher (SmbiosTableInfo, SmbiosTableCount);
> +
> + Status = DispatchSmbiosTables (
> + TableFactoryProtocol,
> + CfgMgrProtocol,
> + SmbiosProtocol,
> + SmbiosTableInfo,
> + SmbiosTableCount
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to install SMBIOS Tables.Status = %r\n",
> + Status
> + ));
> + }
> +
> + return Status;
> +}
> +
> /** Generate and install ACPI tables.
>
> The function gathers the information necessary for installing the @@ -
> 701,30 +1201,20 @@ ProcessAcpiTables (
> return Status;
> }
>
> -/** Entrypoint of Dynamic Table Manager Dxe.
> +/** Callback function for ACPI Protocol .
>
> - The Dynamic Table Manager uses the Configuration Manager Protocol
> - to get the list of ACPI and SMBIOS tables to install. For each table
> - in the list it requests the corresponding ACPI/SMBIOS table factory for
> - a generator capable of building the ACPI/SMBIOS table.
> - If a suitable table generator is found, it invokes the generator interface
> - to build the table. The Dynamic Table Manager then installs the
> - table and invokes another generator interface to free any resources
> - allocated for building the table.
> + Callback function for ACPI protocol that installs ACPI tables
>
> - @param ImageHandle
> - @param SystemTable
> + @param Event
> + @param Context
>
> - @retval EFI_SUCCESS Success.
> - @retval EFI_OUT_OF_RESOURCES Memory allocation failed.
> - @retval EFI_NOT_FOUND Required interface/object was not found.
> - @retval EFI_INVALID_PARAMETER Some parameter is incorrect/invalid.
> + @retval None
> **/
> -EFI_STATUS
> -EFIAPI
> -DynamicTableManagerDxeInitialize (
> - IN EFI_HANDLE ImageHandle,
> - IN EFI_SYSTEM_TABLE *SystemTable
> +STATIC
> +VOID
> +AcpiTableProtocolReady (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> )
> {
> EFI_STATUS Status;
> @@ -745,7 +1235,7 @@ DynamicTableManagerDxeInitialize (
> " Status = %r\n",
> Status
> ));
> - return Status;
> + return;
> }
>
> // Locate the Configuration Manager for the Platform @@ -760,7 +1250,7
> @@ DynamicTableManagerDxeInitialize (
> "ERROR: Failed to find Configuration Manager protocol. Status = %r\n",
> Status
> ));
> - return Status;
> + return;
> }
>
> Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo); @@ -770,7 +1260,7
> @@ DynamicTableManagerDxeInitialize (
> "ERROR: Failed to get Configuration Manager info. Status = %r\n",
> Status
> ));
> - return Status;
> + return;
> }
>
> DEBUG ((
> @@ -793,6 +1283,147 @@ DynamicTableManagerDxeInitialize (
> Status
> ));
> }
> +}
> +
> +/** Callback function for SMBIOS Protocol .
> +
> + Callback function for SMBIOS protocol that installs SMBIOS tables
> + that use the DynamicTables Package.
> +
> + @param Event
> + @param Context
> +
> + @retval None
> +**/
> +STATIC
> +VOID
> +SmbiosProtocolReady (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +{
> + EFI_STATUS Status;
> + EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol;
> + CM_STD_OBJ_CONFIGURATION_MANAGER_INFO *CfgMfrInfo;
> + EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *TableFactoryProtocol;
> +
> + // Locate the Dynamic Table Factory
> + Status = gBS->LocateProtocol (
> + &gEdkiiDynamicTableFactoryProtocolGuid,
> + NULL,
> + (VOID **)&TableFactoryProtocol
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to find Dynamic Table Factory protocol." \
> + " Status = %r\n",
> + Status
> + ));
> + return;
> + }
> +
> + // Locate the Configuration Manager for the Platform Status =
> + gBS->LocateProtocol (
> + &gEdkiiConfigurationManagerProtocolGuid,
> + NULL,
> + (VOID **)&CfgMgrProtocol
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to find Configuration Manager protocol. Status = %r\n",
> + Status
> + ));
> + return;
> + }
> +
> + Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo); if (EFI_ERROR
> + (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to get Configuration Manager info. Status = %r\n",
> + Status
> + ));
> + return;
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: Configuration Manager Version = 0x%x, OemID =
> %c%c%c%c%c%c\n",
> + CfgMfrInfo->Revision,
> + CfgMfrInfo->OemId[0],
> + CfgMfrInfo->OemId[1],
> + CfgMfrInfo->OemId[2],
> + CfgMfrInfo->OemId[3],
> + CfgMfrInfo->OemId[4],
> + CfgMfrInfo->OemId[5]
> + ));
> +
> + Status = ProcessSmbiosTables (TableFactoryProtocol, CfgMgrProtocol);
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: SMBIOS Table processing failure. Status = %r\n",
> + Status
> + ));
> + }
> +}
> +
> +/** Entrypoint of Dynamic Table Manager Dxe.
> +
> + The Dynamic Table Manager uses the Configuration Manager Protocol to
> + get the list of ACPI and SMBIOS tables to install. For each table in
> + the list it requests the corresponding ACPI/SMBIOS table factory for
> + a generator capable of building the ACPI/SMBIOS table.
> + If a suitable table generator is found, it invokes the generator
> + interface to build the table. The Dynamic Table Manager then installs
> + the table and invokes another generator interface to free any
> + resources allocated for building the table.
> +
> + @param ImageHandle
> + @param SystemTable
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_OUT_OF_RESOURCES Memory allocation failed.
> + @retval EFI_NOT_FOUND Required interface/object was not found.
> + @retval EFI_INVALID_PARAMETER Some parameter is incorrect/invalid.
> +**/
> +EFI_STATUS
> +EFIAPI
> +DynamicTableManagerDxeInitialize (
> + IN EFI_HANDLE ImageHandle,
> + IN EFI_SYSTEM_TABLE *SystemTable
> + )
> +{
> + EFI_STATUS Status;
> + EFI_EVENT AcpiEvent;
> + EFI_EVENT SmbiosEvent;
> +
> + AcpiEvent = EfiCreateProtocolNotifyEvent (
> + &gEfiAcpiTableProtocolGuid,
> + TPL_CALLBACK,
> + AcpiTableProtocolReady,
> + NULL,
> + &AcpiTableProtocolRegistration
> + );
> + if (AcpiEvent == NULL) {
> + DEBUG ((DEBUG_ERROR, "%a: Failed to ACPI create protocol event\r\n",
> __FUNCTION__));
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + SmbiosEvent = EfiCreateProtocolNotifyEvent (
> + &gEfiSmbiosProtocolGuid,
> + TPL_CALLBACK,
> + SmbiosProtocolReady,
> + NULL,
> + &SmbiosProtocolRegistration
> + );
> + if (SmbiosEvent == NULL) {
> + DEBUG ((DEBUG_ERROR, "%a: Failed to SMBIOS create protocol
> event\r\n", __FUNCTION__));
> + gBS->CloseEvent (AcpiEvent);
> + return EFI_OUT_OF_RESOURCES;
> + }
>
> return Status;
> }
> diff --git
> a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManag
> erDxe.inf
> b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManag
> erDxe.inf
> index b09272d883..3beab7420a 100644
> ---
> a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManag
> erDxe.inf
> +++
> b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManag
> e
> +++ rDxe.inf
> @@ -33,6 +33,7 @@
> [LibraryClasses]
> PrintLib
> TableHelperLib
> + UefiLib
> UefiBootServicesTableLib
> UefiDriverEntryPoint
>
> @@ -42,12 +43,12 @@
> [Protocols]
> gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
> gEfiAcpiSdtProtocolGuid # PROTOCOL ALWAYS_CONSUMED
> + gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED
>
> gEdkiiConfigurationManagerProtocolGuid # PROTOCOL
> ALWAYS_CONSUMED
> gEdkiiDynamicTableFactoryProtocolGuid # PROTOCOL
> ALWAYS_CONSUMED
>
> [Depex]
> - gEfiAcpiTableProtocolGuid AND
Why is this depex being removed?
If this change is required, does it make sense to move it to a separate commit?
> gEdkiiConfigurationManagerProtocolGuid AND
> gEdkiiDynamicTableFactoryProtocolGuid
>
> diff --git
> a/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h
> b/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h
> index b11fc0c9f1..e298236311 100644
> --- a/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h
> +++ b/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h
> @@ -1,5 +1,6 @@
> /** @file
>
> + Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
>
> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -239,6 +240,15 @@
> typedef struct DynamicTableFactoryProtocol {
> EDKII_DYNAMIC_TABLE_FACTORY_DEREGISTER_DT_TABLE_GENERATOR
> DeregisterDtTableGenerator;
>
> + EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_ADD_HANDLE
> +
> + AddSmbiosHandle;
> +
> + EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_GET_HANDLE
> +
> + GetSmbiosHandle;
> +
> + EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_GET_HANDLE_EX
> +
> + GetSmbiosHandleEx;
> +
> /** Pointer to the data structure that holds the
> list of registered table generators
> */
> diff --git a/DynamicTablesPkg/Include/SmbiosTableGenerator.h
> b/DynamicTablesPkg/Include/SmbiosTableGenerator.h
> index 934d56c90d..a9f8199a3b 100644
> --- a/DynamicTablesPkg/Include/SmbiosTableGenerator.h
> +++ b/DynamicTablesPkg/Include/SmbiosTableGenerator.h
> @@ -1,5 +1,6 @@
> /** @file
>
> + Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
>
> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -10,7 +11,7 @@ #define
> SMBIOS_TABLE_GENERATOR_H_
>
> #include <IndustryStandard/SmBios.h>
> -
> +#include <Protocol/Smbios.h>
> #include <TableGenerator.h>
>
> #pragma pack(1)
> @@ -121,12 +122,21 @@ typedef enum StdSmbiosTableGeneratorId {
> ETableGeneratorNameSpaceStd, \
> TableId \
> )
> +#define MAX_SMBIOS_HANDLES (255)
>
> /** Forward declarations.
> */
> typedef struct ConfigurationManagerProtocol
> EDKII_CONFIGURATION_MANAGER_PROTOCOL;
> typedef struct CmStdObjSmbiosTableInfo
> CM_STD_OBJ_SMBIOS_TABLE_INFO;
> typedef struct SmbiosTableGenerator SMBIOS_TABLE_GENERATOR;
> +typedef struct DynamicTableFactoryProtocol
> EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL;
> +typedef UINTN CM_OBJECT_TOKEN;
> +
> +typedef struct SmbiosHandleCmObjMap {
> + SMBIOS_TABLE_GENERATOR_ID SmbiosGeneratorId;
> + SMBIOS_HANDLE SmbiosTblHandle;
> + CM_OBJECT_TOKEN SmbiosCmToken;
> +} SMBIOS_HANDLE_MAP;
>
> /** This function pointer describes the interface to SMBIOS table build
> functions provided by the SMBIOS table generator and called by the
> @@ -143,9 +153,11 @@ typedef struct SmbiosTableGenerator
> SMBIOS_TABLE_GENERATOR;
> **/
> typedef EFI_STATUS (*SMBIOS_TABLE_GENERATOR_BUILD_TABLE) (
> IN CONST SMBIOS_TABLE_GENERATOR *Generator,
> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST
> + TableFactoryProtocol,
> IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo,
> IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
> CfgMgrProtocol,
> - OUT SMBIOS_STRUCTURE **Table
> + OUT SMBIOS_STRUCTURE **Table,
> + OUT CM_OBJECT_TOKEN *CmObjToken
> );
>
> /** This function pointer describes the interface to used by the @@ -163,32
> +175,147 @@ typedef EFI_STATUS
> (*SMBIOS_TABLE_GENERATOR_BUILD_TABLE) ( **/ typedef EFI_STATUS
> (*SMBIOS_TABLE_GENERATOR_FREE_TABLE) (
> IN CONST SMBIOS_TABLE_GENERATOR *Generator,
> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST
nit: one space too many before *CONST (to ensure correct alignment with the other *CONST)
> + TableFactoryProtocol,
> IN CONST CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST
> SmbiosTableInfo,
> IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
> CfgMgrProtocol,
> IN SMBIOS_STRUCTURE **Table
> );
>
> +/** This function pointer describes the interface to SMBIOS table build
> + functions provided by the SMBIOS table generator and called by the
> + Table Manager to build an SMBIOS table.
> +
> + @param [in] Generator Pointer to the SMBIOS table generator.
> + @param [in] SmbiosTableInfo Pointer to the SMBIOS table information.
> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager
> + Protocol interface.
> + @param [out] Table Pointer to the generated SMBIOS table.
> +
> + @return EFI_SUCCESS If the table is generated successfully or other
> + failure codes as returned by the generator.
> +**/
> +typedef EFI_STATUS (*SMBIOS_TABLE_GENERATOR_BUILD_TABLEEX) (
> + IN CONST SMBIOS_TABLE_GENERATOR *Generator,
> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST
> TableFactoryProtocol,
> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo,
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
> CfgMgrProtocol,
> + OUT SMBIOS_STRUCTURE ***Table,
> + OUT CM_OBJECT_TOKEN **CmObjectToken,
> + OUT UINTN *CONST TableCount
> + );
> +
> +/** This function pointer describes the interface to used by the
> + Table Manager to give the generator an opportunity to free
> + any resources allocated for building the SMBIOS table.
> +
> + @param [in] Generator Pointer to the SMBIOS table generator.
> + @param [in] SmbiosTableInfo Pointer to the SMBIOS table information.
> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager
> + Protocol interface.
> + @param [in] Table Pointer to the generated SMBIOS table.
> +
> + @return EFI_SUCCESS If freed successfully or other failure codes
> + as returned by the generator.
> +**/
> +typedef EFI_STATUS (*SMBIOS_TABLE_GENERATOR_FREE_TABLEEX) (
> + IN CONST SMBIOS_TABLE_GENERATOR *Generator,
> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST
> TableFactoryProtocol,
> + IN CONST CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST
> SmbiosTableInfo,
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST
> CfgMgrProtocol,
> + IN SMBIOS_STRUCTURE ***Table,
> + IN CM_OBJECT_TOKEN **CmObjectToken,
> + IN CONST UINTN TableCount
> + );
> +
> +/** This function pointer describes the interface to used by the
> + Table Manager to give the generator an opportunity to add
> + an SMBIOS Handle.
> +
> + This function is called by the Dynamic Table Manager to add a newly
> + added SMBIOS Table OR it can be called by an SMBIOS Table generator
> + to create and add a new SMBIOS Handle if there is a reference to
> + another table and if there is a generator for that table that hasn't been
> called yet.
> +
> + @param [in] Smbios Pointer to the SMBIOS protocol.
> + @param [in] SmbiosHandle Pointer to an SMBIOS handle (either
> generated by
> + SmbiosDxe Driver or SMBIOS_HANDLE_PI_RESERVED
> + if a handle needs to be generated).
> + @param [in] CmObjectToken The CM Object token for that is used to
> generate
> + SMBIOS record.
> + @param [in] GeneratorId The SMBIOS table generator Id.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_OUT_OF_RESOURCES Unable to add the handle.
> + @retval EFI_NOT_FOUND The requested generator is not found
> + in the list of registered generators.
> +**/
> +typedef EFI_STATUS (EFIAPI
> *EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_ADD_HANDLE)(
> + IN EFI_SMBIOS_PROTOCOL *Smbios,
> + IN SMBIOS_HANDLE *SmbiosHandle,
> + IN CM_OBJECT_TOKEN CmObjectToken,
> + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId
> + );
> +
> +/** This function pointer describes the interface to used by the
> + Table Manager to give the generator an opportunity to find
> + an SMBIOS Handle.
> +
> + This function is called by the SMBIOS table generator to find an
> + SMBIOS handle needed as part of generating an SMBIOS Table.
> +
> + @param [in] CmObjectToken The CM Object token used to generate the
> SMBIOS
> + record.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_NOT_FOUND The requested generator is not found
> + in the list of registered generators.
> +**/
> +typedef SMBIOS_HANDLE_MAP *(EFIAPI
> *EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_GET_HANDLE)(
> + IN CM_OBJECT_TOKEN CmObjectToken
> + );
> +
> +/** Find and return SMBIOS handle based on associated CM object token.
> +
> + @param [in] GeneratorId SMBIOS generator ID used to build the SMBIOS
> Table.
> + @param [in] CmObjectToken Token of the CM_OBJECT used to build the
> SMBIOS Table.
> +
> + @return SMBIOS handle of the table associated with SmbiosTableId and
> + CmObjectToken if found. Otherwise, returns 0xFFFF.
> +**/
> +typedef UINT16 (EFIAPI
> +*EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_GET_HANDLE_EX)(
> + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId,
> + IN CM_OBJECT_TOKEN CmObjToken
> + );
> +
> /** The SMBIOS_TABLE_GENERATOR structure provides an interface that the
> Table Manager can use to invoke the functions to build SMBIOS tables.
> */
> typedef struct SmbiosTableGenerator {
> /// The SMBIOS table generator ID.
> - SMBIOS_TABLE_GENERATOR_ID GeneratorID;
> + SMBIOS_TABLE_GENERATOR_ID GeneratorID;
>
> /// String describing the DT table
> /// generator.
> - CONST CHAR16 *Description;
> + CONST CHAR16 *Description;
>
> /// The SMBIOS table type.
> - SMBIOS_TYPE Type;
> + SMBIOS_TYPE Type;
>
> /// SMBIOS table build function pointer.
> - SMBIOS_TABLE_GENERATOR_BUILD_TABLE BuildSmbiosTable;
> + SMBIOS_TABLE_GENERATOR_BUILD_TABLE BuildSmbiosTable;
> +
> + /** The function to free any resources
> + allocated for building the SMBIOS table.
> + */
> + SMBIOS_TABLE_GENERATOR_FREE_TABLE FreeTableResources;
> +
> + /// SMBIOS table extended build function pointer.
> + SMBIOS_TABLE_GENERATOR_BUILD_TABLEEX BuildSmbiosTableEx;
>
> /** The function to free any resources
> allocated for building the SMBIOS table.
> */
> - SMBIOS_TABLE_GENERATOR_FREE_TABLE FreeTableResources;
> + SMBIOS_TABLE_GENERATOR_FREE_TABLEEX FreeTableResourcesEx;
> } SMBIOS_TABLE_GENERATOR;
>
> /** Register SMBIOS table factory generator.
> @@ -229,6 +356,69 @@ DeregisterSmbiosTableGenerator (
> IN CONST SMBIOS_TABLE_GENERATOR *CONST Generator
> );
>
> +/** Add SMBIOS Handle.
> +
> + This function is called by the Dynamic Table Manager to add a newly
> + added SMBIOS Table OR it can be called by an SMBIOS Table generator
> + to create and add a new SMBIOS Handle if there is a reference to
> + another table and if there is a generator for that table that hasn't been
> called yet.
> +
> + @param [in] Smbios Pointer to the SMBIOS protocol.
> + @param [in] SmbiosHandle Pointer to an SMBIOS handle (either
> generated by
> + SmbiosDxe Driver or SMBIOS_HANDLE_PI_RESERVED
> + if a handle needs to be generated).
> + @param [in] CmObjectToken The CM Object token for that is used to
> generate
> + SMBIOS record.
> + @param [in] GeneratorId The SMBIOS table generator Id.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_OUT_OF_RESOURCES Unable to add the handle.
> + @retval EFI_NOT_FOUND The requested generator is not found
> + in the list of registered generators.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AddSmbiosHandle (
> + IN EFI_SMBIOS_PROTOCOL *Smbios,
> + IN SMBIOS_HANDLE *SmbiosHandle,
> + IN CM_OBJECT_TOKEN CmObjectToken,
> + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId
> + );
> +
> +/** Find SMBIOS Handle given the CM Object token used to generate the
> SMBIOS
> + record..
nit: remove one of the full stops.
Jose
> +
> + This function is called by the SMBIOS table generator to find an
> + SMBIOS handle needed as part of generating an SMBIOS Table.
> +
> + @param [in] CmObjectToken The CM Object token used to generate the
> SMBIOS
> + record.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_NOT_FOUND The requested generator is not found
> + in the list of registered generators.
> +**/
> +SMBIOS_HANDLE_MAP *
> +EFIAPI
> +FindSmbiosHandle (
> + IN CM_OBJECT_TOKEN CmObjectToken
> + );
> +
> +/** Find and return SMBIOS handle based on associated CM object token.
> +
> + @param [in] GeneratorId SMBIOS generator ID used to build the SMBIOS
> Table.
> + @param [in] CmObjectToken Token of the CM_OBJECT used to build the
> SMBIOS Table.
> +
> + @return SMBIOS handle of the table associated with SmbiosTableId and
> + CmObjectToken if found. Otherwise, returns 0xFFFF.
> +**/
> +UINT16
> +EFIAPI
> +FindSmbiosHandleEx (
> + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId,
> + IN CM_OBJECT_TOKEN CmObjToken
> + );
> +
> #pragma pack()
>
> #endif // SMBIOS_TABLE_GENERATOR_H_
> diff --git a/MdePkg/Include/IndustryStandard/SmBios.h
> b/MdePkg/Include/IndustryStandard/SmBios.h
> index 89985bb418..c40986157c 100644
> --- a/MdePkg/Include/IndustryStandard/SmBios.h
> +++ b/MdePkg/Include/IndustryStandard/SmBios.h
> @@ -28,6 +28,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent ///
> #define SMBIOS_HANDLE_PI_RESERVED 0xFFFE
>
> +///
> +/// Reference SMBIOS 3.6, chapter 6.1.2.
> +/// Unless otherwise specified, when referring to another structure’s
> +handle, the value /// 0FFFFh is used to indicate that the referenced
> +handle is not applicable or does not /// exist.
> +///
> +#define SMBIOS_HANDLE_INVALID 0xFFFF
> +
> ///
> /// Reference SMBIOS 2.6, chapter 3.1.3.
> /// Each text string is limited to 64 significant characters due to system MIF
> limitations.
> --
> 2.17.1
>
>
>
>
>
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#108020): https://edk2.groups.io/g/devel/message/108020
Mute This Topic: https://groups.io/mt/100361559/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2023-08-24 19:02 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-25 23:38 [edk2-devel] [PATCH v3 0/5] DynamicTablesPkg: Add SMBIOS Table Generation Girish Mahadevan via groups.io
2023-07-25 23:38 ` [edk2-devel] [PATCH v3 1/5] DynamicTablesPkg: Add SMBIOS table generation Girish Mahadevan via groups.io
2023-08-24 19:02 ` Jose Marinho [this message]
2023-07-25 23:38 ` [edk2-devel] [PATCH v3 2/5] DynamicTablesPkg: Split the ACPI and SMBIOS table generators Girish Mahadevan via groups.io
2023-07-25 23:38 ` [edk2-devel] [PATCH v3 3/5] DynamicTablesPkg: Introduce new namespace for SMBIOS Objects Girish Mahadevan via groups.io
2023-07-25 23:38 ` [edk2-devel] [PATCH v3 4/5] DynamicTablesPkg: Smbios Memory Device (Type 17) Girish Mahadevan via groups.io
2023-07-25 23:38 ` [edk2-devel] [PATCH v3 5/5] DynamicTablesPkg: Smbios Physical Memory Array (Type 16) Girish Mahadevan via groups.io
2023-08-24 19:36 ` Jose Marinho
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DBBPR08MB6012003D7C88E47927B2DD98881DA@DBBPR08MB6012.eurprd08.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox