/** @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_