/** @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
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