Hi, I have a couple of minor comments.
reviewed-by: Jose Marinho <jose.mari...@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.muja...@arm.com> > Cc: gmahade...@nvidia.com; Alexei Fedorov <alexei.fedo...@arm.com>; > Pierre Gondois <pierre.gond...@arm.com>; Jeff Brasen (jbra...@nvidia.com) > <jbra...@nvidia.com>; ashishsin...@nvidia.com; nrami...@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 <gmahade...@nvidia.com> > Reviewed-by: Jeff Brasen <jbra...@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/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-