/** @file AML Node. Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef AML_NODE_H_ #define AML_NODE_H_ #include #include /** Create an AML_ROOT_NODE. This node will be the root of the tree. @param [in] SdtHeader Pointer to an ACPI DSDT/SSDT header to copy the data from. @param [out] NewRootNodePtr If success, contains the created AML_ROOT_NODE. Otherwise reset to NULL. @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 AmlCreateRootNode ( IN CONST EFI_ACPI_DESCRIPTION_HEADER *SdtHeader, OUT AML_ROOT_NODE **NewRootNodePtr ); /** Create an AML_OBJECT_NODE. @param [in] AmlByteEncoding Byte encoding entry. @param [in] PkgLength PkgLength of the node if the AmlByteEncoding has the PkgLen attribute. 0 otherwise. @param [out] NewObjectNodePtr If success, contains the created AML_OBJECT_NODE. Otherwise reset to NULL. @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 AmlCreateObjectNode ( IN CONST AML_BYTE_ENCODING *AmlByteEncoding, IN UINT32 PkgLength, OUT AML_OBJECT_NODE **NewObjectNodePtr ); /** Create an AML_DATA_NODE. @param [in] DataType DataType of the node. @param [in] Data Pointer to the AML bytecode corresponding to this node. Data is copied from there. @param [in] DataSize Number of bytes to consider at the address pointed by Data. @param [out] NewDataNodePtr If success, contains the created AML_DATA_NODE. Otherwise reset to NULL. @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 AmlCreateDataNode ( IN EAML_NODE_DATA_TYPE DataType, IN CONST UINT8 *Data, IN UINT32 DataSize, OUT AML_DATA_NODE **NewDataNodePtr ); /** Delete a Node. @param [in] Node Pointer to a Node. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS EFIAPI AmlDeleteNode ( IN AML_NODE_HEADER *Node ); /** Check whether ObjectNode has the input attribute. This function can be used to check ObjectNode is an object node at the same time. @param [in] ObjectNode Pointer to an object node. @param [in] Attribute Attribute to check for. @retval TRUE The node is an AML object and the attribute is present. @retval FALSE Otherwise. **/ BOOLEAN EFIAPI AmlNodeHasAttribute ( IN CONST AML_OBJECT_NODE *ObjectNode, IN AML_OP_ATTRIBUTE Attribute ); /** Check whether ObjectNode has the input OpCode/SubOpcode couple. @param [in] ObjectNode Pointer to an object node. @param [in] OpCode OpCode to check @param [in] SubOpCode SubOpCode to check @retval TRUE The node is an AML object and the Opcode and the SubOpCode match. @retval FALSE Otherwise. **/ BOOLEAN EFIAPI AmlNodeCompareOpCode ( IN CONST AML_OBJECT_NODE *ObjectNode, IN UINT8 OpCode, IN UINT8 SubOpCode ); /** Check whether a Node is an integer node. By integer node we mean an object node having one of the following opcode: - AML_BYTE_PREFIX; - AML_WORD_PREFIX; - AML_DWORD_PREFIX; - AML_QWORD_PREFIX. @param [in] Node The node to check. @retval TRUE The Node is an integer node. @retval FALSE Otherwise. */ BOOLEAN EFIAPI IsIntegerNode ( IN AML_OBJECT_NODE *Node ); /** Check whether a Node is a ZeroOp, a OneOp or a OnesOp. These two objects don't have a data node holding a value. This require special handling. @param [in] Node The node to check. @retval TRUE The Node is a ZeroOp or OneOp. @retval FALSE Otherwise. */ BOOLEAN EFIAPI IsSpecialIntegerNode ( IN AML_OBJECT_NODE *Node ); /** Check whether Node corresponds to a method definition. A method definition can be introduced: - By a method object, having an AML_METHOD_OP OpCode; - By an external definition of a method, having an AML_EXTERNAL_OP OpCode and an ObjectType byte set to the MethodObj. Note: An alias node, having an AML_ALIAS_OP, can be resolved to a method definition. This function doesn't handle this case. @param [in] Node Node to check whether it is a method definition. @retval TRUE The Node is a method definition. @retval FALSE Otherwise. **/ BOOLEAN EFIAPI AmlIsMethodDefinitionNode ( IN CONST AML_OBJECT_NODE *Node ); /** Get the index at which the name of the node is stored. @param [in] ObjectNode Pointer to an object node. Must have the AML_IN_NAMESPACE attribute. @param [out] Index Index of the name in the fixed list of arguments. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS AmlNodeGetNameIndex ( IN CONST AML_OBJECT_NODE *ObjectNode, OUT EAML_PARSE_INDEX *Index ); /** Get the name of the Node. Node must be part of the namespace. @param [in] ObjectNode Pointer to an object node, which is part of the namespace. @return A pointer to the name. NULL otherwise. Return NULL for the root node. **/ CHAR8 * EFIAPI AmlNodeGetName ( IN CONST AML_OBJECT_NODE *ObjectNode ); #endif // AML_NODE_H_