soc/intel/xeon_sp/skx: Fix CPU init

Move CPU init closer to other SoC and CPX.

FSP-S only is aware of socket 0, thus all cores must rerun all
settings already done by FSP, in order to set up socket 1 as well.

FSP sets the following on socket0:
- Set BIT20 in MSR_VR_MISC_CONFIG
- Set LTR_IIO_DISABLE in MSR_POWER_CTL

Lock the following MSRs:
- MSR_SNC_CONFIG
- MSR_CONFIG_TDP_CONTROL
- MSR_FEATURE_CONFIG
- MSR_TURBO_ACTIVATION_RATIO

Also do the following as done on other SoCs:
- Configure VMX and lock it
- Enable LAPIC TPRs (fixes MWAIT support)
- Honor CONFIG_SET_MSR_AESNI_LOCK_BIT
- Set TCC thermal target as set in devicetree

Fixes 8 second wakeup time from LAPIC interrupts when in MWAIT.

TEST: Booted on ocp/tiogapass to Linux 6.9 with all cores in
      ACPI C6, no boot delay or hung tasks could be found.

Change-Id: If08ef5150b104b0c2329fcb64a0476ce641c831c
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/85289
Reviewed-by: Christian Walter <christian.walter@9elements.com>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Patrick Rudolph 2024-11-25 10:27:54 +01:00 committed by Lean Sheng Tan
commit e1a0e6b738
3 changed files with 36 additions and 9 deletions

View file

@ -320,7 +320,7 @@ void configure_tcc_thermal_target(void)
*/
if (CONFIG(SOC_INTEL_APOLLOLAKE) || CONFIG(SOC_INTEL_SKYLAKE) ||
CONFIG(SOC_INTEL_KABYLAKE) || CONFIG(SOC_INTEL_BRASWELL) ||
CONFIG(SOC_INTEL_BROADWELL))
CONFIG(SOC_INTEL_BROADWELL) || CONFIG(SOC_INTEL_SKYLAKE_SP))
return;
/* Time Window Tau Bits [6:0] */

View file

@ -8,6 +8,8 @@
#define MSR_FEATURE_CONFIG 0x13c
#define FEATURE_CONFIG_LOCK BIT(0)
#define MSR_SNC_CONFIG 0x152
#define IA32_MCG_CAP 0x179
#define IA32_MCG_CAP_COUNT_MASK 0xff
#define IA32_MCG_CAP_CTL_P_BIT 8
@ -71,7 +73,6 @@
#define MSR_TURBO_ACTIVATION_RATIO 0x64c
#define MAX_NON_TURBO_RATIO_SHIFT 0
#define MAX_NON_TURBO_RATIO (0xff << MAX_NON_TURBO_RATIO_SHIFT)
#define IA32_PM_ENABLE 0x770
#define IA32_HWP_CAPABILITIES 0x771

View file

@ -7,6 +7,7 @@
#include <cpu/intel/cpu_ids.h>
#include <cpu/x86/mtrr.h>
#include <cpu/x86/mp.h>
#include <cpu/intel/common/common.h>
#include <cpu/intel/microcode.h>
#include <cpu/intel/turbo.h>
#include <cpu/intel/smm_reloc.h>
@ -84,15 +85,18 @@ static void xeon_sp_core_init(struct device *cpu)
cpu->path.apic.package_id);
assert(chip_config);
/* set MSR_PKG_CST_CONFIG_CONTROL - scope per core*/
/* set MSR_PKG_CST_CONFIG_CONTROL - scope per core */
msr.hi = 0;
msr.lo = (PKG_CSTATE_NO_LIMIT | CFG_LOCK_ENABLE);
wrmsr(MSR_PKG_CST_CONFIG_CONTROL, msr);
/* Enable Energy Perf Bias Access, Dynamic switching and lock MSR */
msr = rdmsr(MSR_POWER_CTL);
msr.lo |= (ENERGY_PERF_BIAS_ACCESS_ENABLE | PWR_PERF_TUNING_DYN_SWITCHING_ENABLE
| PROCHOT_LOCK_ENABLE);
msr.lo &= ~(POWER_CTL_C1E_MASK | BIT2);
msr.lo |= ENERGY_PERF_BIAS_ACCESS_ENABLE;
msr.lo |= PWR_PERF_TUNING_DYN_SWITCHING_ENABLE;
msr.lo |= LTR_IIO_DISABLE;
msr.lo |= PROCHOT_LOCK_ENABLE;
wrmsr(MSR_POWER_CTL, msr);
/* Set P-State ratio */
@ -115,7 +119,9 @@ static void xeon_sp_core_init(struct device *cpu)
wrmsr(MSR_MISC_PWR_MGMT, msr);
}
/* TODO MSR_VR_MISC_CONFIG */
msr = rdmsr(MSR_VR_MISC_CONFIG);
msr.hi |= BIT20;
wrmsr(MSR_VR_MISC_CONFIG, msr);
/* Set current limit lock */
msr = rdmsr(MSR_VR_CURRENT_CONFIG);
@ -132,14 +138,19 @@ static void xeon_sp_core_init(struct device *cpu)
msr.hi = (chip_config->turbo_ratio_limit_cores >> 32) & 0xffffffff;
wrmsr(MSR_TURBO_RATIO_LIMIT_CORES, msr);
/* set Turbo Activation ratio */
msr.hi = 0;
/* set Turbo Activation ratio - scope package */
msr = rdmsr(MSR_TURBO_ACTIVATION_RATIO);
msr.lo |= MAX_NON_TURBO_RATIO;
msr.lo |= BIT31; /* Lock it */
wrmsr(MSR_TURBO_ACTIVATION_RATIO, msr);
/* Enable Fast Strings */
/* Scope package */
msr = rdmsr(MSR_CONFIG_TDP_CONTROL);
msr.lo |= BIT31; /* Lock it */
wrmsr(MSR_CONFIG_TDP_CONTROL, msr);
msr = rdmsr(IA32_MISC_ENABLE);
/* Enable Fast Strings */
msr.lo |= FAST_STRINGS_ENABLE_BIT;
wrmsr(IA32_MISC_ENABLE, msr);
@ -149,9 +160,18 @@ static void xeon_sp_core_init(struct device *cpu)
msr.hi = 0;
wrmsr(MSR_IA32_ENERGY_PERF_BIAS, msr);
if (!intel_ht_sibling()) {
/* scope per core */
msr = rdmsr(MSR_SNC_CONFIG);
msr.lo |= BIT28; /* Lock it */
wrmsr(MSR_SNC_CONFIG, msr);
}
/* Enable Turbo */
enable_turbo();
configure_tcc_thermal_target();
/* Enable speed step. */
if (get_turbo_state() == TURBO_ENABLED) {
msr = rdmsr(IA32_MISC_ENABLE);
@ -161,6 +181,12 @@ static void xeon_sp_core_init(struct device *cpu)
/* Clear out pending MCEs */
xeon_configure_mca();
/* Enable Vmx */
set_vmx_and_lock();
set_aesni_lock();
enable_lapic_tpr();
}
static struct device_operations cpu_dev_ops = {