diff options
Diffstat (limited to 'Silicon/Intel/PurleySktPkg/Include/Library/CpuPpmLib.h')
-rw-r--r-- | Silicon/Intel/PurleySktPkg/Include/Library/CpuPpmLib.h | 706 |
1 files changed, 706 insertions, 0 deletions
diff --git a/Silicon/Intel/PurleySktPkg/Include/Library/CpuPpmLib.h b/Silicon/Intel/PurleySktPkg/Include/Library/CpuPpmLib.h new file mode 100644 index 0000000000..22f312f80b --- /dev/null +++ b/Silicon/Intel/PurleySktPkg/Include/Library/CpuPpmLib.h @@ -0,0 +1,706 @@ +/** @file + +Copyright (c) 2018, Intel Corporation. All rights reserved.<BR> +This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef _CPU_PPM_LIB_H_ +#define _CPU_PPM_LIB_H_ + + +#include <PiDxe.h> +#include <Protocol/CpuCsrAccess.h> +#include <Library/TimerLib.h> +#include "SysHost.h" +#include "UncoreCommonIncludes.h" + +#define NUM_CST_LAT_MSR 3 + +// +// Value definition for CpuPCPSCtrl +// +#define PCD_CPU_PCPS_SINGLEPCTL 0x00000004 +#define PCD_CPU_PCPS_SPD 0x00000008 +#define PCD_CPU_PCPS_PSTATEDOMAIN 0x00000010 + +// Bits configuration for PcdAdvPwrMgtFlags +#define PCD_CPU_PKG_CST_ENTRY_VAL_CTL 0x00000001 +#define PCD_CPU_SAPM_CTL_VAL_CTL 0x00000002 +#define PCD_CPU_SKIP_PKG_CST_ENTRY 0x00000004 +#define PCD_CPU_SW_LTR_OVRD_CTL 0x00000008 +#define PCD_CPU_PRI_PLN_CURR_CFG_CTL 0x00000010 +#define PCD_CPU_CURRENT_CONFIG 0x00000020 +#define PCU_CPU_EFFICIENT_BOOT 0x00000040 +#define CPU_MSR_LOCK 0x00000080 +#define MPLL_OFF_ENA_AUTO 0x00000100 +#define DYNAMIC_L1_DISABLE 0x00000200 +#define SPT_PCH_WORKAROUND 0x00000400 +#define TURBO_LIMIT_CSR_LOCK 0x00000800 +#define VCCSA_VCCIO_DISABLE 0x00001000 + + +// PCU_CR_PMAX_CONFIG bit definition +#define PCU_CR_PMAX_CFG_OFFSET_SHIFT 0 +#define PCU_CR_PMAX_CFG_LOCK_SHIFT 31 +#define PCU_CR_PMAX_CFG_OFFSET (0x1f << PCU_CR_PMAX_CFG_OFFSET_SHIFT) // Bits 4:0 +#define USER_PMAX_USE_OFFSET_TABLE BIT5 +#define USER_PMAX_NEGATIVE_BIT BIT4 +#define USER_PMAX_VALUE_BIT_MASK 0x0F // Bits 3:0 +#define PCU_CR_PMAX_CFG_LOCK (0x1 << PCU_CR_PMAX_CFG_LOCK_SHIFT) // Bit 31 + +// DYNAMIC_PERF_POWER_CTL bit definition +#define EEP_L_OVERRIDE_SHIFT 26 // Bit 29:26 +#define EEP_L_OVERRIDE_ENABLE_SHIFT 25 // Bit 25 +#define I_TURBO_OVERRIDE_ENABLE_SHIFT 24 // Bit 24 +#define CST_DEMOTION_OVERRIDE_ENABLE_SHIFT 23 // Bit 23 +#define TURBO_DEMOTION_OVERRIDE_ENABLE_SHIFT 22 // Bit 22 +#define UNCORE_PERF_PLIMIT_OVERRIDE_ENABLE_SHIFT 20 // Bit 20 +#define EET_OVERRIDE_ENABLE_SHIFT 18 // Bit 18 +#define IO_BW_PLIMIT_OVERRIDE_ENABLE_SHIFT 15 // Bit 15 +#define IMC_APM_OVERRIDE_ENABLE_SHIFT 10 // Bit 10 +#define IOM_APM_OVERRIDE_ENABLE_SHIFT 5 // Bit 5 +#define QPI_APM_OVERRIDE_ENABLE_SHIFT 0 // Bit 0 +#define EEP_L_OVERRIDE (0xf << EEP_L_OVERRIDE_SHIFT) // Bit 29:26 +#define EEP_L_OVERRIDE_ENABLE (1 << EEP_L_OVERRIDE_ENABLE_SHIFT) // Bit 25 +#define I_TURBO_OVERRIDE_ENABLE (1 << I_TURBO_OVERRIDE_ENABLE_SHIFT) // Bit 24 +#define CST_DEMOTION_OVERRIDE_ENABLE (1 << CST_DEMOTION_OVERRIDE_ENABLE_SHIFT) // Bit 23 +#define TURBO_DEMOTION_OVERRIDE_ENABLE (1 << TURBO_DEMOTION_OVERRIDE_ENABLE_SHIFT) // Bit 22 +#define UNOCRE_PERF_PLIMIT_OVERRIDE_ENABLE (1 << UNCORE_PERF_PLIMIT_OVERRIDE_ENABLE_SHIFT) // Bit 20 +#define EET_OVERRIDE_ENABLE (1 << EET_OVERRIDE_ENABLE_SHIFT) // Bit 18 +#define IO_BW_PLIMIT_OVERRIDE_ENABLE (1 << IO_BW_PLIMIT_OVERRIDE_ENABLE_SHIFT) // Bit 15 +#define IMC_APM_OVERRIDE_ENABLE (1 << IMC_APM_OVERRIDE_ENABLE_SHIFT) // Bit 10 +#define IOM_APM_OVERRIDE_ENABLE (1 << IOM_APM_OVERRIDE_ENABLE_SHIFT) // Bit 5 +#define QPI_APM_OVERRIDE_ENABLE (1 << QPI_APM_OVERRIDE_ENABLE_SHIFT) // Bit 0 +#define DYNAMIC_PERF_POWER_CTL_MASK (0x3C000000 + UNOCRE_PERF_PLIMIT_OVERRIDE_ENABLE + EET_OVERRIDE_ENABLE + IO_BW_PLIMIT_OVERRIDE_ENABLE + IMC_APM_OVERRIDE_ENABLE + IOM_APM_OVERRIDE_ENABLE + QPI_APM_OVERRIDE_ENABLE) + +// CSR_PCIE_ILTR_OVRD (CSR 1:10:1:78) +// SW_LTR_OVRD (MSR 0xa02) -- not used +//CSR_PCIE_ILTR_OVRD bit definition +#define SNOOP_LATENCY_VLD_SHIFT 31 // Bits 31 +#define FORCE_SNOOP_OVRD_SHIFT 30 // Bits 30 +#define SNOOP_LATENCY_MUL_SHIFT 26 // Bits 28:26 +#define SNOOP_LATENCY_Value_SHIFT 16 // Bits 25:16 +#define NON_SNOOP_LATENCY_VLD_SHIFT 15 // Bits 15 +#define FORCE_NON_SNOOP_OVRD_SHIFT 14 // Bits 14 +#define NON_SNOOP_LATENCY_MUL_SHIFT 10 // Bits 12:10 +#define NON_SNOOP_LATENCY_Value_SHIFT 0 // Bits 9:0 +#define SNOOP_LATENCY_VLD_MASK (1 << SNOOP_LATENCY_VLD_SHIFT) // Bits 31 +#define FORCE_SNOOP_OVRD_MASK (1 << FORCE_SNOOP_OVRD_SHIFT) // Bits 30 +#define SNOOP_LATENCY_MUL_MASK (0x7 << SNOOP_LATENCY_MUL_SHIFT) // Bits 28:26 +#define SNOOP_LATENCY_Value_MASK (0x3FF << SNOOP_LATENCY_Value_SHIFT) // Bits 25:16 +#define NON_SNOOP_LATENCY_VLD_MASK (1 << NON_SNOOP_LATENCY_VLD_SHIFT) // Bits 15 +#define FORCE_NON_SNOOP_OVRD_MASK (1 << FORCE_NON_SNOOP_OVRD_SHIFT) // Bits 14 +#define NON_SNOOP_LATENCY_MUL_MASK (0x7 << NON_SNOOP_LATENCY_MUL_SHIFT) // Bits 12:10 +#define NON_SNOOP_LATENCY_Value_MASK (0x3FF << NON_SNOOP_LATENCY_Value_SHIFT) // Bits 9:0 +#define SW_LTR_OVRD_CTL_MASK (SNOOP_LATENCY_VLD_MASK + FORCE_SNOOP_OVRD_MASK + SNOOP_LATENCY_MUL_MASK + SNOOP_LATENCY_Value_MASK + \ + NON_SNOOP_LATENCY_VLD_MASK + FORCE_NON_SNOOP_OVRD_MASK + NON_SNOOP_LATENCY_MUL_MASK + NON_SNOOP_LATENCY_Value_MASK) + +//CSR_PKG_CST_ENTRY_CRITERIA_MASK bit definition +#define DRAM_IN_SR_SHIFT 28 +#define QPI_2_IN_L1_SHIFT 27 +#define QPI_1_IN_L1_SHIFT 26 +#define QPI_0_IN_L1_SHIFT 25 +#define QPI_2_IN_L0S_SHIFT 24 +#define QPI_1_IN_L0S_SHIFT 23 +#define QPI_0_IN_L0S_SHIFT 22 +#define PCIE_IN_L1_SHIFT 11 +#define PCIE_IN_L0S_SHIFT 0 +#define DRAM_IN_SR (1 << DRAM_IN_SR_SHIFT) +#define QPI_2_IN_L1 (1 << QPI_2_IN_L1_SHIFT) +#define QPI_1_IN_L1 (1 << QPI_1_IN_L1_SHIFT) +#define QPI_0_IN_L1 (1 << QPI_0_IN_L1_SHIFT) +#define QPI_2_IN_L0S (1 << QPI_2_IN_L0S_SHIFT) +#define QPI_1_IN_L0S (1 << QPI_1_IN_L0S_SHIFT) +#define QPI_0_IN_L0S (1 << QPI_0_IN_L0S_SHIFT) +#define PCIE_IN_L1 (1 << PCIE_IN_L1_SHIFT) +#define PCIE_IN_L0S (1 << PCIE_IN_L0S_SHIFT) +#define PCIE_IN_LX_MASK 0x7FF // Bit[10:0] +#define MASK_PCIE_BITS 0xFFC00000 // clear bits 21:0 +// For SKX +#define KTI_2_IN_L1_SHIFT 2 +#define KTI_1_IN_L1_SHIFT 1 +#define KTI_0_IN_L1_SHIFT 0 +#define KTI_2_IN_L1 (1 << KTI_2_IN_L1_SHIFT) +#define KTI_1_IN_L1 (1 << KTI_1_IN_L1_SHIFT) +#define KTI_0_IN_L1 (1 << KTI_0_IN_L1_SHIFT) +#define MASK_PCIE_IN_L1_BITS 0xFF000000 // clear bits 23:0 +#define SET_KTI_INPKGCENTRY (KTI_0_IN_L1 + KTI_1_IN_L1 + KTI_2_IN_L1) +#define SET_PCIE_INPKGCENTRY 0xFFFFFF // set bits 23:0 +#define SET_PCIEx_MASK 0xF +#define SET_DMI_MASK 0x1 + + +// CSR Perf PLIMIT bit definition for HSX <= B Stepping +#define I_TURBO_WAIT_PERIOD_SHIFT 19 // Bits 31:19 +#define PERF_P_LIMIT_THRESHOLD_SHIFT 13 // Bits 18:13 +#define I_TURBO_EN_SHIFT 12 // Bit 12 +#define PERF_P_LIMIT_CLIP_SHIFT 6 // Bits 11:6 +#define DISABLE_PERF_P_INPUT_SHIFT 5 // Bit 5 +#define RESOLUTION_MODE_SHIFT 1 // Bits 2:1 +#define REPERF_P_LIMIT_EN_SHIFT 0 // Bit 0 +#define I_TURBO_WAIT_PERIOD (0x1fff << I_TURBO_WAIT_PERIOD_SHIFT) // Bits 31:19 +#define PERF_P_LIMIT_THRESHOLD (0x3f << PERF_P_LIMIT_THRESHOLD_SHIFT) // Bits 18:13 +#define I_TURBO_EN (1 << I_TURBO_EN_SHIFT) // Bit 12 +#define PERF_P_LIMIT_CLIP (0x3f << PERF_P_LIMIT_CLIP_SHIFT) // Bits 11:6 +#define DISABLE_PERF_P_INPUT (1 << DISABLE_PERF_P_INPUT_SHIFT) // Bit 5 +#define RESOLUTION_MODE (3 << RESOLUTION_MODE_SHIFT) // Bits 2:1 +#define REPERF_P_LIMIT_EN (1 << REPERF_P_LIMIT_EN_SHIFT) // Bit 0 + +// CSR Perf PLIMIT bit definition for HSX >= C Stepping & SKX +#define PERF_PLIMIT_DIFFERENTIAL_SHIFT 15 // Bits 17:15 +#define PERF_PLIMIT_DIFFERENTIAL (7 << PERF_PLIMIT_DIFFERENTIAL_SHIFT) // Bits 17:15 +#define PERF_PLIMIT_CLIP_SHIFT 7 // Bits 11:7 +#define PERF_PLIMIT_CLIP (0x1f << PERF_P_LIMIT_CLIP_SHIFT) // Bits 11:7 +#define PERF_PLIMIT_THRESHOLD_SHIFT 1 // Bits 5:1 +#define PERF_PLIMIT_THRESHOLD (0x1f << PERF_P_LIMIT_THRESHOLD_SHIFT) // Bits 5:1 +#define REPERF_PLIMIT_EN_SHIFT 0 // Bit 0 +#define REPERF_PLIMIT_EN (1 << REPERF_P_LIMIT_EN_SHIFT) // Bit 0 +#define PERF_P_LIMIT_CTRL_MASK (PERF_PLIMIT_THRESHOLD + PERF_PLIMIT_CLIP + PERF_PLIMIT_DIFFERENTIAL + REPERF_PLIMIT_EN) + +//CSR SAPMCTLbit definition +#define SAPMCTL_LOCK_SHIFT 31 // Bit 31 for IVT/HSX/SKX +#define SETVID_DECAY_DISABLE_SHIFT 30 // Bit 30 for IVT/KSX/SKX +#define QPI_L0S_PLL_SEN_ENABLE_SHIFT 29 // Bit 29//Only for IVT +#define QPI_L0_PLL_SEN_ENABLE_SHIFT 28 // Bit 28//Only for IVT +#define IIO_L0S_PLL_SEN_ENABLE_SHIFT 27 // Bit 27//Only for IVT +#define IIO_L0_PLL_SEN_ENABLE_SHIFT 26 // Bit 26//Only for IVT +#define QPI2_L0S_PLL_SEN_ENABLE_SHIFT 25 // Bit 25//Only for IVT +#define QPI2_L0_PLL_SEN_ENABLE_SHIFT 24 // Bit 24//Only for IVT +#define QPI2_PKGC_CLOCK_GATE_DISABLE_SHIFT 18 // Bit 18//IVT/HSX +#define QPI01_PKGC_CLOCK_GATE_DISABLE_SHIFT 17 // Bit 17//IVT/HSX +#define IIO_PKGC_CLOCK_GATE_DISABLE_SHIFT 16 // Bit 16//IVT/HSX +#define MDLL_ON_DE_SHIFT 15 // Bit 15//IVT/HSX +#define MPLL_ON_DE_SHIFT 14 // Bit 14//IVT/HSX +#define SACG_MPLL_SHIFT 13 // Bit 13//Only for IVT +#define NSWAKE_SREXIT_SHIFT 12 // Bit 12//IVT/HSX +#define SACG_SREXIT_SHIFT 11 // Bit 11//Only for IVT +#define MDLL_OFF_SEN_SHIFT 10 // Bit 10//Only for IVT +#define MPLL_OFF_SEN_SHIFT 9 // Bit 9//Only for IVT +#define SACG_SEN_SHIFT 8 // Bit 8//Only for IVT +#define FORCE_PPLL_OFF_SHIFT 4 // Bit 4 //IVT/HSX +#define QPLL_OFF_ENA_SHIFT 3 // Bit 3//Only for IVT +#define PPLL_OFF_ENA_SHIFT 2 // Bit 2//IVT/HSX +#define MPLL_OFF_ENA_SHIFT 1 // Bit 1//IVT/HSX +#define SACG_ENA_SHIFT 0 // Bit 0//Only for IVT +#define SAPMCTL_LOCK (1 << SAPMCTL_LOCK_SHIFT) // Bit 31 +#define SETVID_DECAY_DISABLE (1 << SETVID_DECAY_DISABLE_SHIFT) // Bit 30 +#define QPI_L0S_PLL_SEN_ENABLE (1 << QPI_L0S_PLL_SEN_ENABLE_SHIFT) // Bit 29 +#define QPI_L0_PLL_SEN_ENABLE (1 << QPI_L0_PLL_SEN_ENABLE_SHIFT) // Bit 28 +#define IIO_L0S_PLL_SEN_ENABLE (1 << IIO_L0S_PLL_SEN_ENABLE_SHIFT) // Bit 27 +#define IIO_L0_PLL_SEN_ENABLE (1 << IIO_L0_PLL_SEN_ENABLE_SHIFT) // Bit 26 +#define QPI2_L0S_PLL_SEN_ENABLE (1 << QPI2_L0S_PLL_SEN_ENABLE_SHIFT) // Bit 25 +#define QPI2_L0_PLL_SEN_ENABLE (1 << QPI2_L0_PLL_SEN_ENABLE_SHIFT) // Bit 24 +#define QPI2_PKGC_CLOCK_GATE_DISABLE (1 << QPI2_PKGC_CLOCK_GATE_DISABLE_SHIFT) // Bit 18//IVT +#define QPI01_PKGC_CLOCK_GATE_DISABLE (1 << QPI01_PKGC_CLOCK_GATE_DISABLE_SHIFT) // Bit 17//IVT +#define IIO_PKGC_CLOCK_GATE_DISABLE (1 << IIO_PKGC_CLOCK_GATE_DISABLE_SHIFT) // Bit 16//IVT +#define MDLL_ON_DE (1 << MDLL_ON_DE_SHIFT) // Bit 15 +#define MPLL_ON_DE (1 << MPLL_ON_DE_SHIFT) // Bit 14 +#define SACG_MPLL (1 << SACG_MPLL_SHIFT) // Bit 13 +#define NSWAKE_SREXIT (1 << NSWAKE_SREXIT_SHIFT) // Bit 12 +#define SACG_SREXIT (1 << SACG_SREXIT_SHIFT) // Bit 11 +#define MDLL_OFF_SEN (1 << MDLL_OFF_SEN_SHIFT) // Bit 10 +#define MPLL_OFF_SEN (1 << MPLL_OFF_SEN_SHIFT) // Bit 9 +#define SACG_SEN (1 << SACG_SEN_SHIFT) // Bit 8 +#define FORCE_PPLL_OFF (1 << FORCE_PPLL_OFF_SHIFT) // Bit 4 //IVT +#define QPLL_OFF_ENA (1 << QPLL_OFF_ENA_SHIFT) // Bit 3 +#define PPLL_OFF_ENA (1 << PPLL_OFF_ENA_SHIFT) // Bit 2 +#define MPLL_OFF_ENA (1 << MPLL_OFF_ENA_SHIFT) // Bit 1 +#define SACG_ENA (1 << SACG_ENA_SHIFT) // Bit 0 + +//CSR SAPMCTLbit definition for SKX +#define MC1_PKGC_DIG_VOLTAGE_REDUCTION_DISABLE_SHIFT 27 // Bit 27, SKX +#define MC0_PKGC_DIG_VOLTAGE_REDUCTION_DISABLE_SHIFT 26 // Bit 26, SKX +#define MC1_PKGC_IO_VOLTAGE_REDUCTION_DISABLE_SHIFT 25 // Bit 25, SKX +#define MC0_PKGC_IO_VOLTAGE_REDUCTION_DISABLE_SHIFT 24 // Bit 24, SKX +#define MEM_PLL_OFF_EN_SHIFT 22 // Bit 22,23, SKX +#define KTI_PLL_OFF_EN_SHIFT 19 // Bit 19,20, SKX +#define IIO_PLL_OFF_EN_SHIFT 16 // Bit 16,17,18, SKX +#define MC1_PKGC_CLK_GATE_DISABLE_SHIFT 7 // Bit 7, SKX +#define MC0_PKGC_CLK_GATE_DISABLE_SHIFT 6 // Bit 6, SKX +#define KTI23_PKGC_CLK_GATE_DISABLE_SHIFT 4 // Bit 4, SKX +#define KTI01_PKGC_CLK_GATE_DISABLE_SHIFT 3 // Bit 3, SKX +#define IIO012_PKGC_CLK_GATE_DISABLE_SHIFT 0 // Bit 0,1,2, SKX +#define MC1_PKGC_DIG_VOLTAGE_REDUCTION_DISABLE (1 << MC1_PKGC_DIG_VOLTAGE_REDUCTION_DISABLE_SHIFT) // Bit 27, SKX +#define MC0_PKGC_DIG_VOLTAGE_REDUCTION_DISABLE (1 << MC0_PKGC_DIG_VOLTAGE_REDUCTION_DISABLE_SHIFT) // Bit 26, SKX +#define MC1_PKGC_IO_VOLTAGE_REDUCTION_DISABLE (1 << MC1_PKGC_IO_VOLTAGE_REDUCTION_DISABLE_SHIFT) // Bit 25, SKX +#define MC0_PKGC_IO_VOLTAGE_REDUCTION_DISABLE (1 << MC0_PKGC_IO_VOLTAGE_REDUCTION_DISABLE_SHIFT) // Bit 24, SKX +#define MEM_PLL_OFF_EN (3 << MEM_PLL_OFF_EN_SHIFT) // Bit 22,23, SKX +#define KTI_PLL_OFF_EN (3 << KTI_PLL_OFF_EN_SHIFT) // Bit 19,20, SKX +#define IIO_PLL_OFF_EN (7 << IIO_PLL_OFF_EN_SHIFT) // Bit 16,17,18, SKX +#define MC1_PKGC_CLK_GATE_DISABLE (1 << MC1_PKGC_CLK_GATE_DISABLE_SHIFT) // Bit 7, SKX +#define MC0_PKGC_CLK_GATE_DISABLE (1 << MC0_PKGC_CLK_GATE_DISABLE_SHIFT) // Bit 6, SKX +#define KTI23_PKGC_CLK_GATE_DISABLE (1 << KTI23_PKGC_CLK_GATE_DISABLE_SHIFT) // Bit 4, SKX +#define KTI01_PKGC_CLK_GATE_DISABLE (1 << KTI01_PKGC_CLK_GATE_DISABLE_SHIFT) // Bit 3, SKX +#define IIO012_PKGC_CLK_GATE_DISABLE (7 << IIO012_PKGC_CLK_GATE_DISABLE_SHIFT) // Bit 0,1,2, SKX +#define SAPMCTL_MASK (IIO012_PKGC_CLK_GATE_DISABLE + KTI01_PKGC_CLK_GATE_DISABLE + KTI23_PKGC_CLK_GATE_DISABLE + MC0_PKGC_CLK_GATE_DISABLE \ + + MC1_PKGC_CLK_GATE_DISABLE + IIO_PLL_OFF_EN + KTI_PLL_OFF_EN + MEM_PLL_OFF_EN + SETVID_DECAY_DISABLE + SAPMCTL_LOCK \ + + MC1_PKGC_IO_VOLTAGE_REDUCTION_DISABLE + MC0_PKGC_IO_VOLTAGE_REDUCTION_DISABLE + MC1_PKGC_DIG_VOLTAGE_REDUCTION_DISABLE + MC0_PKGC_DIG_VOLTAGE_REDUCTION_DISABLE) + +//Config TDP +#define CONFIG_TDP_LEVEL (3 << CONFIG_TDP_LEVEL_SHIFT) +#define CONFIG_TDP_LEVEL_SHIFT 1 // Bit [2:1] +#define CONFIG_TDP_SHIFT 0 // Bit 0 + +// MSR 0x1FC +#define MSR_POWER_CTL 0x1FC +#define PCH_NEG_DISABLE (1 << 30) +#define PCH_NEG_DISABLE_SHIFT 30 +#define LTR_SW_DISABLE (1 << 29) //LTR_IIO_DISABLE +#define LTR_SW_DISABLE_SHIFT 29 +#define PROCHOT_LOCK (1 << 27) +#define PROCHOT_LOCK_SHIFT 27 +#define PROCHOT_RESPONSE (1 << 26) +#define PROCHOT_RESPONSE_SHIFT 26 +#define PWR_PERF_TUNING_CFG_MODE (1 << 25) +#define PWR_PERF_TUNING_CFG_MODE_SHIFT 25 +#define PWR_PERF_TUNING_ENABLE_DYN_SWITCHING (1 << 24) +#define PWR_PERF_TUNING_ENABLE_DYN_SHIFT 24 +#define PWR_PERF_TUNING_DISABLE_EEP_CTRL (1 << 23) +#define PWR_PERF_TUNING_DISABLE_EEP_SHIFT 23 +#define PWR_PERF_TUNING_DISABLE_SAPM_CTRL (1 << 22) +#define PWR_PERF_TUNING_DISABLE_SAPM_SHIFT 22 +#define DIS_PROCHOT_OUT (1 << 21) +#define DIS_PROCHOT_OUT_SHIFT 21 +#define EE_TURBO_DISABLE (1 << 19) +#define EE_TURBO_DISABLE_SHIFT 19 +#define ENERGY_EFFICIENT_PSTATE_ENABLE (1 << 18) +#define ENERGY_EFFICIENT_PSTATE_ENABLE_SHIFT 18 +#define PHOLD_SR_DISABLE (1 << 17) +#define PHOLD_SR_DISABLE_SHIFT 17 +#define PHOLD_CST_PREVENTION_INIT (1 << 16) +#define PHOLD_CST_PREVENTION_INIT_SHIFT 16 +#define FAST_BRK_INT_EN (1 << 4) +#define FAST_BRK_INT_EN_SHIFT 4 +#define FAST_BRK_SNP_EN (1 << 3) +#define FAST_BRK_SNP_EN_SHIFT 3 +#define SAPM_IMC_C2_POLICY_EN (1 << 2) +#define SAPM_IMC_C2_POLICY_SHIFT 2 +#define C1E_ENABLE (1 << 1) +#define C1E_ENABLE_SHIFT 1 +#define ENABLE_BIDIR_PROCHOT_EN (1 << 0) +#define ENABLE_BIDIR_PROCHOT_EN_SHIFT 0 +#define POWER_CTL_MASK (PCH_NEG_DISABLE + LTR_SW_DISABLE + PWR_PERF_TUNING_CFG_MODE + \ + PWR_PERF_TUNING_ENABLE_DYN_SWITCHING + PWR_PERF_TUNING_DISABLE_EEP_CTRL + \ + PWR_PERF_TUNING_DISABLE_SAPM_CTRL + DIS_PROCHOT_OUT + ENABLE_BIDIR_PROCHOT_EN + C1E_ENABLE) + +// PRIMARY_PLANE_CURRENT_CONFIG_CONTROL 0x601 +#define PSI3_CODE_SHIFT 27 // (Bits 61:59 actully) we operate on a 32 bit register +#define PSI3_THSHLD_SHIFT 20 // (Bits 58:52 actully) we operate on a 32 bit register +#define PSI2_CODE_SHIFT 17 // (Bits 51:49 actully) we operate on a 32 bit register +#define PSI2_THSHLD_SHIFT 10 // (Bits 48:42 actully) we operate on a 32 bit register +#define PSI1_CODE_SHIFT 7 // (Bits 41:39 actully) we operate on a 32 bit register +#define PSI1_THSHLD_SHIFT 0 // (Bits 38:32 actully) we operate on a 32 bit register +#define PPCCC_LOCK_SHIFT 31 +#define CURRENT_LIMIT_SHIFT 0 +#define PSI3_CODE (0x7 << PSI3_CODE_SHIFT) // (Bits 61:59 actully) we operate on a 32 bit register +#define PSI3_THSHLD (0x7f << PSI3_THSHLD_SHIFT) // (Bits 58:52 actully) we operate on a 32 bit register +#define PSI2_CODE (0x7 << PSI2_CODE_SHIFT) // (Bits 51:49 actully) we operate on a 32 bit register +#define PSI2_THSHLD (0x7f << PSI2_THSHLD_SHIFT) // (Bits 48:42 actully) we operate on a 32 bit register +#define PSI1_CODE (0x7 << PSI1_CODE_SHIFT) // (Bits 41:39 actully) we operate on a 32 bit register +#define PSI1_THSHLD (0x7f << PSI1_THSHLD_SHIFT) // (Bits 38:32 actully) we operate on a 32 bit register +#define PPCCC_LOCK (1 << PPCCC_LOCK_SHIFT) +#define CURRENT_LIMIT (0x1fff << CURRENT_LIMIT_SHIFT) + +#define B_PCPS_DISABLE (1 << 25) // Bit 25 + +// MSR_C_STATE_LATENCY_CONTROL_0 0x60a, 60b, 60c +#define VALID_SHIFT 15 +#define MULTIPLIER_SHIFT 10 +#define VALUE_SHIFT 0 + +// MSR_TURBO_POWER_LIMIT 0x610 +// CSR_TURBO_POWER_LIMIT +#define POWER_LIMIT_ENABLE_SHIFT 15 +#define POWER_LIMIT_ENABLE (1 << POWER_LIMIT_ENABLE_SHIFT) // Used as Bit 15 and Bit 47 +#define PKG_CLMP_LIM_SHIFT 16 +#define PKG_CLMP_LIM (1 << PKG_CLMP_LIM_SHIFT) // used as Bit 16 and Bit48 +#define POWER_LIMIT_MASK (0x7FFF) // Bits 14:0 and 46:32 +#define POWER_LIMIT_1_TIME_SHIFT 17 +#define POWER_LIMIT_1_TIME_MASK (0xFE0000) // Bits 23:17 +#define POWER_LIMIT_LOCK_SHIFT 31 +#define POWER_LIMIT_LOCK (1 << POWER_LIMIT_LOCK_SHIFT) // Bit 63 + +// MSR_ENERGY_PERF_BIAS_CONFIG 0xA01 +#define AVG_TIME_Window (0xff << AVG_TIME_Window_SHIFT) // Bits 31:24 +#define PO_TOTAL_TIME_THSHLD_LOW (0x3f << PO_TOTAL_TIME_THSHLD_LOW_SHIFT) // Bits 23:18 +#define PO_TOTAL_TIME_THSHLD_HIGH (0x3f << PO_TOTAL_TIME_THSHLD_HIGH_SHIFT) // Bis 17:12 +#define ALT_ENERGY_PERF_BIAS (0xf << ALT_ENERGY_PERF_BIAS_SHIFT) // Bits 6:3 +#define WORKLD_CONFIG (0x7 << WORKLD_CONFIG_SHIFT) // Bits 2:0 +#define AVG_TIME_Window_SHIFT 24 // Bits 31:24 +#define PO_TOTAL_TIME_THSHLD_LOW_SHIFT 18 // Bits 23:18 +#define PO_TOTAL_TIME_THSHLD_HIGH_SHIFT 12 // Bis 17:12 +#define ALT_ENERGY_PERF_BIAS_SHIFT 3 // Bits 6:3 +#define WORKLD_CONFIG_SHIFT 0 // Bits 2:0 +#define ENERGY_PERF_BIAS_CTRL_MASK (AVG_TIME_Window + PO_TOTAL_TIME_THSHLD_LOW + PO_TOTAL_TIME_THSHLD_HIGH + WORKLD_CONFIG + ALT_ENERGY_PERF_BIAS) + +// +// Cross over Mode +// +#define XOVER_MODE_2TO2 1 +#define XOVER_MODE_1TO1 2 + +// HWPM features +#define HWP_ENABLE 0x01 +#define ACC_ENABLE 0x02 + +// SPT workarounds +#define SPT_WA_ENABLE 0x03 + +// ratio in Performance Control MSR (MSR_IA32_PERF_CTL) +#define B_IA32_PERF_CTRLP_STATE_TARGET (0x7F << 8) + +#pragma pack(1) + +/************************** + Processor Power Management Data structs +***************************/ + +typedef struct _PPM_FROM_PPMINFO_HOB { + UINT8 NumberOfSockets; // # of populated sockets in the system + UINT8 SocketNumber; // which socket + UINT32 SocketPresentBitMap; // bitmap for present CPU packages/nodes + UINT8 IioBusNumber[MAX_SOCKET]; // Bus# for IIO, indexed by CPU Socket/Node ID + UINT8 UncoreBusNumber[MAX_SOCKET]; // Bus# for Uncore, indexed by CPU Socket/Node ID + UINT32 mmCfgBase; + UINT8 DdrXoverMode; // DDR 2.2 Mode + UINT32 OutKtiPerLinkL1En[MAX_SOCKET]; // output kti link enabled status for PM + UINT32 OutPciePerLinkL1En[MAX_SOCKET]; // output PCIe (IIO) link enabled status for PM + UINT8 KtiPortCnt; // num KTI ports residing on each Socket + UINT8 ProcessorPowerUnit[MAX_SOCKET]; // + UINT8 ProcessorTimeUnit[MAX_SOCKET]; // + UINT16 PackageTdp[MAX_SOCKET]; // Package TDP + UINT32 CapId4; //CapId CSR value + UINT32 CpuType; // CpuType + UINT8 CpuStepping; // CpuStepping + UINT32 mNumOfBitShift; // # Bits to shift right APIC ID to get next level APIC ID + UINTN NumberOfProcessors; // number of active threads + BOOLEAN EistCap; // EIST Capability + UINT8 Bios_Reset_Cpl_Phase; + UINT8 HwpmSupport; //HWPM support flag +}PPM_FROM_PPMINFO_HOB; + +typedef struct { + UINT8 Major; // Major Vesion + UINT8 Minor; // Minor Vesion + UINT8 Rev; // Release Version + UINT8 Build; // +} PPM_VERSION; + +typedef union _MSR_REGISTER { + UINT64 Qword; + + struct _DWORDS { + UINT32 Low; + UINT32 High; + } Dwords; + + struct _BYTES { + UINT8 FirstByte; + UINT8 SecondByte; + UINT8 ThirdByte; + UINT8 FouthByte; + UINT8 FifthByte; + UINT8 SixthByte; + UINT8 SeventhByte; + UINT8 EighthByte; + } Bytes; + +} MSR_REGISTER; + +typedef struct { + BOOLEAN C1e; + + UINT32 PkgCstEntryCriteriaMaskKti[MAX_SOCKET]; + UINT32 PkgCstEntryCriteriaMaskPcie[MAX_SOCKET]; + MSR_REGISTER LatencyCtrl[NUM_CST_LAT_MSR]; + +} CSTATE_STRUCT; + +typedef struct { + + BOOLEAN EistEnabled; // option to enable GV3 + +} PSTATE_STRUCT; + +typedef struct { + BOOLEAN Enable; + UINT32 Voltage; + UINT16 RatioLimit[MAX_CORE]; +} XE_STRUCT; + +typedef struct { + UINT8 RatioLimitRatio[8]; + UINT8 RatioLimitRatioMask[8]; + UINT8 RatioLimitCores[8]; + UINT8 RatioLimitCoresMask[8]; +} TURBO_RATIO_LIMIT_RATIO_CORES; + +typedef struct { + UINT8 HWPMEnable; + UINT8 HWPMNative; + UINT8 HWPMOOB; + UINT8 HWPMInterrupt; + UINT8 AutoCState; + UINT8 EPPEnable; + UINT8 EPPProfile; + UINT8 APSrocketing; + UINT8 Scalability; + UINT8 PPOTarget; + UINT8 PPOBudget; + UINT8 OutofBandAlternateEPB; +} HWPM_STRUCT; + +typedef struct { + + UINT8 ConfigTDP; + UINT8 PcpsCtrl; + UINT8 FastRaplDutyCycle; + UINT8 FuseTjMaxOffset; + + UINT8 OverclockingLock; + UINT32 AdvPwrMgtCtlFlags; + + MSR_REGISTER PowerCtl; + MSR_REGISTER TurboPowerLimit; + MSR_REGISTER PP0CurrentCfg; + MSR_REGISTER PerfBiasConfig; + + UINT32 ProchotRatio; + UINT32 PmaxConfig; + UINT32 SapmCtl[MAX_SOCKET]; + UINT32 PerPLimitCtl; + UINT32 C2C3TT; + UINT32 DynamicPerPowerCtl; + UINT32 PcieIltrOvrd; + + CSTATE_STRUCT Cst; + PSTATE_STRUCT Pst; + XE_STRUCT Xe; + HWPM_STRUCT Hwpm; + TURBO_RATIO_LIMIT_RATIO_CORES TurboRatioLimitRatioCores; + + UINT8 TCCActivationOffset; + +} EFI_PPM_STRUCT; + + +typedef struct { + + PPM_VERSION Version; + + EFI_CPU_CSR_ACCESS_PROTOCOL *CpuCsrAccess; + + PPM_FROM_PPMINFO_HOB *Info; + + EFI_PPM_STRUCT *Setup; + + UINTN ProcessorNumber; + +} EFI_CPU_PM_STRUCT; + + +#pragma pack() + +VOID +PStateTransition ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +InitializeCpuPPMLib ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +PpmSetBiosInitDone ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +PpmSetCsrLockBit ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +PpmSetMsrLockBit ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramCSRTurboPowerLimit ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramCsrDynamicPerfPowerCtl ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramCsrSapmCtl ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramCsrSwLtrOvrd ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramCsrPkgCstEntryCriteriaMask( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramCsrResponseRatioCfg( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +EFIAPI +SetupPCIEPkgCstEntryCriteria ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramCsrPerfPlimitControl ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramCsrPmaxConfig ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramMsrPowerCtl ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +ProgramMsrTurboPowerLimit ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +ProgramEnergyPerfBiasConfigMsr ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +ProgMsrPriPlaneCurtCfgCtrL ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +ProgramMsrTurboRatioLimit ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +ProgramMsrTemperatureTarget ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +GetMsrTemperatureTarget ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramMsrMiscPwrMgmt ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +Program_Bios_Reset_Cpl ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramB2PFastRaplDutyCycle ( + EFI_CPU_PM_STRUCT *ppm + ); + +UINT8 +EFIAPI +GetHwpmSupport ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +HWPMInterfaceReg ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +EnableAutonomousCStateControl ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +EFIAPI +EnableHwpLvtThermalInterrupt( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +EFIAPI +EnableHwpFeatures( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +ProgramB2PPcuMiscConfig ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramB2PHWPMMiscConfig ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramMsrCLatency ( + EFI_CPU_PM_STRUCT *ppm, + UINTN ProcessorNumber + ); + +VOID +ProgramB2PDynamicL1 ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +PpmSetMsrCstConfigCtrlLockBit ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramB2PForceUncoreAndMeshRatio ( + EFI_CPU_PM_STRUCT *ppm + ); + +VOID +ProgramB2PMiscWorkaroundEnable ( + EFI_CPU_PM_STRUCT *ppm + ); + +#endif |