/** @file Device Tree 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 // Module specific include files. #include #include #include #include #include "DynamicTableFactory.h" extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo; /** Return a pointer to the DT table generator. @param [in] This Pointer to the Dynamic Table Factory Protocol. @param [in] GeneratorId The DT table generator ID for the requested generator. @param [out] Generator Pointer to the requested DT 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 GetDtTableGenerator ( IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This, IN CONST DT_TABLE_GENERATOR_ID GeneratorId, OUT CONST DT_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_DT (GeneratorId)) { DEBUG ((DEBUG_ERROR, "ERROR: Generator Type is not DT\n")); return EFI_INVALID_PARAMETER; } *Generator = NULL; TableId = GET_TABLE_ID (GeneratorId); if (IS_GENERATOR_NAMESPACE_STD (GeneratorId)) { if (TableId >= EStdDtTableIdMax) { ASSERT (TableId < EStdDtTableIdMax); return EFI_INVALID_PARAMETER; } if (FactoryInfo->StdDtTableGeneratorList[TableId] != NULL) { *Generator = FactoryInfo->StdDtTableGeneratorList[TableId]; } else { return EFI_NOT_FOUND; } } else { if (TableId > FixedPcdGet16 (PcdMaxCustomDTGenerators)) { ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomDTGenerators)); return EFI_INVALID_PARAMETER; } if (FactoryInfo->CustomDtTableGeneratorList[TableId] != NULL) { *Generator = FactoryInfo->CustomDtTableGeneratorList[TableId]; } else { return EFI_NOT_FOUND; } } return EFI_SUCCESS; } /** Register DT table factory generator. The DT table factory maintains a list of the Standard and OEM DT table generators. @param [in] Generator Pointer to the DT 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 RegisterDtTableGenerator ( IN CONST DT_TABLE_GENERATOR * CONST Generator ) { UINT16 TableId; if (Generator == NULL) { DEBUG ((DEBUG_ERROR, "ERROR: DT register - Invalid Generator\n")); return EFI_INVALID_PARAMETER; } if (!IS_GENERATOR_TYPE_DT (Generator->GeneratorID)) { DEBUG (( DEBUG_ERROR, "ERROR: DT register - Generator" \ " Type is not DT\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 >= EStdDtTableIdMax) { ASSERT (TableId < EStdDtTableIdMax); return EFI_INVALID_PARAMETER; } if (TableFactoryInfo.StdDtTableGeneratorList[TableId] == NULL) { TableFactoryInfo.StdDtTableGeneratorList[TableId] = Generator; } else { return EFI_ALREADY_STARTED; } } else { if (TableId > FixedPcdGet16 (PcdMaxCustomDTGenerators)) { ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomDTGenerators)); return EFI_INVALID_PARAMETER; } if (TableFactoryInfo.CustomDtTableGeneratorList[TableId] == NULL) { TableFactoryInfo.CustomDtTableGeneratorList[TableId] = Generator; } else { return EFI_ALREADY_STARTED; } } return EFI_SUCCESS; } /** Deregister DT generator. This function is called by the DT table generator to deregister itself from the DT table factory. @param [in] Generator Pointer to the DT 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 DeregisterDtTableGenerator ( IN CONST DT_TABLE_GENERATOR * CONST Generator ) { UINT16 TableId; if (Generator == NULL) { DEBUG ((DEBUG_ERROR, "ERROR: DT deregister - Invalid Generator\n")); return EFI_INVALID_PARAMETER; } if (!IS_GENERATOR_TYPE_DT (Generator->GeneratorID)) { DEBUG (( DEBUG_ERROR, "ERROR: DT deregister - Generator" \ " Type is not DT\n" )); return EFI_INVALID_PARAMETER; } TableId = GET_TABLE_ID (Generator->GeneratorID); if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) { if (TableId >= EStdDtTableIdMax) { ASSERT (TableId < EStdDtTableIdMax); return EFI_INVALID_PARAMETER; } if (TableFactoryInfo.StdDtTableGeneratorList[TableId] != NULL) { if (Generator != TableFactoryInfo.StdDtTableGeneratorList[TableId]) { return EFI_INVALID_PARAMETER; } TableFactoryInfo.StdDtTableGeneratorList[TableId] = NULL; } else { return EFI_NOT_FOUND; } } else { if (TableId > FixedPcdGet16 (PcdMaxCustomDTGenerators)) { ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomDTGenerators)); return EFI_INVALID_PARAMETER; } if (TableFactoryInfo.CustomDtTableGeneratorList[TableId] != NULL) { if (Generator != TableFactoryInfo.CustomDtTableGeneratorList[TableId]) { return EFI_INVALID_PARAMETER; } TableFactoryInfo.CustomDtTableGeneratorList[TableId] = NULL; } else { return EFI_NOT_FOUND; } } DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description)); return EFI_SUCCESS; }