| /** @file | |
| SMBIOS Table Factory | |
| Copyright (c) 2017 - 2019, ARM Limited. All rights reserved. | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| @par Glossary: | |
| - Std - Standard | |
| **/ | |
| #include <IndustryStandard/SmBios.h> | |
| #include <Library/BaseLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/DebugLib.h> | |
| // Module specific include files. | |
| #include <SmbiosTableGenerator.h> | |
| #include <ConfigurationManagerObject.h> | |
| #include <Protocol/ConfigurationManagerProtocol.h> | |
| #include <Protocol/DynamicTableFactoryProtocol.h> | |
| #include "DynamicTableFactory.h" | |
| extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo; | |
| /** Return a pointer to the SMBIOS table generator. | |
| @param [in] This Pointer to the Dynamic Table Factory Protocol. | |
| @param [in] GeneratorId The SMBIOS table generator ID for the | |
| requested generator. | |
| @param [out] Generator Pointer to the requested SMBIOS table | |
| generator. | |
| @retval EFI_SUCCESS Success. | |
| @retval EFI_INVALID_PARAMETER A parameter is invalid. | |
| @retval EFI_NOT_FOUND The requested generator is not found | |
| in the list of registered generators. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| GetSmbiosTableGenerator ( | |
| IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This, | |
| IN CONST SMBIOS_TABLE_GENERATOR_ID GeneratorId, | |
| OUT CONST SMBIOS_TABLE_GENERATOR ** CONST Generator | |
| ) | |
| { | |
| UINT16 TableId; | |
| EDKII_DYNAMIC_TABLE_FACTORY_INFO * FactoryInfo; | |
| ASSERT (This != NULL); | |
| FactoryInfo = This->TableFactoryInfo; | |
| if (Generator == NULL) { | |
| DEBUG ((DEBUG_ERROR, "ERROR: Invalid Generator pointer\n")); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (!IS_GENERATOR_TYPE_SMBIOS (GeneratorId)) { | |
| DEBUG ((DEBUG_ERROR, "ERROR: Generator Type is not SMBIOS\n")); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| *Generator = NULL; | |
| TableId = GET_TABLE_ID (GeneratorId); | |
| if (IS_GENERATOR_NAMESPACE_STD (GeneratorId)) { | |
| if (TableId >= EStdSmbiosTableIdMax) { | |
| ASSERT (TableId < EStdSmbiosTableIdMax); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (FactoryInfo->StdSmbiosTableGeneratorList[TableId] != NULL) { | |
| *Generator = FactoryInfo->StdSmbiosTableGeneratorList[TableId]; | |
| } else { | |
| return EFI_NOT_FOUND; | |
| } | |
| } else { | |
| if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) { | |
| ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (FactoryInfo->CustomSmbiosTableGeneratorList[TableId] != NULL) { | |
| *Generator = FactoryInfo->CustomSmbiosTableGeneratorList[TableId]; | |
| } else { | |
| return EFI_NOT_FOUND; | |
| } | |
| } | |
| return EFI_SUCCESS; | |
| } | |
| /** Register SMBIOS table factory generator. | |
| The SMBIOS table factory maintains a list of the Standard and OEM SMBIOS | |
| table generators. | |
| @param [in] Generator Pointer to the SMBIOS table generator. | |
| @retval EFI_SUCCESS The Generator was registered | |
| successfully. | |
| @retval EFI_INVALID_PARAMETER The Generator ID is invalid or | |
| the Generator pointer is NULL. | |
| @retval EFI_ALREADY_STARTED The Generator for the Table ID is | |
| already registered. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| RegisterSmbiosTableGenerator ( | |
| IN CONST SMBIOS_TABLE_GENERATOR * CONST Generator | |
| ) | |
| { | |
| UINT16 TableId; | |
| if (Generator == NULL) { | |
| DEBUG ((DEBUG_ERROR, "ERROR: SMBIOS register - Invalid Generator\n")); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (!IS_GENERATOR_TYPE_SMBIOS (Generator->GeneratorID)) { | |
| DEBUG (( | |
| DEBUG_ERROR, | |
| "ERROR: SMBIOS register - Generator" \ | |
| " Type is not SMBIOS\n" | |
| )); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| DEBUG ((DEBUG_INFO, "Registering %s\n", Generator->Description)); | |
| TableId = GET_TABLE_ID (Generator->GeneratorID); | |
| if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) { | |
| if (TableId >= EStdSmbiosTableIdMax) { | |
| ASSERT (TableId < EStdSmbiosTableIdMax); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] == NULL) { | |
| TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] = Generator; | |
| } else { | |
| return EFI_ALREADY_STARTED; | |
| } | |
| } else { | |
| if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) { | |
| ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] == NULL) { | |
| TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] = Generator; | |
| } else { | |
| return EFI_ALREADY_STARTED; | |
| } | |
| } | |
| return EFI_SUCCESS; | |
| } | |
| /** Deregister SMBIOS generator. | |
| This function is called by the SMBIOS table generator to deregister itself | |
| from the SMBIOS table factory. | |
| @param [in] Generator Pointer to the SMBIOS table generator. | |
| @retval EFI_SUCCESS Success. | |
| @retval EFI_INVALID_PARAMETER The generator is invalid. | |
| @retval EFI_NOT_FOUND The requested generator is not found | |
| in the list of registered generators. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| DeregisterSmbiosTableGenerator ( | |
| IN CONST SMBIOS_TABLE_GENERATOR * CONST Generator | |
| ) | |
| { | |
| UINT16 TableId; | |
| if (Generator == NULL) { | |
| DEBUG ((DEBUG_ERROR, "ERROR: SMBIOS deregister - Invalid Generator\n")); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (!IS_GENERATOR_TYPE_SMBIOS (Generator->GeneratorID)) { | |
| DEBUG (( | |
| DEBUG_ERROR, | |
| "ERROR: SMBIOS deregister - Generator" \ | |
| " Type is not SMBIOS\n" | |
| )); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| TableId = GET_TABLE_ID (Generator->GeneratorID); | |
| if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) { | |
| if (TableId >= EStdSmbiosTableIdMax) { | |
| ASSERT (TableId < EStdSmbiosTableIdMax); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] != NULL) { | |
| if (Generator != TableFactoryInfo.StdSmbiosTableGeneratorList[TableId]) { | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] = NULL; | |
| } else { | |
| return EFI_NOT_FOUND; | |
| } | |
| } else { | |
| if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) { | |
| ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] != NULL) { | |
| if (Generator != | |
| TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId]) { | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] = NULL; | |
| } else { | |
| return EFI_NOT_FOUND; | |
| } | |
| } | |
| DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description)); | |
| return EFI_SUCCESS; | |
| } |