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.web09.10571.1633704405766240838 for ; Fri, 08 Oct 2021 07:46:53 -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 E3B316D; Fri, 8 Oct 2021 07:46:52 -0700 (PDT) Received: from e120189.arm.com (unknown [10.57.73.60]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 069993F66F; Fri, 8 Oct 2021 07:46:51 -0700 (PDT) From: "PierreGondois" To: devel@edk2.groups.io, Sami Mujawar , Alexei.Fedorov@arm.com Subject: [PATCH v3 11/21] DynamicTablesPkg: AML Code generation for Resource data EndTag Date: Fri, 8 Oct 2021 15:46:22 +0100 Message-Id: <20211008144632.31894-12-Pierre.Gondois@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211008144632.31894-1-Pierre.Gondois@arm.com> References: <20211008144632.31894-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. Reviewed-by: Sami Mujawar Signed-off-by: Pierre Gondois --- .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 113 ++++++++++++++++++ .../AmlLib/CodeGen/AmlResourceDataCodeGen.h | 43 +++++++ 2 files changed, 156 insertions(+) diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c index 20b745f27a2b..0bdb6c24c5bb 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -280,6 +280,119 @@ 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. + + ACPI 6.4, s6.4.2.9 "End Tag": + "This checksum is generated such that adding it to the sum of all the data + bytes will produce a zero sum." + "If the checksum field is zero, the resource data is treated as if the + checksum operation succeeded. Configuration proceeds normally." + + To avoid re-computing checksums, if a new resource data elements is + added/removed/modified in a list of resource data elements, the AmlLib + resets the checksum to 0. + + @param [in] CheckSum CheckSum to store in the EndTag. + To ignore/avoid computing the checksum, + give 0. + @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; + } + + // 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 831d6a7462ae..102340495933 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h @@ -104,4 +104,47 @@ 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. + + ACPI 6.4, s6.4.2.9 "End Tag": + "This checksum is generated such that adding it to the sum of all the data + bytes will produce a zero sum." + "If the checksum field is zero, the resource data is treated as if the + checksum operation succeeded. Configuration proceeds normally." + + To avoid re-computing checksums, if a new resource data elements is + added/removed/modified in a list of resource data elements, the AmlLib + resets the checksum to 0. + + @param [in] CheckSum CheckSum to store in the EndTag. + To ignore/avoid computing the checksum, + give 0. + @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