public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Sami Mujawar" <sami.mujawar@arm.com>
To: Pierre.Gondois@arm.com, devel@edk2.groups.io,
	Alexei.Fedorov@arm.com, nd <nd@arm.com>
Subject: Re: [PATCH v2 15/21] DynamicTablesPkg: AML code generation for a Method
Date: Fri, 8 Oct 2021 15:07:23 +0100	[thread overview]
Message-ID: <63792fad-f5fd-7b9a-d8a2-3cb5e8f2544e@arm.com> (raw)
In-Reply-To: <20211007153210.26608-16-Pierre.Gondois@arm.com>

Hi Pierre,

Thank you for adding documentation for the steps for generating a Method.

Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>

Regards,

Sami Mujawar

On 07/10/2021 04:32 PM, Pierre.Gondois@arm.com wrote:
> From: Pierre Gondois <Pierre.Gondois@arm.com>
>
> Add AmlCodeGenMethod() to generate code for a control method.
>
> AmlCodeGenMethod ("MET0", 1, TRUE, 3, ParentNode, NewObjectNode)
> is equivalent of the following ASL code:
>      Method(MET0, 1, Serialized, 3) {}
>
> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
> ---
>   .../Common/AmlLib/CodeGen/AmlCodeGen.c        | 184 ++++++++++++++++++
>   1 file changed, 184 insertions(+)
>
> diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> index da80e9d77cc2..dd519bc67007 100644
> --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> @@ -970,3 +970,187 @@ error_handler1:
>
>     return Status;
>   }
> +
> +/** AML code generation for a Method object node.
> +
> +  AmlCodeGenMethod ("MET0", 1, TRUE, 3, ParentNode, NewObjectNode) is
> +  equivalent of the following ASL code:
> +    Method(MET0, 1, Serialized, 3) {}
> +
> +  ACPI 6.4, s20.2.5.2 "Named Objects Encoding":
> +    DefMethod := MethodOp PkgLength NameString MethodFlags TermList
> +    MethodOp := 0x14
> +
> +  The ASL parameters "ReturnType" and "ParameterTypes" are not asked
> +  in this function. They are optional parameters in ASL.
> +
> +  @param [in]  NameString     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]  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.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AmlCodeGenMethod (
> +  IN  CONST CHAR8              * NameString,
> +  IN        UINT8                NumArgs,
> +  IN        BOOLEAN              IsSerialized,
> +  IN        UINT8                SyncLevel,
> +  IN        AML_NODE_HEADER    * ParentNode,     OPTIONAL
> +  OUT       AML_OBJECT_NODE   ** NewObjectNode   OPTIONAL
> +  )
> +{
> +  EFI_STATUS        Status;
> +  UINT32            PkgLen;
> +  UINT8             Flags;
> +  AML_OBJECT_NODE * ObjectNode;
> +  AML_DATA_NODE   * DataNode;
> +  CHAR8           * AmlNameString;
> +  UINT32            AmlNameStringSize;
> +
> +  if ((NameString == NULL)    ||
> +      (NumArgs > 6)           ||
> +      (SyncLevel > 15)        ||
> +      ((ParentNode == NULL) && (NewObjectNode == NULL))) {
> +    ASSERT (0);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  ObjectNode = NULL;
> +  DataNode = NULL;
> +
> +  // ACPI 6.4, s20.2.5.2 "Named Objects Encoding":
> +  //   DefMethod := MethodOp PkgLength NameString MethodFlags TermList
> +  //   MethodOp := 0x14
> +  // So:
> +  //  1- Create the NameString
> +  //  2- Compute the size to write in the PkgLen
> +  //  3- Create nodes for the NameString and Method object node
> +  //  4- Set the NameString DataNode as a fixed argument
> +  //  5- Create and link the MethodFlags node
> +
> +  // 1- Create the NameString
> +  Status = ConvertAslNameToAmlName (NameString, &AmlNameString);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    return Status;
> +  }
> +
> +  Status = AmlGetNameStringSize (AmlNameString, &AmlNameStringSize);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler1;
> +  }
> +
> +  // 2- Compute the size to write in the PkgLen
> +  //    Add 1 byte (ByteData) for MethodFlags.
> +  Status = AmlComputePkgLength (AmlNameStringSize + 1, &PkgLen);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler1;
> +  }
> +
> +  //  3- Create nodes for the NameString and Method object node
> +  Status = AmlCreateObjectNode (
> +             AmlGetByteEncodingByOpCode (AML_METHOD_OP, 0),
> +             PkgLen,
> +             &ObjectNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler1;
> +  }
> +
> +  Status = AmlCreateDataNode (
> +             EAmlNodeDataTypeNameString,
> +             (UINT8*)AmlNameString,
> +             AmlNameStringSize,
> +             &DataNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler2;
> +  }
> +
> +  //  4- Set the NameString DataNode as a fixed argument
> +  Status = AmlSetFixedArgument (
> +             ObjectNode,
> +             EAmlParseIndexTerm0,
> +             (AML_NODE_HEADER*)DataNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler2;
> +  }
> +
> +  DataNode = NULL;
> +
> +  //  5- Create and link the MethodFlags node
> +  Flags = NumArgs                   |
> +          (IsSerialized ? BIT3 : 0) |
> +          (SyncLevel << 4);
> +
> +  Status = AmlCreateDataNode (EAmlNodeDataTypeUInt, &Flags, 1, &DataNode);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler2;
> +  }
> +
> +  Status = AmlSetFixedArgument (
> +             ObjectNode,
> +             EAmlParseIndexTerm1,
> +             (AML_NODE_HEADER*)DataNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler2;
> +  }
> +
> +  // Data node is attached so set the pointer to
> +  // NULL to ensure correct error handling.
> +  DataNode = NULL;
> +
> +  Status = LinkNode (
> +             ObjectNode,
> +             ParentNode,
> +             NewObjectNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler2;
> +  }
> +
> +  // Free AmlNameString before returning as it is copied
> +  // in the call to AmlCreateDataNode().
> +  goto error_handler1;
> +
> +error_handler2:
> +  if (ObjectNode != NULL) {
> +    AmlDeleteTree ((AML_NODE_HEADER*)ObjectNode);
> +  }
> +  if (DataNode != NULL) {
> +    AmlDeleteTree ((AML_NODE_HEADER*)DataNode);
> +  }
> +
> +error_handler1:
> +  if (AmlNameString != NULL) {
> +    FreePool (AmlNameString);
> +  }
> +  return Status;
> +}

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.

  reply	other threads:[~2021-10-08 14:07 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-07 15:31 [PATCH v2 00/21] Create a SSDT CPU topology generator PierreGondois
2021-10-07 15:31 ` [PATCH v2 01/21] DynamicTablesPkg: Remove unnecessary includes PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:31 ` [PATCH v2 02/21] DynamicTablesPkg: Add missing parameter check PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:31 ` [PATCH v2 03/21] DynamicTablesPkg: Add AddSsdtAcpiHeader() PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:31 ` [PATCH v2 04/21] DynamicTablesPkg: Add AmlRdSetEndTagChecksum() PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:31 ` [PATCH v2 05/21] DynamicTablesPkg: Add AmlSetRdListCheckSum() PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:31 ` [PATCH v2 06/21] DynamicTablesPkg: Set EndTag's Checksum if RdList is modified PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:31 ` [PATCH v2 07/21] DynamicTablesPkg: Clear pointer in node creation fcts PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:31 ` [PATCH v2 08/21] DynamicTablesPkg: Update error handling for node creation PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:31 ` [PATCH v2 09/21] DynamicTablesPkg: Make AmlNodeGetIntegerValue public PierreGondois
2021-10-07 15:31 ` [PATCH v2 10/21] DynamicTablesPkg: AML Code generation for Register() PierreGondois
2021-10-07 15:32 ` [PATCH v2 11/21] DynamicTablesPkg: AML Code generation for Resource data EndTag PierreGondois
2021-10-08 14:07   ` Sami Mujawar
2021-10-07 15:32 ` [PATCH v2 12/21] DynamicTablesPkg: AML code generation for a Package PierreGondois
2021-10-08 14:06   ` Sami Mujawar
2021-10-07 15:32 ` [PATCH v2 13/21] DynamicTablesPkg: Helper function to compute package length PierreGondois
2021-10-07 15:32 ` [PATCH v2 14/21] DynamicTablesPkg: AML code generation for a ResourceTemplate PierreGondois
2021-10-08 14:07   ` Sami Mujawar
2021-10-07 15:32 ` [PATCH v2 15/21] DynamicTablesPkg: AML code generation for a Method PierreGondois
2021-10-08 14:07   ` Sami Mujawar [this message]
2021-10-07 15:32 ` [PATCH v2 16/21] DynamicTablesPkg: AML code generation to Return a NameString PierreGondois
2021-10-08 13:28   ` Sami Mujawar
2021-10-07 15:32 ` [PATCH v2 17/21] DynamicTablesPkg: AML code generation for a Method returning a NS PierreGondois
2021-10-08 14:17   ` Sami Mujawar
2021-10-07 15:32 ` [PATCH v2 18/21] DynamicTablesPkg: AML code generation for a _LPI object PierreGondois
2021-10-08 14:24   ` Sami Mujawar
2021-10-07 15:32 ` [PATCH v2 19/21] DynamicTablesPkg: AML code generation to add an _LPI state PierreGondois
2021-10-08 14:29   ` Sami Mujawar
2021-10-07 15:32 ` [PATCH v2 20/21] DynamicTablesPkg: Add CM_ARM_LPI_INFO object PierreGondois
2021-10-07 15:32 ` [PATCH v2 21/21] DynamicTablesPkg: SSDT CPU topology and LPI state generator PierreGondois

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=63792fad-f5fd-7b9a-d8a2-3cb5e8f2544e@arm.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