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