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.web08.5800.1641901066337513121 for ; Tue, 11 Jan 2022 03:37:46 -0800 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 E6BCE1FB; Tue, 11 Jan 2022 03:37:45 -0800 (PST) Received: from [10.57.66.135] (unknown [10.57.66.135]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A92FF3F766; Tue, 11 Jan 2022 03:37:44 -0800 (PST) From: "PierreGondois" Subject: Re: [edk2-devel] [PATCH 3/3] DynamicTablesPkg: Add AmlCodeGenMethodRetInteger function To: devel@edk2.groups.io, quic_rcran@quicinc.com, Sami Mujawar , Alexei Fedorov , Leif Lindholm References: <20220108215748.2173-1-quic_rcran@quicinc.com> <20220108215748.2173-4-quic_rcran@quicinc.com> Message-ID: <6e40c8c8-44fc-938c-eb1c-8ae0c0b53849@arm.com> Date: Tue, 11 Jan 2022 12:38:02 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 MIME-Version: 1.0 In-Reply-To: <20220108215748.2173-4-quic_rcran@quicinc.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US Hello Rebecca, This patch looks good to me: Reviewed-by: Pierre Gondois On 1/8/22 10:57 PM, Rebecca Cran via groups.io wrote: > Add AmlCodeGenMethodRetInteger function to generate AML code for > a Method returning an Integer. > > Signed-off-by: Rebecca Cran > --- > DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h | 47 ++++++ > DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c | 156 ++++++++++++++++++++ > 2 files changed, 203 insertions(+) > > diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h > index 8b3e80b61466..e47cf99eaa37 100644 > --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h > +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h > @@ -1118,6 +1118,53 @@ AmlCodeGenMethodRetNameString ( > OUT AML_OBJECT_NODE_HANDLE *NewObjectNode OPTIONAL > ); > > +/** AML code generation for a method returning an Integer. > + > + AmlCodeGenMethodRetInteger ( > + "_CBA", 0, 1, TRUE, 3, ParentNode, NewObjectNode > + ); > + is equivalent of the following ASL code: > + Method(_CBA, 1, Serialized, 3) { > + Return (0) > + } > + > + The ASL parameters "ReturnType" and "ParameterTypes" are not asked > + in this function. They are optional parameters in ASL. > + > + @param [in] MethodNameString The new Method's name. > + Must be a NULL-terminated ASL NameString > + e.g.: "MET0", "_SB.MET0", etc. > + The input string is copied. > + @param [in] ReturnedInteger The value of the integer returned by the > + method. > + @param [in] NumArgs Number of arguments. > + Must be 0 <= NumArgs <= 6. > + @param [in] IsSerialized TRUE is equivalent to Serialized. > + FALSE is equivalent to NotSerialized. > + Default is NotSerialized in ASL spec. > + @param [in] SyncLevel Synchronization level for the method. > + Must be 0 <= SyncLevel <= 15. > + Default is 0 in ASL. > + @param [in] ParentNode If provided, set ParentNode as the parent > + of the node created. > + @param [out] NewObjectNode If success, contains the created node. > + > + @retval EFI_SUCCESS Success. > + @retval EFI_INVALID_PARAMETER Invalid parameter. > + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > +**/ > +EFI_STATUS > +EFIAPI > +AmlCodeGenMethodRetInteger ( > + IN CONST CHAR8 *MethodNameString, > + IN UINT64 ReturnedInteger, > + IN UINT8 NumArgs, > + IN BOOLEAN IsSerialized, > + IN UINT8 SyncLevel, > + IN AML_NODE_HANDLE ParentNode OPTIONAL, > + OUT AML_OBJECT_NODE_HANDLE *NewObjectNode OPTIONAL > + ); > + > /** Create a _LPI name. > > AmlCreateLpiNode ("_LPI", 0, 1, ParentNode, &LpiNode) is diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c index 838a892c6b58..07822ead5b70 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c @@ -1685,6 +1685,61 @@ exit_handler: return Status; } +/** AML code generation for a Return object node, + returning an Integer. + + AmlCodeGenReturn (0), ParentNode, NewObjectNode) is + equivalent of the following ASL code: + Return (0) + + The ACPI 6.3 specification, 20.2.8 "Statement Opcodes Encoding" states: > + DefReturn := ReturnOp ArgObject > + ReturnOp := 0xA4 > + ArgObject := TermArg => DataRefObject > + > + Thus, the ReturnNode must be evaluated as a DataRefObject. > + > + The ReturnNode must be generated inside a Method body scope. > + > + @param [in] Integer The integer is returned by the Return > + ASL statement. > + @param [in] ParentNode If provided, set ParentNode as the parent > + of the node created. > + Must be a MethodOp node. > + @param [out] NewObjectNode If success, contains the created node. > + > + @retval EFI_SUCCESS Success. > + @retval EFI_INVALID_PARAMETER Invalid parameter. > + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > +**/ > +STATIC > +EFI_STATUS > +EFIAPI > +AmlCodeGenReturnInteger ( > + IN UINT64 Integer, > + IN AML_NODE_HEADER *ParentNode OPTIONAL, > + OUT AML_OBJECT_NODE **NewObjectNode OPTIONAL > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_NODE *IntNode; > + > + IntNode = NULL; > + > + Status = AmlCodeGenInteger (Integer, &IntNode); > + ASSERT_EFI_ERROR (Status); > + > + // AmlCodeGenReturn() deletes DataNode if error. > + Status = AmlCodeGenReturn ( > + (AML_NODE_HEADER *)IntNode, > + ParentNode, > + NewObjectNode > + ); > + ASSERT_EFI_ERROR (Status); > + > + return Status; > +} > + > /** AML code generation for a method returning a NameString. > > AmlCodeGenMethodRetNameString ( > @@ -1793,6 +1848,107 @@ error_handler: > return Status; > } > > +/** AML code generation for a method returning an Integer. > + > + AmlCodeGenMethodRetInteger ( > + "_CBA", 0, 1, TRUE, 3, ParentNode, NewObjectNode > + ); > + is equivalent of the following ASL code: > + Method(_CBA, 1, Serialized, 3) { > + Return (0) > + } > + > + The ASL parameters "ReturnType" and "ParameterTypes" are not asked > + in this function. They are optional parameters in ASL. > + > + @param [in] MethodNameString The new Method's name. > + Must be a NULL-terminated ASL NameString > + e.g.: "MET0", "_SB.MET0", etc. > + The input string is copied. > + @param [in] ReturnedInteger The value of the integer returned by the > + method. > + @param [in] NumArgs Number of arguments. > + Must be 0 <= NumArgs <= 6. > + @param [in] IsSerialized TRUE is equivalent to Serialized. > + FALSE is equivalent to NotSerialized. > + Default is NotSerialized in ASL spec. > + @param [in] SyncLevel Synchronization level for the method. > + Must be 0 <= SyncLevel <= 15. > + Default is 0 in ASL. > + @param [in] ParentNode If provided, set ParentNode as the parent > + of the node created. > + @param [out] NewObjectNode If success, contains the created node. > + > + @retval EFI_SUCCESS Success. > + @retval EFI_INVALID_PARAMETER Invalid parameter. > + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > +**/ > +EFI_STATUS > +EFIAPI > +AmlCodeGenMethodRetInteger ( > + IN CONST CHAR8 *MethodNameString, > + IN UINT64 ReturnedInteger, > + IN UINT8 NumArgs, > + IN BOOLEAN IsSerialized, > + IN UINT8 SyncLevel, > + IN AML_NODE_HANDLE ParentNode OPTIONAL, > + OUT AML_OBJECT_NODE_HANDLE *NewObjectNode OPTIONAL > + ) > +{ > + EFI_STATUS Status; > + AML_OBJECT_NODE_HANDLE MethodNode; > + > + if ((MethodNameString == NULL) || > + ((ParentNode == NULL) && (NewObjectNode == NULL))) > + { > + ASSERT (0); > + return EFI_INVALID_PARAMETER; > + } > + > + // Create a Method named MethodNameString. > + Status = AmlCodeGenMethod ( > + MethodNameString, > + NumArgs, > + IsSerialized, > + SyncLevel, > + NULL, > + &MethodNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + return Status; > + } > + > + Status = AmlCodeGenReturnInteger ( > + ReturnedInteger, > + (AML_NODE_HANDLE)MethodNode, > + NULL > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + Status = LinkNode ( > + MethodNode, > + ParentNode, > + NewObjectNode > + ); > + if (EFI_ERROR (Status)) { > + ASSERT (0); > + goto error_handler; > + } > + > + return Status; > + > +error_handler: > + if (MethodNode != NULL) { > + AmlDeleteTree ((AML_NODE_HANDLE)MethodNode); > + } > + > + return Status; > +} > + > /** Create a _LPI name. > > AmlCreateLpiNode ("_LPI", 0, 1, ParentNode, &LpiNode) is