[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