--- /dev/null
+/** @file\r
+ ACPI Table Factory\r
+\r
+ Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\r
+\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+ @par Glossary:\r
+ - Std - Standard\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Protocol/AcpiTable.h>\r
+\r
+// Module specific include files.\r
+#include <AcpiTableGenerator.h>\r
+#include <ConfigurationManagerObject.h>\r
+#include <Protocol/ConfigurationManagerProtocol.h>\r
+#include <Protocol/DynamicTableFactoryProtocol.h>\r
+\r
+#include "DynamicTableFactory.h"\r
+\r
+extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo;\r
+\r
+/** Return a pointer to the ACPI table generator.\r
+\r
+ @param [in] This Pointer to the Dynamic Table Factory Protocol.\r
+ @param [in] GeneratorId The ACPI table generator ID for the\r
+ requested generator.\r
+ @param [out] Generator Pointer to the requested ACPI table\r
+ generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetAcpiTableGenerator (\r
+ IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This,\r
+ IN CONST ACPI_TABLE_GENERATOR_ID GeneratorId,\r
+ OUT CONST ACPI_TABLE_GENERATOR ** CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+ EDKII_DYNAMIC_TABLE_FACTORY_INFO * FactoryInfo;\r
+\r
+ ASSERT (This != NULL);\r
+\r
+ FactoryInfo = This->TableFactoryInfo;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: Invalid Generator pointer\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_ACPI (GeneratorId)) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: Generator Type is not ACPI\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *Generator = NULL;\r
+ TableId = GET_TABLE_ID (GeneratorId);\r
+ if (IS_GENERATOR_NAMESPACE_STD (GeneratorId)) {\r
+ if (TableId >= EStdAcpiTableIdMax) {\r
+ ASSERT (TableId < EStdAcpiTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (FactoryInfo->StdAcpiTableGeneratorList[TableId] != NULL) {\r
+ *Generator = FactoryInfo->StdAcpiTableGeneratorList[TableId];\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomACPIGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomACPIGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (FactoryInfo->CustomAcpiTableGeneratorList[TableId] != NULL) {\r
+ *Generator = FactoryInfo->CustomAcpiTableGeneratorList[TableId];\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/** Register ACPI table factory generator.\r
+\r
+ The ACPI table factory maintains a list of the Standard and OEM ACPI\r
+ table generators.\r
+\r
+ @param [in] Generator Pointer to the ACPI table generator.\r
+\r
+ @retval EFI_SUCCESS The Generator was registered\r
+ successfully.\r
+ @retval EFI_INVALID_PARAMETER The Generator ID is invalid or\r
+ the Generator pointer is NULL.\r
+ @retval EFI_ALREADY_STARTED The Generator for the Table ID is\r
+ already registered.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegisterAcpiTableGenerator (\r
+ IN CONST ACPI_TABLE_GENERATOR * CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: ACPI register - Invalid Generator\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_ACPI (Generator->GeneratorID)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: ACPI register - Generator" \\r
+ " Type is not ACPI\n"\r
+ ));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "Registering %s\n", Generator->Description));\r
+\r
+ TableId = GET_TABLE_ID (Generator->GeneratorID);\r
+ if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {\r
+ if (TableId >= EStdAcpiTableIdMax) {\r
+ ASSERT (TableId < EStdAcpiTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.StdAcpiTableGeneratorList[TableId] == NULL) {\r
+ TableFactoryInfo.StdAcpiTableGeneratorList[TableId] = Generator;\r
+ } else {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomACPIGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomACPIGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.CustomAcpiTableGeneratorList[TableId] == NULL) {\r
+ TableFactoryInfo.CustomAcpiTableGeneratorList[TableId] = Generator;\r
+ } else {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/** Deregister ACPI generator.\r
+\r
+ This function is called by the ACPI table generator to deregister itself\r
+ from the ACPI table factory.\r
+\r
+ @param [in] Generator Pointer to the ACPI table generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER The generator is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DeregisterAcpiTableGenerator (\r
+ IN CONST ACPI_TABLE_GENERATOR * CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: ACPI deregister - Invalid Generator\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_ACPI (Generator->GeneratorID)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: ACPI deregister - Generator" \\r
+ " Type is not ACPI\n"\r
+ ));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ TableId = GET_TABLE_ID (Generator->GeneratorID);\r
+ if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {\r
+ if (TableId >= EStdAcpiTableIdMax) {\r
+ ASSERT (TableId < EStdAcpiTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.StdAcpiTableGeneratorList[TableId] != NULL) {\r
+ if (Generator != TableFactoryInfo.StdAcpiTableGeneratorList[TableId]) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ TableFactoryInfo.StdAcpiTableGeneratorList[TableId] = NULL;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomACPIGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomACPIGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.CustomAcpiTableGeneratorList[TableId] != NULL) {\r
+ if (Generator !=\r
+ TableFactoryInfo.CustomAcpiTableGeneratorList[TableId]) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ TableFactoryInfo.CustomAcpiTableGeneratorList[TableId] = NULL;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description));\r
+ return EFI_SUCCESS;\r
+}\r
--- /dev/null
+/** @file\r
+ Device Tree Table Factory\r
+\r
+ Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\r
+\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+ @par Glossary:\r
+ - Std - Standard\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+// Module specific include files.\r
+#include <DeviceTreeTableGenerator.h>\r
+#include <ConfigurationManagerObject.h>\r
+#include <Protocol/ConfigurationManagerProtocol.h>\r
+#include <Protocol/DynamicTableFactoryProtocol.h>\r
+\r
+#include "DynamicTableFactory.h"\r
+\r
+extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo;\r
+\r
+/** Return a pointer to the DT table generator.\r
+\r
+ @param [in] This Pointer to the Dynamic Table Factory Protocol.\r
+ @param [in] GeneratorId The DT table generator ID for the\r
+ requested generator.\r
+ @param [out] Generator Pointer to the requested DT table\r
+ generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetDtTableGenerator (\r
+ IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This,\r
+ IN CONST DT_TABLE_GENERATOR_ID GeneratorId,\r
+ OUT CONST DT_TABLE_GENERATOR ** CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+ EDKII_DYNAMIC_TABLE_FACTORY_INFO * FactoryInfo;\r
+\r
+ ASSERT (This != NULL);\r
+\r
+ FactoryInfo = This->TableFactoryInfo;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: Invalid Generator pointer\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_DT (GeneratorId)) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: Generator Type is not DT\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *Generator = NULL;\r
+ TableId = GET_TABLE_ID (GeneratorId);\r
+ if (IS_GENERATOR_NAMESPACE_STD (GeneratorId)) {\r
+ if (TableId >= EStdDtTableIdMax) {\r
+ ASSERT (TableId < EStdDtTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (FactoryInfo->StdDtTableGeneratorList[TableId] != NULL) {\r
+ *Generator = FactoryInfo->StdDtTableGeneratorList[TableId];\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomDTGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomDTGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (FactoryInfo->CustomDtTableGeneratorList[TableId] != NULL) {\r
+ *Generator = FactoryInfo->CustomDtTableGeneratorList[TableId];\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/** Register DT table factory generator.\r
+\r
+ The DT table factory maintains a list of the Standard and OEM DT\r
+ table generators.\r
+\r
+ @param [in] Generator Pointer to the DT table generator.\r
+\r
+ @retval EFI_SUCCESS The Generator was registered\r
+ successfully.\r
+ @retval EFI_INVALID_PARAMETER The Generator ID is invalid or\r
+ the Generator pointer is NULL.\r
+ @retval EFI_ALREADY_STARTED The Generator for the Table ID is\r
+ already registered.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegisterDtTableGenerator (\r
+ IN CONST DT_TABLE_GENERATOR * CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: DT register - Invalid Generator\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_DT (Generator->GeneratorID)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: DT register - Generator" \\r
+ " Type is not DT\n"\r
+ ));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "Registering %s\n", Generator->Description));\r
+\r
+ TableId = GET_TABLE_ID (Generator->GeneratorID);\r
+ if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {\r
+ if (TableId >= EStdDtTableIdMax) {\r
+ ASSERT (TableId < EStdDtTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.StdDtTableGeneratorList[TableId] == NULL) {\r
+ TableFactoryInfo.StdDtTableGeneratorList[TableId] = Generator;\r
+ } else {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomDTGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomDTGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.CustomDtTableGeneratorList[TableId] == NULL) {\r
+ TableFactoryInfo.CustomDtTableGeneratorList[TableId] = Generator;\r
+ } else {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/** Deregister DT generator.\r
+\r
+ This function is called by the DT table generator to deregister itself\r
+ from the DT table factory.\r
+\r
+ @param [in] Generator Pointer to the DT table generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER The generator is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DeregisterDtTableGenerator (\r
+ IN CONST DT_TABLE_GENERATOR * CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: DT deregister - Invalid Generator\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_DT (Generator->GeneratorID)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: DT deregister - Generator" \\r
+ " Type is not DT\n"\r
+ ));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ TableId = GET_TABLE_ID (Generator->GeneratorID);\r
+ if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {\r
+ if (TableId >= EStdDtTableIdMax) {\r
+ ASSERT (TableId < EStdDtTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.StdDtTableGeneratorList[TableId] != NULL) {\r
+ if (Generator != TableFactoryInfo.StdDtTableGeneratorList[TableId]) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ TableFactoryInfo.StdDtTableGeneratorList[TableId] = NULL;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomDTGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomDTGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.CustomDtTableGeneratorList[TableId] != NULL) {\r
+ if (Generator !=\r
+ TableFactoryInfo.CustomDtTableGeneratorList[TableId]) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ TableFactoryInfo.CustomDtTableGeneratorList[TableId] = NULL;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description));\r
+ return EFI_SUCCESS;\r
+}\r
--- /dev/null
+/** @file\r
+\r
+ Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\r
+\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+ @par Glossary:\r
+ - Std - Standard\r
+ - ACPI - Advanced Configuration and Power Interface\r
+ - SMBIOS - System Management BIOS\r
+ - DT - Device Tree\r
+**/\r
+\r
+#ifndef DYNAMIC_TABLE_FACTORY_H_\r
+#define DYNAMIC_TABLE_FACTORY_H_\r
+\r
+#pragma pack(1)\r
+\r
+/** A structure that holds the list of registered ACPI and\r
+ SMBIOS table generators.\r
+*/\r
+typedef struct DynamicTableFactoryInfo {\r
+ /// An array for holding the list of Standard ACPI Table Generators.\r
+ CONST ACPI_TABLE_GENERATOR *\r
+ StdAcpiTableGeneratorList[EStdAcpiTableIdMax];\r
+\r
+ /// An array for holding the list of Custom ACPI Table Generators.\r
+ CONST ACPI_TABLE_GENERATOR *\r
+ CustomAcpiTableGeneratorList[FixedPcdGet16 (\r
+ PcdMaxCustomACPIGenerators\r
+ )];\r
+\r
+ /// An array for holding the list of Standard SMBIOS Table Generators.\r
+ CONST SMBIOS_TABLE_GENERATOR *\r
+ StdSmbiosTableGeneratorList[EStdSmbiosTableIdMax];\r
+\r
+ /// An array for holding the list of Custom SMBIOS Table Generators.\r
+ CONST SMBIOS_TABLE_GENERATOR *\r
+ CustomSmbiosTableGeneratorList[FixedPcdGet16 (\r
+ PcdMaxCustomSMBIOSGenerators\r
+ )];\r
+\r
+ /// An array for holding the list of Standard DT Table Generators.\r
+ CONST DT_TABLE_GENERATOR *\r
+ StdDtTableGeneratorList[EStdDtTableIdMax];\r
+\r
+ /// An array for holding the list of Custom DT Table Generators.\r
+ CONST DT_TABLE_GENERATOR *\r
+ CustomDtTableGeneratorList[FixedPcdGet16 (\r
+ PcdMaxCustomDTGenerators\r
+ )];\r
+} EDKII_DYNAMIC_TABLE_FACTORY_INFO;\r
+\r
+/** Return a pointer to the ACPI table generator.\r
+\r
+ @param [in] This Pointer to the Dynamic Table Factory Protocol.\r
+ @param [in] GeneratorId The ACPI table generator ID for the\r
+ requested generator.\r
+ @param [out] Generator Pointer to the requested ACPI table\r
+ generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetAcpiTableGenerator (\r
+ IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This,\r
+ IN CONST ACPI_TABLE_GENERATOR_ID GeneratorId,\r
+ OUT CONST ACPI_TABLE_GENERATOR ** CONST Generator\r
+ );\r
+\r
+/** Return a pointer to the SMBIOS table generator.\r
+\r
+ @param [in] This Pointer to the Dynamic Table Factory Protocol.\r
+ @param [in] GeneratorId The SMBIOS table generator ID for the\r
+ requested generator.\r
+ @param [out] Generator Pointer to the requested SMBIOS table\r
+ generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSmbiosTableGenerator (\r
+ IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This,\r
+ IN CONST SMBIOS_TABLE_GENERATOR_ID GeneratorId,\r
+ OUT CONST SMBIOS_TABLE_GENERATOR ** CONST Generator\r
+ );\r
+\r
+/** Return a pointer to the DT table generator.\r
+\r
+ @param [in] This Pointer to the Dynamic Table Factory Protocol.\r
+ @param [in] GeneratorId The DT table generator ID for the\r
+ requested generator.\r
+ @param [out] Generator Pointer to the requested DT table\r
+ generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetDtTableGenerator (\r
+ IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This,\r
+ IN CONST DT_TABLE_GENERATOR_ID GeneratorId,\r
+ OUT CONST DT_TABLE_GENERATOR ** CONST Generator\r
+ );\r
+\r
+#pragma pack()\r
+\r
+#endif // DYNAMIC_TABLE_FACTORY_H_\r
--- /dev/null
+/** @file\r
+ Dynamic Table Factory Dxe\r
+\r
+ Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.\r
+\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Protocol/AcpiTable.h>\r
+\r
+// Module specific include files.\r
+#include <AcpiTableGenerator.h>\r
+#include <ConfigurationManagerObject.h>\r
+#include <ConfigurationManagerHelper.h>\r
+#include <DeviceTreeTableGenerator.h>\r
+#include <Library/TableHelperLib.h>\r
+#include <Protocol/ConfigurationManagerProtocol.h>\r
+#include <Protocol/DynamicTableFactoryProtocol.h>\r
+#include <SmbiosTableGenerator.h>\r
+\r
+#include "DynamicTableFactory.h"\r
+\r
+/** The Dynamic Table Factory protocol structure that holds the\r
+ list of registered ACPI and SMBIOS table generators.\r
+*/\r
+EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo;\r
+\r
+/** A structure describing the Dynamic Table Factory protocol.\r
+*/\r
+STATIC\r
+CONST\r
+EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL DynamicTableFactoryProtocol = {\r
+ CREATE_REVISION (1, 0),\r
+ GetAcpiTableGenerator,\r
+ RegisterAcpiTableGenerator,\r
+ DeregisterAcpiTableGenerator,\r
+ GetSmbiosTableGenerator,\r
+ RegisterSmbiosTableGenerator,\r
+ DeregisterSmbiosTableGenerator,\r
+ GetDtTableGenerator,\r
+ RegisterDtTableGenerator,\r
+ DeregisterDtTableGenerator,\r
+ &TableFactoryInfo\r
+};\r
+\r
+/** Entrypoint for Dynamic Table Factory Dxe.\r
+\r
+ @param ImageHandle\r
+ @param SystemTable\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_OUT_OF_RESOURCES Memory allocation failed.\r
+ @retval EFI_NOT_FOUND Required interface/object was not found.\r
+ @retval EFI_INVALID_PARAMETER Some parameter is incorrect/invalid.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DynamicTableFactoryDxeInitialize (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE * CONST SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = gBS->InstallProtocolInterface (\r
+ &ImageHandle,\r
+ &gEdkiiDynamicTableFactoryProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ (VOID*)&DynamicTableFactoryProtocol\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: Failed to install the Dynamic Table Factory Protocol." \\r
+ " Status = %r\n",\r
+ Status\r
+ ));\r
+ }\r
+ return Status;\r
+}\r
--- /dev/null
+## @file\r
+# Module to manage the list of available table factories.\r
+#\r
+# Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.\r
+#\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010019\r
+ BASE_NAME = DynamicTableFactoryDxe\r
+ FILE_GUID = FE846898-7403-4932-B8AD-A0491F0C2CBA\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ ENTRY_POINT = DynamicTableFactoryDxeInitialize\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = ARM AARCH64\r
+#\r
+\r
+[Sources]\r
+ AcpiTableFactory/AcpiTableFactory.c\r
+ DeviceTreeTableFactory/DeviceTreeTableFactory.c\r
+ DynamicTableFactoryDxe.c\r
+ SmbiosTableFactory/SmbiosTableFactory.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+ DynamicTablesPkg/DynamicTablesPkg.dec\r
+\r
+[LibraryClasses]\r
+ BaseLib\r
+ MemoryAllocationLib\r
+ PrintLib\r
+ TableHelperLib\r
+ UefiBootServicesTableLib\r
+ UefiDriverEntryPoint\r
+\r
+[FixedPcd]\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxCustomACPIGenerators\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxCustomSMBIOSGenerators\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxCustomDTGenerators\r
+\r
+[Protocols]\r
+ gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
+ gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
+ gEdkiiConfigurationManagerProtocolGuid\r
+ gEdkiiDynamicTableFactoryProtocolGuid\r
+\r
+[Depex]\r
+ TRUE\r
--- /dev/null
+/** @file\r
+ SMBIOS Table Factory\r
+\r
+ Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\r
+\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+ @par Glossary:\r
+ - Std - Standard\r
+**/\r
+\r
+#include <IndustryStandard/SmBios.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+// Module specific include files.\r
+#include <SmbiosTableGenerator.h>\r
+#include <ConfigurationManagerObject.h>\r
+#include <Protocol/ConfigurationManagerProtocol.h>\r
+#include <Protocol/DynamicTableFactoryProtocol.h>\r
+\r
+#include "DynamicTableFactory.h"\r
+\r
+extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo;\r
+\r
+/** Return a pointer to the SMBIOS table generator.\r
+\r
+ @param [in] This Pointer to the Dynamic Table Factory Protocol.\r
+ @param [in] GeneratorId The SMBIOS table generator ID for the\r
+ requested generator.\r
+ @param [out] Generator Pointer to the requested SMBIOS table\r
+ generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSmbiosTableGenerator (\r
+ IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL * CONST This,\r
+ IN CONST SMBIOS_TABLE_GENERATOR_ID GeneratorId,\r
+ OUT CONST SMBIOS_TABLE_GENERATOR ** CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+ EDKII_DYNAMIC_TABLE_FACTORY_INFO * FactoryInfo;\r
+\r
+ ASSERT (This != NULL);\r
+\r
+ FactoryInfo = This->TableFactoryInfo;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: Invalid Generator pointer\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_SMBIOS (GeneratorId)) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: Generator Type is not SMBIOS\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *Generator = NULL;\r
+ TableId = GET_TABLE_ID (GeneratorId);\r
+ if (IS_GENERATOR_NAMESPACE_STD (GeneratorId)) {\r
+ if (TableId >= EStdSmbiosTableIdMax) {\r
+ ASSERT (TableId < EStdSmbiosTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (FactoryInfo->StdSmbiosTableGeneratorList[TableId] != NULL) {\r
+ *Generator = FactoryInfo->StdSmbiosTableGeneratorList[TableId];\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (FactoryInfo->CustomSmbiosTableGeneratorList[TableId] != NULL) {\r
+ *Generator = FactoryInfo->CustomSmbiosTableGeneratorList[TableId];\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/** Register SMBIOS table factory generator.\r
+\r
+ The SMBIOS table factory maintains a list of the Standard and OEM SMBIOS\r
+ table generators.\r
+\r
+ @param [in] Generator Pointer to the SMBIOS table generator.\r
+\r
+ @retval EFI_SUCCESS The Generator was registered\r
+ successfully.\r
+ @retval EFI_INVALID_PARAMETER The Generator ID is invalid or\r
+ the Generator pointer is NULL.\r
+ @retval EFI_ALREADY_STARTED The Generator for the Table ID is\r
+ already registered.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegisterSmbiosTableGenerator (\r
+ IN CONST SMBIOS_TABLE_GENERATOR * CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: SMBIOS register - Invalid Generator\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_SMBIOS (Generator->GeneratorID)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: SMBIOS register - Generator" \\r
+ " Type is not SMBIOS\n"\r
+ ));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "Registering %s\n", Generator->Description));\r
+\r
+ TableId = GET_TABLE_ID (Generator->GeneratorID);\r
+ if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {\r
+ if (TableId >= EStdSmbiosTableIdMax) {\r
+ ASSERT (TableId < EStdSmbiosTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] == NULL) {\r
+ TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] = Generator;\r
+ } else {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] == NULL) {\r
+ TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] = Generator;\r
+ } else {\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/** Deregister SMBIOS generator.\r
+\r
+ This function is called by the SMBIOS table generator to deregister itself\r
+ from the SMBIOS table factory.\r
+\r
+ @param [in] Generator Pointer to the SMBIOS table generator.\r
+\r
+ @retval EFI_SUCCESS Success.\r
+ @retval EFI_INVALID_PARAMETER The generator is invalid.\r
+ @retval EFI_NOT_FOUND The requested generator is not found\r
+ in the list of registered generators.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DeregisterSmbiosTableGenerator (\r
+ IN CONST SMBIOS_TABLE_GENERATOR * CONST Generator\r
+ )\r
+{\r
+ UINT16 TableId;\r
+\r
+ if (Generator == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: SMBIOS deregister - Invalid Generator\n"));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_GENERATOR_TYPE_SMBIOS (Generator->GeneratorID)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: SMBIOS deregister - Generator" \\r
+ " Type is not SMBIOS\n"\r
+ ));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ TableId = GET_TABLE_ID (Generator->GeneratorID);\r
+ if (IS_GENERATOR_NAMESPACE_STD (Generator->GeneratorID)) {\r
+ if (TableId >= EStdSmbiosTableIdMax) {\r
+ ASSERT (TableId < EStdSmbiosTableIdMax);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] != NULL) {\r
+ if (Generator != TableFactoryInfo.StdSmbiosTableGeneratorList[TableId]) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ TableFactoryInfo.StdSmbiosTableGeneratorList[TableId] = NULL;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ } else {\r
+ if (TableId > FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators)) {\r
+ ASSERT (TableId <= FixedPcdGet16 (PcdMaxCustomSMBIOSGenerators));\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ if (TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] != NULL) {\r
+ if (Generator !=\r
+ TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId]) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ TableFactoryInfo.CustomSmbiosTableGeneratorList[TableId] = NULL;\r
+ } else {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "Deregistering %s\n", Generator->Description));\r
+ return EFI_SUCCESS;\r
+}\r
[LibraryClasses.common]\r
TableHelperLib|DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf\r
\r
+[Components.common]\r
+ #\r
+ # Dynamic Table Factory Dxe\r
+ #\r
+ DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf\r
+\r
--- /dev/null
+## @file\r
+# fdf include file for Dynamic Tables Framework.\r
+#\r
+# Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+ #\r
+ # Dynamic Table Factory Dxe\r
+ #\r
+ INF DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf\r
+\r
# Dynamic Table Factory Protocol GUID\r
gEdkiiDynamicTableFactoryProtocolGuid = { 0x91d1e327, 0xfe5a, 0x49b8, { 0xab, 0x65, 0xe, 0xce, 0x2d, 0xdb, 0x45, 0xec } }\r
\r
+[PcdsFixedAtBuild]\r
+\r
+ # Maximum number of Custom ACPI Generators\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxCustomACPIGenerators|1|UINT16|0xC0000001\r
+\r
+ # Maximum number of Custom SMBIOS Generators\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxCustomSMBIOSGenerators|1|UINT16|0xC0000002\r
+\r
+ # Maximum number of Custom DT Generators\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdMaxCustomDTGenerators|1|UINT16|0xC0000003\r
+\r