DynamicTablesPkg: AmlLib definitions

Dynamic AML is a solution to generate Definition Block tables
at runtime. Dynamic AML provides the following techniques for
generating AML tables.
  - AML Fixup
  - AML Codegen
  - AML Fixup + Codegen

AML fixup involves patching small sections of a template AML
code at runtime, while AML Codegen provides APIs to generate
small sections of AML code at runtime. A combination of
Fixup and Codegen can also be used.

AML has a complex grammar. To simplify the generation of
AML tables, Dynamic AML introduces AmlLib that provides a
rich set of APIs for parsing, traversing, fixup, codegen
and serialisation of AML byte code.

This patch introduces the definitions used by AmlLib.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Reviewed-by: Alexei Fedorov <Alexei.Fedorov@arm.com>
This commit is contained in:
Pierre Gondois 2020-07-29 13:11:20 +01:00 committed by mergify[bot]
parent 056b0f1b20
commit 292e540854
2 changed files with 206 additions and 0 deletions

View File

@ -0,0 +1,188 @@
/** @file
AML Defines.
Copyright (c) 2020, 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
/** Size of a NameSeg.
Cf. ACPI 6.3 specification, s20.2.
@ingroup TreeStructures
*/
#define AML_NAME_SEG_SIZE 4U
/** 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_

View File

@ -0,0 +1,18 @@
/** @file
AML Include file
Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef AML_INCLUDE_H_
#define AML_INCLUDE_H_
#include <Base.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#endif // AML_INCLUDE_H_