public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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]
-=-=-=-=-=-=-=-=-=-=-=-



  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