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>
This commit is contained in:
Pierre Gondois 2024-01-25 16:18:46 +01:00 committed by mergify[bot]
parent 0a9060b259
commit 3344495489
2 changed files with 221 additions and 2 deletions

View File

@ -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_

View File

@ -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;
}