From nobody Mon Apr 29 09:37:37 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+40979+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+40979+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1558170093; cv=none; d=zoho.com; s=zohoarc; b=MwPsBt3x6x1T3FXWTCSgBocoodqBBKDb7fN21k9kcjawCjD0THGKAKnTTVJiRpkNDM4yx+nZxu2x7Vub4AGYP5i/uIyBz6S3j/A0cGhi/TrHtTxWv0vj127hGiNuzxh6vxpwYS+SOlt5g6FZMcNaP3QxVNH8OdpIc8Jj98uduuo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1558170093; h=Content-Transfer-Encoding:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To:ARC-Authentication-Results; bh=s+iuSUouZCJeI29hnEpd+44Sn7ijQwVWIabPEZmafUY=; b=eDCmsziZleohz7EVppXxz2MWGKuVdGbzBw7T5UajD9DMqje7UOsx2v8A7GnwVbRAWJOB8BL9ZatID7gIW995uYaGuq5xiQyw4NbqpKWXGlw1BJP+ZG0p5F+SvtwAgmcdjML7vPwXeCj8HttZgz/+TwpDgKDE26bWn1Yj6dLFqyY= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+40979+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1558170093352661.1613286892119; Sat, 18 May 2019 02:01:33 -0700 (PDT) Return-Path: X-Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by groups.io with SMTP; Sat, 18 May 2019 01:58:32 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 May 2019 01:58:30 -0700 X-ExtLoop1: 1 X-Received: from shwdeopenpsi068.ccr.corp.intel.com ([10.239.158.73]) by fmsmga008.fm.intel.com with ESMTP; 18 May 2019 01:58:29 -0700 From: "Zeng, Star" To: devel@edk2.groups.io Cc: Star Zeng , Laszlo Ersek , Eric Dong , Ruiyu Ni , Chandana Kumar , Kevin Li Subject: [edk2-devel] [PATCH] UefiCpuPkg CpuCommFeaturesLib: Reduce to set MSR_IA32_CLOCK_MODULATION Date: Sat, 18 May 2019 16:58:27 +0800 Message-Id: <20190518085827.78084-1-star.zeng@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: 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,star.zeng@intel.com Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1558170092; bh=NaSjRF1qj0AY2NYc/F5ro2BzAjXzllED9kUpMQnAgY4=; h=Cc:Date:From:Reply-To:Subject:To; b=Z97d0zAfglIuEeOw70yb3F9ln2hLN0VSQQ8xWwivFG+M0xoRpG4whYty+ImZRWZap7G Y6WR3OvoSKhPoTYQUVK8qW6xoO4xk3d8wL9KCmtL9Z8KzfIaMynx++Q4i87CExT76ezq/ GSKRUv8DngwsZmvcpNDZcspnOMPgVSr/n8E= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1810 This patch covers two problems. 1. Current code gets CPUID_THERMAL_POWER_MANAGEMENT in ClockModulationInitialize() and uses its ECMD bit for all processors. But ClockModulationInitialize() is only executed by BSP, that means the bit is just for BSP. It may have no functionality issue as all processors may have same bit value in a great possibility. But for good practice, the code should get CPUID_THERMAL_POWER_MANAGEMENT in ClockModulationSupport (executed by all processors), and then use them in ClockModulationInitialize() for all processors. We can see that Aesni.c (and others) have used this good practice. 2. Current code uses 3 CPU_REGISTER_TABLE_WRITE_FIELD for MSR_IA32_CLOCK_MODULATION in ClockModulationInitialize(), they can be reduced to 1 CPU_REGISTER_TABLE_WRITE64 by getting MSR_IA32_CLOCK_MODULATION for all processors in ClockModulationSupport() and then update fields for register table write in ClockModulationInitialize(). We may argue that there may be more times of MSR_IA32_CLOCK_MODULATION getting. But actually the times of MSR_IA32_CLOCK_MODULATION getting could be also reduced. The reason is in ProgramProcessorRegister() of CpuFeaturesInitialize.c, AsmMsrBitFieldWrite64 (read then write) will be used for CPU_REGISTER_TABLE_WRITE_FIELD, and AsmWriteMsr64 (write) will be used for CPU_REGISTER_TABLE_WRITE64. The times of MSR_IA32_CLOCK_MODULATION getting & setting for one thread: Without the patch: 3 getting (3 AsmMsrBitFieldWrite64 for 3 CPU_REGISTER_TABLE_WRITE_FIELD) 3 setting (3 AsmMsrBitFieldWrite64 for 3 CPU_REGISTER_TABLE_WRITE_FIELD) With the patch: One getting (1 AsmReadMsr64 in ClockModulationSupport) One setting (1 AsmWriteMsr64 for 1 CPU_REGISTER_TABLE_WRITE64) Cc: Laszlo Ersek Cc: Eric Dong Cc: Ruiyu Ni Cc: Chandana Kumar Cc: Kevin Li Signed-off-by: Star Zeng --- .../CpuCommonFeaturesLib/ClockModulation.c | 93 ++++++++++++++----- .../CpuCommonFeaturesLib/CpuCommonFeatures.h | 15 +++ .../CpuCommonFeaturesLib.c | 2 +- 3 files changed, 84 insertions(+), 26 deletions(-) diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/ClockModulation.c b/Ue= fiCpuPkg/Library/CpuCommonFeaturesLib/ClockModulation.c index 614768587501..15a4396b6b15 100644 --- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/ClockModulation.c +++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/ClockModulation.c @@ -1,13 +1,40 @@ /** @file Clock Modulation feature. =20 - Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ =20 #include "CpuCommonFeatures.h" =20 +typedef struct { + CPUID_THERMAL_POWER_MANAGEMENT_EAX ThermalPowerManagementEax; + MSR_IA32_CLOCK_MODULATION_REGISTER ClockModulation; +} CLOCK_MODULATION_CONFIG_DATA; + +/** + Prepares for the data used by CPU feature detection and initialization. + + @param[in] NumberOfProcessors The number of CPUs in the platform. + + @return Pointer to a buffer of CPU related configuration data. + + @note This service could be called by BSP only. +**/ +VOID * +EFIAPI +ClockModulationGetConfigData ( + IN UINTN NumberOfProcessors + ) +{ + UINT32 *ConfigData; + + ConfigData =3D AllocateZeroPool (sizeof (CLOCK_MODULATION_CONFIG_DATA) *= NumberOfProcessors); + ASSERT (ConfigData !=3D NULL); + return ConfigData; +} + /** Detects if Clock Modulation feature supported on current processor. =20 @@ -32,7 +59,26 @@ ClockModulationSupport ( IN VOID *ConfigData OPTIONAL ) { - return (CpuInfo->CpuIdVersionInfoEdx.Bits.ACPI =3D=3D 1); + CLOCK_MODULATION_CONFIG_DATA *ClockModulationConfigData; + CPUID_THERMAL_POWER_MANAGEMENT_EAX *ThermalPowerManagementEax; + MSR_IA32_CLOCK_MODULATION_REGISTER *ClockModulation; + + if (CpuInfo->CpuIdVersionInfoEdx.Bits.ACPI =3D=3D 1) { + ClockModulationConfigData =3D (CLOCK_MODULATION_CONFIG_DATA *) ConfigD= ata; + ASSERT (ClockModulationConfigData !=3D NULL); + ThermalPowerManagementEax =3D &ClockModulationConfigData[ProcessorNumb= er].ThermalPowerManagementEax; + ClockModulation =3D &ClockModulationConfigData[ProcessorNumber].ClockM= odulation; + AsmCpuid ( + CPUID_THERMAL_POWER_MANAGEMENT, + &ThermalPowerManagementEax->Uint32, + NULL, + NULL, + NULL + ); + ClockModulation->Uint64 =3D AsmReadMsr64 (MSR_IA32_CLOCK_MODULATION); + return TRUE; + } + return FALSE; } =20 /** @@ -61,34 +107,31 @@ ClockModulationInitialize ( IN BOOLEAN State ) { - CPUID_THERMAL_POWER_MANAGEMENT_EAX ThermalPowerManagementEax; - AsmCpuid (CPUID_THERMAL_POWER_MANAGEMENT, &ThermalPowerManagementEax.Uin= t32, NULL, NULL, NULL); + CLOCK_MODULATION_CONFIG_DATA *ClockModulationConfigData; + CPUID_THERMAL_POWER_MANAGEMENT_EAX *ThermalPowerManagementEax; + MSR_IA32_CLOCK_MODULATION_REGISTER *ClockModulation; =20 - CPU_REGISTER_TABLE_WRITE_FIELD ( - ProcessorNumber, - Msr, - MSR_IA32_CLOCK_MODULATION, - MSR_IA32_CLOCK_MODULATION_REGISTER, - Bits.OnDemandClockModulationDutyCycle, - PcdGet8 (PcdCpuClockModulationDutyCycle) >> 1 - ); - if (ThermalPowerManagementEax.Bits.ECMD =3D=3D 1) { - CPU_REGISTER_TABLE_WRITE_FIELD ( - ProcessorNumber, - Msr, - MSR_IA32_CLOCK_MODULATION, - MSR_IA32_CLOCK_MODULATION_REGISTER, - Bits.ExtendedOnDemandClockModulationDutyCycle, - PcdGet8 (PcdCpuClockModulationDutyCycle) & BIT0 - ); + ClockModulationConfigData =3D (CLOCK_MODULATION_CONFIG_DATA *) ConfigDat= a; + ASSERT (ClockModulationConfigData !=3D NULL); + ThermalPowerManagementEax =3D &ClockModulationConfigData[ProcessorNumber= ].ThermalPowerManagementEax; + ClockModulation =3D &ClockModulationConfigData[ProcessorNumber].ClockMod= ulation; + + if (State) { + ClockModulation->Bits.OnDemandClockModulationEnable =3D 1; + ClockModulation->Bits.OnDemandClockModulationDutyCycle =3D PcdGet8 (Pc= dCpuClockModulationDutyCycle) >> 1; + if (ThermalPowerManagementEax->Bits.ECMD =3D=3D 1) { + ClockModulation->Bits.ExtendedOnDemandClockModulationDutyCycle =3D P= cdGet8 (PcdCpuClockModulationDutyCycle) & BIT0; + } + } else { + ClockModulation->Bits.OnDemandClockModulationEnable =3D 0; } - CPU_REGISTER_TABLE_WRITE_FIELD ( + + CPU_REGISTER_TABLE_WRITE64 ( ProcessorNumber, Msr, MSR_IA32_CLOCK_MODULATION, - MSR_IA32_CLOCK_MODULATION_REGISTER, - Bits.OnDemandClockModulationEnable, - (State) ? 1 : 0 + ClockModulation->Uint64 ); + return RETURN_SUCCESS; } diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h b/= UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h index af2fc41f759a..9e784e916a85 100644 --- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h +++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h @@ -87,6 +87,21 @@ AesniInitialize ( IN BOOLEAN State ); =20 +/** + Prepares for the data used by CPU feature detection and initialization. + + @param[in] NumberOfProcessors The number of CPUs in the platform. + + @return Pointer to a buffer of CPU related configuration data. + + @note This service could be called by BSP only. +**/ +VOID * +EFIAPI +ClockModulationGetConfigData ( + IN UINTN NumberOfProcessors + ); + /** Detects if Clock Modulation feature supported on current processor. =20 diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.c= b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.c index 738b57dc87f9..b93b898cc959 100644 --- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.c +++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.c @@ -47,7 +47,7 @@ CpuCommonFeaturesLibConstructor ( if (IsCpuFeatureSupported (CPU_FEATURE_ACPI)) { Status =3D RegisterCpuFeature ( "ACPI", - NULL, + ClockModulationGetConfigData, ClockModulationSupport, ClockModulationInitialize, CPU_FEATURE_ACPI, --=20 2.21.0.windows.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 (#40979): https://edk2.groups.io/g/devel/message/40979 Mute This Topic: https://groups.io/mt/31663527/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-