/** @file | |
AML Defines. | |
Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef AML_DEFINES_H_ | |
#define AML_DEFINES_H_ | |
/** | |
@defgroup TreeStructures Tree structures | |
@ingroup AMLLib | |
@{ | |
The AML tree created by the AMLLib relies on enum/define values and | |
structures defined here. | |
@} | |
*/ | |
/** AML tree node types. | |
Data nodes are tagged with the data type they contain. | |
Some data types cannot be used for data nodes (None, Object). | |
EAmlUIntX types are converted to the EAML_NODE_DATA_TYPE enum type. | |
These types are accessible externally. | |
@ingroup TreeStructures | |
*/ | |
typedef enum EAmlNodeDataType { | |
EAmlNodeDataTypeNone = 0, ///< EAmlNone, not accessible. | |
EAmlNodeDataTypeReserved1, ///< EAmlUInt8, converted to the UInt type. | |
EAmlNodeDataTypeReserved2, ///< EAmlUInt16, converted to the UInt type. | |
EAmlNodeDataTypeReserved3, ///< EAmlUInt32, converted to the UInt type. | |
EAmlNodeDataTypeReserved4, ///< EAmlUInt64, converted to the UInt type. | |
EAmlNodeDataTypeReserved5, ///< EAmlObject, not accessible. | |
EAmlNodeDataTypeNameString, ///< EAmlName, name corresponding to the | |
/// NameString keyword in the ACPI | |
/// specification. E.g.: "\_SB_.DEV0" | |
EAmlNodeDataTypeString, ///< EAmlString, NULL terminated string. | |
EAmlNodeDataTypeUInt, ///< Integer data of any length, EAmlUIntX | |
/// are converted to this type. | |
EAmlNodeDataTypeRaw, ///< Raw bytes contained in a buffer. | |
EAmlNodeDataTypeResourceData, ///< Resource data element. | |
EAmlNodeDataTypeFieldPkgLen, ///< FieldPkgLen data element. | |
/// PkgLen are usually stored as | |
/// part of object node structures. | |
/// However, they can be found | |
/// standalone in a FieldList. | |
EAmlNodeDataTypeMax ///< Max enum. | |
} EAML_NODE_DATA_TYPE; | |
/** Indexes of fixed arguments. | |
AML objects defined the ACPI 6.3 specification, | |
s20.3 "AML Byte Stream Byte Values" can have at most 6 fixed arguments. | |
Method and functions can have at most 7 arguments, cf | |
s19.6.83 "Method (Declare Control Method)". The enum goes to 8 to store the | |
name of the method invocation. | |
@ingroup TreeStructures | |
*/ | |
typedef enum EAmlParseIndex { | |
EAmlParseIndexTerm0 = 0, ///< First fixed argument index. | |
EAmlParseIndexTerm1, ///< Second fixed argument index. | |
EAmlParseIndexTerm2, ///< Third fixed argument index. | |
EAmlParseIndexTerm3, ///< Fourth fixed argument index. | |
EAmlParseIndexTerm4, ///< Fifth fixed argument index. | |
EAmlParseIndexTerm5, ///< Sixth fixed argument index. | |
EAmlParseIndexMax ///< Maximum fixed argument index (=6). | |
} EAML_PARSE_INDEX; | |
/** Maximum size of an AML NameString. | |
An AML NameString can be at most (255 * 4) + 255 + 2 = 1277 bytes long. | |
Indeed, according to ACPI 6.3 specification, s20.2.2, | |
an AML NameString can be resolved as a MultiNamePath. | |
The encoding of this MultiNamePath can be made of at most: | |
- 255 carets ('^'), one for each level in the namespace; | |
- 255 NameSeg of 4 bytes; | |
- 2 bytes for the MultiNamePrefix and SegCount. | |
@ingroup TreeStructures | |
*/ | |
#define MAX_AML_NAMESTRING_SIZE 1277U | |
/** Maximum size of an ASL NameString. | |
An ASL NameString can be at most (255 * 4) + 255 + 254 = 1529 bytes long. | |
Cf the ASL grammar available in ACPI 6.3 specification, 19.2.2. | |
The encoding of an ASL NameString can be made of at most: | |
- 255 carets ('^'), one for each level in the namespace; | |
- 255 NameSeg of 4 bytes; | |
- 254 NameSeg separators ('.'). | |
@ingroup TreeStructures | |
*/ | |
#define MAX_ASL_NAMESTRING_SIZE 1529U | |
/** Pseudo OpCode for method invocations. | |
The AML grammar does not attribute an OpCode/SubOpCode couple for | |
method invocations. This library is representing method invocations | |
as if they had one. | |
The AML encoding for method invocations in the ACPI specification 6.3 is: | |
MethodInvocation := NameString TermArgList | |
In this library, it is: | |
MethodInvocation := MethodInvocationOp NameString ArgumentCount TermArgList | |
ArgumentCount := ByteData | |
When computing the size of a tree or serializing it, the additional data is | |
not taken into account (i.e. the MethodInvocationOp and the ArgumentCount). | |
@ingroup TreeStructures | |
*/ | |
#define AML_METHOD_INVOC_OP 0xD0 | |
/** Pseudo OpCode for NamedField field elements. | |
The AML grammar does not attribute an OpCode/SubOpCode couple for | |
the NamedField field element. This library is representing NamedField field | |
elements as if they had one. | |
The AML encoding for NamedField field elements in the ACPI specification 6.3 | |
is: | |
NamedField := NameSeg PkgLength | |
In this library, it is: | |
NamedField := NamedFieldOp NameSeg PkgLength | |
When computing the size of a tree or serializing it, the additional data is | |
not taken into account (i.e. the NamedFieldOp). | |
@ingroup TreeStructures | |
*/ | |
#define AML_FIELD_NAMED_OP 0x04 | |
/** AML object types. | |
The ACPI specification defines several object types. They are listed | |
with the definition of ObjectTypeKeyword. | |
@ingroup TreeStructures | |
*/ | |
typedef enum EAmlObjType { | |
EAmlObjTypeUnknown = 0x0, | |
EAmlObjTypeInt, | |
EAmlObjTypeStrObj, | |
EAmlObjTypeBuffObj, | |
EAmlObjTypePkgObj, | |
EAmlObjTypeFieldUnitObj, | |
EAmlObjTypeDeviceObj, | |
EAmlObjTypeEventObj, | |
EAmlObjTypeMethodObj, | |
EAmlObjTypeMutexObj, | |
EAmlObjTypeOpRegionObj, | |
EAmlObjTypePowerResObj, | |
EAmlObjTypeProcessorObj, | |
EAmlObjTypeThermalZoneObj, | |
EAmlObjTypeBuffFieldObj, | |
EAmlObjTypeDDBHandleObj, | |
} EAML_OBJ_TYPE; | |
/** Node types. | |
@ingroup TreeStructures | |
*/ | |
typedef enum EAmlNodeType { | |
EAmlNodeUnknown, ///< Unknown/Invalid AML Node Type. | |
EAmlNodeRoot, ///< AML Root Node, typically represents a DefinitionBlock. | |
EAmlNodeObject, ///< AML Object Node, typically represents an ASL statement | |
/// or its arguments. | |
EAmlNodeData, ///< AML Data Node, typically represents arguments for an | |
/// ASL statement. | |
EAmlNodeMax ///< Max enum. | |
} EAML_NODE_TYPE; | |
#endif // AML_DEFINES_H_ |