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.web08.10306.1633704409160139632 for ; Fri, 08 Oct 2021 07:46:49 -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 C2DC26D; Fri, 8 Oct 2021 07:46:43 -0700 (PDT) Received: from e120189.arm.com (unknown [10.57.73.60]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id B90C63F66F; Fri, 8 Oct 2021 07:46:42 -0700 (PDT) From: "PierreGondois" To: devel@edk2.groups.io, Sami Mujawar , Alexei.Fedorov@arm.com Subject: [PATCH v3 05/21] DynamicTablesPkg: Add AmlSetRdListCheckSum() Date: Fri, 8 Oct 2021 15:46:16 +0100 Message-Id: <20211008144632.31894-6-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 Lists of Resource Data elements end with an EndTag (most of the time). This function finds the EndTag (if present) in a list of Resource Data elements and sets the checksum. 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." Reviewed-by: Sami Mujawar Signed-off-by: Pierre Gondois --- .../Library/Common/AmlLib/Utils/AmlUtility.c | 76 +++++++++++++++++++ .../Library/Common/AmlLib/Utils/AmlUtility.h | 32 ++++++++ 2 files changed, 108 insertions(+) diff --git a/DynamicTablesPkg/Library/Common/AmlLib/Utils/AmlUtility.c b/DynamicTablesPkg/Library/Common/AmlLib/Utils/AmlUtility.c index 7ebd08f945c0..ef159e3b831e 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/Utils/AmlUtility.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/Utils/AmlUtility.c @@ -904,3 +904,79 @@ AmlPropagateInformation ( return EFI_SUCCESS; } + +/** Find and set the EndTag's Checksum of a list of Resource Data elements. + + Lists of Resource Data elements end with an EndTag (most of the time). This + function finds the EndTag (if present) in a list of Resource Data elements + and sets the checksum. + + 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] BufferOpNode Node having a list of Resource Data elements. + @param [in] CheckSum CheckSum to store in the EndTag. + To ignore/avoid computing the checksum, + give 0. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND No EndTag found. +**/ +EFI_STATUS +EFIAPI +AmlSetRdListCheckSum ( + IN AML_OBJECT_NODE * BufferOpNode, + IN UINT8 CheckSum + ) +{ + EFI_STATUS Status; + AML_DATA_NODE * LastRdNode; + AML_RD_HEADER RdDataType; + + if (!AmlNodeCompareOpCode (BufferOpNode, AML_BUFFER_OP, 0)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Get the last Resource data node in the variable list of + // argument of the BufferOp node. + LastRdNode = (AML_DATA_NODE*)AmlGetPreviousVariableArgument ( + (AML_NODE_HEADER*)BufferOpNode, + NULL + ); + if ((LastRdNode == NULL) || + !IS_AML_DATA_NODE (LastRdNode) || + (LastRdNode->DataType != EAmlNodeDataTypeResourceData)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Status = AmlGetResourceDataType (LastRdNode, &RdDataType); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // Check the LastRdNode is an EndTag. + // It is possible to have only one Resource Data in a BufferOp with + // no EndTag. Return EFI_NOT_FOUND is such case. + if (!AmlRdCompareDescId ( + &RdDataType, + AML_RD_BUILD_SMALL_DESC_ID (ACPI_SMALL_END_TAG_DESCRIPTOR_NAME))) { + ASSERT (0); + return EFI_NOT_FOUND; + } + + Status = AmlRdSetEndTagChecksum (LastRdNode->Buffer, CheckSum); + ASSERT_EFI_ERROR (Status); + + return Status; +} diff --git a/DynamicTablesPkg/Library/Common/AmlLib/Utils/AmlUtility.h b/DynamicTablesPkg/Library/Common/AmlLib/Utils/AmlUtility.h index c57d780140d4..4667f57d7f08 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/Utils/AmlUtility.h +++ b/DynamicTablesPkg/Library/Common/AmlLib/Utils/AmlUtility.h @@ -91,5 +91,37 @@ AmlPropagateInformation ( IN UINT8 NodeCount ); +/** Find and set the EndTag's Checksum of a list of Resource Data elements. + + Lists of Resource Data elements end with an EndTag (most of the time). This + function finds the EndTag (if present) in a list of Resource Data elements + and sets the checksum. + + 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] BufferOpNode Node having a list of Resource Data elements. + @param [in] CheckSum CheckSum to store in the EndTag. + To ignore/avoid computing the checksum, + give 0. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND No EndTag found. +**/ +EFI_STATUS +EFIAPI +AmlSetRdListCheckSum ( + IN AML_OBJECT_NODE * BufferOpNode, + IN UINT8 CheckSum + ); + #endif // AML_UTILITY_H_ -- 2.17.1