blob: d199f06cc54df3be3436fd27360dc5ee0cef83ed [file] [log] [blame]
/** @file
AML Node Definition.
Copyright (c) 2020, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef AML_NODE_DEFINES_H_
#define AML_NODE_DEFINES_H_
#include <AmlEncoding/Aml.h>
#include <IndustryStandard/Acpi.h>
/** AML header node.
This abstract class represents either a root/object/data node.
All the enumerated nodes have this same common header.
*/
typedef struct AmlNodeHeader {
/// This must be the first field in this structure.
LIST_ENTRY Link;
/// Parent of this node. NULL for the root node.
struct AmlNodeHeader *Parent;
/// Node type allowing to identify a root/object/data node.
EAML_NODE_TYPE NodeType;
} AML_NODE_HEADER;
/** Node handle.
*/
typedef AML_NODE_HEADER *AML_NODE_HANDLE;
/** AML root node.
The root node is unique and at the head of tree. It is a fake node used
to maintain the list of AML statements (stored as object nodes) which are
at the first scope level.
*/
typedef struct AmlRootNode {
/// Header information. Must be the first field of the struct.
AML_NODE_HEADER NodeHeader;
/// List of object nodes being at the first scope level.
/// These are children and can only be object nodes.
LIST_ENTRY VariableArgs;
/// ACPI DSDT/SSDT header.
EFI_ACPI_DESCRIPTION_HEADER *SdtHeader;
} AML_ROOT_NODE;
/** Root Node handle.
*/
typedef AML_ROOT_NODE *AML_ROOT_NODE_HANDLE;
/** AML object node.
Object nodes match AML statements. They are associated with an
OpCode/SubOpCode, and can have children.
*/
typedef struct AmlObjectNode {
/// Header information. Must be the first field of the struct.
AML_NODE_HEADER NodeHeader;
/// Some object nodes have a variable list of arguments.
/// These are children and can only be object/data nodes.
/// Cf ACPI specification, s20.3.
LIST_ENTRY VariableArgs;
/// Fixed arguments of this object node.
/// These are children and can be object/data nodes.
/// Cf ACPI specification, s20.3.
AML_NODE_HEADER *FixedArgs[EAmlParseIndexMax];
/// AML byte encoding. Stores the encoding information:
/// (OpCode/SubOpCode/number of fixed arguments/ attributes).
CONST AML_BYTE_ENCODING *AmlByteEncoding;
/// Some nodes have a PkgLen following their OpCode/SubOpCode in the
/// AML bytestream. This field stores the decoded value of the PkgLen.
UINT32 PkgLen;
} AML_OBJECT_NODE;
/** Object Node handle.
*/
typedef AML_OBJECT_NODE *AML_OBJECT_NODE_HANDLE;
/** AML data node.
Data nodes store the smallest pieces of information.
E.g.: UINT8, UINT64, NULL terminated string, etc.
Data node don't have children nodes.
*/
typedef struct AmlDataNode {
/// Header information. Must be the first field of the struct.
AML_NODE_HEADER NodeHeader;
/// Tag identifying what data is stored in this node.
/// E.g. UINT, NULL terminated string, resource data element, etc.
EAML_NODE_DATA_TYPE DataType;
/// Buffer containing the data stored by this node.
UINT8 *Buffer;
/// Size of the Buffer.
UINT32 Size;
} AML_DATA_NODE;
/** Data Node handle.
*/
typedef AML_DATA_NODE *AML_DATA_NODE_HANDLE;
/** Check whether a Node has a valid NodeType.
@param [in] Node The node to check.
@retval TRUE The Node has a valid NodeType.
@retval FALSE Otherwise.
*/
#define IS_AML_NODE_VALID(Node) \
((Node != NULL) && \
((((CONST AML_NODE_HEADER*)Node)->NodeType > EAmlNodeUnknown) || \
(((CONST AML_NODE_HEADER*)Node)->NodeType < EAmlNodeMax)))
/** Check whether a Node is a root node.
@param [in] Node The node to check.
@retval TRUE The Node is a root node.
@retval FALSE Otherwise.
*/
#define IS_AML_ROOT_NODE(Node) \
((Node != NULL) && \
(((CONST AML_NODE_HEADER*)Node)->NodeType == EAmlNodeRoot))
/** Check whether a Node is an object node.
@param [in] Node The node to check.
@retval TRUE The Node is an object node.
@retval FALSE Otherwise.
*/
#define IS_AML_OBJECT_NODE(Node) \
((Node != NULL) && \
(((CONST AML_NODE_HEADER*)Node)->NodeType == EAmlNodeObject))
/** Check whether a Node is a data node.
@param [in] Node The node to check.
@retval TRUE The Node is a data node.
@retval FALSE Otherwise.
*/
#define IS_AML_DATA_NODE(Node) \
((Node != NULL) && \
(((CONST AML_NODE_HEADER*)Node)->NodeType == EAmlNodeData))
/** Check whether a Node has a parent.
@param [in] Node The node to check.
@retval TRUE The Node is a data node.
@retval FALSE Otherwise.
*/
#define AML_NODE_HAS_PARENT(Node) \
(IS_AML_NODE_VALID (Node) && \
(((CONST AML_NODE_HEADER*)Node)->Parent != NULL))
/** Check that the Node is not attached somewhere.
This doesn't mean the node cannot have children.
@param [in] Node The node to check.
@retval TRUE The Node has been detached.
@retval FALSE Otherwise.
*/
#define AML_NODE_IS_DETACHED(Node) \
(IS_AML_NODE_VALID (Node) && \
IsListEmpty ((CONST LIST_ENTRY*)Node) && \
(((CONST AML_NODE_HEADER*)Node)->Parent == NULL))
#endif // AML_NODE_DEFINES_H_