123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362 |
- /** @file
- SSDT Cpu Topology Table Generator.
- Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- @par Reference(s):
- - ACPI 6.3 Specification - January 2019 - s8.4 Declaring Processors
- **/
- #include <Library/AcpiLib.h>
- #include <Library/BaseLib.h>
- #include <Library/BaseMemoryLib.h>
- #include <Library/DebugLib.h>
- #include <Library/MemoryAllocationLib.h>
- #include <Protocol/AcpiTable.h>
- // Module specific include files.
- #include <AcpiTableGenerator.h>
- #include <ConfigurationManagerObject.h>
- #include <ConfigurationManagerHelper.h>
- #include <Library/AcpiHelperLib.h>
- #include <Library/TableHelperLib.h>
- #include <Library/AmlLib/AmlLib.h>
- #include <Protocol/ConfigurationManagerProtocol.h>
- #include "SsdtCpuTopologyGenerator.h"
- /** ARM standard SSDT Cpu Topology Table Generator.
- Requirements:
- The following Configuration Manager Object(s) are required by
- this Generator:
- - EArmObjGicCInfo
- - EArmObjProcHierarchyInfo (OPTIONAL) along with
- - EArmObjCmRef (OPTIONAL)
- - EArmObjLpiInfo (OPTIONAL)
- */
- /** This macro expands to a function that retrieves the GIC
- CPU interface Information from the Configuration Manager.
- */
- GET_OBJECT_LIST (
- EObjNameSpaceArm,
- EArmObjGicCInfo,
- CM_ARM_GICC_INFO
- );
- /**
- This macro expands to a function that retrieves the Processor Hierarchy
- information from the Configuration Manager.
- */
- GET_OBJECT_LIST (
- EObjNameSpaceArm,
- EArmObjProcHierarchyInfo,
- CM_ARM_PROC_HIERARCHY_INFO
- );
- /**
- This macro expands to a function that retrieves the cross-CM-object-
- reference information from the Configuration Manager.
- */
- GET_OBJECT_LIST (
- EObjNameSpaceArm,
- EArmObjCmRef,
- CM_ARM_OBJ_REF
- );
- /**
- This macro expands to a function that retrieves the Lpi
- information from the Configuration Manager.
- */
- GET_OBJECT_LIST (
- EObjNameSpaceArm,
- EArmObjLpiInfo,
- 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.
- One entry should be allocated for each CM_ARM_PROC_HIERARCHY_INFO
- structure of the platform. The TokenTable allows to have a mapping:
- Index <-> CM_OBJECT_TOKEN (to CM_ARM_LPI_INFO structures).
- There will always be less sets of Lpi states (CM_ARM_OBJ_REF)
- than the number of cpus/clusters (CM_ARM_PROC_HIERARCHY_INFO).
- @param [in] Generator The SSDT Cpu Topology generator.
- @param [in] Count Number of entries to allocate in the TokenTable.
- @retval EFI_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- TokenTableInitialize (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN UINT32 Count
- )
- {
- CM_OBJECT_TOKEN *Table;
- if ((Generator == NULL) ||
- (Count == 0) ||
- (Count >= MAX_NODE_COUNT))
- {
- ASSERT (0);
- return EFI_INVALID_PARAMETER;
- }
- Table = AllocateZeroPool (sizeof (CM_OBJECT_TOKEN) * Count);
- if (Table == NULL) {
- ASSERT (0);
- return EFI_OUT_OF_RESOURCES;
- }
- Generator->TokenTable.Table = Table;
- return EFI_SUCCESS;
- }
- /** Free the TokenTable.
- @param [in] Generator The SSDT Cpu Topology generator.
- **/
- STATIC
- VOID
- EFIAPI
- TokenTableFree (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator
- )
- {
- ASSERT (Generator != NULL);
- ASSERT (Generator->TokenTable.Table != NULL);
- if (Generator->TokenTable.Table != NULL) {
- FreePool (Generator->TokenTable.Table);
- }
- }
- /** Add a new entry to the TokenTable and return its index.
- If an entry with Token is already available in the table,
- return its index without adding a new entry.
- @param [in] Generator The SSDT Cpu Topology generator.
- @param [in] Token New Token entry to add.
- @retval The index of the token entry in the TokenTable.
- **/
- STATIC
- UINT32
- EFIAPI
- TokenTableAdd (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN CM_OBJECT_TOKEN Token
- )
- {
- CM_OBJECT_TOKEN *Table;
- UINT32 Index;
- UINT32 LastIndex;
- ASSERT (Generator != NULL);
- ASSERT (Generator->TokenTable.Table != NULL);
- Table = Generator->TokenTable.Table;
- LastIndex = Generator->TokenTable.LastIndex;
- // Search if there is already an entry with this Token.
- for (Index = 0; Index < LastIndex; Index++) {
- if (Table[Index] == Token) {
- return Index;
- }
- }
- ASSERT (LastIndex < MAX_NODE_COUNT);
- ASSERT (LastIndex < Generator->ProcNodeCount);
- // If no, create a new entry.
- Table[LastIndex] = Token;
- return Generator->TokenTable.LastIndex++;
- }
- /** Write a string 'Xxxx\0' in AslName (5 bytes long),
- with 'X' being the leading char of the name, and
- with 'xxx' being Value in hexadecimal.
- As 'xxx' in hexadecimal represents a number on 12 bits,
- we have Value < (1 << 12).
- @param [in] LeadChar Leading char of the name.
- @param [in] Value Hex value of the name.
- Must be lower than (2 << 12).
- @param [in, out] AslName Pointer to write the 'Xxxx' string to.
- Must be at least 5 bytes long.
- @retval EFI_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- WriteAslName (
- IN CHAR8 LeadChar,
- IN UINT32 Value,
- IN OUT CHAR8 *AslName
- )
- {
- UINT8 Index;
- if ((Value >= MAX_NODE_COUNT) ||
- (AslName == NULL))
- {
- ASSERT (0);
- return EFI_INVALID_PARAMETER;
- }
- AslName[0] = LeadChar;
- AslName[AML_NAME_SEG_SIZE] = '\0';
- for (Index = 0; Index < AML_NAME_SEG_SIZE - 1; Index++) {
- AslName[AML_NAME_SEG_SIZE - Index - 1] =
- AsciiFromHex (((Value >> (4 * Index)) & 0xF));
- }
- 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.
- For instance, transform an AML node from:
- Device (C002)
- {
- Name (_UID, 2)
- Name (_HID, "ACPI0007")
- }
- To:
- Device (C002)
- {
- Name (_UID, 2)
- Name (_HID, "ACPI0007")
- Method (_LPI, 0, NotSerialized)
- {
- Return (\_SB.L003)
- }
- }
- @param [in] Generator The SSDT Cpu Topology generator.
- @param [in] ProcHierarchyNodeInfo CM_ARM_PROC_HIERARCHY_INFO describing
- the Cpu.
- @param [in] Node Node to which the _LPI method is
- attached. Can represent a Cpu or a
- Cluster.
- @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
- CreateAmlLpiMethod (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN CM_ARM_PROC_HIERARCHY_INFO *ProcHierarchyNodeInfo,
- IN AML_OBJECT_NODE_HANDLE *Node
- )
- {
- EFI_STATUS Status;
- UINT32 TokenIndex;
- CHAR8 AslName[SB_SCOPE_PREFIX_SIZE + AML_NAME_SEG_SIZE];
- ASSERT (Generator != NULL);
- ASSERT (ProcHierarchyNodeInfo != NULL);
- ASSERT (ProcHierarchyNodeInfo->LpiToken != CM_NULL_TOKEN);
- ASSERT (Node != NULL);
- TokenIndex = TokenTableAdd (Generator, ProcHierarchyNodeInfo->LpiToken);
- CopyMem (AslName, SB_SCOPE_PREFIX, SB_SCOPE_PREFIX_SIZE);
- Status = WriteAslName (
- 'L',
- TokenIndex,
- AslName + SB_SCOPE_PREFIX_SIZE - 1
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // ASL:
- // Method (_LPI, 0) {
- // Return ([AslName])
- // }
- Status = AmlCodeGenMethodRetNameString (
- "_LPI",
- AslName,
- 0,
- FALSE,
- 0,
- Node,
- NULL
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- }
- return Status;
- }
- /** Generate all the Lpi states under the '_SB' scope.
- This function generates the following ASL code:
- Scope (\_SB) {
- Name (L000, Package() {
- 0, // Version
- 0, // Level Index
- X, // Count
- Package() {
- [An Lpi state]
- },
- Package() {
- [Another Lpi state]
- },
- } // Name L000
- Name (L001, Package() {
- ...
- } // Name L001
- ...
- } // Scope /_SB
- The Lpi states are fetched from the Configuration Manager.
- The names of the Lpi states are generated from the TokenTable.
- @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_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- GenerateLpiStates (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
- IN AML_OBJECT_NODE_HANDLE ScopeNode
- )
- {
- EFI_STATUS Status;
- UINT32 Index;
- UINT32 LastIndex;
- AML_OBJECT_NODE_HANDLE LpiNode;
- CM_ARM_OBJ_REF *LpiRefInfo;
- UINT32 LpiRefInfoCount;
- UINT32 LpiRefIndex;
- CM_ARM_LPI_INFO *LpiInfo;
- CHAR8 AslName[AML_NAME_SEG_SIZE + 1];
- ASSERT (Generator != NULL);
- ASSERT (Generator->TokenTable.Table != NULL);
- ASSERT (CfgMgrProtocol != NULL);
- ASSERT (ScopeNode != NULL);
- LastIndex = Generator->TokenTable.LastIndex;
- // For each entry in the TokenTable, create a name in the AML namespace
- // under SB_SCOPE, to store the Lpi states associated with the LpiToken.
- for (Index = 0; Index < LastIndex; Index++) {
- Status = WriteAslName ('L', Index, AslName);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // We do not support the LevelId field for now, let it to 0.
- Status = AmlCreateLpiNode (AslName, 1, 0, ScopeNode, &LpiNode);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // Fetch the LPI objects referenced by the token.
- Status = GetEArmObjCmRef (
- CfgMgrProtocol,
- Generator->TokenTable.Table[Index],
- &LpiRefInfo,
- &LpiRefInfoCount
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- for (LpiRefIndex = 0; LpiRefIndex < LpiRefInfoCount; LpiRefIndex++) {
- // For each CM_ARM_LPI_INFO referenced by the token, add an Lpi state.
- Status = GetEArmObjLpiInfo (
- CfgMgrProtocol,
- LpiRefInfo[LpiRefIndex].ReferenceToken,
- &LpiInfo,
- NULL
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- Status = AmlAddLpiState (
- LpiInfo->MinResidency,
- LpiInfo->WorstCaseWakeLatency,
- LpiInfo->Flags,
- LpiInfo->ArchFlags,
- LpiInfo->ResCntFreq,
- LpiInfo->EnableParentState,
- LpiInfo->IsInteger ?
- NULL :
- &LpiInfo->RegisterEntryMethod,
- LpiInfo->IsInteger ?
- LpiInfo->IntegerEntryMethod :
- 0,
- &LpiInfo->ResidencyCounterRegister,
- &LpiInfo->UsageCounterRegister,
- LpiInfo->StateName,
- LpiNode
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- } // for LpiRefIndex
- } // for Index
- return EFI_SUCCESS;
- }
- /** Create a Cpu in the AML namespace.
- This generates the following ASL code:
- Device (C002)
- {
- Name (_UID, 2)
- Name (_HID, "ACPI0007")
- }
- @param [in] Generator The SSDT Cpu Topology generator.
- @param [in] ParentNode Parent node to attach the Cpu node to.
- @param [in] GicCInfo CM_ARM_GICC_INFO object used to create the node.
- @param [in] CpuIndex Index used to generate the node name.
- @param [out] CpuNodePtr If not NULL, return the created Cpu node.
- @retval EFI_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- CreateAmlCpu (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN AML_NODE_HANDLE ParentNode,
- IN CM_ARM_GICC_INFO *GicCInfo,
- IN UINT32 CpuIndex,
- OUT AML_OBJECT_NODE_HANDLE *CpuNodePtr OPTIONAL
- )
- {
- EFI_STATUS Status;
- AML_OBJECT_NODE_HANDLE CpuNode;
- CHAR8 AslName[AML_NAME_SEG_SIZE + 1];
- ASSERT (Generator != NULL);
- ASSERT (ParentNode != NULL);
- ASSERT (GicCInfo != NULL);
- Status = WriteAslName ('C', CpuIndex, AslName);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- Status = AmlCodeGenDevice (AslName, ParentNode, &CpuNode);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- Status = AmlCodeGenNameInteger (
- "_UID",
- GicCInfo->AcpiProcessorUid,
- CpuNode,
- NULL
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- Status = AmlCodeGenNameString (
- "_HID",
- ACPI_HID_PROCESSOR_DEVICE,
- CpuNode,
- NULL
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // If requested, return the handle to the CpuNode.
- if (CpuNodePtr != NULL) {
- *CpuNodePtr = CpuNode;
- }
- return Status;
- }
- /** Create a Cpu in the AML namespace from a CM_ARM_PROC_HIERARCHY_INFO
- CM object.
- @param [in] Generator The SSDT Cpu Topology generator.
- @param [in] CfgMgrProtocol Pointer to the Configuration Manager
- Protocol Interface.
- @param [in] ParentNode Parent node to attach the Cpu node to.
- @param [in] CpuIndex Index used to generate the node name.
- @param [in] ProcHierarchyNodeInfo CM_ARM_PROC_HIERARCHY_INFO describing
- the Cpu.
- @retval EFI_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- CreateAmlCpuFromProcHierarchy (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
- IN AML_NODE_HANDLE ParentNode,
- IN UINT32 CpuIndex,
- IN CM_ARM_PROC_HIERARCHY_INFO *ProcHierarchyNodeInfo
- )
- {
- EFI_STATUS Status;
- CM_ARM_GICC_INFO *GicCInfo;
- AML_OBJECT_NODE_HANDLE CpuNode;
- ASSERT (Generator != NULL);
- ASSERT (CfgMgrProtocol != NULL);
- ASSERT (ParentNode != NULL);
- ASSERT (ProcHierarchyNodeInfo != NULL);
- ASSERT (ProcHierarchyNodeInfo->GicCToken != CM_NULL_TOKEN);
- Status = GetEArmObjGicCInfo (
- CfgMgrProtocol,
- ProcHierarchyNodeInfo->GicCToken,
- &GicCInfo,
- NULL
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- Status = CreateAmlCpu (Generator, ParentNode, GicCInfo, CpuIndex, &CpuNode);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // If a set of Lpi states is associated with the
- // CM_ARM_PROC_HIERARCHY_INFO, create an _LPI method returning them.
- if (ProcHierarchyNodeInfo->LpiToken != CM_NULL_TOKEN) {
- Status = CreateAmlLpiMethod (Generator, ProcHierarchyNodeInfo, 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) {
- Status = CreateAmlCpcNode (Generator, CfgMgrProtocol, GicCInfo, CpuNode);
- if (EFI_ERROR (Status)) {
- ASSERT_EFI_ERROR (Status);
- return Status;
- }
- }
- return Status;
- }
- /** Create a Processor Container in the AML namespace.
- Any CM_ARM_PROC_HIERARCHY_INFO object with the following flags is
- assumed to be a processor container:
- - EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL
- - EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID
- - EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF
- This generates the following ASL code:
- Device (C002)
- {
- Name (_UID, 2)
- Name (_HID, "ACPI0010")
- }
- @param [in] Generator The SSDT Cpu Topology generator.
- @param [in] CfgMgrProtocol Pointer to the Configuration Manager
- Protocol Interface.
- @param [in] ParentNode Parent node to attach the processor
- container node to.
- @param [in] ProcHierarchyNodeInfo CM_ARM_PROC_HIERARCHY_INFO object used
- to create the node.
- @param [in] ProcContainerIndex Index used to generate the node name.
- @param [out] ProcContainerNodePtr If success, contains the created processor
- container node.
- @retval EFI_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- CreateAmlProcessorContainer (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
- IN AML_NODE_HANDLE ParentNode,
- IN CM_ARM_PROC_HIERARCHY_INFO *ProcHierarchyNodeInfo,
- IN UINT32 ProcContainerIndex,
- OUT AML_OBJECT_NODE_HANDLE *ProcContainerNodePtr
- )
- {
- EFI_STATUS Status;
- AML_OBJECT_NODE_HANDLE ProcContainerNode;
- CHAR8 AslNameProcContainer[AML_NAME_SEG_SIZE + 1];
- ASSERT (Generator != NULL);
- ASSERT (CfgMgrProtocol != NULL);
- ASSERT (ParentNode != NULL);
- ASSERT (ProcHierarchyNodeInfo != NULL);
- ASSERT (ProcContainerNodePtr != NULL);
- Status = WriteAslName ('C', ProcContainerIndex, AslNameProcContainer);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- Status = AmlCodeGenDevice (AslNameProcContainer, ParentNode, &ProcContainerNode);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // Use the ProcContainerIndex for the _UID value as there is no AcpiProcessorUid
- // and EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID is set for non-Cpus.
- Status = AmlCodeGenNameInteger (
- "_UID",
- ProcContainerIndex,
- ProcContainerNode,
- NULL
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- Status = AmlCodeGenNameString (
- "_HID",
- ACPI_HID_PROCESSOR_CONTAINER_DEVICE,
- ProcContainerNode,
- NULL
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // If a set of Lpi states are associated with the
- // CM_ARM_PROC_HIERARCHY_INFO, create an _LPI method returning them.
- if (ProcHierarchyNodeInfo->LpiToken != CM_NULL_TOKEN) {
- Status = CreateAmlLpiMethod (
- Generator,
- ProcHierarchyNodeInfo,
- ProcContainerNode
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- }
- *ProcContainerNodePtr = ProcContainerNode;
- return Status;
- }
- /** Create an AML representation of the Cpu topology.
- A processor container is by extension any non-leave device in the cpu topology.
- @param [in] Generator The SSDT Cpu Topology generator.
- @param [in] CfgMgrProtocol Pointer to the Configuration Manager
- Protocol Interface.
- @param [in] NodeToken Token of the CM_ARM_PROC_HIERARCHY_INFO
- currently handled.
- Cannot be CM_NULL_TOKEN.
- @param [in] ParentNode Parent node to attach the created
- node to.
- @param [in,out] ProcContainerIndex Pointer to the current processor container
- index to be used as UID.
- @retval EFI_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- CreateAmlCpuTopologyTree (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
- IN CM_OBJECT_TOKEN NodeToken,
- IN AML_NODE_HANDLE ParentNode,
- IN OUT UINT32 *ProcContainerIndex
- )
- {
- EFI_STATUS Status;
- UINT32 Index;
- UINT32 CpuIndex;
- AML_OBJECT_NODE_HANDLE ProcContainerNode;
- ASSERT (Generator != NULL);
- ASSERT (Generator->ProcNodeList != NULL);
- ASSERT (Generator->ProcNodeCount != 0);
- ASSERT (CfgMgrProtocol != NULL);
- ASSERT (NodeToken != CM_NULL_TOKEN);
- ASSERT (ParentNode != NULL);
- ASSERT (ProcContainerIndex != NULL);
- CpuIndex = 0;
- for (Index = 0; Index < Generator->ProcNodeCount; Index++) {
- // Find the children of the CM_ARM_PROC_HIERARCHY_INFO
- // currently being handled (i.e. ParentToken == NodeToken).
- if (Generator->ProcNodeList[Index].ParentToken == NodeToken) {
- // Only Cpus (leaf nodes in this tree) have a GicCToken.
- // Create a Cpu node.
- if (Generator->ProcNodeList[Index].GicCToken != CM_NULL_TOKEN) {
- if ((Generator->ProcNodeList[Index].Flags & PPTT_PROCESSOR_MASK) !=
- PPTT_CPU_PROCESSOR_MASK)
- {
- DEBUG ((
- DEBUG_ERROR,
- "ERROR: SSDT-CPU-TOPOLOGY: Invalid flags for cpu: 0x%x.\n",
- Generator->ProcNodeList[Index].Flags
- ));
- ASSERT (0);
- return EFI_INVALID_PARAMETER;
- }
- Status = CreateAmlCpuFromProcHierarchy (
- Generator,
- CfgMgrProtocol,
- ParentNode,
- CpuIndex,
- &Generator->ProcNodeList[Index]
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- CpuIndex++;
- } else {
- // If this is not a Cpu, then this is a processor container.
- // Acpi processor Id for clusters is not handled.
- if ((Generator->ProcNodeList[Index].Flags & PPTT_PROCESSOR_MASK) !=
- PPTT_CLUSTER_PROCESSOR_MASK)
- {
- DEBUG ((
- DEBUG_ERROR,
- "ERROR: SSDT-CPU-TOPOLOGY: Invalid flags for cluster: 0x%x.\n",
- Generator->ProcNodeList[Index].Flags
- ));
- ASSERT (0);
- return EFI_INVALID_PARAMETER;
- }
- Status = CreateAmlProcessorContainer (
- Generator,
- CfgMgrProtocol,
- ParentNode,
- &Generator->ProcNodeList[Index],
- *ProcContainerIndex,
- &ProcContainerNode
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // Nodes must have a unique name in the ASL namespace.
- // Reset the Cpu index whenever we create a new processor container.
- (*ProcContainerIndex)++;
- CpuIndex = 0;
- // Recursively continue creating an AML tree.
- Status = CreateAmlCpuTopologyTree (
- Generator,
- CfgMgrProtocol,
- Generator->ProcNodeList[Index].Token,
- ProcContainerNode,
- ProcContainerIndex
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- }
- } // if ParentToken == NodeToken
- } // for
- return EFI_SUCCESS;
- }
- /** Create the processor hierarchy AML tree from CM_ARM_PROC_HIERARCHY_INFO
- 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_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- CreateTopologyFromProcHierarchy (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
- IN AML_OBJECT_NODE_HANDLE ScopeNode
- )
- {
- EFI_STATUS Status;
- UINT32 Index;
- UINT32 TopLevelProcNodeIndex;
- UINT32 ProcContainerIndex;
- ASSERT (Generator != NULL);
- ASSERT (Generator->ProcNodeCount != 0);
- ASSERT (Generator->ProcNodeList != NULL);
- ASSERT (CfgMgrProtocol != NULL);
- ASSERT (ScopeNode != NULL);
- TopLevelProcNodeIndex = MAX_UINT32;
- ProcContainerIndex = 0;
- Status = TokenTableInitialize (Generator, Generator->ProcNodeCount);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // It is assumed that there is one unique CM_ARM_PROC_HIERARCHY_INFO
- // structure with no ParentToken and the EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL
- // flag set. All other CM_ARM_PROC_HIERARCHY_INFO are non-physical and
- // have a ParentToken.
- for (Index = 0; Index < Generator->ProcNodeCount; Index++) {
- if ((Generator->ProcNodeList[Index].ParentToken == CM_NULL_TOKEN) &&
- (Generator->ProcNodeList[Index].Flags &
- EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL))
- {
- if (TopLevelProcNodeIndex != MAX_UINT32) {
- DEBUG ((
- DEBUG_ERROR,
- "ERROR: SSDT-CPU-TOPOLOGY: Top level CM_ARM_PROC_HIERARCHY_INFO "
- "must be unique\n"
- ));
- ASSERT (0);
- goto exit_handler;
- }
- TopLevelProcNodeIndex = Index;
- }
- } // for
- Status = CreateAmlCpuTopologyTree (
- Generator,
- CfgMgrProtocol,
- Generator->ProcNodeList[TopLevelProcNodeIndex].Token,
- ScopeNode,
- &ProcContainerIndex
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- goto exit_handler;
- }
- Status = GenerateLpiStates (Generator, CfgMgrProtocol, ScopeNode);
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- goto exit_handler;
- }
- exit_handler:
- TokenTableFree (Generator);
- return Status;
- }
- /** Create the processor hierarchy AML tree from CM_ARM_GICC_INFO
- CM objects.
- A processor container is by extension any non-leave device in the cpu topology.
- @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_SUCCESS Success.
- @retval EFI_INVALID_PARAMETER Invalid parameter.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- CreateTopologyFromGicC (
- IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator,
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
- IN AML_OBJECT_NODE_HANDLE ScopeNode
- )
- {
- EFI_STATUS Status;
- CM_ARM_GICC_INFO *GicCInfo;
- UINT32 GicCInfoCount;
- UINT32 Index;
- AML_OBJECT_NODE_HANDLE CpuNode;
- ASSERT (Generator != NULL);
- ASSERT (CfgMgrProtocol != NULL);
- ASSERT (ScopeNode != NULL);
- Status = GetEArmObjGicCInfo (
- CfgMgrProtocol,
- CM_NULL_TOKEN,
- &GicCInfo,
- &GicCInfoCount
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- return Status;
- }
- // For each CM_ARM_GICC_INFO object, create an AML node.
- for (Index = 0; Index < GicCInfoCount; Index++) {
- Status = CreateAmlCpu (
- Generator,
- ScopeNode,
- &GicCInfo[Index],
- Index,
- &CpuNode
- );
- if (EFI_ERROR (Status)) {
- ASSERT (0);
- 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
- return Status;
- }
- /** Construct the SSDT Cpu Topology ACPI table.
- This function invokes the Configuration Manager protocol interface
- to get the required hardware information for generating the ACPI
- table.
- If this function allocates any resources then they must be freed
- in the FreeXXXXTableResources function.
- @param [in] This Pointer to the table generator.
- @param [in] AcpiTableInfo Pointer to the ACPI Table Info.
- @param [in] CfgMgrProtocol Pointer to the Configuration Manager
- Protocol Interface.
- @param [out] Table Pointer to the constructed ACPI Table.
- @retval EFI_SUCCESS Table generated successfully.
- @retval EFI_INVALID_PARAMETER A parameter is invalid.
- @retval EFI_NOT_FOUND The required object was not found.
- @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration
- Manager is less than the Object size for the
- requested object.
- **/
- STATIC
- EFI_STATUS
- EFIAPI
- BuildSsdtCpuTopologyTable (
- IN CONST ACPI_TABLE_GENERATOR *CONST This,
- IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo,
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
- OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table
- )
- {
- EFI_STATUS Status;
- AML_ROOT_NODE_HANDLE RootNode;
- AML_OBJECT_NODE_HANDLE ScopeNode;
- CM_ARM_PROC_HIERARCHY_INFO *ProcHierarchyNodeList;
- UINT32 ProcHierarchyNodeCount;
- ACPI_CPU_TOPOLOGY_GENERATOR *Generator;
- ASSERT (This != NULL);
- ASSERT (AcpiTableInfo != NULL);
- ASSERT (CfgMgrProtocol != NULL);
- ASSERT (Table != NULL);
- ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID);
- ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);
- Generator = (ACPI_CPU_TOPOLOGY_GENERATOR *)This;
- Status = AddSsdtAcpiHeader (
- CfgMgrProtocol,
- This,
- AcpiTableInfo,
- &RootNode
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- Status = AmlCodeGenScope (SB_SCOPE, RootNode, &ScopeNode);
- if (EFI_ERROR (Status)) {
- goto exit_handler;
- }
- // Get the processor hierarchy info and update the processor topology
- // structure count with Processor Hierarchy Nodes (Type 0)
- Status = GetEArmObjProcHierarchyInfo (
- CfgMgrProtocol,
- CM_NULL_TOKEN,
- &ProcHierarchyNodeList,
- &ProcHierarchyNodeCount
- );
- if (EFI_ERROR (Status) &&
- (Status != EFI_NOT_FOUND))
- {
- goto exit_handler;
- }
- if (Status == EFI_NOT_FOUND) {
- // If hierarchy information is not found generate a flat topology
- // using CM_ARM_GICC_INFO objects.
- Status = CreateTopologyFromGicC (
- Generator,
- CfgMgrProtocol,
- ScopeNode
- );
- if (EFI_ERROR (Status)) {
- goto exit_handler;
- }
- } else {
- // Generate the topology from CM_ARM_PROC_HIERARCHY_INFO objects.
- Generator->ProcNodeList = ProcHierarchyNodeList;
- Generator->ProcNodeCount = ProcHierarchyNodeCount;
- Status = CreateTopologyFromProcHierarchy (
- Generator,
- CfgMgrProtocol,
- ScopeNode
- );
- if (EFI_ERROR (Status)) {
- goto exit_handler;
- }
- }
- Status = AmlSerializeDefinitionBlock (
- RootNode,
- Table
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((
- DEBUG_ERROR,
- "ERROR: SSDT-CPU-TOPOLOGY: Failed to Serialize SSDT Table Data."
- " Status = %r\n",
- Status
- ));
- goto exit_handler;
- }
- exit_handler:
- // Delete the RootNode and its attached children.
- return AmlDeleteTree (RootNode);
- }
- /** Free any resources allocated for constructing the
- SSDT Cpu Topology ACPI table.
- @param [in] This Pointer to the table generator.
- @param [in] AcpiTableInfo Pointer to the ACPI Table Info.
- @param [in] CfgMgrProtocol Pointer to the Configuration Manager
- Protocol Interface.
- @param [in, out] Table Pointer to the ACPI Table.
- @retval EFI_SUCCESS The resources were freed successfully.
- @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid.
- **/
- STATIC
- EFI_STATUS
- FreeSsdtCpuTopologyTableResources (
- IN CONST ACPI_TABLE_GENERATOR *CONST This,
- IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo,
- IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
- IN OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table
- )
- {
- ASSERT (This != NULL);
- ASSERT (AcpiTableInfo != NULL);
- ASSERT (CfgMgrProtocol != NULL);
- ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID);
- ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);
- if ((Table == NULL) || (*Table == NULL)) {
- DEBUG ((DEBUG_ERROR, "ERROR: SSDT-CPU-TOPOLOGY: Invalid Table Pointer\n"));
- ASSERT ((Table != NULL) && (*Table != NULL));
- return EFI_INVALID_PARAMETER;
- }
- FreePool (*Table);
- *Table = NULL;
- return EFI_SUCCESS;
- }
- /** This macro defines the SSDT Cpu Topology Table Generator revision.
- */
- #define SSDT_CPU_TOPOLOGY_GENERATOR_REVISION CREATE_REVISION (1, 0)
- /** The interface for the SSDT Cpu Topology Table Generator.
- */
- STATIC
- ACPI_CPU_TOPOLOGY_GENERATOR SsdtCpuTopologyGenerator = {
- // ACPI table generator header
- {
- // Generator ID
- CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdtCpuTopology),
- // Generator Description
- L"ACPI.STD.SSDT.CPU.TOPOLOGY.GENERATOR",
- // ACPI Table Signature
- EFI_ACPI_6_3_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
- // ACPI Table Revision - Unused
- 0,
- // Minimum ACPI Table Revision - Unused
- 0,
- // Creator ID
- TABLE_GENERATOR_CREATOR_ID_ARM,
- // Creator Revision
- SSDT_CPU_TOPOLOGY_GENERATOR_REVISION,
- // Build Table function
- BuildSsdtCpuTopologyTable,
- // Free Resource function
- FreeSsdtCpuTopologyTableResources,
- // Extended build function not needed
- NULL,
- // Extended build function not implemented by the generator.
- // Hence extended free resource function is not required.
- NULL
- },
- // Private fields are defined from here.
- // TokenTable
- {
- // Table
- NULL,
- // LastIndex
- 0
- },
- // ProcNodeList
- NULL,
- // ProcNodeCount
- 0
- };
- /** Register the Generator with the ACPI Table Factory.
- @param [in] ImageHandle The handle to the image.
- @param [in] SystemTable Pointer to the System Table.
- @retval EFI_SUCCESS The Generator is registered.
- @retval EFI_INVALID_PARAMETER A parameter is invalid.
- @retval EFI_ALREADY_STARTED The Generator for the Table ID
- is already registered.
- **/
- EFI_STATUS
- EFIAPI
- AcpiSsdtCpuTopologyLibConstructor (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
- {
- EFI_STATUS Status;
- Status = RegisterAcpiTableGenerator (&SsdtCpuTopologyGenerator.Header);
- DEBUG ((
- DEBUG_INFO,
- "SSDT-CPU-TOPOLOGY: Register Generator. Status = %r\n",
- Status
- ));
- ASSERT_EFI_ERROR (Status);
- return Status;
- }
- /** Deregister the Generator from the ACPI Table Factory.
- @param [in] ImageHandle The handle to the image.
- @param [in] SystemTable Pointer to the System Table.
- @retval EFI_SUCCESS The Generator is deregistered.
- @retval EFI_INVALID_PARAMETER A parameter is invalid.
- @retval EFI_NOT_FOUND The Generator is not registered.
- **/
- EFI_STATUS
- EFIAPI
- AcpiSsdtCpuTopologyLibDestructor (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
- {
- EFI_STATUS Status;
- Status = DeregisterAcpiTableGenerator (&SsdtCpuTopologyGenerator.Header);
- DEBUG ((
- DEBUG_INFO,
- "SSDT-CPU-TOPOLOGY: Deregister Generator. Status = %r\n",
- Status
- ));
- ASSERT_EFI_ERROR (Status);
- return Status;
- }
|