-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
DynamicTablesPkg: Adds X64 support for CPU SSDT generator
Introduce support for generating ACPI CPU SSDT table for the X64 architecture. Creates processor objects based on configuration data. Cc: Sami Mujawar <[email protected]> Cc: Pierre Gondois <[email protected]> Signed-off-by: Abdul Lateef Attar <[email protected]>
- Loading branch information
1 parent
e89ff68
commit 5158b59
Showing
3 changed files
with
152 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
144 changes: 144 additions & 0 deletions
144
...micTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/X64/X64SsdtCpuTopologyGenerator.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
/** @file | ||
X64 SSDT Cpu Topology Table Generator Helpers. | ||
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved. | ||
SPDX-License-Identifier: BSD-2-Clause-Patent | ||
@par Reference(s): | ||
- ACPI 6.3 Specification - January 2019 - s8.4 Declaring Processors | ||
**/ | ||
|
||
#include <Library/BaseLib.h> | ||
#include <Library/DebugLib.h> | ||
|
||
// Module specific include files. | ||
#include <AcpiTableGenerator.h> | ||
#include <ConfigurationManagerObject.h> | ||
#include <ConfigurationManagerHelper.h> | ||
#include <Library/TableHelperLib.h> | ||
#include <Library/AmlLib/AmlLib.h> | ||
#include <Protocol/ConfigurationManagerProtocol.h> | ||
|
||
#include "SsdtCpuTopologyGenerator.h" | ||
|
||
/** This macro expands to a function that retrieves the | ||
Local APIC or X2APIC information from the Configuration Manager. | ||
*/ | ||
GET_OBJECT_LIST ( | ||
EObjNameSpaceX64, | ||
EX64ObjLocalApicX2ApicInfo, | ||
CM_X64_LOCAL_APIC_X2APIC_INFO | ||
); | ||
|
||
/** | ||
Create the processor hierarchy AML tree from arch specific CM objects. | ||
@param [in] Generator The SSDT Cpu Topology generator. | ||
@param [in] CfgMgrProtocol Pointer to the Configuration Manager | ||
Protocol Interface. | ||
@param [in] ScopeNode Scope node handle ('\_SB' scope). | ||
@retval EFI_UNSUPPORTED Not supported | ||
**/ | ||
EFI_STATUS | ||
EFIAPI | ||
CreateTopologyFromIntC ( | ||
IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator, | ||
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, | ||
IN AML_OBJECT_NODE_HANDLE ScopeNode | ||
) | ||
{ | ||
EFI_STATUS Status; | ||
CM_X64_LOCAL_APIC_X2APIC_INFO *LocalApicX2ApicInfo; | ||
UINT32 LocalApicX2ApicCount; | ||
UINT32 Index; | ||
AML_OBJECT_NODE_HANDLE CpuNode; | ||
|
||
ASSERT (Generator != NULL); | ||
ASSERT (CfgMgrProtocol != NULL); | ||
ASSERT (ScopeNode != NULL); | ||
|
||
LocalApicX2ApicCount = 0; | ||
Status = GetEX64ObjLocalApicX2ApicInfo ( | ||
CfgMgrProtocol, | ||
CM_NULL_TOKEN, | ||
&LocalApicX2ApicInfo, | ||
&LocalApicX2ApicCount | ||
); | ||
if (EFI_ERROR (Status)) { | ||
ASSERT_EFI_ERROR (Status); | ||
return Status; | ||
} | ||
|
||
/// for each processor object, create an AML node. | ||
for (Index = 0; Index < LocalApicX2ApicCount; Index++) { | ||
Status = CreateAmlCpu ( | ||
Generator, | ||
ScopeNode, | ||
LocalApicX2ApicInfo[Index].AcpiProcessorUid, | ||
Index, | ||
&CpuNode | ||
); | ||
if (EFI_ERROR (Status)) { | ||
ASSERT_EFI_ERROR (Status); | ||
break; | ||
} | ||
} | ||
|
||
return Status; | ||
} | ||
|
||
/** Add arch specific information to a CPU node in the asl description. | ||
@param [in] Generator The SSDT Cpu Topology generator. | ||
@param [in] CfgMgrProtocol Pointer to the Configuration Manager | ||
Protocol Interface. | ||
@param [in] AcpiIdObjectToken AcpiIdObjectToken identifying the CPU to fetch the | ||
other fields from. | ||
@param [in] CpuName Value used to generate the CPU node name. | ||
@param [out] CpuNode CPU Node to which the ET device node is | ||
attached. | ||
@retval EFI_UNSUPPORTED Not supported | ||
**/ | ||
EFI_STATUS | ||
EFIAPI | ||
AddArchAmlCpuInfo ( | ||
IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator, | ||
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, | ||
IN CM_OBJECT_TOKEN AcpiIdObjectToken, | ||
IN UINT32 CpuName, | ||
OUT AML_OBJECT_NODE_HANDLE *CpuNode | ||
) | ||
{ | ||
return EFI_UNSUPPORTED; | ||
} | ||
|
||
/** Get generic interrupt information from arch specific CM objects. | ||
@param [in] CfgMgrProtocol Pointer to the Configuration Manager | ||
Protocol Interface. | ||
@param [in] AcpiIdObjectToken AcpiIdObjectToken identifying the CPU to fetch the | ||
other fields from. | ||
@param [out] AcpiProcessorUid AcpiProcessorUid of the CPU identified by | ||
the AcpiIdObjectToken. | ||
@param [out] CpcToken CpcToken of the CPU identified by | ||
the AcpiIdObjectToken. | ||
@param [out] PsdToken PsdToken of the CPU identified by | ||
the AcpiIdObjectToken. | ||
@retval EFI_UNSUPPORTED Not supported | ||
**/ | ||
EFI_STATUS | ||
EFIAPI | ||
GetIntCInfo ( | ||
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, | ||
IN CM_OBJECT_TOKEN AcpiIdObjectToken, | ||
OUT UINT32 *AcpiProcessorUid, | ||
OUT CM_OBJECT_TOKEN *CpcToken, | ||
OUT CM_OBJECT_TOKEN *PsdToken | ||
) | ||
{ | ||
return EFI_UNSUPPORTED; | ||
} |