Re: [PATCH v2 18/21] DynamicTablesPkg: AML code generation for a _LPI object


Sami Mujawar
 

Hi Pierre,

Thank you for this patch.

Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>

Regards,

Sami Mujawar

On 07/10/2021 04:32 PM, Pierre.Gondois@arm.com wrote:
From: Pierre Gondois <Pierre.Gondois@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@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 67474094b975..2223e4bcfef9 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
@@ -1442,3 +1442,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;
+}
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.

Join devel@edk2.groups.io to automatically receive all group messages.