From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web10.6276.1624448497201194472 for ; Wed, 23 Jun 2021 04:41:37 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: pierre.gondois@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D9DA331B; Wed, 23 Jun 2021 04:41:36 -0700 (PDT) Received: from e120189.arm.com (unknown [10.57.78.245]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 7A1213F719; Wed, 23 Jun 2021 04:41:35 -0700 (PDT) From: "PierreGondois" To: devel@edk2.groups.io, Sami Mujawar , Alexei Fedorov Cc: Akanksha Jain , Alexandru Elisei Subject: [PATCH v1 03/13] DynamicTablesPkg: AML Code generation for Resource data EndTag Date: Wed, 23 Jun 2021 12:40:28 +0100 Message-Id: <20210623114039.24491-4-Pierre.Gondois@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210623114039.24491-1-Pierre.Gondois@arm.com> References: <20210623114039.24491-1-Pierre.Gondois@arm.com> From: Pierre Gondois Add a helper function AmlCodeGenEndTag() to generate AML Resource Data EndTag. The EndTag resource data is automatically generated by the ASL compiler at the end of a list of resource data elements. Therefore, an equivalent function is not present in ASL. However, AmlCodeGenEndTag() is useful when generating AML code for the ResourceTemplate() macro. Signed-off-by: Pierre Gondois --- .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 104 ++++++++++++++++++ .../AmlLib/CodeGen/AmlResourceDataCodeGen.h | 34 ++++++ 2 files changed, 138 insertions(+) diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c index 07a96725a4ef..78910cc5d4b4 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -274,6 +274,110 @@ AmlCodeGenRdRegister ( return LinkRdNode (RdNode, NameOpNode, NewRdNode); } +/** Code generation for the EndTag resource data. + + The EndTag resource data is automatically generated by the ASL compiler + at the end of a list of resource data elements. Thus, it doesn't have + a corresponding ASL function. + + This function allocates memory to create a data node. It is the caller's + responsibility to either: + - attach this node to an AML tree; + - delete this node. + + @param [in] CheckSum CheckSum to store in the EndTag. + Optional: can be let to 0. It is not + updated when new resource data elements + are added/removed/modified in the list. + @param [in] ParentNode If not NULL, add the generated node + to the end of the variable list of + argument of the ParentNode. + The ParentNode must not initially contain + an EndTag resource data element. + @param [out] NewRdNode If success, contains the generated node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenEndTag ( + IN UINT8 CheckSum, OPTIONAL + IN AML_OBJECT_NODE * ParentNode, OPTIONAL + OUT AML_DATA_NODE ** NewRdNode OPTIONAL + ) +{ + EFI_STATUS Status; + AML_DATA_NODE * RdNode; + EFI_ACPI_END_TAG_DESCRIPTOR EndTag; + ACPI_SMALL_RESOURCE_HEADER SmallResHdr; + + if ((ParentNode == NULL) && (NewRdNode == NULL)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + RdNode = NULL; + + // Header + SmallResHdr.Bits.Length = sizeof (EFI_ACPI_END_TAG_DESCRIPTOR) - + sizeof (ACPI_SMALL_RESOURCE_HEADER); + SmallResHdr.Bits.Name = ACPI_SMALL_END_TAG_DESCRIPTOR_NAME; + SmallResHdr.Bits.Type = ACPI_SMALL_ITEM_FLAG; + + // Body + EndTag.Desc = SmallResHdr.Byte; + EndTag.Checksum = CheckSum; + + Status = AmlCreateDataNode ( + EAmlNodeDataTypeResourceData, + (UINT8*)&EndTag, + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR), + &RdNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + if (NewRdNode != NULL) { + *NewRdNode = RdNode; + } + + if (ParentNode != NULL) { + // Check the BufferOp doesn't contain any resource data yet. + // This is a hard check: do not allow to add an EndTag if the BufferNode + // already has resource data elements attached. Indeed, the EndTag should + // have already been added. + if (AmlGetNextVariableArgument ((AML_NODE_HEADER*)ParentNode, NULL) != + NULL) { + ASSERT (0); + Status = EFI_INVALID_PARAMETER; + goto error_handler; + } + + // Manually add the EndTag RdNode. Indeed, the AmlAppendRdNode function + // is looking for an EndTag, which we are adding here. + Status = AmlVarListAddTail ( + (AML_NODE_HEADER*)ParentNode, + (AML_NODE_HEADER*)RdNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + goto error_handler; + } + } + + return Status; + +error_handler: + if (RdNode != NULL) { + AmlDeleteTree ((AML_NODE_HEADER*)RdNode); + } + return Status; +} + // DEPRECATED APIS #ifndef DISABLE_NEW_DEPRECATED_INTERFACES diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h index 3c9217d9ddab..0b464305da40 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h @@ -104,4 +104,38 @@ AmlCodeGenRdRegister ( OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL ); +/** Code generation for the EndTag resource data. + + The EndTag resource data is automatically generated by the ASL compiler + at the end of a list of resource data elements. Thus, it doesn't have + a corresponding ASL function. + + This function allocates memory to create a data node. It is the caller's + responsibility to either: + - attach this node to an AML tree; + - delete this node. + + @param [in] CheckSum CheckSum to store in the EndTag. + Optional: can be let to 0. It is not + updated when new resource data elements + are added/removed/modified in the list. + @param [in] ParentNode If not NULL, add the generated node + to the end of the variable list of + argument of the ParentNode. + The ParentNode must not initially contain + an EndTag resource data element. + @param [out] NewRdNode If success, contains the generated node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenEndTag ( + IN UINT8 CheckSum, OPTIONAL + IN AML_OBJECT_NODE * ParentNode, OPTIONAL + OUT AML_DATA_NODE ** NewRdNode OPTIONAL + ); + #endif // AML_RESOURCE_DATA_CODE_GEN_H_ -- 2.17.1