mirror of https://github.com/acidanthera/audk.git
DynamicTablesPkg: SSDT CPU _CPC generator
Add code to use a token attached to GICC to generate _CPC object on cpus. Signed-off-by: Jeff Brasen <jbrasen@nvidia.com> Reviewed-by: Pierre Gondois <pierre.gondois@arm.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
This commit is contained in:
parent
58350c0055
commit
2500ce1011
|
@ -76,6 +76,16 @@ GET_OBJECT_LIST (
|
||||||
CM_ARM_LPI_INFO
|
CM_ARM_LPI_INFO
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
This macro expands to a function that retrieves the CPC
|
||||||
|
information from the Configuration Manager.
|
||||||
|
*/
|
||||||
|
GET_OBJECT_LIST (
|
||||||
|
EObjNameSpaceArm,
|
||||||
|
EArmObjCpcInfo,
|
||||||
|
CM_ARM_CPC_INFO
|
||||||
|
);
|
||||||
|
|
||||||
/** Initialize the TokenTable.
|
/** Initialize the TokenTable.
|
||||||
|
|
||||||
One entry should be allocated for each CM_ARM_PROC_HIERARCHY_INFO
|
One entry should be allocated for each CM_ARM_PROC_HIERARCHY_INFO
|
||||||
|
@ -229,6 +239,93 @@ WriteAslName (
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Create and add an _CPC 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(_CPC, Package()
|
||||||
|
{
|
||||||
|
NumEntries, // Integer
|
||||||
|
Revision, // Integer
|
||||||
|
HighestPerformance, // Integer or Buffer (Resource Descriptor)
|
||||||
|
NominalPerformance, // Integer or Buffer (Resource Descriptor)
|
||||||
|
LowestNonlinearPerformance, // Integer or Buffer (Resource Descriptor)
|
||||||
|
LowestPerformance, // Integer or Buffer (Resource Descriptor)
|
||||||
|
GuaranteedPerformanceRegister, // Buffer (Resource Descriptor)
|
||||||
|
DesiredPerformanceRegister , // Buffer (Resource Descriptor)
|
||||||
|
MinimumPerformanceRegister , // Buffer (Resource Descriptor)
|
||||||
|
MaximumPerformanceRegister , // Buffer (Resource Descriptor)
|
||||||
|
PerformanceReductionToleranceRegister, // Buffer (Resource Descriptor)
|
||||||
|
TimeWindowRegister, // Buffer (Resource Descriptor)
|
||||||
|
CounterWraparoundTime, // Integer or Buffer (Resource Descriptor)
|
||||||
|
ReferencePerformanceCounterRegister, // Buffer (Resource Descriptor)
|
||||||
|
DeliveredPerformanceCounterRegister, // Buffer (Resource Descriptor)
|
||||||
|
PerformanceLimitedRegister, // Buffer (Resource Descriptor)
|
||||||
|
CPPCEnableRegister // Buffer (Resource Descriptor)
|
||||||
|
AutonomousSelectionEnable, // Integer or Buffer (Resource Descriptor)
|
||||||
|
AutonomousActivityWindowRegister, // Buffer (Resource Descriptor)
|
||||||
|
EnergyPerformancePreferenceRegister, // Buffer (Resource Descriptor)
|
||||||
|
ReferencePerformance // Integer or Buffer (Resource Descriptor)
|
||||||
|
LowestFrequency, // Integer or Buffer (Resource Descriptor)
|
||||||
|
NominalFrequency // Integer or Buffer (Resource Descriptor)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
@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
|
||||||
|
CreateAmlCpcNode (
|
||||||
|
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_CPC_INFO *CpcInfo;
|
||||||
|
|
||||||
|
Status = GetEArmObjCpcInfo (
|
||||||
|
CfgMgrProtocol,
|
||||||
|
GicCInfo->CpcToken,
|
||||||
|
&CpcInfo,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ASSERT (0);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = AmlCreateCpcNode (
|
||||||
|
CpcInfo,
|
||||||
|
Node,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/** Create and add an _LPI method to Cpu/Cluster Node.
|
/** Create and add an _LPI method to Cpu/Cluster Node.
|
||||||
|
|
||||||
For instance, transform an AML node from:
|
For instance, transform an AML node from:
|
||||||
|
@ -581,7 +678,20 @@ CreateAmlCpuFromProcHierarchy (
|
||||||
// CM_ARM_PROC_HIERARCHY_INFO, create an _LPI method returning them.
|
// CM_ARM_PROC_HIERARCHY_INFO, create an _LPI method returning them.
|
||||||
if (ProcHierarchyNodeInfo->LpiToken != CM_NULL_TOKEN) {
|
if (ProcHierarchyNodeInfo->LpiToken != CM_NULL_TOKEN) {
|
||||||
Status = CreateAmlLpiMethod (Generator, ProcHierarchyNodeInfo, CpuNode);
|
Status = CreateAmlLpiMethod (Generator, ProcHierarchyNodeInfo, CpuNode);
|
||||||
ASSERT_EFI_ERROR (Status);
|
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) {
|
||||||
|
Status = CreateAmlCpcNode (Generator, CfgMgrProtocol, GicCInfo, CpuNode);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -934,10 +1044,11 @@ CreateTopologyFromGicC (
|
||||||
IN AML_OBJECT_NODE_HANDLE ScopeNode
|
IN AML_OBJECT_NODE_HANDLE ScopeNode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
CM_ARM_GICC_INFO *GicCInfo;
|
CM_ARM_GICC_INFO *GicCInfo;
|
||||||
UINT32 GicCInfoCount;
|
UINT32 GicCInfoCount;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
|
AML_OBJECT_NODE_HANDLE CpuNode;
|
||||||
|
|
||||||
ASSERT (Generator != NULL);
|
ASSERT (Generator != NULL);
|
||||||
ASSERT (CfgMgrProtocol != NULL);
|
ASSERT (CfgMgrProtocol != NULL);
|
||||||
|
@ -961,12 +1072,22 @@ CreateTopologyFromGicC (
|
||||||
ScopeNode,
|
ScopeNode,
|
||||||
&GicCInfo[Index],
|
&GicCInfo[Index],
|
||||||
Index,
|
Index,
|
||||||
NULL
|
&CpuNode
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
ASSERT (0);
|
ASSERT (0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If a CPC info is associated with the
|
||||||
|
// GicCinfo, create an _CPC method returning them.
|
||||||
|
if (GicCInfo->CpcToken != CM_NULL_TOKEN) {
|
||||||
|
Status = CreateAmlCpcNode (Generator, CfgMgrProtocol, &GicCInfo[Index], CpuNode);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
} // for
|
} // for
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
Loading…
Reference in New Issue