/** @file

  Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.

  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Glossary:
    - Std    - Standard
    - ACPI   - Advanced Configuration and Power Interface
    - SMBIOS - System Management BIOS
    - DT     - Device Tree
**/

#ifndef DYNAMIC_TABLE_FACTORY_H_
#define DYNAMIC_TABLE_FACTORY_H_

#pragma pack(1)

/** A structure that holds the list of registered ACPI and
    SMBIOS table generators.
*/
typedef struct DynamicTableFactoryInfo {
  /// An array for holding the list of Standard ACPI Table  Generators.
  CONST ACPI_TABLE_GENERATOR *
          StdAcpiTableGeneratorList[EStdAcpiTableIdMax];

  /// An array for holding the list of Custom ACPI Table Generators.
  CONST ACPI_TABLE_GENERATOR *
          CustomAcpiTableGeneratorList[FixedPcdGet16 (
                                         PcdMaxCustomACPIGenerators
                                         )];

  /// An array for holding the list of Standard SMBIOS Table Generators.
  CONST SMBIOS_TABLE_GENERATOR *
          StdSmbiosTableGeneratorList[EStdSmbiosTableIdMax];

  /// An array for holding the list of Custom SMBIOS Table Generators.
  CONST SMBIOS_TABLE_GENERATOR *
          CustomSmbiosTableGeneratorList[FixedPcdGet16 (
                                           PcdMaxCustomSMBIOSGenerators
                                           )];

  /// An array for holding the list of Standard DT Table Generators.
  CONST DT_TABLE_GENERATOR *
          StdDtTableGeneratorList[EStdDtTableIdMax];

  /// An array for holding the list of Custom DT Table Generators.
  CONST DT_TABLE_GENERATOR *
          CustomDtTableGeneratorList[FixedPcdGet16 (
                                       PcdMaxCustomDTGenerators
                                       )];
} EDKII_DYNAMIC_TABLE_FACTORY_INFO;

/** 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
  );

/** 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
  );

/** 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
  );

#pragma pack()

#endif // DYNAMIC_TABLE_FACTORY_H_
