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.
next prev parent 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