diff options
author | Pierre Gondois <pierre.gondois@arm.com> | 2024-01-25 16:18:46 +0100 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2024-01-29 16:47:03 +0000 |
commit | 3344495489d8c6b49d16fd6ec4b5a226ac21ac22 (patch) | |
tree | 5657c85ce0764a70ae04eaaa278641e6cdb5c677 | |
parent | 0a9060b259edf43a4d94294ccda9987be3316228 (diff) | |
download | edk2-3344495489d8c6b49d16fd6ec4b5a226ac21ac22.tar.gz |
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>
-rw-r--r-- | DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h | 35 | ||||
-rw-r--r-- | DynamicTablesPkg/Library/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 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;
+}
|