diff options
author | Pierre Gondois <Pierre.Gondois@arm.com> | 2021-10-08 15:46:29 +0100 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2021-10-08 15:39:42 +0000 |
commit | 018a962d92ee750f4260ad4f064923f6f53e74b1 (patch) | |
tree | 5df76edbadb60c37f9ec716692e8552781d370cc | |
parent | 3e958e93ce2021dd955a448185d4ddf047c90f4e (diff) | |
download | edk2-018a962d92ee750f4260ad4f064923f6f53e74b1.tar.gz edk2-018a962d92ee750f4260ad4f064923f6f53e74b1.tar.bz2 edk2-018a962d92ee750f4260ad4f064923f6f53e74b1.zip |
DynamicTablesPkg: AML code generation for a _LPI object
_LPI object provides a method to describe Low Power Idle
states that define the local power states for each node
in a hierarchical processor topology.
Therefore, add AmlCreateLpiNode() to generate code for a
_LPI object.
AmlCreateLpiNode ("_LPI", 0, 1, ParentNode, &LpiNode) is
equivalent of the following ASL code:
Name (_LPI, Package (
0, // Revision
1, // LevelId
0 // Count
))
Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
-rw-r--r-- | DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h | 44 | ||||
-rw-r--r-- | DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c | 133 |
2 files changed, 177 insertions, 0 deletions
diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h index 7740aac244..40c45073d3 100644 --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h @@ -672,6 +672,50 @@ AmlCodeGenMethodRetNameString ( OUT AML_OBJECT_NODE_HANDLE * NewObjectNode OPTIONAL
);
+/** Create a _LPI name.
+
+ AmlCreateLpiNode ("_LPI", 0, 1, ParentNode, &LpiNode) is
+ equivalent of the following ASL code:
+ Name (_LPI, Package (
+ 0, // Revision
+ 1, // LevelId
+ 0 // Count
+ ))
+
+ This function doesn't define any LPI state. As shown above, the count
+ of _LPI state is set to 0.
+ The AmlAddLpiState () function must be used to add LPI states.
+
+ Cf ACPI 6.3 specification, s8.4.4 "Lower Power Idle States".
+
+ @ingroup CodeGenApis
+
+ @param [in] LpiNameString The new LPI 's object name.
+ Must be a NULL-terminated ASL NameString
+ e.g.: "_LPI", "DEV0.PLPI", etc.
+ The input string is copied.
+ @param [in] Revision Revision number of the _LPI states.
+ @param [in] LevelId A platform defined number that identifies the
+ level of hierarchy of the processor node to
+ which the LPI states apply.
+ @param [in] ParentNode If provided, set ParentNode as the parent
+ of the node created.
+ @param [out] NewLpiNode If success, contains the created node.
+
+ @retval EFI_SUCCESS The function completed successfully.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+AmlCreateLpiNode (
+ IN CONST CHAR8 * LpiNameString,
+ IN UINT16 Revision,
+ IN UINT64 LevelId,
+ IN AML_NODE_HANDLE ParentNode, OPTIONAL
+ OUT AML_OBJECT_NODE_HANDLE * NewLpiNode OPTIONAL
+ );
+
// DEPRECATED APIS
#ifndef DISABLE_NEW_DEPRECATED_INTERFACES
diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c index f59a959993..9af7a725d5 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c @@ -1441,3 +1441,136 @@ error_handler: }
return Status;
}
+
+/** Create a _LPI name.
+
+ AmlCreateLpiNode ("_LPI", 0, 1, ParentNode, &LpiNode) is
+ equivalent of the following ASL code:
+ Name (_LPI, Package (
+ 0, // Revision
+ 1, // LevelId
+ 0 // Count
+ ))
+
+ This function doesn't define any LPI state. As shown above, the count
+ of _LPI state is set to 0.
+ The AmlAddLpiState () function allows to add LPI states.
+
+ Cf ACPI 6.3 specification, s8.4.4 "Lower Power Idle States".
+
+ @param [in] LpiNameString The new LPI 's object name.
+ Must be a NULL-terminated ASL NameString
+ e.g.: "_LPI", "DEV0.PLPI", etc.
+ The input string is copied.
+ @param [in] Revision Revision number of the _LPI states.
+ @param [in] LevelId A platform defined number that identifies the
+ level of hierarchy of the processor node to
+ which the LPI states apply.
+ @param [in] ParentNode If provided, set ParentNode as the parent
+ of the node created.
+ @param [out] NewLpiNode If success, contains the created node.
+
+ @retval EFI_SUCCESS The function completed successfully.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+AmlCreateLpiNode (
+ IN CONST CHAR8 * LpiNameString,
+ IN UINT16 Revision,
+ IN UINT64 LevelId,
+ IN AML_NODE_HANDLE ParentNode, OPTIONAL
+ OUT AML_OBJECT_NODE_HANDLE * NewLpiNode OPTIONAL
+ )
+{
+ EFI_STATUS Status;
+ AML_OBJECT_NODE_HANDLE PackageNode;
+ AML_OBJECT_NODE_HANDLE IntegerNode;
+
+ if ((LpiNameString == NULL) ||
+ ((ParentNode == NULL) && (NewLpiNode == NULL))) {
+ ASSERT (0);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ IntegerNode = NULL;
+
+ Status = AmlCodeGenPackage (&PackageNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ return Status;
+ }
+
+ // Create and attach Revision
+ Status = AmlCodeGenInteger (Revision, &IntegerNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ IntegerNode = NULL;
+ goto error_handler;
+ }
+
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)PackageNode,
+ (AML_NODE_HANDLE)IntegerNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ IntegerNode = NULL;
+
+ // Create and attach LevelId
+ Status = AmlCodeGenInteger (LevelId, &IntegerNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ IntegerNode = NULL;
+ goto error_handler;
+ }
+
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)PackageNode,
+ (AML_NODE_HANDLE)IntegerNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ IntegerNode = NULL;
+
+ // Create and attach Count. No LPI state is added, so 0.
+ Status = AmlCodeGenInteger (0, &IntegerNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ IntegerNode = NULL;
+ goto error_handler;
+ }
+
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)PackageNode,
+ (AML_NODE_HANDLE)IntegerNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ IntegerNode = NULL;
+
+ Status = AmlCodeGenName (LpiNameString, PackageNode, ParentNode, NewLpiNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ return Status;
+
+error_handler:
+ AmlDeleteTree ((AML_NODE_HANDLE)PackageNode);
+ if (IntegerNode != NULL) {
+ AmlDeleteTree ((AML_NODE_HANDLE)IntegerNode);
+ }
+ return Status;
+}
|