diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DeviceTreeTableFactory/DeviceTreeTableFactory.c')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DeviceTreeTableFactory/DeviceTreeTableFactory.c | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DeviceTreeTableFactory/DeviceTreeTableFactory.c b/src/VBox/Devices/EFI/Firmware/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DeviceTreeTableFactory/DeviceTreeTableFactory.c new file mode 100644 index 00000000..85ef9e66 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DeviceTreeTableFactory/DeviceTreeTableFactory.c @@ -0,0 +1,219 @@ +/** @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 <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> + +// Module specific include files. +#include <DeviceTreeTableGenerator.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 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; +} |