/ src / soc / intel / jasperlake / cpu.c
cpu.c
  1  /* SPDX-License-Identifier: GPL-2.0-only */
  2  
  3  #include <device/pci.h>
  4  #include <cpu/x86/mp.h>
  5  #include <cpu/x86/msr.h>
  6  #include <cpu/intel/smm_reloc.h>
  7  #include <cpu/intel/turbo.h>
  8  #include <cpu/intel/common/common.h>
  9  #include <fsp/api.h>
 10  #include <intelblocks/cpulib.h>
 11  #include <intelblocks/mp_init.h>
 12  #include <intelblocks/msr.h>
 13  #include <soc/cpu.h>
 14  #include <soc/msr.h>
 15  #include <soc/pci_devs.h>
 16  #include <soc/soc_chip.h>
 17  #include <static.h>
 18  #include <types.h>
 19  
 20  bool cpu_soc_is_in_untrusted_mode(void)
 21  {
 22  	msr_t msr;
 23  
 24  	msr = rdmsr(MSR_BIOS_DONE);
 25  	return !!(msr.lo & ENABLE_IA_UNTRUSTED);
 26  }
 27  
 28  void cpu_soc_bios_done(void)
 29  {
 30  	msr_t msr;
 31  
 32  	msr = rdmsr(MSR_BIOS_DONE);
 33  	msr.lo |= ENABLE_IA_UNTRUSTED;
 34  	wrmsr(MSR_BIOS_DONE, msr);
 35  }
 36  
 37  static void soc_fsp_load(void)
 38  {
 39  	fsps_load();
 40  }
 41  
 42  static void configure_misc(void)
 43  {
 44  	msr_t msr;
 45  
 46  	config_t *conf = config_of_soc();
 47  
 48  	msr = rdmsr(IA32_MISC_ENABLE);
 49  	msr.lo |= (1 << 0);	/* Fast String enable */
 50  	msr.lo |= (1 << 3);	/* TM1/TM2/EMTTM enable */
 51  	wrmsr(IA32_MISC_ENABLE, msr);
 52  
 53  	/* Set EIST status */
 54  	cpu_set_eist(conf->eist_enable);
 55  
 56  	/* Disable Thermal interrupts */
 57  	msr.lo = 0;
 58  	msr.hi = 0;
 59  	wrmsr(IA32_THERM_INTERRUPT, msr);
 60  
 61  	/* Enable package critical interrupt only */
 62  	msr.lo = 1 << 4;
 63  	msr.hi = 0;
 64  	wrmsr(IA32_PACKAGE_THERM_INTERRUPT, msr);
 65  
 66  	/* Enable PROCHOT */
 67  	msr = rdmsr(MSR_POWER_CTL);
 68  	msr.lo |= (1 << 0);	/* Enable Bi-directional PROCHOT as an input */
 69  	msr.lo |= (1 << 23);	/* Lock it */
 70  	wrmsr(MSR_POWER_CTL, msr);
 71  }
 72  
 73  /* All CPUs including BSP will run the following function. */
 74  void soc_core_init(struct device *cpu)
 75  {
 76  	/* Clear out pending MCEs */
 77  	/* TODO(adurbin): This should only be done on a cold boot. Also, some
 78  	 * of these banks are core vs package scope. For now every CPU clears
 79  	 * every bank. */
 80  	mca_configure();
 81  
 82  	enable_lapic_tpr();
 83  
 84  	/* Configure Enhanced SpeedStep and Thermal Sensors */
 85  	configure_misc();
 86  
 87  	enable_pm_timer_emulation();
 88  
 89  	/* Enable Direct Cache Access */
 90  	configure_dca_cap();
 91  
 92  	/* Set energy policy */
 93  	set_energy_perf_bias(ENERGY_POLICY_NORMAL);
 94  
 95  	/* Enable Turbo */
 96  	enable_turbo();
 97  }
 98  
 99  static void per_cpu_smm_trigger(void)
100  {
101  	/* Relocate the SMM handler. */
102  	smm_relocate();
103  }
104  
105  static void post_mp_init(void)
106  {
107  	/* Set Max Ratio */
108  	cpu_set_max_ratio();
109  
110  	/*
111  	 * 1. Now that all APs have been relocated as well as the BSP let SMIs
112  	 * start flowing.
113  	 * 2. Skip enabling power button SMI and enable it after BS_CHIPS_INIT
114  	 * to avoid shutdown hang due to lack of init on certain IP in FSP-S.
115  	 */
116  	global_smi_enable_no_pwrbtn();
117  }
118  
119  static const struct mp_ops mp_ops = {
120  	/*
121  	 * Skip Pre MP init MTRR programming as MTRRs are mirrored from BSP,
122  	 * that are set prior to ramstage.
123  	 * Real MTRRs programming are being done after resource allocation.
124  	 */
125  	.pre_mp_init = soc_fsp_load,
126  	.get_cpu_count = get_cpu_count,
127  	.get_smm_info = smm_info,
128  	.get_microcode_info = get_microcode_info,
129  	.pre_mp_smm_init = smm_initialize,
130  	.per_cpu_smm_trigger = per_cpu_smm_trigger,
131  	.relocation_handler = smm_relocation_handler,
132  	.post_mp_init = post_mp_init,
133  };
134  
135  void mp_init_cpus(struct bus *cpu_bus)
136  {
137  	/* TODO: Handle mp_init_with_smm failure? */
138  	mp_init_with_smm(cpu_bus, &mp_ops);
139  
140  	/* Thermal throttle activation offset */
141  	configure_tcc_thermal_target();
142  }