/** @file ACPI 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 ACPI table generator. @param [in] This Pointer to the Dynamic Table Factory Protocol. @param [in] GeneratorId The ACPI table generator ID for the requested generator. @param [out] Generator Pointer to the requested ACPI 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 GetAcpiTableGenerator ( IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST This, IN CONST ACPI_TABLE_GENERATOR_ID GeneratorId, OUT CONST ACPI_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_ACPI (GeneratorId)) { DEBUG ((DEBUG_ERROR, "ERROR: Generator Type is not ACPI\n")); return EFI_INVALID_PARAMETER; } *Generator = NULL; TableId = GET_TABLE_ID (GeneratorId); if (IS_GENERATOR_NAMESPACE_STD (GeneratorId)) { if (TableId >= EStdAcpiTableIdMax) { ASSERT (TableId < EStdAcpiTableIdMax); return EFI_INVALID_PARAMETER; } if (FactoryInfo->StdAcpiTableGeneratorList[TableId] != NULL) { *Generator = FactoryInfo->StdAcpiTableGeneratorList[TableId]; } else { return EFI_NOT_FOUND; } } else { if (TableId > FixedPcdGet16 (PcdMaxCustomACPIGenerators)) { ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomACPIGenerators)); return EFI_INVALID_PARAMETER; } if (FactoryInfo->CustomAcpiTableGeneratorList[TableId] != NULL) { *Generator = FactoryInfo->CustomAcpiTableGeneratorList[TableId]; } else { return EFI_NOT_FOUND; } } return EFI_SUCCESS; } /** Register ACPI table factory generator. The ACPI table factory maintains a list of the Standard and OEM ACPI table generators. @param [in] Generator Pointer to the ACPI 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 RegisterAcpiTableGenerator ( IN CONST ACPI_TABLE_GENERATOR *CONST Generator ) { UINT16 TableId; if (Generator == NULL) { DEBUG ((DEBUG_ERROR, "ERROR: ACPI register - Invalid Generator\n")); return EFI_INVALID_PARAMETER; } if (!IS_GENERATOR_TYPE_ACPI (Generator->GeneratorID)) { DEBUG (( DEBUG_ERROR, "ERROR: ACPI register - Generator" \ " Type is not ACPI\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 >= EStdAcpiTableIdMax) { ASSERT (TableId < EStdAcpiTableIdMax); return EFI_INVALID_PARAMETER; } if (TableFactoryInfo.StdAcpiTableGeneratorList[TableId] == NULL) { TableFactoryInfo.StdAcpiTableGeneratorList[TableId] = Generator; } else { return EFI_ALREADY_STARTED; } } else { if (TableId > FixedPcdGet16 (PcdMaxCustomACPIGenerators)) { ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomACPIGenerators)); return EFI_INVALID_PARAMETER; } if (TableFactoryInfo.CustomAcpiTableGeneratorList[TableId] == NULL) { TableFactoryInfo.CustomAcpiTableGeneratorList[TableId] = Generator; } else { return EFI_ALREADY_STARTED; } } return EFI_SUCCESS; } /** Deregister ACPI generator. This function is called by the ACPI table generator to deregister itself from the ACPI table factory. @param [in] Generator Pointer to the ACPI 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 DeregisterAcpiTableGenerator ( IN CONST ACPI_TABLE_GENERATOR *CONST Generator ) { UINT16 TableId; if (Generator == NULL) { DEBUG ((DEBUG_ERROR, "ERROR: ACPI deregister - Invalid Generator\n")); return EFI_INVALID_PARAMETER; } if (!IS_GENERATOR_TYPE_ACPI (Generator->GeneratorID)) { DEBUG (( DEBUG_ERROR, "ERROR: ACPI deregister - Generator" \ " Type is not ACPI\n" )); return EFI_INVALID_PARAMETER; } TableId = GET_TABLE_ID (Generator->GeneratorID); if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) { if (TableId >= EStdAcpiTableIdMax) { ASSERT (TableId < EStdAcpiTableIdMax); return EFI_INVALID_PARAMETER; } if (TableFactoryInfo.StdAcpiTableGeneratorList[TableId] != NULL) { if (Generator != TableFactoryInfo.StdAcpiTableGeneratorList[TableId]) { return EFI_INVALID_PARAMETER; } TableFactoryInfo.StdAcpiTableGeneratorList[TableId] = NULL; } else { return EFI_NOT_FOUND; } } else { if (TableId > FixedPcdGet16 (PcdMaxCustomACPIGenerators)) { ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomACPIGenerators)); return EFI_INVALID_PARAMETER; } if (TableFactoryInfo.CustomAcpiTableGeneratorList[TableId] != NULL) { if (Generator != TableFactoryInfo.CustomAcpiTableGeneratorList[TableId]) { return EFI_INVALID_PARAMETER; } TableFactoryInfo.CustomAcpiTableGeneratorList[TableId] = NULL; } else { return EFI_NOT_FOUND; } } DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description)); return EFI_SUCCESS; }