[edk2-devel] [PATCH v5 07/11] DynamicTablesPkg: Add AmlCreatePsdNode() to generate _PSD

PierreGondois posted 11 patches 11 months, 3 weeks ago
[edk2-devel] [PATCH v5 07/11] DynamicTablesPkg: Add AmlCreatePsdNode() to generate _PSD
Posted by PierreGondois 11 months, 3 weeks ago
Add AmlCreatePsdNode() to the AmlLib to generate _PSD objects.
_PSD objects allow to describe 'performance control, P-state
or CPPC, logical processor dependency', Cf. ACPI 6.5,
s8.4.5.5 _PSD (P-State Dependency).

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 .../Include/Library/AmlLib/AmlLib.h           |  35 +++-
 .../Common/AmlLib/CodeGen/AmlCodeGen.c        | 188 +++++++++++++++++-
 2 files changed, 221 insertions(+), 2 deletions(-)

diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
index 01e37b089897..82d546408418 100644
--- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
+++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
@@ -1,7 +1,7 @@
 /** @file
   AML Lib.
 
-  Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.<BR>
+  Copyright (c) 2019 - 2023, Arm Limited. All rights reserved.<BR>
   Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
 
   SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -1805,4 +1805,37 @@ AmlCodeGenInvokeMethod (
   IN        AML_NODE_HANDLE   ParentNode
   );
 
+/** Create a _PSD node.
+
+  Creates and optionally adds the following node
+   Name(_PSD, Package()
+   {
+    NumEntries,  // Integer
+    Revision,    // Integer
+    Domain,      // Integer
+    CoordType,   // Integer
+    NumProc,     // Integer
+  })
+
+  Cf. ACPI 6.5, s8.4.5.5 _PSD (P-State Dependency)
+
+  @ingroup CodeGenApis
+
+  @param [in]  PsdInfo      PsdInfo object
+  @param [in]  ParentNode   If provided, set ParentNode as the parent
+                            of the node created.
+  @param [out] NewPsdNode   If success and provided, 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
+AmlCreatePsdNode (
+  IN  AML_PSD_INFO            *PsdInfo,
+  IN  AML_NODE_HANDLE         ParentNode    OPTIONAL,
+  OUT AML_OBJECT_NODE_HANDLE  *NewPsdNode   OPTIONAL
+  );
+
 #endif // AML_LIB_H_
diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
index 9040192f8c3c..6f3f46e3b1ed 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
@@ -1,7 +1,7 @@
 /** @file
   AML Code Generation.
 
-  Copyright (c) 2020 - 2022, Arm Limited. All rights reserved.<BR>
+  Copyright (c) 2020 - 2023, Arm Limited. All rights reserved.<BR>
   Copyright (C) 2023 - 2024, Advanced Micro Devices, Inc. All rights reserved.<BR>
 
   SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -4090,3 +4090,189 @@ exit_handler:
   FreePool (NodeStream);
   return Status;
 }
+
+/** Create a _PSD node.
+
+  Creates and optionally adds the following node
+   Name(_PSD, Package()
+   {
+    NumEntries,  // Integer
+    Revision,    // Integer
+    Domain,      // Integer
+    CoordType,   // Integer
+    NumProc,     // Integer
+  })
+
+  Cf. ACPI 6.5, s8.4.5.5 _PSD (P-State Dependency)
+
+  @ingroup CodeGenApis
+
+  @param [in]  PsdInfo      PsdInfo object
+  @param [in]  ParentNode   If provided, set ParentNode as the parent
+                            of the node created.
+  @param [out] NewPsdNode   If success and provided, 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
+AmlCreatePsdNode (
+  IN  AML_PSD_INFO            *PsdInfo,
+  IN  AML_NODE_HANDLE         ParentNode    OPTIONAL,
+  OUT AML_OBJECT_NODE_HANDLE  *NewPsdNode   OPTIONAL
+  )
+{
+  EFI_STATUS              Status;
+  AML_OBJECT_NODE_HANDLE  PsdNode;
+  AML_OBJECT_NODE_HANDLE  PsdPackage;
+  AML_OBJECT_NODE_HANDLE  IntegerNode;
+  UINT32                  NumberOfEntries;
+
+  if ((PsdInfo == NULL) ||
+      ((ParentNode == NULL) && (NewPsdNode == NULL)))
+  {
+    Status = EFI_INVALID_PARAMETER;
+    ASSERT_EFI_ERROR (Status);
+    return Status;
+  }
+
+  // Revision 3 per ACPI 6.5 specification
+  if (PsdInfo->Revision == EFI_ACPI_6_5_AML_PSD_REVISION) {
+    // NumEntries 5 per ACPI 6.5 specification
+    NumberOfEntries = 5;
+  } else {
+    Status = EFI_INVALID_PARAMETER;
+    ASSERT_EFI_ERROR (Status);
+    return Status;
+  }
+
+  if (((PsdInfo->CoordType != ACPI_AML_COORD_TYPE_SW_ALL) &&
+       (PsdInfo->CoordType != ACPI_AML_COORD_TYPE_SW_ANY) &&
+       (PsdInfo->CoordType != ACPI_AML_COORD_TYPE_HW_ALL)) ||
+      (PsdInfo->NumProc == 0))
+  {
+    Status = EFI_INVALID_PARAMETER;
+    ASSERT_EFI_ERROR (Status);
+    return Status;
+  }
+
+  Status = AmlCodeGenNamePackage ("_PSD", NULL, &PsdNode);
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    return Status;
+  }
+
+  // Get the Package object node of the _PSD node,
+  // which is the 2nd fixed argument (i.e. index 1).
+  PsdPackage = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument (
+                                         PsdNode,
+                                         EAmlParseIndexTerm1
+                                         );
+  if ((PsdPackage == NULL)                                              ||
+      (AmlGetNodeType ((AML_NODE_HANDLE)PsdPackage) != EAmlNodeObject)  ||
+      (!AmlNodeHasOpCode (PsdPackage, AML_PACKAGE_OP, 0)))
+  {
+    Status = EFI_INVALID_PARAMETER;
+    ASSERT_EFI_ERROR (Status);
+    goto error_handler;
+  }
+
+  // NumEntries
+  Status = AmlCodeGenInteger (NumberOfEntries, &IntegerNode);
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    goto error_handler;
+  }
+
+  Status = AmlVarListAddTail (
+             (AML_NODE_HANDLE)PsdPackage,
+             (AML_NODE_HANDLE)IntegerNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    FreePool (IntegerNode);
+    goto error_handler;
+  }
+
+  // Revision
+  Status = AmlCodeGenInteger (PsdInfo->Revision, &IntegerNode);
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    goto error_handler;
+  }
+
+  Status = AmlVarListAddTail (
+             (AML_NODE_HANDLE)PsdPackage,
+             (AML_NODE_HANDLE)IntegerNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    FreePool (IntegerNode);
+    goto error_handler;
+  }
+
+  // Domain
+  Status = AmlCodeGenInteger (PsdInfo->Domain, &IntegerNode);
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    goto error_handler;
+  }
+
+  Status = AmlVarListAddTail (
+             (AML_NODE_HANDLE)PsdPackage,
+             (AML_NODE_HANDLE)IntegerNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    FreePool (IntegerNode);
+    goto error_handler;
+  }
+
+  // CoordType
+  Status = AmlCodeGenInteger (PsdInfo->CoordType, &IntegerNode);
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    goto error_handler;
+  }
+
+  Status = AmlVarListAddTail (
+             (AML_NODE_HANDLE)PsdPackage,
+             (AML_NODE_HANDLE)IntegerNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    FreePool (IntegerNode);
+    goto error_handler;
+  }
+
+  // Num Processors
+  Status = AmlCodeGenInteger (PsdInfo->NumProc, &IntegerNode);
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    goto error_handler;
+  }
+
+  Status = AmlVarListAddTail (
+             (AML_NODE_HANDLE)PsdPackage,
+             (AML_NODE_HANDLE)IntegerNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    FreePool (IntegerNode);
+    goto error_handler;
+  }
+
+  Status = LinkNode (PsdNode, ParentNode, NewPsdNode);
+  if (EFI_ERROR (Status)) {
+    ASSERT_EFI_ERROR (Status);
+    goto error_handler;
+  }
+
+  return Status;
+
+error_handler:
+  AmlDeleteTree ((AML_NODE_HANDLE)PsdNode);
+  return Status;
+}
-- 
2.25.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114417): https://edk2.groups.io/g/devel/message/114417
Mute This Topic: https://groups.io/mt/103955504/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v5 07/11] DynamicTablesPkg: Add AmlCreatePsdNode() to generate _PSD
Posted by Sami Mujawar 11 months, 3 weeks ago
Hi Pierre,

Thank you for the updated patch.

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

Regards,

Sami Mujawar

On 25/01/2024, 15:19, "Pierre Gondois" <pierre.gondois@arm.com <mailto:pierre.gondois@arm.com>> wrote:


Add AmlCreatePsdNode() to the AmlLib to generate _PSD objects.
_PSD objects allow to describe 'performance control, P-state
or CPPC, logical processor dependency', Cf. ACPI 6.5,
s8.4.5.5 _PSD (P-State Dependency).


Signed-off-by: Pierre Gondois <pierre.gondois@arm.com <mailto:pierre.gondois@arm.com>>
---
.../Include/Library/AmlLib/AmlLib.h | 35 +++-
.../Common/AmlLib/CodeGen/AmlCodeGen.c | 188 +++++++++++++++++-
2 files changed, 221 insertions(+), 2 deletions(-)


diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
index 01e37b089897..82d546408418 100644
--- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
+++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
@@ -1,7 +1,7 @@
/** @file


AML Lib.






- Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.<BR>


+ Copyright (c) 2019 - 2023, Arm Limited. All rights reserved.<BR>


Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>






SPDX-License-Identifier: BSD-2-Clause-Patent


@@ -1805,4 +1805,37 @@ AmlCodeGenInvokeMethod (
IN AML_NODE_HANDLE ParentNode


);






+/** Create a _PSD node.


+


+ Creates and optionally adds the following node


+ Name(_PSD, Package()


+ {


+ NumEntries, // Integer


+ Revision, // Integer


+ Domain, // Integer


+ CoordType, // Integer


+ NumProc, // Integer


+ })


+


+ Cf. ACPI 6.5, s8.4.5.5 _PSD (P-State Dependency)


+


+ @ingroup CodeGenApis


+


+ @param [in] PsdInfo PsdInfo object


+ @param [in] ParentNode If provided, set ParentNode as the parent


+ of the node created.


+ @param [out] NewPsdNode If success and provided, 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


+AmlCreatePsdNode (


+ IN AML_PSD_INFO *PsdInfo,


+ IN AML_NODE_HANDLE ParentNode OPTIONAL,


+ OUT AML_OBJECT_NODE_HANDLE *NewPsdNode OPTIONAL


+ );


+


#endif // AML_LIB_H_


diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
index 9040192f8c3c..6f3f46e3b1ed 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
@@ -1,7 +1,7 @@
/** @file


AML Code Generation.






- Copyright (c) 2020 - 2022, Arm Limited. All rights reserved.<BR>


+ Copyright (c) 2020 - 2023, Arm Limited. All rights reserved.<BR>


Copyright (C) 2023 - 2024, Advanced Micro Devices, Inc. All rights reserved.<BR>






SPDX-License-Identifier: BSD-2-Clause-Patent


@@ -4090,3 +4090,189 @@ exit_handler:
FreePool (NodeStream);


return Status;


}


+


+/** Create a _PSD node.


+


+ Creates and optionally adds the following node


+ Name(_PSD, Package()


+ {


+ NumEntries, // Integer


+ Revision, // Integer


+ Domain, // Integer


+ CoordType, // Integer


+ NumProc, // Integer


+ })


+


+ Cf. ACPI 6.5, s8.4.5.5 _PSD (P-State Dependency)


+


+ @ingroup CodeGenApis


+


+ @param [in] PsdInfo PsdInfo object


+ @param [in] ParentNode If provided, set ParentNode as the parent


+ of the node created.


+ @param [out] NewPsdNode If success and provided, 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


+AmlCreatePsdNode (


+ IN AML_PSD_INFO *PsdInfo,


+ IN AML_NODE_HANDLE ParentNode OPTIONAL,


+ OUT AML_OBJECT_NODE_HANDLE *NewPsdNode OPTIONAL


+ )


+{


+ EFI_STATUS Status;


+ AML_OBJECT_NODE_HANDLE PsdNode;


+ AML_OBJECT_NODE_HANDLE PsdPackage;


+ AML_OBJECT_NODE_HANDLE IntegerNode;


+ UINT32 NumberOfEntries;


+


+ if ((PsdInfo == NULL) ||


+ ((ParentNode == NULL) && (NewPsdNode == NULL)))


+ {


+ Status = EFI_INVALID_PARAMETER;


+ ASSERT_EFI_ERROR (Status);


+ return Status;


+ }


+


+ // Revision 3 per ACPI 6.5 specification


+ if (PsdInfo->Revision == EFI_ACPI_6_5_AML_PSD_REVISION) {


+ // NumEntries 5 per ACPI 6.5 specification


+ NumberOfEntries = 5;


+ } else {


+ Status = EFI_INVALID_PARAMETER;


+ ASSERT_EFI_ERROR (Status);


+ return Status;


+ }


+


+ if (((PsdInfo->CoordType != ACPI_AML_COORD_TYPE_SW_ALL) &&


+ (PsdInfo->CoordType != ACPI_AML_COORD_TYPE_SW_ANY) &&


+ (PsdInfo->CoordType != ACPI_AML_COORD_TYPE_HW_ALL)) ||


+ (PsdInfo->NumProc == 0))


+ {


+ Status = EFI_INVALID_PARAMETER;


+ ASSERT_EFI_ERROR (Status);


+ return Status;


+ }


+


+ Status = AmlCodeGenNamePackage ("_PSD", NULL, &PsdNode);


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ return Status;


+ }


+


+ // Get the Package object node of the _PSD node,


+ // which is the 2nd fixed argument (i.e. index 1).


+ PsdPackage = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument (


+ PsdNode,


+ EAmlParseIndexTerm1


+ );


+ if ((PsdPackage == NULL) ||


+ (AmlGetNodeType ((AML_NODE_HANDLE)PsdPackage) != EAmlNodeObject) ||


+ (!AmlNodeHasOpCode (PsdPackage, AML_PACKAGE_OP, 0)))


+ {


+ Status = EFI_INVALID_PARAMETER;


+ ASSERT_EFI_ERROR (Status);


+ goto error_handler;


+ }


+


+ // NumEntries


+ Status = AmlCodeGenInteger (NumberOfEntries, &IntegerNode);


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ goto error_handler;


+ }


+


+ Status = AmlVarListAddTail (


+ (AML_NODE_HANDLE)PsdPackage,


+ (AML_NODE_HANDLE)IntegerNode


+ );


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ FreePool (IntegerNode);


+ goto error_handler;


+ }


+


+ // Revision


+ Status = AmlCodeGenInteger (PsdInfo->Revision, &IntegerNode);


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ goto error_handler;


+ }


+


+ Status = AmlVarListAddTail (


+ (AML_NODE_HANDLE)PsdPackage,


+ (AML_NODE_HANDLE)IntegerNode


+ );


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ FreePool (IntegerNode);


+ goto error_handler;


+ }


+


+ // Domain


+ Status = AmlCodeGenInteger (PsdInfo->Domain, &IntegerNode);


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ goto error_handler;


+ }


+


+ Status = AmlVarListAddTail (


+ (AML_NODE_HANDLE)PsdPackage,


+ (AML_NODE_HANDLE)IntegerNode


+ );


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ FreePool (IntegerNode);


+ goto error_handler;


+ }


+


+ // CoordType


+ Status = AmlCodeGenInteger (PsdInfo->CoordType, &IntegerNode);


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ goto error_handler;


+ }


+


+ Status = AmlVarListAddTail (


+ (AML_NODE_HANDLE)PsdPackage,


+ (AML_NODE_HANDLE)IntegerNode


+ );


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ FreePool (IntegerNode);


+ goto error_handler;


+ }


+


+ // Num Processors


+ Status = AmlCodeGenInteger (PsdInfo->NumProc, &IntegerNode);


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ goto error_handler;


+ }


+


+ Status = AmlVarListAddTail (


+ (AML_NODE_HANDLE)PsdPackage,


+ (AML_NODE_HANDLE)IntegerNode


+ );


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ FreePool (IntegerNode);


+ goto error_handler;


+ }


+


+ Status = LinkNode (PsdNode, ParentNode, NewPsdNode);


+ if (EFI_ERROR (Status)) {


+ ASSERT_EFI_ERROR (Status);


+ goto error_handler;


+ }


+


+ return Status;


+


+error_handler:


+ AmlDeleteTree ((AML_NODE_HANDLE)PsdNode);


+ return Status;


+}


-- 
2.25.1







-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#114575): https://edk2.groups.io/g/devel/message/114575
Mute This Topic: https://groups.io/mt/103955504/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-