[edk2-devel] [PATCH 1/2] DynamicTablesPkg: Add SMBIOS table generation

Sami Mujawar sami.mujawar at arm.com
Mon Sep 12 14:55:58 UTC 2022


Hi Girish,

Thank you for this patch.

I am having difficulty applying this patch locally. Is it possible to 
share this patch series on a github branch as well, please? It will 
greatly help me with the review. I normally include a link to my github 
branch (after the --- line) when positng to the mailing list see 
https://edk2.groups.io/g/devel/message/93651

Other than that, please see my response inline marked [SAMI].

Regards,

Sami Mujawar

On 26/08/2022 06:37 pm, Girish Mahadevan wrote:
> Modify the DynamicTableManagerDxe driver to install SMBIOS tables in
> addition to ACPI tables.
> Instead of adding gEfiSmbiosProtocolGuid to the DEPEX list, setup
> callback notifications for gEfiSmbiosProtocolGuid and
> gEfiAcpiTableProtocolGuid and install the SMBIOS and ACPI tables
> in the respective notification ready callback functions.
>
> Add the ability to install multiple SMBIOS tables to the SMBIOS
> factory generator similar to ACPI.
>
> Signed-off-by: Girish Mahadevan <gmahadevan at nvidia.com>
> ---
>   .../DynamicTableManagerDxe.c                  | 585 +++++++++++++++++-
>   .../DynamicTableManagerDxe.inf                |   2 +-
>   .../Include/SmbiosTableGenerator.h            |  50 ++
>   3 files changed, 628 insertions(+), 9 deletions(-)
>
> diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c
> index ed62299f9b..1642d6c387 100644
> --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c
> +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c
> @@ -8,9 +8,11 @@
>   **/
>   
>   #include <Library/DebugLib.h>
> +#include <Library/UefiLib.h>
>   #include <Library/PcdLib.h>
>   #include <Library/UefiBootServicesTableLib.h>
>   #include <Protocol/AcpiTable.h>
> +#include <Protocol/Smbios.h>
>   
>   // Module specific include files.
>   #include <AcpiTableGenerator.h>
> @@ -31,6 +33,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
> @@ -478,6 +492,449 @@ 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;
> +  EFI_SMBIOS_HANDLE  TableHandle;
> +
> +  SmbiosTable = NULL;
> +  Status      = Generator->BuildSmbiosTable (
> +                             Generator,
> +                             SmbiosTableInfo,
> +                             CfgMgrProtocol,
> +                             &SmbiosTable
> +                             );

[SAMI] I think we may have to add another out parameter to the 
BuildSmbiosTable () and BuildSmbiosTableEx () interfaces. This parameter 
shall be a Reference Token that shall be a key in the mapping of 
Reference Token to the SMBIOS record handle.

Please see my feedback in patch 2/2 about the need for a SMBIOS 
HandleManager.

[/SAMI]

