/** @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 #include #include #include // Module specific include files. #include #include #include #include #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; }