DynamicTablesPkg: Generate _PSD in SsdtCpuTopologyGenerator

Make use of the newly added AmlCreatePsdNode() to generate
_PSD objects.

_PSD objects allow to describe 'performance control, P-state
or CPPC, logical processor dependency', Cf. ACPI 6.4,
s8.4.5.5 _PSD (P-State Dependency).

Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
This commit is contained in:
Pierre Gondois 2024-01-25 16:18:47 +01:00 committed by mergify[bot]
parent 3344495489
commit fc04cfd119
1 changed files with 96 additions and 0 deletions

View File

@ -42,6 +42,7 @@ Requirements:
- EArmObjCmRef (OPTIONAL)
- EArmObjLpiInfo (OPTIONAL)
- GetEArmObjEtInfo (OPTIONAL)
- EArmObjPsdInfo (OPTIONAL)
*/
/** This macro expands to a function that retrieves the GIC
@ -103,6 +104,16 @@ GET_OBJECT_LIST (
CM_ARM_ET_INFO
);
/**
This macro expands to a function that retrieves the PSD
information from the Configuration Manager.
*/
GET_OBJECT_LIST (
EObjNameSpaceArm,
EArmObjPsdInfo,
CM_ARM_PSD_INFO
);
/** Initialize the TokenTable.
One entry should be allocated for each CM_ARM_PROC_HIERARCHY_INFO
@ -256,6 +267,75 @@ WriteAslName (
return EFI_SUCCESS;
}
/** Create and add an _PSD Node to Cpu Node.
For instance, transform an AML node from:
Device (C002)
{
Name (_UID, 2)
Name (_HID, "ACPI0007")
}
To:
Device (C002)
{
Name (_UID, 2)
Name (_HID, "ACPI0007")
Name (_PSD, Package()
{
NumEntries, // Integer
Revision, // Integer
Domain, // Integer
CoordType, // Integer
NumProcessors, // Integer
})
}
@param [in] Generator The SSDT Cpu Topology generator.
@param [in] CfgMgrProtocol Pointer to the Configuration Manager
Protocol Interface.
@param [in] GicCInfo Pointer to the CM_ARM_GICC_INFO object
describing the Cpu.
@param [in] Node CPU Node to which the _CPC node is
attached.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_INVALID_PARAMETER Invalid parameter.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
**/
STATIC
EFI_STATUS
EFIAPI
CreateAmlPsdNode (
IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
IN CM_ARM_GICC_INFO *GicCInfo,
IN AML_OBJECT_NODE_HANDLE *Node
)
{
EFI_STATUS Status;
CM_ARM_PSD_INFO *PsdInfo;
Status = GetEArmObjPsdInfo (
CfgMgrProtocol,
GicCInfo->PsdToken,
&PsdInfo,
NULL
);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
Status = AmlCreatePsdNode (
PsdInfo,
Node,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}
/** Create and add an _CPC Node to Cpu Node.
For instance, transform an AML node from:
@ -842,6 +922,14 @@ CreateAmlCpuFromProcHierarchy (
}
}
if (GicCInfo->PsdToken != CM_NULL_TOKEN) {
Status = CreateAmlPsdNode (Generator, CfgMgrProtocol, GicCInfo, CpuNode);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
}
// If a CPC info is associated with the
// GicCinfo, create an _CPC method returning them.
if (GicCInfo->CpcToken != CM_NULL_TOKEN) {
@ -1299,6 +1387,14 @@ CreateTopologyFromGicC (
break;
}
if (GicCInfo->PsdToken != CM_NULL_TOKEN) {
Status = CreateAmlPsdNode (Generator, CfgMgrProtocol, GicCInfo, CpuNode);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
}
// If a CPC info is associated with the
// GicCinfo, create an _CPC method returning them.
if (GicCInfo[Index].CpcToken != CM_NULL_TOKEN) {