[edk2-devel] [PATCH v2 18/21] DynamicTablesPkg: AML code generation for a _LPI object

Sami Mujawar sami.mujawar at arm.com
Fri Oct 8 14:24:42 UTC 2021


Hi Pierre,

Thank you for this patch.

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>
>
> _LPI object provides a method to describe Low Power Idle
> states that define the local power states for each node
> in a hierarchical processor topology.
>
> Therefore, add AmlCreateLpiNode() to generate code for a
> _LPI object.
>
> AmlCreateLpiNode ("_LPI", 0, 1, ParentNode, &LpiNode) is
> equivalent of the following ASL code:
>    Name (_LPI, Package (
>               0,  // Revision
>               1,  // LevelId
>               0   // Count
>               ))
>
> Signed-off-by: Pierre Gondois <Pierre.Gondois at arm.com>
> ---
>   .../Include/Library/AmlLib/AmlLib.h           |  44 ++++++
>   .../Common/AmlLib/CodeGen/AmlCodeGen.c        | 133 ++++++++++++++++++
>   2 files changed, 177 insertions(+)
>
> diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
> index 7740aac24470..40c45073d303 100644
> --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
> +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
> @@ -672,6 +672,50 @@ AmlCodeGenMethodRetNameString (
>     OUT       AML_OBJECT_NODE_HANDLE  * NewObjectNode        OPTIONAL
>     );
>
> +/** Create a _LPI name.
> +
> +  AmlCreateLpiNode ("_LPI", 0, 1, ParentNode, &LpiNode) is
> +  equivalent of the following ASL code:
> +    Name (_LPI, Package (
> +                  0,  // Revision
> +                  1,  // LevelId
> +                  0   // Count
> +                  ))
> +
> +  This function doesn't define any LPI state. As shown above, the count
> +  of _LPI state is set to 0.
> +  The AmlAddLpiState () function must be used to add LPI states.
> +
> +  Cf ACPI 6.3 specification, s8.4.4 "Lower Power Idle States".
> +
> +  @ingroup CodeGenApis
> +
> +  @param [in]  LpiNameString  The new LPI 's object name.
> +                              Must be a NULL-terminated ASL NameString
> +                              e.g.: "_LPI", "DEV0.PLPI", etc.
> +                              The input string is copied.
> +  @param [in]  Revision       Revision number of the _LPI states.
> +  @param [in]  LevelId        A platform defined number that identifies the
> +                              level of hierarchy of the processor node to
> +                              which the LPI states apply.
> +  @param [in]  ParentNode     If provided, set ParentNode as the parent
> +                              of the node created.
> +  @param [out] NewLpiNode     If success, contains the created node.
> +
> +  @retval EFI_SUCCESS             The function completed successfully.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AmlCreateLpiNode (
> +  IN  CONST CHAR8                   * LpiNameString,
> +  IN        UINT16                    Revision,
> +  IN        UINT64                    LevelId,
> +  IN        AML_NODE_HANDLE           ParentNode,  OPTIONAL
> +  OUT       AML_OBJECT_NODE_HANDLE  * NewLpiNode   OPTIONAL
> +  );
> +
>   // DEPRECATED APIS
>   #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
>
> diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> index 67474094b975..2223e4bcfef9 100644
> --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> @@ -1442,3 +1442,136 @@ error_handler:
>     }
>     return Status;
>   }
> +
> +/** Create a _LPI name.
> +
> +  AmlCreateLpiNode ("_LPI", 0, 1, ParentNode, &LpiNode) is
> +  equivalent of the following ASL code:
> +    Name (_LPI, Package (
> +                  0,  // Revision
> +                  1,  // LevelId
> +                  0   // Count
> +                  ))
> +
> +  This function doesn't define any LPI state. As shown above, the count
> +  of _LPI state is set to 0.
> +  The AmlAddLpiState () function allows to add LPI states.
> +
> +  Cf ACPI 6.3 specification, s8.4.4 "Lower Power Idle States".
> +
> +  @param [in]  LpiNameString  The new LPI 's object name.
> +                              Must be a NULL-terminated ASL NameString
> +                              e.g.: "_LPI", "DEV0.PLPI", etc.
> +                              The input string is copied.
> +  @param [in]  Revision       Revision number of the _LPI states.
> +  @param [in]  LevelId        A platform defined number that identifies the
> +                              level of hierarchy of the processor node to
> +                              which the LPI states apply.
> +  @param [in]  ParentNode     If provided, set ParentNode as the parent
> +                              of the node created.
> +  @param [out] NewLpiNode     If success, contains the created node.
> +
> +  @retval EFI_SUCCESS             The function completed successfully.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AmlCreateLpiNode (
> +  IN  CONST CHAR8                   * LpiNameString,
> +  IN        UINT16                    Revision,
> +  IN        UINT64                    LevelId,
> +  IN        AML_NODE_HANDLE           ParentNode,  OPTIONAL
> +  OUT       AML_OBJECT_NODE_HANDLE  * NewLpiNode   OPTIONAL
> +  )
> +{
> +  EFI_STATUS                Status;
> +  AML_OBJECT_NODE_HANDLE    PackageNode;
> +  AML_OBJECT_NODE_HANDLE    IntegerNode;
> +
> +  if ((LpiNameString == NULL)                           ||
> +      ((ParentNode == NULL) && (NewLpiNode == NULL))) {
> +    ASSERT (0);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  IntegerNode = NULL;
> +
> +  Status = AmlCodeGenPackage (&PackageNode);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    return Status;
> +  }
> +
> +  // Create and attach Revision
> +  Status = AmlCodeGenInteger (Revision, &IntegerNode);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    IntegerNode = NULL;
> +    goto error_handler;
> +  }
> +
> +  Status = AmlVarListAddTail (
> +             (AML_NODE_HANDLE)PackageNode,
> +             (AML_NODE_HANDLE)IntegerNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  IntegerNode = NULL;
> +
> +  // Create and attach LevelId
> +  Status = AmlCodeGenInteger (LevelId, &IntegerNode);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    IntegerNode = NULL;
> +    goto error_handler;
> +  }
> +
> +  Status = AmlVarListAddTail (
> +             (AML_NODE_HANDLE)PackageNode,
> +             (AML_NODE_HANDLE)IntegerNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  IntegerNode = NULL;
> +
> +  // Create and attach Count. No LPI state is added, so 0.
> +  Status = AmlCodeGenInteger (0, &IntegerNode);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    IntegerNode = NULL;
> +    goto error_handler;
> +  }
> +
> +  Status = AmlVarListAddTail (
> +             (AML_NODE_HANDLE)PackageNode,
> +             (AML_NODE_HANDLE)IntegerNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  IntegerNode = NULL;
> +
> +  Status = AmlCodeGenName (LpiNameString, PackageNode, ParentNode, NewLpiNode);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  return Status;
> +
> +error_handler:
> +  AmlDeleteTree ((AML_NODE_HANDLE)PackageNode);
> +  if (IntegerNode != NULL) {
> +    AmlDeleteTree ((AML_NODE_HANDLE)IntegerNode);
> +  }
> +  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.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81687): https://edk2.groups.io/g/devel/message/81687
Mute This Topic: https://groups.io/mt/86148214/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