summaryrefslogtreecommitdiff
path: root/DynamicTablesPkg
diff options
context:
space:
mode:
authorPierre Gondois <Pierre.Gondois@arm.com>2021-10-08 15:46:22 +0100
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2021-10-08 15:39:42 +0000
commit9454d1ebcbee01ccf504ea7e8bf7d7e83a8e99e2 (patch)
tree1cf82c0f93bf46b76d4fb2b7356d5e31acc4004b /DynamicTablesPkg
parentf995f8672b388a7a0f9ccb94e3af68469cb51ae8 (diff)
downloadedk2-9454d1ebcbee01ccf504ea7e8bf7d7e83a8e99e2.zip
edk2-9454d1ebcbee01ccf504ea7e8bf7d7e83a8e99e2.tar.gz
edk2-9454d1ebcbee01ccf504ea7e8bf7d7e83a8e99e2.tar.bz2
DynamicTablesPkg: AML Code generation for Resource data EndTag
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. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
Diffstat (limited to 'DynamicTablesPkg')
-rw-r--r--DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c113
-rw-r--r--DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h43
2 files changed, 156 insertions, 0 deletions
diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c
index 20b745f..0bdb6c2 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 831d6a7..1023404 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_