From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id A0EDB941AAB for ; Thu, 25 Jan 2024 15:19:26 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=9m8rANL3WJdS4jzekICKt4o5pRNkl5gUgCtXpvCYf6o=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1706195965; v=1; b=sBSqxyCRa1NzM4V02jvo5IxDfw2kohY4uV/QG208pDVgKBnLsfkwfNAoFtMCA+FuZHx8R8RV zrPPfk1K0fa4PCWzaZt6MLyco+4EahD8jcmbsedeFKCYR2+92MJ8UheXq+eKilRKgXkIkkcM2t7 jod0i/Szwqs59TcI0cEBS8C4= X-Received: by 127.0.0.2 with SMTP id 89odYY7687511xsDhP6gkQ92; Thu, 25 Jan 2024 07:19:25 -0800 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.20315.1706195964812568583 for ; Thu, 25 Jan 2024 07:19:24 -0800 X-Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 0771F1476; Thu, 25 Jan 2024 07:20:09 -0800 (PST) X-Received: from e126645.arm.com (unknown [10.57.47.22]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 676A03F5A1; Thu, 25 Jan 2024 07:19:23 -0800 (PST) From: "PierreGondois" To: devel@edk2.groups.io Cc: Sami Mujawar , Leif Lindholm , Ard Biesheuvel , Pierre Gondois Subject: [edk2-devel] [PATCH v5 09/11] DynamicTablesPkg: Add DynamicTablesScmiInfoLib Date: Thu, 25 Jan 2024 16:18:48 +0100 Message-Id: <20240125151850.620749-10-pierre.gondois@arm.com> In-Reply-To: <20240125151850.620749-1-pierre.gondois@arm.com> References: <20240125151850.620749-1-pierre.gondois@arm.com> MIME-Version: 1.0 Precedence: Bulk 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,pierre.gondois@arm.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: OBGDDdshaobINBBI8mX96OeFx7686176AA= Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=sBSqxyCR; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=arm.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io The SCP holds some power information that could be advertised through the _CPC object. The communication with the SCP is done through SCMI protocols (c.f. ArmScmiDxe). Use the SCMI protocols to query information and feed it to the DynamicTablesPkg. Acked-by: Leif Lindholm Signed-off-by: Pierre Gondois --- DynamicTablesPkg/DynamicTables.dsc.inc | 3 + DynamicTablesPkg/DynamicTablesPkg.dec | 4 + DynamicTablesPkg/DynamicTablesPkg.dsc | 3 + .../Library/DynamicTablesScmiInfoLib.h | 33 ++ .../DynamicTablesScmiInfoLib.c | 297 ++++++++++++++++++ .../DynamicTablesScmiInfoLib.inf | 31 ++ 6 files changed, 371 insertions(+) create mode 100644 DynamicTablesPkg/Include/Library/DynamicTablesScmiInfoL= ib.h create mode 100644 DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/Dynam= icTablesScmiInfoLib.c create mode 100644 DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/Dynam= icTablesScmiInfoLib.inf diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/Dyna= micTables.dsc.inc index 8c99574097ad..19ca62d6a85c 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -21,6 +21,9 @@ [LibraryClasses.common] TableHelperLib|DynamicTablesPkg/Library/Common/TableHelperLib/TableHelpe= rLib.inf=0D SmbiosStringTableLib|DynamicTablesPkg/Library/Common/SmbiosStringTableLi= b/SmbiosStringTableLib.inf=0D =0D +[LibraryClasses.AARCH64]=0D + DynamicTablesScmiInfoLib|DynamicTablesPkg/Library/DynamicTablesScmiInfoL= ib/DynamicTablesScmiInfoLib.inf=0D +=0D [Components.common]=0D #=0D # Dynamic Tables Manager Dxe=0D diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/Dynam= icTablesPkg.dec index cfbcbb9569f1..25355ace884b 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -42,6 +42,10 @@ [LibraryClasses] ## @libraryclass Defines a set of SMBIOS string helper methods.=0D SmbiosStringTableLib|Include/Library/SmbiosStringTableLib.h=0D =0D +[LibraryClasses.AARCH64]=0D + ## @libraryclass Defines a set of APIs to populate CmObj using SCMI.=0D + DynamicTablesScmiInfoLib|Include/Library/DynamicTablesScmiInfoLib.h=0D +=0D [Protocols]=0D # Configuration Manager Protocol GUID=0D gEdkiiConfigurationManagerProtocolGuid =3D { 0xd85a4835, 0x5a82, 0x4894,= { 0xac, 0x2, 0x70, 0x6f, 0x43, 0xd5, 0x97, 0x8e } }=0D diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/Dynam= icTablesPkg.dsc index 2f35ac82f20b..cf06f0731a23 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -51,6 +51,9 @@ [Components.common] [Components.ARM, Components.AARCH64]=0D DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf=0D =0D +[Components.AARCH64]=0D + DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiInfoL= ib.inf=0D +=0D [BuildOptions]=0D *_*_*_CC_FLAGS =3D -D DISABLE_NEW_DEPRECATED_INTERFACES=0D =0D diff --git a/DynamicTablesPkg/Include/Library/DynamicTablesScmiInfoLib.h b/= DynamicTablesPkg/Include/Library/DynamicTablesScmiInfoLib.h new file mode 100644 index 000000000000..ff6b47d51fe8 --- /dev/null +++ b/DynamicTablesPkg/Include/Library/DynamicTablesScmiInfoLib.h @@ -0,0 +1,33 @@ +/** @file=0D + Arm SCMI Info Library.=0D +=0D + Copyright (c) 2022 - 2023, Arm Limited. All rights reserved.
=0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +**/=0D +=0D +#ifndef ARM_SCMI_INFO_LIB_H_=0D +#define ARM_SCMI_INFO_LIB_H_=0D +=0D +#include =0D +=0D +/** Populate a AML_CPC_INFO object based on SCMI information.=0D +=0D + @param[in] DomainId Identifier for the performance domain.=0D + @param[out] CpcInfo If success, this structure was populated from=0D + information queried to the SCP.=0D +=0D + @retval EFI_SUCCESS Success.=0D + @retval EFI_DEVICE_ERROR Device error.=0D + @retval EFI_INVALID_PARAMETER Invalid parameter.=0D + @retval EFI_TIMEOUT Time out.=0D + @retval EFI_UNSUPPORTED Unsupported.=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +DynamicTablesScmiInfoGetFastChannel (=0D + IN UINT32 DomainId,=0D + OUT AML_CPC_INFO *CpcInfo=0D + );=0D +=0D +#endif // ARM_SCMI_INFO_LIB_H_=0D diff --git a/DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTable= sScmiInfoLib.c b/DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicT= ablesScmiInfoLib.c new file mode 100644 index 000000000000..da5bc1895778 --- /dev/null +++ b/DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiIn= foLib.c @@ -0,0 +1,297 @@ +/** @file=0D + Arm SCMI Info Library.=0D +=0D + Copyright (c) 2022 - 2023, Arm Limited. All rights reserved.
=0D +=0D + Arm Functional Fixed Hardware Specification:=0D + - https://developer.arm.com/documentation/den0048/latest/=0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +**/=0D +=0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +=0D +/** Arm FFH registers=0D +=0D + Cf. Arm Functional Fixed Hardware Specification=0D + s3.2 Performance management and Collaborative Processor Performance Cont= rol=0D +*/=0D +#define ARM_FFH_DELIVERED_PERF_COUNTER_REGISTER 0x0=0D +#define ARM_FFH_REFERENCE_PERF_COUNTER_REGISTER 0x1=0D +=0D +/// Arm SCMI performance protocol.=0D +STATIC SCMI_PERFORMANCE_PROTOCOL *ScmiPerfProtocol;=0D +=0D +/** Arm SCMI Info Library constructor.=0D +=0D + @param ImageHandle Image of the loaded driver.=0D + @param SystemTable Pointer to the System Table.=0D +=0D + @retval EFI_SUCCESS Success.=0D + @retval EFI_DEVICE_ERROR Device error.=0D + @retval EFI_INVALID_PARAMETER Invalid parameter.=0D + @retval EFI_NOT_FOUND Not Found=0D + @retval EFI_TIMEOUT Timeout.=0D + @retval EFI_UNSUPPORTED Unsupported.=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +DynamicTablesScmiInfoLibConstructor (=0D + IN EFI_HANDLE ImageHandle,=0D + IN EFI_SYSTEM_TABLE *SystemTable=0D + )=0D +{=0D + EFI_STATUS Status;=0D + UINT32 Version;=0D +=0D + Status =3D gBS->LocateProtocol (=0D + &gArmScmiPerformanceProtocolGuid,=0D + NULL,=0D + (VOID **)&ScmiPerfProtocol=0D + );=0D + if (EFI_ERROR (Status)) {=0D + return Status;=0D + }=0D +=0D + Status =3D ScmiPerfProtocol->GetVersion (ScmiPerfProtocol, &Version);=0D + if (EFI_ERROR (Status)) {=0D + return Status;=0D + }=0D +=0D + // FastChannels were added in SCMI v2.0 spec.=0D + if (Version < PERFORMANCE_PROTOCOL_VERSION_V2) {=0D + DEBUG ((=0D + DEBUG_ERROR,=0D + "DynamicTablesScmiInfoLib requires SCMI version > 2.0\n"=0D + ));=0D + return EFI_UNSUPPORTED;=0D + }=0D +=0D + return Status;=0D +}=0D +=0D +/** Get the OPPs/performance states of a power domain.=0D +=0D + This function is a wrapper around the SCMI PERFORMANCE_DESCRIBE_LEVELS=0D + command. The list of discrete performance states is returned in a buffer= =0D + that must be freed by the caller.=0D +=0D + @param[in] DomainId Identifier for the performance domain.=0D + @param[out] LevelArray If success, pointer to the list of list of=0D + performance state. This memory must be freed= by=0D + the caller.=0D + @param[out] LevelArrayCount If success, contains the number of states in= =0D + LevelArray.=0D +=0D + @retval EFI_SUCCESS Success.=0D + @retval EFI_DEVICE_ERROR Device error.=0D + @retval EFI_INVALID_PARAMETER Invalid parameter.=0D + @retval EFI_TIMEOUT Time out.=0D + @retval EFI_UNSUPPORTED Unsupported.=0D +**/=0D +STATIC=0D +EFI_STATUS=0D +EFIAPI=0D +DynamicTablesScmiInfoDescribeLevels (=0D + IN UINT32 DomainId,=0D + OUT SCMI_PERFORMANCE_LEVEL **LevelArray,=0D + OUT UINT32 *LevelArrayCount=0D + )=0D +{=0D + EFI_STATUS Status;=0D + SCMI_PERFORMANCE_LEVEL *Array;=0D + UINT32 Count;=0D + UINT32 Size;=0D +=0D + if ((ScmiPerfProtocol =3D=3D NULL) ||=0D + (LevelArray =3D=3D NULL) ||=0D + (LevelArrayCount =3D=3D NULL))=0D + {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + // First call to get the number of levels.=0D + Size =3D 0;=0D + Status =3D ScmiPerfProtocol->DescribeLevels (=0D + ScmiPerfProtocol,=0D + DomainId,=0D + &Count,=0D + &Size,=0D + NULL=0D + );=0D + if (Status !=3D EFI_BUFFER_TOO_SMALL) {=0D + // EFI_SUCCESS is not a valid option.=0D + if (Status =3D=3D EFI_SUCCESS) {=0D + return EFI_INVALID_PARAMETER;=0D + } else {=0D + return Status;=0D + }=0D + }=0D +=0D + Array =3D AllocateZeroPool (Size);=0D + if (Array =3D=3D NULL) {=0D + return EFI_OUT_OF_RESOURCES;=0D + }=0D +=0D + // Second call to get the descriptions of the levels.=0D + Status =3D ScmiPerfProtocol->DescribeLevels (=0D + ScmiPerfProtocol,=0D + DomainId,=0D + &Count,=0D + &Size,=0D + Array=0D + );=0D + if (EFI_ERROR (Status)) {=0D + return Status;=0D + }=0D +=0D + *LevelArray =3D Array;=0D + *LevelArrayCount =3D Count;=0D +=0D + return Status;=0D +}=0D +=0D +/** Populate a AML_CPC_INFO object based on SCMI information.=0D +=0D + @param[in] DomainId Identifier for the performance domain.=0D + @param[out] CpcInfo If success, this structure was populated from=0D + information queried to the SCP.=0D +=0D + @retval EFI_SUCCESS Success.=0D + @retval EFI_DEVICE_ERROR Device error.=0D + @retval EFI_INVALID_PARAMETER Invalid parameter.=0D + @retval EFI_TIMEOUT Time out.=0D + @retval EFI_UNSUPPORTED Unsupported.=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +DynamicTablesScmiInfoGetFastChannel (=0D + IN UINT32 DomainId,=0D + OUT AML_CPC_INFO *CpcInfo=0D + )=0D +{=0D + EFI_STATUS Status;=0D + SCMI_PERFORMANCE_FASTCHANNEL FcLevelGet;=0D + SCMI_PERFORMANCE_FASTCHANNEL FcLimitsSet;=0D + SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES DomainAttributes;=0D +=0D + SCMI_PERFORMANCE_LEVEL *LevelArray;=0D + UINT32 LevelCount;=0D +=0D + UINT64 FcLevelGetAddr;=0D + UINT64 FcLimitsMaxSetAddr;=0D + UINT64 FcLimitsMinSetAddr;=0D +=0D + if ((ScmiPerfProtocol =3D=3D NULL) ||=0D + (CpcInfo =3D=3D NULL))=0D + {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + Status =3D ScmiPerfProtocol->DescribeFastchannel (=0D + ScmiPerfProtocol,=0D + DomainId,=0D + ScmiMessageIdPerformanceLevelSet,=0D + &FcLevelGet=0D + );=0D + if (EFI_ERROR (Status)) {=0D + return Status;=0D + }=0D +=0D + Status =3D ScmiPerfProtocol->DescribeFastchannel (=0D + ScmiPerfProtocol,=0D + DomainId,=0D + ScmiMessageIdPerformanceLimitsSet,=0D + &FcLimitsSet=0D + );=0D + if (EFI_ERROR (Status)) {=0D + return Status;=0D + }=0D +=0D + Status =3D ScmiPerfProtocol->GetDomainAttributes (=0D + ScmiPerfProtocol,=0D + DomainId,=0D + &DomainAttributes=0D + );=0D + if (EFI_ERROR (Status)) {=0D + return Status;=0D + }=0D +=0D + Status =3D DynamicTablesScmiInfoDescribeLevels (DomainId, &LevelArray, &= LevelCount);=0D + if (EFI_ERROR (Status)) {=0D + return Status;=0D + }=0D +=0D + /* Do some safety checks.=0D + Only support FastChannels (and not doorbells) as this is=0D + the only mechanism supported by SCP.=0D + FcLimits[Get|Set] require 2 UINT32 values (max, then min) and=0D + FcLimits[Get|Set] require 1 UINT32 value (level).=0D + */=0D + if ((FcLevelGet.ChanSize !=3D sizeof (UINT32)) ||=0D + ((FcLevelGet.Attributes & SCMI_PERF_FC_ATTRIB_HAS_DOORBELL) =3D=3D=0D + SCMI_PERF_FC_ATTRIB_HAS_DOORBELL) ||=0D + (FcLimitsSet.ChanSize !=3D 2 * sizeof (UINT32)) ||=0D + ((FcLimitsSet.Attributes & SCMI_PERF_FC_ATTRIB_HAS_DOORBELL) =3D=3D= =0D + SCMI_PERF_FC_ATTRIB_HAS_DOORBELL))=0D + {=0D + Status =3D EFI_INVALID_PARAMETER;=0D + goto exit_handler;=0D + }=0D +=0D + FcLevelGetAddr =3D ((UINT64)FcLevelGet.ChanAddrHigh << 32) |=0D + FcLevelGet.ChanAddrLow;=0D + FcLimitsMaxSetAddr =3D ((UINT64)FcLimitsSet.ChanAddrHigh << 32) |=0D + FcLimitsSet.ChanAddrLow;=0D + FcLimitsMinSetAddr =3D FcLimitsMaxSetAddr + 0x4;=0D +=0D + CpcInfo->Revision =3D EFI_ACPI_6_5_AML_CPC_REVI= SION;=0D + CpcInfo->HighestPerformanceInteger =3D LevelArray[LevelCount - 1= ].Level;=0D + CpcInfo->NominalPerformanceInteger =3D DomainAttributes.Sustaine= dPerfLevel;=0D + CpcInfo->LowestNonlinearPerformanceInteger =3D LevelArray[0].Level;=0D + CpcInfo->LowestPerformanceInteger =3D LevelArray[0].Level;=0D +=0D + CpcInfo->DesiredPerformanceRegister.AddressSpaceId =3D EFI_ACPI_6_5_S= YSTEM_MEMORY;=0D + CpcInfo->DesiredPerformanceRegister.RegisterBitWidth =3D 32;=0D + CpcInfo->DesiredPerformanceRegister.RegisterBitOffset =3D 0;=0D + CpcInfo->DesiredPerformanceRegister.AccessSize =3D EFI_ACPI_6_5_D= WORD;=0D + CpcInfo->DesiredPerformanceRegister.Address =3D FcLevelGetAddr= ;=0D +=0D + CpcInfo->MinimumPerformanceRegister.AddressSpaceId =3D EFI_ACPI_6_5_S= YSTEM_MEMORY;=0D + CpcInfo->MinimumPerformanceRegister.RegisterBitWidth =3D 32;=0D + CpcInfo->MinimumPerformanceRegister.RegisterBitOffset =3D 0;=0D + CpcInfo->MinimumPerformanceRegister.AccessSize =3D EFI_ACPI_6_5_D= WORD;=0D + CpcInfo->MinimumPerformanceRegister.Address =3D FcLimitsMinSet= Addr;=0D +=0D + CpcInfo->MaximumPerformanceRegister.AddressSpaceId =3D EFI_ACPI_6_5_S= YSTEM_MEMORY;=0D + CpcInfo->MaximumPerformanceRegister.RegisterBitWidth =3D 32;=0D + CpcInfo->MaximumPerformanceRegister.RegisterBitOffset =3D 0;=0D + CpcInfo->MaximumPerformanceRegister.AccessSize =3D EFI_ACPI_6_5_D= WORD;=0D + CpcInfo->MaximumPerformanceRegister.Address =3D FcLimitsMaxSet= Addr;=0D +=0D + CpcInfo->ReferencePerformanceCounterRegister.AddressSpaceId =3D EFI_A= CPI_6_5_FUNCTIONAL_FIXED_HARDWARE;=0D + CpcInfo->ReferencePerformanceCounterRegister.RegisterBitWidth =3D 0x40;= =0D + CpcInfo->ReferencePerformanceCounterRegister.RegisterBitOffset =3D 0;=0D + CpcInfo->ReferencePerformanceCounterRegister.AccessSize =3D ARM_F= FH_REFERENCE_PERF_COUNTER_REGISTER;=0D + CpcInfo->ReferencePerformanceCounterRegister.Address =3D 0x4;= =0D +=0D + CpcInfo->DeliveredPerformanceCounterRegister.AddressSpaceId =3D EFI_A= CPI_6_5_FUNCTIONAL_FIXED_HARDWARE;=0D + CpcInfo->DeliveredPerformanceCounterRegister.RegisterBitWidth =3D 0x40;= =0D + CpcInfo->DeliveredPerformanceCounterRegister.RegisterBitOffset =3D 0;=0D + CpcInfo->DeliveredPerformanceCounterRegister.AccessSize =3D ARM_F= FH_DELIVERED_PERF_COUNTER_REGISTER;=0D + CpcInfo->DeliveredPerformanceCounterRegister.Address =3D 0x4;= =0D +=0D + // SCMI should advertise performance values on a unified scale. So frequ= ency=0D + // values are not available. LowestFrequencyInteger and=0D + // NominalFrequencyInteger are populated in the ConfigurationManager.=0D +=0D +exit_handler:=0D + FreePool (LevelArray);=0D + return Status;=0D +}=0D diff --git a/DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTable= sScmiInfoLib.inf b/DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/Dynami= cTablesScmiInfoLib.inf new file mode 100644 index 000000000000..d49277f82bc3 --- /dev/null +++ b/DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiIn= foLib.inf @@ -0,0 +1,31 @@ +## @file=0D +# Arm SCMI Info Library.=0D +#=0D +# Copyright (c) 2022 - 2023, Arm Limited. All rights reserved.=0D +#=0D +# SPDX-License-Identifier: BSD-2-Clause-Patent=0D +##=0D +=0D +[Defines]=0D + INF_VERSION =3D 0x0001001B=0D + BASE_NAME =3D DynamicTablesScmiInfoLib=0D + FILE_GUID =3D 1A7CDB04-9FFC-40DA-A87C-A5ACADAF8136=0D + VERSION_STRING =3D 1.0=0D + MODULE_TYPE =3D DXE_DRIVER=0D + LIBRARY_CLASS =3D DynamicTablesScmiInfoLib=0D + CONSTRUCTOR =3D DynamicTablesScmiInfoLibConstructor=0D +=0D +[Sources]=0D + DynamicTablesScmiInfoLib.c=0D +=0D +[Packages]=0D + ArmPkg/ArmPkg.dec=0D + DynamicTablesPkg/DynamicTablesPkg.dec=0D + EmbeddedPkg/EmbeddedPkg.dec=0D + MdePkg/MdePkg.dec=0D +=0D +[Protocols]=0D + gArmScmiPerformanceProtocolGuid ## CONSUMES=0D +=0D +[Depex]=0D + gArmScmiPerformanceProtocolGuid=0D --=20 2.25.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#114419): https://edk2.groups.io/g/devel/message/114419 Mute This Topic: https://groups.io/mt/103955508/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-