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 <Alexei.Fedorov@arm.com>
Cc: Akanksha Jain <akanksha.jain2@arm.com>,
	Alexandru Elisei <alexandru.elisei@arm.com>, nd <nd@arm.com>
Subject: Re: [PATCH v1 06/13] DynamicTablesPkg: AML code generation for a ResourceTemplate
Date: Fri, 1 Oct 2021 15:34:12 +0100	[thread overview]
Message-ID: <acbd6c55-ffa4-c242-9e71-d3c2840d0a7d@arm.com> (raw)
In-Reply-To: <20210623114039.24491-7-Pierre.Gondois@arm.com>

Hi Pierre,

Thank you for this patch.

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

Regards,

Sami Mujawar


On 23/06/2021 12:40 PM, Pierre.Gondois@arm.com wrote:
> From: Pierre Gondois <Pierre.Gondois@arm.com>
>
> ASL provides a ResourceTemplate macro that creates a Buffer in which
> resource descriptor macros can be listed. The ResourceTemplate macro
> automatically generates an End descriptor and calculates the checksum
> for the resource template.
>
> Therefore, add AmlCodeGenResourceTemplate() to generate AML code for
> the ResourceTemplate() macro. This function generates a Buffer node
> with an EndTag resource data descriptor, which is similar to the ASL
> ResourceTemplate() macro.
>
> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
> ---
>   .../Common/AmlLib/CodeGen/AmlCodeGen.c        | 192 ++++++++++++++++++
>   1 file changed, 192 insertions(+)
>
> diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> index ea9b73b464a4..faf7902c1f21 100644
> --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> @@ -12,6 +12,7 @@
>   
>   #include <AmlCoreInterface.h>
>   #include <AmlEncoding/Aml.h>
> +#include <CodeGen/AmlResourceDataCodeGen.h>
>   #include <Tree/AmlNode.h>
>   #include <Tree/AmlTree.h>
>   #include <String/AmlString.h>
> @@ -315,6 +316,197 @@ error_handler:
>     return Status;
>   }
>   
> +/** AML code generation for a Buffer object node.
> +
> +  To create a Buffer object node with an empty buffer,
> +  call the function with (Buffer=NULL, BufferSize=0).
> +
> +  @param [in]  Buffer          Buffer to set for the created Buffer
> +                               object node. The Buffer's content is copied.
> +                               NULL if there is no buffer to set for
> +                               the Buffer node.
> +  @param [in]  BufferSize      Size of the Buffer.
> +                               0 if there is no buffer to set for
> +                               the Buffer node.
> +  @param [out] NewObjectNode   If success, contains the created
> +                               Buffer object node.
> +
> +  @retval EFI_SUCCESS             Success.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AmlCodeGenBuffer (
> +  IN  CONST UINT8             * Buffer,       OPTIONAL
> +  IN        UINT32              BufferSize,   OPTIONAL
> +  OUT       AML_OBJECT_NODE  ** NewObjectNode
> +  )
> +{
> +  EFI_STATUS        Status;
> +  AML_OBJECT_NODE * BufferNode;
> +  AML_OBJECT_NODE * BufferSizeNode;
> +  UINT32            BufferSizeNodeSize;
> +  AML_DATA_NODE   * DataNode;
> +  UINT32            PkgLen;
> +
> +  // Buffer and BufferSize must be either both set, or both clear.
> +  if ((NewObjectNode == NULL)                 ||
> +      ((Buffer == NULL) != (BufferSize == 0))) {
> +    ASSERT (0);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  BufferNode = NULL;
> +  DataNode = NULL;
> +
> +  // Cf ACPI 6.3 specification, s20.2.5.4 "Type 2 Opcodes Encoding"
> +  // DefBuffer := BufferOp PkgLength BufferSize ByteList
> +  // BufferOp  := 0x11
> +  // BufferSize := TermArg => Integer
> +
> +  Status = AmlCodeGenInteger (BufferSize, &BufferSizeNode);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    return Status;
> +  }
> +
> +  // Get the number of bytes required to encode the BufferSizeNode.
> +  Status = AmlComputeSize (
> +             (AML_NODE_HEADER*)BufferSizeNode,
> +             &BufferSizeNodeSize
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  // Compute the size to write in the PkgLen.
> +  Status = AmlComputePkgLength (BufferSizeNodeSize + BufferSize, &PkgLen);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  // Create an object node for the buffer.
> +  Status = AmlCreateObjectNode (
> +             AmlGetByteEncodingByOpCode (AML_BUFFER_OP, 0),
> +             PkgLen,
> +             &BufferNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  // Set the BufferSizeNode as a fixed argument of the BufferNode.
> +  Status = AmlSetFixedArgument (
> +             BufferNode,
> +             EAmlParseIndexTerm0,
> +             (AML_NODE_HEADER*)BufferSizeNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  // BufferSizeNode is now attached.
> +  BufferSizeNode = NULL;
> +
> +  // If there is a buffer, create a DataNode and attach it to the BufferNode.
> +  if (Buffer != NULL) {
> +    Status = AmlCreateDataNode (
> +               EAmlNodeDataTypeRaw,
> +               Buffer,
> +               BufferSize,
> +               &DataNode
> +               );
> +    if (EFI_ERROR (Status)) {
> +      ASSERT (0);
> +      goto error_handler;
> +    }
> +
> +    Status = AmlVarListAddTail (
> +               (AML_NODE_HEADER*)BufferNode,
> +               (AML_NODE_HEADER*)DataNode
> +               );
> +    if (EFI_ERROR (Status)) {
> +      ASSERT (0);
> +      goto error_handler;
> +    }
> +  }
> +
> +  *NewObjectNode = BufferNode;
> +  return Status;
> +
> +error_handler:
> +  if (BufferSizeNode != NULL) {
> +    AmlDeleteTree ((AML_NODE_HEADER*)BufferSizeNode);
> +  }
> +  if (BufferNode != NULL) {
> +    AmlDeleteTree ((AML_NODE_HEADER*)BufferNode);
> +  }
> +  if (DataNode != NULL) {
> +    AmlDeleteTree ((AML_NODE_HEADER*)DataNode);
> +  }
> +  return Status;
> +}
> +
> +/** AML code generation for a ResourceTemplate.
> +
> +  "ResourceTemplate" is a macro defined in ACPI 6.3, s19.3.3
> +  "ASL Resource Templates". It allows to store resource data elements.
> +
> +  In AML, a ResourceTemplate is implemented as a Buffer storing resource
> +  data elements. An EndTag resource data descriptor must be at the end
> +  of the list of resource data elements.
> +  This function generates a Buffer node with an EndTag resource data
> +  descriptor. It can be seen as an empty list of resource data elements.
> +
> +  @param [out] NewObjectNode   If success, contains the created
> +                               ResourceTemplate object node.
> +
> +  @retval EFI_SUCCESS             Success.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AmlCodeGenResourceTemplate (
> +  OUT AML_OBJECT_NODE    ** NewObjectNode
> +  )
> +{
> +  EFI_STATUS          Status;
> +  AML_OBJECT_NODE   * BufferNode;
> +
> +  if (NewObjectNode == NULL) {
> +    ASSERT (0);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  BufferNode = NULL;
> +
> +  // Create a BufferNode with an empty buffer.
> +  Status = AmlCodeGenBuffer (NULL, 0, &BufferNode);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    return Status;
> +  }
> +
> +  // Create an EndTag resource data element and attach it to the Buffer.
> +  Status = AmlCodeGenEndTag (0, BufferNode, NULL);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    AmlDeleteTree ((AML_NODE_HEADER*)BufferNode);
> +    return Status;
> +  }
> +
> +  *NewObjectNode = BufferNode;
> +  return Status;
> +}
> +
>   /** AML code generation for a Name object node.
>   
>     @param  [in] NameString     The new variable name.


  reply	other threads:[~2021-10-01 14:34 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-23 11:40 [PATCH v1 00/13] Create a SSDT CPU topology generator PierreGondois
2021-06-23 11:40 ` [PATCH v1 01/13] DynamicTablesPkg: Make AmlNodeGetIntegerValue public PierreGondois
2021-10-01 14:48   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 02/13] DynamicTablesPkg: AML Code generation for Register() PierreGondois
2021-10-01 12:25   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 03/13] DynamicTablesPkg: AML Code generation for Resource data EndTag PierreGondois
2021-10-01 12:48   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 04/13] DynamicTablesPkg: AML code generation for a Package PierreGondois
2021-10-01 12:55   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 05/13] DynamicTablesPkg: Helper function to compute package length PierreGondois
2021-10-01 14:24   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 06/13] DynamicTablesPkg: AML code generation for a ResourceTemplate PierreGondois
2021-10-01 14:34   ` Sami Mujawar [this message]
2021-06-23 11:40 ` [PATCH v1 07/13] DynamicTablesPkg: AML code generation for a Method PierreGondois
2021-10-01 14:52   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 08/13] DynamicTablesPkg: AML code generation to Return a NameString PierreGondois
2021-10-01 15:13   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 09/13] DynamicTablesPkg: AML code generation for a Method returning a NS PierreGondois
2021-10-01 15:23   ` Sami Mujawar
2021-10-06 13:33     ` PierreGondois
2021-06-23 11:40 ` [PATCH v1 09/13] DynamicTablesPkg: AML code generation to create " PierreGondois
2021-06-23 11:45   ` [edk2-devel] " PierreGondois
2021-06-23 11:40 ` [PATCH v1 10/13] DynamicTablesPkg: AML code generation for a _LPI object PierreGondois
2021-10-01 15:31   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 11/13] DynamicTablesPkg: AML code generation to add an _LPI state PierreGondois
2021-10-01 15:43   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 12/13] DynamicTablesPkg: Add CM_ARM_LPI_INFO object PierreGondois
2021-10-05 14:39   ` Sami Mujawar
2021-06-23 11:40 ` [PATCH v1 13/13] DynamicTablesPkg: SSDT CPU topology and LPI state generator PierreGondois
2021-10-05 14:38   ` Sami Mujawar

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=acbd6c55-ffa4-c242-9e71-d3c2840d0a7d@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