> +  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
> +                             );
[SAMI] I think we need to call an SMBIOS HandleManager interface to map 
the ReferenceToken received from BuildSmbiosTable () and 
BuildSmbiosTableEx () and associate it with the TableHandle.
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "ERROR: Failed to Install SMBIOS Table. 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,
> +                           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;
> +  EFI_SMBIOS_HANDLE  TableHandle;
> +  UINTN              TableCount;
> +  UINTN              Index;
> +
> +  TableCount = 0;
> +  Status     = Generator->BuildSmbiosTableEx (
> +                            Generator,
> +                            SmbiosTableInfo,
> +                            CfgMgrProtocol,
> +                            &SmbiosTable,
> +                            &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;
> +    // 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;
> +    }
> +
> +    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,
> +                           SmbiosTableInfo,
> +                           CfgMgrProtocol,
> +                           &SmbiosTable,
> +                           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;
> +    }
> +  }
> +
> +  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.
> +**/
> +STATIC
> +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
> +      ));
> +  }
> +
> +  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;
> +  UINT32                        Idx;
> +
> +  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;
> +  }
> +
[SAMI] I think we may need some additional code to sequence the 
dependency of SMBIOS table generation. Please see my feedback about 
SMBIOS Handle Manager in patch 2/2.
> +  DEBUG ((
> +    DEBUG_INFO,
> +    "INFO: EStdObjSmbiosTableList: SmbiosTableCount = %d\n",
> +    SmbiosTableCount
> +    ));
> +
> +  for (Idx = 0; Idx < SmbiosTableCount; Idx++) {
> +    Status = BuildAndInstallSmbiosTable (
> +               TableFactoryProtocol,
> +               CfgMgrProtocol,
> +               SmbiosProtocol,
> +               &SmbiosTableInfo[Idx]
> +               );
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((
> +        DEBUG_ERROR,
> +        "ERROR: Failed to install SMBIOS Table." \
> +        " Id = %u Status = %r\n",
> +        SmbiosTableInfo[Idx].TableGeneratorId,
> +        Status
> +        ));
> +    }
> +  }
> +
> +  return Status;
> +}
> +
>   /** Generate and install ACPI tables.
>   
>     The function gathers the information necessary for installing the
> @@ -664,11 +1121,11 @@ ProcessAcpiTables (
>     @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
> +STATIC
> +VOID
> +AcpiTableProtocolReady (
> +  IN  EFI_EVENT  Event,
> +  IN  VOID       *Context
>     )
>   {
>     EFI_STATUS                             Status;
> @@ -689,7 +1146,7 @@ DynamicTableManagerDxeInitialize (
>         " Status = %r\n",
>         Status
>         ));
> -    return Status;
> +    return;
>     }
>   
>     // Locate the Configuration Manager for the Platform
> @@ -704,7 +1161,7 @@ DynamicTableManagerDxeInitialize (
>         "ERROR: Failed to find Configuration Manager protocol. Status = %r\n",
>         Status
>         ));
> -    return Status;
> +    return;
>     }
>   
>     Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo);
> @@ -714,7 +1171,7 @@ DynamicTableManagerDxeInitialize (
>         "ERROR: Failed to get Configuration Manager info. Status = %r\n",
>         Status
>         ));
> -    return Status;
> +    return;
>     }
>   
>     DEBUG ((
> @@ -737,6 +1194,118 @@ DynamicTableManagerDxeInitialize (
>         Status
>         ));
>     }
> +}
> +
> +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
> +      ));
> +  }
> +}
> +
> +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/DynamicTableManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf
> index 028c3d413c..ccf58f6099 100644
> --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf
> +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf
> @@ -36,12 +36,12 @@
>   
>   [Protocols]
>     gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
> +  gEfiSmbiosProtocolGuid                        # PROTOCOL ALWAYS_CONSUMED
>   
>     gEdkiiConfigurationManagerProtocolGuid        # PROTOCOL ALWAYS_CONSUMED
>     gEdkiiDynamicTableFactoryProtocolGuid         # PROTOCOL ALWAYS_CONSUMED
>   
>   [Depex]
> -  gEfiAcpiTableProtocolGuid AND
>     gEdkiiConfigurationManagerProtocolGuid AND
>     gEdkiiDynamicTableFactoryProtocolGuid
>   
> diff --git a/DynamicTablesPkg/Include/SmbiosTableGenerator.h b/DynamicTablesPkg/Include/SmbiosTableGenerator.h
> index 934d56c90d..7bf6300d90 100644
> --- a/DynamicTablesPkg/Include/SmbiosTableGenerator.h
> +++ b/DynamicTablesPkg/Include/SmbiosTableGenerator.h
> @@ -168,6 +168,48 @@ typedef EFI_STATUS (*SMBIOS_TABLE_GENERATOR_FREE_TABLE) (
>     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        CM_STD_OBJ_SMBIOS_TABLE_INFO          *CONST  SmbiosTableInfo,
> +  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
> +  OUT       SMBIOS_STRUCTURE                              ***Table,
> +  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 CM_STD_OBJ_SMBIOS_TABLE_INFO          *CONST  SmbiosTableInfo,
> +  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
> +  IN        SMBIOS_STRUCTURE                              ***Table,
> +  IN  CONST UINTN                                          TableCount
> +  );
> +
>   /** The SMBIOS_TABLE_GENERATOR structure provides an interface that the
>       Table Manager can use to invoke the functions to build SMBIOS tables.
>   */
> @@ -189,6 +231,14 @@ typedef struct SmbiosTableGenerator {
>         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_TABLEEX   FreeTableResourcesEx;
>   } SMBIOS_TABLE_GENERATOR;
>   
>   /** Register SMBIOS table factory generator.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#93652): https://edk2.groups.io/g/devel/message/93652
Mute This Topic: https://groups.io/mt/93275298/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list