public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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]
-=-=-=-=-=-=-=-=-=-=-=-



      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