summaryrefslogtreecommitdiffstats
path: root/DynamicTablesPkg
diff options
context:
space:
mode:
authorPierre Gondois <pierre.gondois@arm.com>2024-01-25 16:18:46 +0100
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2024-01-29 16:47:03 +0000
commit3344495489d8c6b49d16fd6ec4b5a226ac21ac22 (patch)
tree5657c85ce0764a70ae04eaaa278641e6cdb5c677 /DynamicTablesPkg
parent0a9060b259edf43a4d94294ccda9987be3316228 (diff)
downloadedk2-3344495489d8c6b49d16fd6ec4b5a226ac21ac22.tar.gz
edk2-3344495489d8c6b49d16fd6ec4b5a226ac21ac22.tar.bz2
edk2-3344495489d8c6b49d16fd6ec4b5a226ac21ac22.zip
DynamicTablesPkg: Add AmlCreatePsdNode() to generate _PSD
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> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
Diffstat (limited to 'DynamicTablesPkg')
-rw-r--r--DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h35
-rw-r--r--DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c188
2 files changed, 221 insertions, 2 deletions
diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
index 01e37b0898..82d5464084 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 9040192f8c..6f3f46e3b1 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;
+}