From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.6342.1624448510969537202 for ; Wed, 23 Jun 2021 04:41:51 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: pierre.gondois@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A4E7631B; Wed, 23 Jun 2021 04:41:50 -0700 (PDT) Received: from e120189.arm.com (unknown [10.57.78.245]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 367FC3F719; Wed, 23 Jun 2021 04:41:49 -0700 (PDT) From: "PierreGondois" To: devel@edk2.groups.io, Sami Mujawar , Alexei Fedorov Cc: Akanksha Jain , Alexandru Elisei Subject: [PATCH v1 10/13] DynamicTablesPkg: AML code generation for a _LPI object Date: Wed, 23 Jun 2021 12:40:36 +0100 Message-Id: <20210623114039.24491-12-Pierre.Gondois@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210623114039.24491-1-Pierre.Gondois@arm.com> References: <20210623114039.24491-1-Pierre.Gondois@arm.com> From: Pierre Gondois _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 --- .../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