[edk2-devel] [PATCH v2 11/21] DynamicTablesPkg: AML Code generation for Resource data EndTag

Sami Mujawar sami.mujawar at arm.com
Fri Oct 8 14:07:06 UTC 2021


Hi Pierre,

This patch looks good to me.

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

Regards,

Sami Mujawar

On 07/10/2021 04:32 PM, Pierre.Gondois at arm.com wrote:
> From: Pierre Gondois <Pierre.Gondois at arm.com>
>
> Add a helper function AmlCodeGenEndTag() to generate AML Resource Data
> EndTag. The EndTag resource data is automatically generated by the ASL
> compiler at the end of a list of resource data elements. Therefore, an
> equivalent function is not present in ASL.
>
> However, AmlCodeGenEndTag() is useful when generating AML code for the
> ResourceTemplate() macro.
>
> Signed-off-by: Pierre Gondois <Pierre.Gondois at arm.com>
> ---
>   .../AmlLib/CodeGen/AmlResourceDataCodeGen.c   | 113 ++++++++++++++++++
>   .../AmlLib/CodeGen/AmlResourceDataCodeGen.h   |  43 +++++++
>   2 files changed, 156 insertions(+)
>
> diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
> index 20b745f27a2b..0bdb6c24c5bb 100644
> --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
> +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
> @@ -280,6 +280,119 @@ AmlCodeGenRdRegister (
>     return LinkRdNode (RdNode, NameOpNode, NewRdNode);
>   }
>
> +/** Code generation for the EndTag resource data.
> +
> +  The EndTag resource data is automatically generated by the ASL compiler
> +  at the end of a list of resource data elements. Thus, it doesn't have
> +  a corresponding ASL function.
> +
> +  This function allocates memory to create a data node. It is the caller's
> +  responsibility to either:
> +   - attach this node to an AML tree;
> +   - delete this node.
> +
> +  ACPI 6.4, s6.4.2.9 "End Tag":
> +  "This checksum is generated such that adding it to the sum of all the data
> +  bytes will produce a zero sum."
> +  "If the checksum field is zero, the resource data is treated as if the
> +  checksum operation succeeded. Configuration proceeds normally."
> +
> +  To avoid re-computing checksums, if a new resource data elements is
> +  added/removed/modified in a list of resource data elements, the AmlLib
> +  resets the checksum to 0.
> +
> +  @param [in]  CheckSum        CheckSum to store in the EndTag.
> +                               To ignore/avoid computing the checksum,
> +                               give 0.
> +  @param [in]  ParentNode      If not NULL, add the generated node
> +                               to the end of the variable list of
> +                               argument of the ParentNode.
> +                               The ParentNode must not initially contain
> +                               an EndTag resource data element.
> +  @param  [out] NewRdNode      If success, contains the generated node.
> +
> +  @retval EFI_SUCCESS             The function completed successfully.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AmlCodeGenEndTag (
> +  IN  UINT8               CheckSum,   OPTIONAL
> +  IN  AML_OBJECT_NODE   * ParentNode, OPTIONAL
> +  OUT AML_DATA_NODE    ** NewRdNode   OPTIONAL
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  AML_DATA_NODE                 * RdNode;
> +  EFI_ACPI_END_TAG_DESCRIPTOR     EndTag;
> +  ACPI_SMALL_RESOURCE_HEADER      SmallResHdr;
> +
> +  if ((ParentNode == NULL) && (NewRdNode == NULL)) {
> +    ASSERT (0);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  RdNode = NULL;
> +
> +  // Header
> +  SmallResHdr.Bits.Length = sizeof (EFI_ACPI_END_TAG_DESCRIPTOR) -
> +                              sizeof (ACPI_SMALL_RESOURCE_HEADER);
> +  SmallResHdr.Bits.Name = ACPI_SMALL_END_TAG_DESCRIPTOR_NAME;
> +  SmallResHdr.Bits.Type = ACPI_SMALL_ITEM_FLAG;
> +
> +  // Body
> +  EndTag.Desc = SmallResHdr.Byte;
> +  EndTag.Checksum = CheckSum;
> +
> +  Status = AmlCreateDataNode (
> +             EAmlNodeDataTypeResourceData,
> +             (UINT8*)&EndTag,
> +             sizeof (EFI_ACPI_END_TAG_DESCRIPTOR),
> +             &RdNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    return Status;
> +  }
> +
> +  if (NewRdNode != NULL) {
> +    *NewRdNode = RdNode;
> +  }
> +
> +  if (ParentNode != NULL) {
> +    // Check the BufferOp doesn't contain any resource data yet.
> +    // This is a hard check: do not allow to add an EndTag if the BufferNode
> +    // already has resource data elements attached. Indeed, the EndTag should
> +    // have already been added.
> +    if (AmlGetNextVariableArgument ((AML_NODE_HEADER*)ParentNode, NULL) !=
> +          NULL) {
> +      ASSERT (0);
> +      Status = EFI_INVALID_PARAMETER;
> +      goto error_handler;
> +    }
> +
> +    // Add the EndTag RdNode. Indeed, the AmlAppendRdNode function
> +    // is looking for an EndTag, which we are adding here.
> +    Status = AmlVarListAddTail (
> +               (AML_NODE_HEADER*)ParentNode,
> +               (AML_NODE_HEADER*)RdNode
> +               );
> +    if (EFI_ERROR (Status)) {
> +      ASSERT (0);
> +      goto error_handler;
> +    }
> +  }
> +
> +  return Status;
> +
> +error_handler:
> +  if (RdNode != NULL) {
> +    AmlDeleteTree ((AML_NODE_HEADER*)RdNode);
> +  }
> +  return Status;
> +}
> +
>   // DEPRECATED APIS
>   #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
>
> diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h
> index 831d6a7462ae..102340495933 100644
> --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h
> +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h
> @@ -104,4 +104,47 @@ AmlCodeGenRdRegister (
>     OUT AML_DATA_NODE_HANDLE    *NewRdNode  OPTIONAL
>     );
>
> +/** Code generation for the EndTag resource data.
> +
> +  The EndTag resource data is automatically generated by the ASL compiler
> +  at the end of a list of resource data elements. Thus, it doesn't have
> +  a corresponding ASL function.
> +
> +  This function allocates memory to create a data node. It is the caller's
> +  responsibility to either:
> +   - attach this node to an AML tree;
> +   - delete this node.
> +
> +  ACPI 6.4, s6.4.2.9 "End Tag":
> +  "This checksum is generated such that adding it to the sum of all the data
> +  bytes will produce a zero sum."
> +  "If the checksum field is zero, the resource data is treated as if the
> +  checksum operation succeeded. Configuration proceeds normally."
> +
> +  To avoid re-computing checksums, if a new resource data elements is
> +  added/removed/modified in a list of resource data elements, the AmlLib
> +  resets the checksum to 0.
> +
> +  @param [in]  CheckSum        CheckSum to store in the EndTag.
> +                               To ignore/avoid computing the checksum,
> +                               give 0.
> +  @param [in]  ParentNode      If not NULL, add the generated node
> +                               to the end of the variable list of
> +                               argument of the ParentNode.
> +                               The ParentNode must not initially contain
> +                               an EndTag resource data element.
> +  @param  [out] NewRdNode      If success, contains the generated node.
> +
> +  @retval EFI_SUCCESS             The function completed successfully.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AmlCodeGenEndTag (
> +  IN  UINT8               CheckSum,   OPTIONAL
> +  IN  AML_OBJECT_NODE   * ParentNode, OPTIONAL
> +  OUT AML_DATA_NODE    ** NewRdNode   OPTIONAL
> +  );
> +
>   #endif // AML_RESOURCE_DATA_CODE_GEN_H_

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.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81682): https://edk2.groups.io/g/devel/message/81682
Mute This Topic: https://groups.io/mt/86148202/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list