--- /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
+**/\r
+\r
+#ifndef TABLE_HELPER_LIB_H_\r
+#define TABLE_HELPER_LIB_H_\r
+\r
+/** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO\r
+ object from the Configuration Manager.\r
+\r
+ @param [in] CfgMgrProtocol Pointer to the Configuration Manager protocol\r
+ interface.\r
+ @param [out] CfgMfrInfo Pointer to the Configuration Manager Info\r
+ object structure.\r
+\r
+ @retval EFI_SUCCESS The object is returned.\r
+ @retval EFI_INVALID_PARAMETER The Object ID is invalid.\r
+ @retval EFI_NOT_FOUND The requested Object is not found.\r
+ @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration\r
+ Manager is less than the Object size.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetCgfMgrInfo (\r
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,\r
+ OUT CM_STD_OBJ_CONFIGURATION_MANAGER_INFO ** CfgMfrInfo\r
+ );\r
+\r
+/** The AddAcpiHeader function updates the ACPI header structure. It uses the\r
+ ACPI table Generator and the Configuration Manager protocol to obtain the\r
+ information required for constructing the header.\r
+\r
+ @param [in] CfgMgrProtocol Pointer to the Configuration Manager\r
+ protocol interface.\r
+ @param [in] Generator Pointer to the ACPI table Generator.\r
+ @param [in,out] AcpiHeader Pointer to the ACPI table header to be\r
+ updated.\r
+ @param [in] Revision Revision of the ACPI table.\r
+ @param [in] Length Length of the ACPI table.\r
+\r
+ @retval EFI_SUCCESS The ACPI table is updated successfully.\r
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
+ @retval EFI_NOT_FOUND The required object information is not found.\r
+ @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration\r
+ Manager is less than the Object size for the\r
+ requested object.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+AddAcpiHeader (\r
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,\r
+ IN CONST ACPI_TABLE_GENERATOR * CONST Generator,\r
+ IN OUT EFI_ACPI_DESCRIPTION_HEADER * CONST AcpiHeader,\r
+ IN CONST UINT32 Revision,\r
+ IN CONST UINT32 Length\r
+ );\r
+\r
+#endif // TABLE_HELPER_LIB_H_\r
--- /dev/null
+/** @file\r
+ Table Helper\r
+\r
+Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\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
+#include <Protocol/AcpiTable.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+// Module specific include files.\r
+#include <AcpiTableGenerator.h>\r
+#include <ConfigurationManagerObject.h>\r
+#include <Protocol/ConfigurationManagerProtocol.h>\r
+\r
+/** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO\r
+ object from the Configuration Manager.\r
+\r
+ @param [in] CfgMgrProtocol Pointer to the Configuration Manager protocol\r
+ interface.\r
+ @param [out] CfgMfrInfo Pointer to the Configuration Manager Info\r
+ object structure.\r
+\r
+ @retval EFI_SUCCESS The object is returned.\r
+ @retval EFI_INVALID_PARAMETER The Object ID is invalid.\r
+ @retval EFI_NOT_FOUND The requested Object is not found.\r
+ @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration\r
+ Manager is less than the Object size.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetCgfMgrInfo (\r
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,\r
+ OUT CM_STD_OBJ_CONFIGURATION_MANAGER_INFO ** CfgMfrInfo\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ CM_OBJ_DESCRIPTOR CmObjectDesc;\r
+\r
+ ASSERT (CfgMgrProtocol != NULL);\r
+ ASSERT (CfgMfrInfo != NULL);\r
+\r
+ *CfgMfrInfo = NULL;\r
+ Status = CfgMgrProtocol->GetObject (\r
+ CfgMgrProtocol,\r
+ CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo),\r
+ CM_NULL_TOKEN,\r
+ &CmObjectDesc\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: Failed to Get Configuration Manager Info. Status = %r\n",\r
+ Status\r
+ ));\r
+ return Status;\r
+ }\r
+\r
+ if (CmObjectDesc.ObjectId != CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: EStdObjCfgMgrInfo: Invalid ObjectId = 0x%x, expected Id = 0x%x\n",\r
+ CmObjectDesc.ObjectId,\r
+ CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo)\r
+ ));\r
+ ASSERT (FALSE);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (CmObjectDesc.Size <\r
+ (sizeof (CM_STD_OBJ_CONFIGURATION_MANAGER_INFO) * CmObjectDesc.Count)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: EStdObjCfgMgrInfo: Buffer too small, size = 0x%x\n",\r
+ CmObjectDesc.Size\r
+ ));\r
+ ASSERT (FALSE);\r
+ return EFI_BAD_BUFFER_SIZE;\r
+ }\r
+\r
+ *CfgMfrInfo = (CM_STD_OBJ_CONFIGURATION_MANAGER_INFO*)CmObjectDesc.Data;\r
+ return Status;\r
+}\r
+\r
+/** The AddAcpiHeader function updates the ACPI header structure pointed by\r
+ the AcpiHeader. It utilizes the ACPI table Generator and the Configuration\r
+ Manager protocol to obtain any information required for constructing the\r
+ header.\r
+\r
+ @param [in] CfgMgrProtocol Pointer to the Configuration Manager\r
+ protocol interface.\r
+ @param [in] Generator Pointer to the ACPI table Generator.\r
+ @param [in,out] AcpiHeader Pointer to the ACPI table header to be\r
+ updated.\r
+ @param [in] Revision Revision of the ACPI table.\r
+ @param [in] Length Length of the ACPI table.\r
+\r
+ @retval EFI_SUCCESS The ACPI table is updated successfully.\r
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
+ @retval EFI_NOT_FOUND The required object information is not found.\r
+ @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration\r
+ Manager is less than the Object size for the\r
+ requested object.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+AddAcpiHeader (\r
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,\r
+ IN CONST ACPI_TABLE_GENERATOR * CONST Generator,\r
+ IN OUT EFI_ACPI_DESCRIPTION_HEADER * CONST AcpiHeader,\r
+ IN CONST UINT32 Revision,\r
+ IN CONST UINT32 Length\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ CM_STD_OBJ_CONFIGURATION_MANAGER_INFO * CfgMfrInfo;\r
+\r
+ ASSERT (CfgMgrProtocol != NULL);\r
+ ASSERT (Generator != NULL);\r
+ ASSERT (AcpiHeader != NULL);\r
+ ASSERT (Length >= sizeof (EFI_ACPI_DESCRIPTION_HEADER));\r
+\r
+ if ((CfgMgrProtocol == NULL) ||\r
+ (Generator == NULL) ||\r
+ (AcpiHeader == NULL) ||\r
+ (Length < sizeof (EFI_ACPI_DESCRIPTION_HEADER))\r
+ ) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: Failed to get Configuration Manager info. Status = %r\n",\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ }\r
+\r
+ // UINT32 Signature\r
+ AcpiHeader->Signature = Generator->AcpiTableSignature;\r
+ // UINT32 Length\r
+ AcpiHeader->Length = Length;\r
+ // UINT8 Revision\r
+ AcpiHeader->Revision = Revision;\r
+ // UINT8 Checksum\r
+ AcpiHeader->Checksum = 0;\r
+\r
+ // UINT8 OemId[6]\r
+ CopyMem (AcpiHeader->OemId, CfgMfrInfo->OemId, sizeof (AcpiHeader->OemId));\r
+\r
+ // UINT64 OemTableId\r
+ AcpiHeader->OemTableId = Generator->CreatorId;\r
+ AcpiHeader->OemTableId <<= 32;\r
+ AcpiHeader->OemTableId |= Generator->AcpiTableSignature;\r
+\r
+ // UINT32 OemRevision\r
+ AcpiHeader->OemRevision = CfgMfrInfo->Revision;\r
+\r
+ // UINT32 CreatorId\r
+ AcpiHeader->CreatorId = Generator->CreatorId;\r
+ // UINT32 CreatorRevision\r
+ AcpiHeader->CreatorRevision = Generator->CreatorRevision;\r
+\r
+error_handler:\r
+ return Status;\r
+}\r