/** @file AML Utility. Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef AML_UTILITY_H_ #define AML_UTILITY_H_ #include /** This function computes and updates the ACPI table checksum. @param [in] AcpiTable Pointer to an Acpi table. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS EFIAPI AcpiPlatformChecksum ( IN EFI_ACPI_DESCRIPTION_HEADER *AcpiTable ); /** Compute the size of a tree/sub-tree. @param [in] Node Node to compute the size. @param [in, out] Size Pointer holding the computed size. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS EFIAPI AmlComputeSize ( IN CONST AML_NODE_HEADER *Node, IN OUT UINT32 *Size ); /** Get the value contained in an integer node. @param [in] Node Pointer to an integer node. Must be an object node. @param [out] Value Value contained in the integer node. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS EFIAPI AmlNodeGetIntegerValue ( IN AML_OBJECT_NODE *Node, OUT UINT64 *Value ); /** Set the value contained in an integer node. The OpCode is updated accordingly to the new value (e.g.: If the original value was a UINT8 value, then the OpCode would be AML_BYTE_PREFIX. If it the new value is a UINT16 value then the OpCode will be updated to AML_WORD_PREFIX). @param [in] Node Pointer to an integer node. Must be an object node. @param [in] NewValue New value to write in the integer node. @param [out] ValueWidthDiff Difference in number of bytes used to store the new value. Can be negative. @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 AmlNodeSetIntegerValue ( IN AML_OBJECT_NODE *Node, IN UINT64 NewValue, OUT INT8 *ValueWidthDiff ); /** Propagate information up the tree. The information can be a new size, a new number of arguments. @param [in] Node Pointer to a node. Must be a root node or an object node. @param [in] IsIncrement Choose the operation to do: - TRUE: Increment the Node's size and the Node's count; - FALSE: Decrement the Node's size and the Node's count. @param [in] Diff Value to add/subtract to the Node's size. @param [in] NodeCount Number of nodes added/removed. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS EFIAPI AmlPropagateInformation ( IN AML_NODE_HEADER *Node, IN BOOLEAN IsIncrement, IN UINT32 Diff, 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_