[edk2-devel] [PATCH v1 10/13] DynamicTablesPkg: AML code generation for a _LPI object

PierreGondois pierre.gondois at arm.com
Wed Jun 23 11:40:36 UTC 2021


From: Pierre Gondois <Pierre.Gondois at arm.com>

_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
		))

Signed-off-by: Pierre Gondois <Pierre.Gondois at arm.com>
---
 .../Include/Library/AmlLib/AmlLib.h           |  44 ++++++
 .../Common/AmlLib/CodeGen/AmlCodeGen.c        | 133 ++++++++++++++++++
 2 files changed, 177 insertions(+)

diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
index 7740aac24470..40c45073d303 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 a9922871c311..89350f65f5df 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
@@ -1421,3 +1421,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);
+    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);
+    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:
+  if (PackageNode != NULL) {
+    AmlDeleteTree ((AML_NODE_HANDLE)PackageNode);
+  }
+  if (IntegerNode != NULL) {
+    AmlDeleteTree ((AML_NODE_HANDLE)IntegerNode);
+  }
+  return Status;
+}
-- 
2.17.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#76952): https://edk2.groups.io/g/devel/message/76952
Mute This Topic: https://groups.io/mt/83735662/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list