]> git.proxmox.com Git - mirror_edk2.git/commitdiff
DynamicTablesPkg: AML code generation for a Package
authorPierre Gondois <Pierre.Gondois@arm.com>
Fri, 8 Oct 2021 14:46:23 +0000 (15:46 +0100)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 8 Oct 2021 15:39:42 +0000 (15:39 +0000)
Add AmlCodeGenPackage() to generate AML code for declaring
a Package() object. This function generates an empty package
node. New elements can then be added to the package's variable
argument list.

Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c

index cbfd9cbb68b68e27e820debb6b3f30ac34aca8ee..a4cd2502dc56e8e57ced3b2284c24a49c2228a71 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   AML Code Generation.\r
 \r
-  Copyright (c) 2020, Arm Limited. All rights reserved.<BR>\r
+  Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.<BR>\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 **/\r
@@ -237,6 +237,85 @@ AmlCodeGenInteger (
   return Status;\r
 }\r
 \r
+/** AML code generation for a Package object node.\r
+\r
+  The package generated is empty. New elements can be added via its\r
+  list of variable arguments.\r
+\r
+  @param [out] NewObjectNode   If success, contains the created\r
+                               Package object node.\r
+\r
+  @retval EFI_SUCCESS             Success.\r
+  @retval EFI_INVALID_PARAMETER   Invalid parameter.\r
+  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+AmlCodeGenPackage (\r
+  OUT AML_OBJECT_NODE    ** NewObjectNode\r
+  )\r
+{\r
+  EFI_STATUS        Status;\r
+  AML_DATA_NODE   * DataNode;\r
+  UINT8             NodeCount;\r
+\r
+  if (NewObjectNode == NULL) {\r
+    ASSERT (0);\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  NodeCount = 0;\r
+\r
+  // Create an object node.\r
+  // PkgLen is 2:\r
+  //  - one byte to store the PkgLength\r
+  //  - one byte for the NumElements.\r
+  // Cf ACPI6.3, s20.2.5 "Term Objects Encoding"\r
+  // DefPackage  := PackageOp PkgLength NumElements PackageElementList\r
+  // NumElements := ByteData\r
+  Status = AmlCreateObjectNode (\r
+             AmlGetByteEncodingByOpCode (AML_PACKAGE_OP, 0),\r
+             2,\r
+             NewObjectNode\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    ASSERT (0);\r
+    return Status;\r
+  }\r
+\r
+  // NumElements is a ByteData.\r
+  Status = AmlCreateDataNode (\r
+             EAmlNodeDataTypeUInt,\r
+             &NodeCount,\r
+             sizeof (NodeCount),\r
+             &DataNode\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    ASSERT (0);\r
+    goto error_handler;\r
+  }\r
+\r
+  Status = AmlSetFixedArgument (\r
+             *NewObjectNode,\r
+             EAmlParseIndexTerm0,\r
+             (AML_NODE_HEADER*)DataNode\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    ASSERT (0);\r
+    goto error_handler;\r
+  }\r
+\r
+  return Status;\r
+\r
+error_handler:\r
+  AmlDeleteTree ((AML_NODE_HEADER*)*NewObjectNode);\r
+  if (DataNode != NULL) {\r
+    AmlDeleteTree ((AML_NODE_HEADER*)DataNode);\r
+  }\r
+  return Status;\r
+}\r
+\r
 /** AML code generation for a Name object node.\r
 \r
   @param  [in] NameString     The new variable name.\r