]> git.proxmox.com Git - mirror_edk2.git/commitdiff
DynamicTablesPkg: Table Helper Library
authorSami Mujawar <sami.mujawar@arm.com>
Sat, 15 Dec 2018 12:02:25 +0000 (12:02 +0000)
committerSami Mujawar <sami.mujawar@arm.com>
Tue, 19 Feb 2019 10:37:30 +0000 (10:37 +0000)
A helper library that implements common functionality
for use by table generators.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Reviewed-by: Alexei Fedorov <alexei.fedorov@arm.com>
DynamicTablesPkg/DynamicTables.dsc.inc [new file with mode: 0644]
DynamicTablesPkg/Include/Library/TableHelperLib.h [new file with mode: 0644]
DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c [new file with mode: 0644]
DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf [new file with mode: 0644]

diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc
new file mode 100644 (file)
index 0000000..1cac3e6
--- /dev/null
@@ -0,0 +1,20 @@
+## @file\r
+#  Dsc 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
+[Defines]\r
+\r
+[LibraryClasses.common]\r
+  TableHelperLib|DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf\r
+\r
diff --git a/DynamicTablesPkg/Include/Library/TableHelperLib.h b/DynamicTablesPkg/Include/Library/TableHelperLib.h
new file mode 100644 (file)
index 0000000..3c4e1d2
--- /dev/null
@@ -0,0 +1,68 @@
+/** @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
diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c
new file mode 100644 (file)
index 0000000..02860dd
--- /dev/null
@@ -0,0 +1,176 @@
+/** @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
diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf
new file mode 100644 (file)
index 0000000..2568057
--- /dev/null
@@ -0,0 +1,36 @@
+## @file\r
+#  Table Helper\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      = DynamicTableHelperLib\r
+  FILE_GUID      = E315C738-3A39-4D0D-A0AF-8EDFA770AB39\r
+  VERSION_STRING = 1.0\r
+  MODULE_TYPE    = DXE_DRIVER\r
+  LIBRARY_CLASS  = TableHelperLib\r
+\r
+[Sources]\r
+  TableHelper.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  DynamicTablesPkg/DynamicTablesPkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+\r
+[Protocols]\r
+\r
+[Guids]\r
+\r