From nobody Mon Feb 9 10:57:19 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+94132+1787277+3901457@groups.io; arc=fail (BodyHash is different from the expected one) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1663879032005702.2327720444468; Thu, 22 Sep 2022 13:37:12 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id qqjIYY1788612xC1Om3UiR4b; Thu, 22 Sep 2022 13:37:11 -0700 X-Received: from NAM02-DM3-obe.outbound.protection.outlook.com (NAM02-DM3-obe.outbound.protection.outlook.com [40.107.95.71]) by mx.groups.io with SMTP id smtpd.web08.271.1663879030398202803 for ; Thu, 22 Sep 2022 13:37:10 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ifS22F35QJzGlwGIl0xuzXG82G+ZuoLUSTOchdbK5FiUVSeUlST5KeGrg6Ebf/BvU4v88asZxnCPca3Ic26VSpbYbS7b9J1IT3g0m+86QjdxUiV4xu+BHQe9Daq/13WfbvbvYCDbTH5GBc9fWAo3LAqj4vwbPrlHwdlLFI0US9g/LvzVO33+I+BL9bf7ovT6JAzkfAdDteD10hBa/7xMBuPGpvPabtI58zA1HNhfg2jmhBPyapu2GKVyznal0rDfgR4ej3NIpGsf85w43Y8/kSlFNZ4uTglFWxQBZAmGaSF8ARNeQIEfX7zSSvo/k+6BRFu538CgbdnTERheEi0vjw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Ci+PwmG4lbLz9lR2Dr7EHm66qsreIMu9k6TdHv19LPc=; b=DpnFk6AVsggdQ5cRah0Uf5hS8dMPAADdl0BsJmSHOL9xy9XAEUlUxCS4fXc4PaRqcM4SqUL8E2SRNezP8uT8tX2PuxqQsKYhNomP9fzM+3LG3qS+3ruyqqEnv5cMWqAZUw3xq2fpiP1o/bWzjoiWNvcoZ/krJhcLAgpZYxdRAVFrvEt2emv8LMhdWF0fCARRy7pcdVV/Z7aosAdkyP/BE64Gjok8p44m7qgVy2wxuPjLUBmkHhOyaYGK7SmBpKEXI/DC88ibZldbxGAxHReKsKkoPu73tX2xkGbH4GRQqayTCWtO6jsogvYrfSy9zlDpDrGXn3KIniLicIAn+LUK8w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none X-Received: from BN1PR12CA0008.namprd12.prod.outlook.com (2603:10b6:408:e1::13) by IA1PR12MB6388.namprd12.prod.outlook.com (2603:10b6:208:388::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.17; Thu, 22 Sep 2022 20:37:08 +0000 X-Received: from BN8NAM11FT025.eop-nam11.prod.protection.outlook.com (2603:10b6:408:e1:cafe::e7) by BN1PR12CA0008.outlook.office365.com (2603:10b6:408:e1::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.19 via Frontend Transport; Thu, 22 Sep 2022 20:37:08 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+94132+1787277+3901457@groups.io; helo=mail02.groups.io; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C X-Received: from mail.nvidia.com (216.228.117.161) by BN8NAM11FT025.mail.protection.outlook.com (10.13.177.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.14 via Frontend Transport; Thu, 22 Sep 2022 20:37:08 +0000 X-Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.26; Thu, 22 Sep 2022 13:36:54 -0700 X-Received: from rnnvmail201.nvidia.com (10.129.68.8) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.29; Thu, 22 Sep 2022 13:36:54 -0700 X-Received: from f153882e4be8.nvidia.com (10.127.8.13) by mail.nvidia.com (10.129.68.8) with Microsoft SMTP Server id 15.2.986.29 via Frontend Transport; Thu, 22 Sep 2022 13:36:53 -0700 From: "Jeff Brasen via groups.io" To: CC: , , , , , Jeff Brasen Subject: [edk2-devel] [PATCH v5 2/3] DynamicTablesPkg: AML Code generation to add _CPC entries Date: Thu, 22 Sep 2022 14:36:45 -0600 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-NVConfidentiality: public X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN8NAM11FT025:EE_|IA1PR12MB6388:EE_ X-MS-Office365-Filtering-Correlation-Id: 3c9b67ad-4037-4cfd-7834-08da9cda37f7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Message-Info: CFNMniKgW7HqbdfRMB5NzOfnmweD1xAK9GQ5tIEc592lFRCtiBeUSaEts9CkVNMCHY9pdLco+zHLqruU0M8vIU+HH0/22iuXczuaX2Cb3+AaXbBLaFy/1DktK3LViM7tyKVaIRGyqwqRkWOKGdmMr3Nz2I8aA6ihFSlOJvF8dBDWj0ydfTNZbqCix6+Z3YHKXhoL1h8MNo+Q9jbaGq9D6Gc7j7qR2vFFBN95pqPAwUZBeyHv9rpueMFkuzNdo6BoM8Xnt6BbeUa5KrhX5kjtGtv7FJna6DMvxOTDui3b1cwDDKvS6mdxs15POFP76G7PJtMealWwoy7+5JAJUEqQv5G7tZPpgxWoKOxZMzpF9PS/WvD8/jr2mQ0iZ9KBXOQuYUKFo0iX48KAmOdi4LhC5jXYj2oE4c4smnPShf8Kslw+vCivXUiXvFTOEmf/eNh60dfIQ5i7Tbg1SrSiRpDdUr0Fog2NQUZEzyeOq+0xUkElGENTvNxhZ2fXz/V8w2dsjldB/mnMxPYzrLMCnsYPcIRKjHagdDrtxNr/WtQI/0lRc8RZdHnzC15WX4Zfz9COjd7cGwruyO5YexzOH1mnIr+psdGqImNwekE+21SFFXqw34T9bzj6Lw/5qjhWd3X2iKNpW013eGXtHoKWJWxF5tKAUtFXnaaEDP26zzJXMVDCmsPbktrn+xgb3+DO48fCkdLdvVaQGmWRUw4E6sGZ5SYqO4fj3aBUQTvE+BPfd0vd1IfJ7nQqN6VRt7e4z/Yadfw8WZt8kV/jPKevjXfJv2PImiaBpSu0OFHFHe/m4R4= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Sep 2022 20:37:08.0083 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3c9b67ad-4037-4cfd-7834-08da9cda37f7 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT025.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6388 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,jbrasen@nvidia.com X-Gm-Message-State: j7yhNSetfN6yrRMVtvKmyBiTx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1663879031; bh=5cEjnyUP0V0T7XLELuzruuKbQ9V/u6ccq7CKGLlRnL8=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=J1m0XL5VP81d9sUfwcrjWDeIWzlojyIFGXNAb8bpt/n3j2Y9FLfpGpdstQaA4wYsRnF kZZ7u6OLLCx4uE1xwapdvaLzv5s3MqjIyORm+xytT95j1aUX+bREOd29I0wazshnyzBCL lSeneUTFTwTDO8DJeagT/wWWjrONTneurSk= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1663879033226100007 Content-Type: text/plain; charset="utf-8" _CPC entries can describe CPU performance information. The object is described in ACPI 6.4 s8.4.7.1. "_CPC (Continuous Performance Control)". Add AmlCreateCpcNode() helper function to add _CPC entries to an existing CPU object. Signed-off-by: Jeff Brasen --- .../Include/Library/AmlLib/AmlLib.h | 54 ++ .../Common/AmlLib/CodeGen/AmlCodeGen.c | 475 ++++++++++++++++++ 2 files changed, 529 insertions(+) diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTabl= esPkg/Include/Library/AmlLib/AmlLib.h index 39968660f2..ebaccba811 100644 --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h @@ -37,6 +37,7 @@ */ =20 #include +#include =20 #ifndef AML_HANDLE =20 @@ -1336,6 +1337,59 @@ AmlAddNameIntegerPackage ( IN AML_OBJECT_NODE_HANDLE PackageNode ); =20 +/** Create a _CPC node. + + Creates and optionally adds the following node + Name(_CPC, Package() + { + NumEntries, // Integer + Revision, // Integer + HighestPerformance, // Integer or Buffer (Resourc= e Descriptor) + NominalPerformance, // Integer or Buffer (Resourc= e Descriptor) + LowestNonlinearPerformance, // Integer or Buffer (Resourc= e Descriptor) + LowestPerformance, // Integer or Buffer (Resourc= e Descriptor) + GuaranteedPerformanceRegister, // Buffer (Resource Descripto= r) + DesiredPerformanceRegister , // Buffer (Resource Descripto= r) + MinimumPerformanceRegister , // Buffer (Resource Descripto= r) + MaximumPerformanceRegister , // Buffer (Resource Descripto= r) + PerformanceReductionToleranceRegister, // Buffer (Resource Descripto= r) + TimeWindowRegister, // Buffer (Resource Descripto= r) + CounterWraparoundTime, // Integer or Buffer (Resourc= e Descriptor) + ReferencePerformanceCounterRegister, // Buffer (Resource Descripto= r) + DeliveredPerformanceCounterRegister, // Buffer (Resource Descripto= r) + PerformanceLimitedRegister, // Buffer (Resource Descripto= r) + CPPCEnableRegister // Buffer (Resource Descripto= r) + AutonomousSelectionEnable, // Integer or Buffer (Resourc= e Descriptor) + AutonomousActivityWindowRegister, // Buffer (Resource Descripto= r) + EnergyPerformancePreferenceRegister, // Buffer (Resource Descripto= r) + ReferencePerformance // Integer or Buffer (Resourc= e Descriptor) + LowestFrequency, // Integer or Buffer (Resourc= e Descriptor) + NominalFrequency // Integer or Buffer (Resourc= e Descriptor) + }) + + If resource buffer is NULL then integer will be used. + + Cf. ACPI 6.4, s8.4.7.1 _CPC (Continuous Performance Control) + + @ingroup CodeGenApis + + @param [in] CpcInfo CpcInfo object + @param [in] ParentNode If provided, set ParentNode as the pa= rent + of the node created. + @param [out] NewCpcNode 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 +AmlCreateCpcNode ( + IN AML_CPC_INFO *CpcInfo, + IN AML_NODE_HANDLE ParentNode OPTIONAL, + OUT AML_OBJECT_NODE_HANDLE *NewCpcNode OPTIONAL + ); + // DEPRECATED APIS #ifndef DISABLE_NEW_DEPRECATED_INTERFACES =20 diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/= DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c index 5fb39d077b..4dc810c034 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -2850,3 +2851,477 @@ error_handler: =20 return Status; } + +/** Adds a register to the package + + @ingroup CodeGenApis + + @param [in] Register If provided, register that will be added to pa= ckage. + otherwise NULL register will be added + @param [in] PackageNode Package to add value to + + @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 +AmlAddRegisterToPackage ( + IN EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE *Register OPTIONAL, + IN AML_OBJECT_NODE_HANDLE PackageNode + ) +{ + EFI_STATUS Status; + AML_DATA_NODE_HANDLE RdNode; + AML_OBJECT_NODE_HANDLE ResourceTemplateNode; + + RdNode =3D NULL; + + Status =3D AmlCodeGenResourceTemplate (&ResourceTemplateNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + if (Register !=3D NULL) { + Status =3D AmlCodeGenRdRegister ( + Register->AddressSpaceId, + Register->RegisterBitWidth, + Register->RegisterBitOffset, + Register->Address, + Register->AccessSize, + NULL, + &RdNode + ); + } else { + Status =3D AmlCodeGenRdRegister ( + EFI_ACPI_6_4_SYSTEM_MEMORY, + 0, + 0, + 0, + 0, + NULL, + &RdNode + ); + } + + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAppendRdNode (ResourceTemplateNode, RdNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + RdNode =3D NULL; + + Status =3D AmlVarListAddTail ( + (AML_NODE_HANDLE)PackageNode, + (AML_NODE_HANDLE)ResourceTemplateNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + return Status; + +error_handler: + if (RdNode !=3D NULL) { + AmlDeleteTree ((AML_NODE_HANDLE)RdNode); + } + + if (ResourceTemplateNode !=3D NULL) { + AmlDeleteTree ((AML_NODE_HANDLE)ResourceTemplateNode); + } + + return Status; +} + +/** Utility function to check if generic address points to NULL + + @param [in] Address Pointer to the Generic address + + @retval TRUE Address is system memory with an Address of 0. + @retval FALSE Address does not point to NULL. +**/ +STATIC +BOOLEAN +EFIAPI +IsNullGenericAddress ( + IN EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE *Address + ) +{ + if ((Address =3D=3D NULL) || + ((Address->AddressSpaceId =3D=3D EFI_ACPI_6_4_SYSTEM_MEMORY) && + (Address->Address =3D=3D 0x0))) + { + return TRUE; + } + + return FALSE; +} + +/** Adds an integer or register to the package + + @ingroup CodeGenApis + + @param [in] Register If provided, register that will be added to pa= ckage + @param [in] Integer If Register is NULL, integer that will be adde= d to the package + @param [in] PackageNode Package to add value to + + @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 +AmlAddRegisterOrIntegerToPackage ( + IN EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE *Register OPTIONAL, + IN UINT32 Integer, + IN AML_OBJECT_NODE_HANDLE PackageNode + ) +{ + EFI_STATUS Status; + AML_OBJECT_NODE_HANDLE IntegerNode; + + IntegerNode =3D NULL; + + if (!IsNullGenericAddress (Register)) { + Status =3D AmlAddRegisterToPackage (Register, PackageNode); + } else { + Status =3D AmlCodeGenInteger (Integer, &IntegerNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status =3D AmlVarListAddTail ( + (AML_NODE_HANDLE)PackageNode, + (AML_NODE_HANDLE)IntegerNode + ); + } + + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + if (IntegerNode !=3D NULL) { + AmlDeleteTree ((AML_NODE_HANDLE)IntegerNode); + } + } + + return Status; +} + +/** Create a _CPC node. + + Creates and optionally adds the following node + Name(_CPC, Package() + { + NumEntries, // Integer + Revision, // Integer + HighestPerformance, // Integer or Buffer (Resourc= e Descriptor) + NominalPerformance, // Integer or Buffer (Resourc= e Descriptor) + LowestNonlinearPerformance, // Integer or Buffer (Resourc= e Descriptor) + LowestPerformance, // Integer or Buffer (Resourc= e Descriptor) + GuaranteedPerformanceRegister, // Buffer (Resource Descripto= r) + DesiredPerformanceRegister , // Buffer (Resource Descripto= r) + MinimumPerformanceRegister , // Buffer (Resource Descripto= r) + MaximumPerformanceRegister , // Buffer (Resource Descripto= r) + PerformanceReductionToleranceRegister, // Buffer (Resource Descripto= r) + TimeWindowRegister, // Buffer (Resource Descripto= r) + CounterWraparoundTime, // Integer or Buffer (Resourc= e Descriptor) + ReferencePerformanceCounterRegister, // Buffer (Resource Descripto= r) + DeliveredPerformanceCounterRegister, // Buffer (Resource Descripto= r) + PerformanceLimitedRegister, // Buffer (Resource Descripto= r) + CPPCEnableRegister // Buffer (Resource Descripto= r) + AutonomousSelectionEnable, // Integer or Buffer (Resourc= e Descriptor) + AutonomousActivityWindowRegister, // Buffer (Resource Descripto= r) + EnergyPerformancePreferenceRegister, // Buffer (Resource Descripto= r) + ReferencePerformance // Integer or Buffer (Resourc= e Descriptor) + LowestFrequency, // Integer or Buffer (Resourc= e Descriptor) + NominalFrequency // Integer or Buffer (Resourc= e Descriptor) + }) + + If resource buffer is NULL then integer will be used. + + Cf. ACPI 6.4, s8.4.7.1 _CPC (Continuous Performance Control) + + @ingroup CodeGenApis + + @param [in] CpcInfo CpcInfo object + @param [in] ParentNode If provided, set ParentNode as the pa= rent + of the node created. + @param [out] NewCpcNode 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 +AmlCreateCpcNode ( + IN AML_CPC_INFO *CpcInfo, + IN AML_NODE_HANDLE ParentNode OPTIONAL, + OUT AML_OBJECT_NODE_HANDLE *NewCpcNode OPTIONAL + ) +{ + EFI_STATUS Status; + AML_OBJECT_NODE_HANDLE CpcNode; + AML_OBJECT_NODE_HANDLE CpcPackage; + UINT32 NumberOfEntries; + + if ((CpcInfo =3D=3D NULL) || + ((ParentNode =3D=3D NULL) && (NewCpcNode =3D=3D NULL))) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Revision 3 per ACPI 6.4 specification + if (CpcInfo->Revision =3D=3D 3) { + // NumEntries 23 per ACPI 6.4 specification + NumberOfEntries =3D 23; + } else { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + if ((IsNullGenericAddress (&CpcInfo->HighestPerformanceBuffer) && + (CpcInfo->HighestPerformanceInteger =3D=3D 0)) || + (IsNullGenericAddress (&CpcInfo->NominalPerformanceBuffer) && + (CpcInfo->NominalPerformanceInteger =3D=3D 0)) || + (IsNullGenericAddress (&CpcInfo->LowestNonlinearPerformanceBuffer) && + (CpcInfo->LowestNonlinearPerformanceInteger =3D=3D 0)) || + (IsNullGenericAddress (&CpcInfo->LowestPerformanceBuffer) && + (CpcInfo->LowestPerformanceInteger =3D=3D 0)) || + IsNullGenericAddress (&CpcInfo->DesiredPerformanceRegister) || + IsNullGenericAddress (&CpcInfo->ReferencePerformanceCounterRegister)= || + IsNullGenericAddress (&CpcInfo->DeliveredPerformanceCounterRegister)= || + IsNullGenericAddress (&CpcInfo->PerformanceLimitedRegister)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + CpcPackage =3D NULL; + + Status =3D AmlCodeGenNamePackage ("_CPC", NULL, &CpcNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + // Get the Package object node of the _CPC node, + // which is the 2nd fixed argument (i.e. index 1). + CpcPackage =3D (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument ( + CpcNode, + EAmlParseIndexTerm1 + ); + if ((CpcPackage =3D=3D NULL) = || + (AmlGetNodeType ((AML_NODE_HANDLE)CpcPackage) !=3D EAmlNodeObject) = || + (!AmlNodeHasOpCode (CpcPackage, AML_PACKAGE_OP, 0))) + { + ASSERT (0); + Status =3D EFI_INVALID_PARAMETER; + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + NULL, + NumberOfEntries, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + NULL, + CpcInfo->Revision, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->HighestPerformanceBuffer, + CpcInfo->HighestPerformanceInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->NominalPerformanceBuffer, + CpcInfo->NominalPerformanceInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->LowestNonlinearPerformanceBuffer, + CpcInfo->LowestNonlinearPerformanceInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->LowestPerformanceBuffer, + CpcInfo->LowestPerformanceInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->GuaranteedPerformanceRegis= ter, CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->DesiredPerformanceRegister= , CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->MinimumPerformanceRegister= , CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->MaximumPerformanceRegister= , CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->PerformanceReductionTolera= nceRegister, CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->TimeWindowRegister, CpcPac= kage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->CounterWraparoundTimeBuffer, + CpcInfo->CounterWraparoundTimeInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->ReferencePerformanceCounte= rRegister, CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->DeliveredPerformanceCounte= rRegister, CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->PerformanceLimitedRegister= , CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->CPPCEnableRegister, CpcPac= kage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->AutonomousSelectionEnableBuffer, + CpcInfo->AutonomousSelectionEnableInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->AutonomousActivityWindowRe= gister, CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterToPackage (&CpcInfo->EnergyPerformancePreferenc= eRegister, CpcPackage); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->ReferencePerformanceBuffer, + CpcInfo->ReferencePerformanceInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->LowestFrequencyBuffer, + CpcInfo->LowestFrequencyInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D AmlAddRegisterOrIntegerToPackage ( + &CpcInfo->NominalFrequencyBuffer, + CpcInfo->NominalFrequencyInteger, + CpcPackage + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status =3D LinkNode (CpcNode, ParentNode, NewCpcNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + return Status; + +error_handler: + AmlDeleteTree ((AML_NODE_HANDLE)CpcNode); + return Status; +} --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#94132): https://edk2.groups.io/g/devel/message/94132 Mute This Topic: https://groups.io/mt/93857390/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-