From: "Abdul Lateef Attar via groups.io" <AbdulLateef.Attar=amd.com@groups.io>
To: <devel@edk2.groups.io>
Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>,
Pierre Gondois <pierre.gondois@arm.com>,
Sami Mujawar <sami.mujawar@arm.com>
Subject: [edk2-devel] [PATCH v3 5/5] DynamicTablesPkg: Adds wrapper API AmlCodeGenMethodInvokeMethodArgn
Date: Mon, 11 Dec 2023 16:07:33 +0530 [thread overview]
Message-ID: <fa8b39e17c0cdf292c480c6731a3605ee484ede2.1702290369.git.AbdulLateef.Attar@amd.com> (raw)
In-Reply-To: <cover.1702290369.git.AbdulLateef.Attar@amd.com>
From: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
Adds a wrapper API AmlCodeGenMethodInvokeMethodArgnWithInteger() to
the AmlCodeGenMethodInvokeMethodArgn().
Wrapper API provides ability to add integer arguments along
with ArgN argument.
This help to generate dynamic code to invoke another
method(might be in static ASL file) with build-in
argument parameters plus integer arguments.
e.g:
Method (MET0, 3, Serialized)
{
\_SB.MET1 (Arg0, Arg1, Arg2, 0x10, 0x20))
}
Cc: Pierre Gondois <pierre.gondois@arm.com>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Signed-off-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
---
.../Include/Library/AmlLib/AmlLib.h | 68 +++++++
.../Common/AmlLib/CodeGen/AmlCodeGen.c | 187 ++++++++++++++++++
2 files changed, 255 insertions(+)
diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
index 5ab205b5f0..132846a38a 100644
--- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
+++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
@@ -1739,4 +1739,72 @@ AmlCodeGenMethodInvokeMethodArgn (
OUT AML_OBJECT_NODE_HANDLE *NewObjectNode OPTIONAL
);
+/** AML code generation for a method invoking another method
+ with ArgN arguments and optionally integer arguments.
+
+ Arg0Int = 0x10;
+ Arg1Int = 0x20;
+ AmlCodeGenMethodInvokeMethodArgnWithInteger (
+ "MET0", "MET1", 4, TRUE, 3,
+ Arg0Int, Arg1Int, NULL, NULL, NULL, NULL,
+ ParentNode, NewObjectNode
+ );
+ is equivalent of the following ASL code:
+ Method(MET0, 4, Serialized, 3) {
+ MET1 (Arg0, Arg1, Arg2, Arg3, 0x10, 0x20)
+ }
+
+ @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] InvokeMethodNameString The called/invoked method's name.
+ Must be a NULL-terminated ASL NameString
+ e.g.: "MET1", "_SB.MET1", etc.
+ The input string is copied.
+ @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] IntegerArg0 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg1 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg2 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg3 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg4 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg5 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @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.
+**/
+EFI_STATUS
+EFIAPI
+AmlCodeGenMethodInvokeMethodArgnWithInteger (
+ IN CONST CHAR8 *MethodNameString,
+ IN CONST CHAR8 *InvokeMethodNameString,
+ IN UINT8 NumArgs,
+ IN BOOLEAN IsSerialized,
+ IN UINT8 SyncLevel,
+ IN UINT64 *IntegerArg0 OPTIONAL,
+ IN UINT64 *IntegerArg1 OPTIONAL,
+ IN UINT64 *IntegerArg2 OPTIONAL,
+ IN UINT64 *IntegerArg3 OPTIONAL,
+ IN UINT64 *IntegerArg4 OPTIONAL,
+ IN UINT64 *IntegerArg5 OPTIONAL,
+ IN AML_NODE_HANDLE ParentNode OPTIONAL,
+ OUT AML_OBJECT_NODE_HANDLE *NewObjectNode OPTIONAL
+ );
+
#endif // AML_LIB_H_
diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
index b05fa6d109..b3b01e7baf 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
@@ -4001,3 +4001,190 @@ exit_handler:
return Status;
}
+
+/** AML code generation for a method invoking another method
+ with ArgN arguments and optionally integer arguments.
+
+ Arg0Int = 0x10;
+ Arg1Int = 0x20;
+ AmlCodeGenMethodInvokeMethodArgnWithInteger (
+ "MET0", "MET1", 4, TRUE, 3,
+ Arg0Int, Arg1Int, NULL, NULL, NULL, NULL,
+ ParentNode, NewObjectNode
+ );
+ is equivalent of the following ASL code:
+ Method(MET0, 4, Serialized, 3) {
+ MET1 (Arg0, Arg1, Arg2, Arg3, 0x10, 0x20)
+ }
+
+ @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] InvokeMethodNameString The called/invoked method's name.
+ Must be a NULL-terminated ASL NameString
+ e.g.: "MET1", "_SB.MET1", etc.
+ The input string is copied.
+ @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] IntegerArg0 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg1 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg2 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg3 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg4 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @param [in] IntegerArg5 If provided and meets the validation criteria,
+ then set as integer argument to invoked method.
+ @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.
+**/
+EFI_STATUS
+EFIAPI
+AmlCodeGenMethodInvokeMethodArgnWithInteger (
+ IN CONST CHAR8 *MethodNameString,
+ IN CONST CHAR8 *InvokeMethodNameString,
+ IN UINT8 NumArgs,
+ IN BOOLEAN IsSerialized,
+ IN UINT8 SyncLevel,
+ IN UINT64 *IntegerArg0 OPTIONAL,
+ IN UINT64 *IntegerArg1 OPTIONAL,
+ IN UINT64 *IntegerArg2 OPTIONAL,
+ IN UINT64 *IntegerArg3 OPTIONAL,
+ IN UINT64 *IntegerArg4 OPTIONAL,
+ IN UINT64 *IntegerArg5 OPTIONAL,
+ IN AML_NODE_HANDLE ParentNode OPTIONAL,
+ OUT AML_OBJECT_NODE_HANDLE *NewObjectNode OPTIONAL
+ )
+{
+ EFI_STATUS Status;
+ AML_OBJECT_NODE_HANDLE MethodObjectNode;
+ AML_OBJECT_NODE *IntNode;
+ UINT64 LocalIntegerArg[6];
+ UINT8 LocalIntegerArgCount;
+ UINT8 Index;
+
+ if ((MethodNameString == NULL) || (InvokeMethodNameString == NULL)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ /// Sanity check optional argument
+ /// AML library allows max 6 argument
+ /// Hence Integer argument count should be within the range
+ /// (NumArgs + Integer argument) should not be grater than 6
+ LocalIntegerArgCount = 0;
+ if (IntegerArg0 != NULL) {
+ if (NumArgs > 5) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ LocalIntegerArg[LocalIntegerArgCount++] = *IntegerArg0;
+ }
+
+ if (IntegerArg1 != NULL) {
+ if (NumArgs > 4) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ LocalIntegerArg[LocalIntegerArgCount++] = *IntegerArg1;
+ }
+
+ if (IntegerArg2 != NULL) {
+ if (NumArgs > 3) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ LocalIntegerArg[LocalIntegerArgCount++] = *IntegerArg2;
+ }
+
+ if (IntegerArg3 != NULL) {
+ if (NumArgs > 2) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ LocalIntegerArg[LocalIntegerArgCount++] = *IntegerArg3;
+ }
+
+ if (IntegerArg4 != NULL) {
+ if (NumArgs > 1) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ LocalIntegerArg[LocalIntegerArgCount++] = *IntegerArg4;
+ }
+
+ if (IntegerArg5 != NULL) {
+ if (NumArgs > 0) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ LocalIntegerArg[LocalIntegerArgCount++] = *IntegerArg5;
+ }
+
+ /// Create a method invoking another method with Argn
+ Status = AmlCodeGenMethodInvokeMethodArgn (
+ MethodNameString,
+ InvokeMethodNameString,
+ NumArgs,
+ IsSerialized,
+ SyncLevel,
+ NULL,
+ &MethodObjectNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ /// Now append the integer argument
+ for (Index = 0; Index < LocalIntegerArgCount; Index++) {
+ IntNode = NULL;
+ Status = AmlCodeGenInteger (LocalIntegerArg[Index], &IntNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ goto exit_handler;
+ }
+
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)MethodObjectNode,
+ (AML_NODE_HANDLE)IntNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ goto exit_handler;
+ }
+ }
+
+ IntNode = NULL;
+ Status = LinkNode (
+ MethodObjectNode,
+ ParentNode,
+ NewObjectNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ goto exit_handler;
+ }
+
+ return Status;
+
+exit_handler:
+ if (MethodObjectNode != NULL) {
+ AmlDeleteTree ((AML_NODE_HANDLE)MethodObjectNode);
+ }
+
+ return Status;
+}
--
2.34.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#112288): https://edk2.groups.io/g/devel/message/112288
Mute This Topic: https://groups.io/mt/103106352/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
prev parent reply other threads:[~2023-12-11 10:37 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-11 10:37 [edk2-devel] [PATCH v3 0/5] DynamicTablesPkg: Updated word I/O Abdul Lateef Attar via groups.io
2023-12-11 10:37 ` [edk2-devel] [PATCH v3 1/5] DynamicTablesPkg: AML Code generation for word I/O ranges Abdul Lateef Attar via groups.io
2023-12-11 10:37 ` [edk2-devel] [PATCH v3 2/5] DynamicTablesPkg: Corrects AmlCodeGenRdWordBusNumber parameters Abdul Lateef Attar via groups.io
2023-12-11 10:37 ` [edk2-devel] [PATCH v3 3/5] DynamicTablesPkg: Corrects function pointer typedef of AML_PARSE_FUNCTION Abdul Lateef Attar via groups.io
2023-12-11 10:37 ` [edk2-devel] [PATCH v3 4/5] DynamicTablesPkg: Adds API to generate a method with ArgN Abdul Lateef Attar via groups.io
2023-12-11 14:26 ` PierreGondois
2023-12-14 4:13 ` Abdul Lateef Attar via groups.io
2023-12-11 10:37 ` Abdul Lateef Attar via groups.io [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fa8b39e17c0cdf292c480c6731a3605ee484ede2.1702290369.git.AbdulLateef.Attar@amd.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox