[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