Hello Rebecca, This patch looks good to me:
Reviewed-by: Pierre Gondois <pierre.gond...@arm.com> 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 <quic_rc...@quicinc.com> > --- > 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 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#85541): https://edk2.groups.io/g/devel/message/85541 Mute This Topic: https://groups.io/mt/88291891/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-