coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mp_init.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <assert.h>
4 #include <bootstate.h>
5 #include <console/console.h>
6 #include <cpu/cpu.h>
7 #include <cpu/x86/mtrr.h>
8 #include <cpu/x86/msr.h>
9 #include <cpu/x86/mp.h>
10 #include <cpu/intel/microcode.h>
11 #include <intelblocks/cfg.h>
12 #include <intelblocks/cpulib.h>
13 #include <intelblocks/fast_spi.h>
14 #include <intelblocks/mp_init.h>
15 #include <intelblocks/msr.h>
16 #include <soc/cpu.h>
17 
18 static void init_one_cpu(struct device *dev)
19 {
20  soc_core_init(dev);
21 
22  const void *microcode_patch = intel_microcode_find();
24 }
25 
26 static struct device_operations cpu_dev_ops = {
27  .init = init_one_cpu,
28 };
29 
30 static const struct cpu_device_id cpu_table[] = {
79  { 0, 0 },
80 };
81 
82 static const struct cpu_driver driver __cpu_driver = {
83  .ops = &cpu_dev_ops,
84  .id_table = cpu_table,
85 };
86 
87 /*
88  * MP Init callback function to Find CPU Topology. This function is common
89  * among all SOCs and thus its in Common CPU block.
90  */
91 int get_cpu_count(void)
92 {
93  unsigned int num_virt_cores, num_phys_cores;
94 
95  cpu_read_topology(&num_phys_cores, &num_virt_cores);
96 
97  printk(BIOS_DEBUG, "Detected %u core, %u thread CPU.\n",
98  num_phys_cores, num_virt_cores);
99 
100  return num_virt_cores;
101 }
102 
103 /*
104  * MP Init callback function(get_microcode_info) to find the Microcode at
105  * Pre MP Init phase. This function is common among all SOCs and thus its in
106  * Common CPU block.
107  * This function also fills in the microcode patch (in *microcode), and also
108  * sets the argument *parallel to 1, which allows microcode loading in all
109  * APs to occur in parallel during MP Init.
110  */
111 void get_microcode_info(const void **microcode, int *parallel)
112 {
114  *parallel = 1;
115 }
116 
117 /*
118  * Perform BSP and AP initialization
119  * This function can be called in below cases:
120  * 1. During coreboot is doing MP initialization as part of BS_DEV_INIT_CHIPS (exclude
121  * this call if user has selected USE_INTEL_FSP_MP_INIT).
122  * 2. coreboot would like to take APs control back after FSP-S has done with MP
123  * initialization based on user select USE_INTEL_FSP_MP_INIT.
124  *
125  * This function would use cpu_cluster as a device and APIC device as a linked list to
126  * the cpu cluster. This function adds a node in case the mainboard doesn't have a lapic id
127  * hardcoded in devicetree, and then fills with the actual BSP APIC ID.
128  * This allows coreboot to dynamically detect the LAPIC ID of BSP.
129  * In case the mainboard has an APIC ID defined in devicetree, a link will be present and
130  * creation of the new node will be skipped. This node will have the APIC ID defined
131  * in devicetree.
132  */
133 void init_cpus(void)
134 {
136  assert(dev != NULL);
137 
138  /* In case link to APIC device is not found, create the one */
139  if (!dev->link_list)
140  add_more_links(dev, 1);
141 
142  soc_init_cpus(dev->link_list);
143 }
144 
145 static void coreboot_init_cpus(void *unused)
146 {
147  if (CONFIG(USE_INTEL_FSP_MP_INIT))
148  return;
149 
150  const void *microcode_patch = intel_microcode_find();
152 
153  init_cpus();
154 }
155 
156 static void post_cpus_add_romcache(void)
157 {
158  if (!CONFIG(BOOT_DEVICE_MEMORY_MAPPED))
159  return;
160 
162 }
163 
164 static void wrapper_x86_setup_mtrrs(void *unused)
165 {
167 }
168 
169 /* Ensure to re-program all MTRRs based on DRAM resource settings */
170 static void post_cpus_init(void *unused)
171 {
173  printk(BIOS_ERR, "MTRR programming failure\n");
174 
176  x86_mtrr_check();
177 }
178 
179 /* Do CPU MP Init before FSP Silicon Init */
#define X86_VENDOR_INTEL
Definition: cpu.h:138
#define assert(statement)
Definition: assert.h:74
@ BS_DEV_INIT_CHIPS
Definition: bootstate.h:79
@ BS_WRITE_TABLES
Definition: bootstate.h:87
@ BS_OS_RESUME
Definition: bootstate.h:86
@ BS_ON_ENTRY
Definition: bootstate.h:95
@ BS_ON_EXIT
Definition: bootstate.h:96
@ CB_SUCCESS
Call completed successfully.
Definition: cb_err.h:16
#define printk(level,...)
Definition: stdlib.h:16
enum cb_err mp_run_on_all_cpus(void(*func)(void *), void *arg)
Definition: mp_init.c:1002
void x86_mtrr_check(void)
Definition: mtrr.c:836
void x86_setup_mtrrs_with_detect(void)
Definition: mtrr.c:823
#define CPUID_TIGERLAKE_B0
Definition: cpu_ids.h:49
#define CPUID_ICELAKE_B0
Definition: cpu_ids.h:40
#define CPUID_KABYLAKE_Y0
Definition: cpu_ids.h:20
#define CPUID_COMETLAKE_H_S_6_2_G0
Definition: cpu_ids.h:44
#define CPUID_COMETLAKE_U_K0_S0
Definition: cpu_ids.h:43
#define CPUID_CANNONLAKE_B0
Definition: cpu_ids.h:24
#define CPUID_COMETLAKE_H_S_10_2_Q0_P1
Definition: cpu_ids.h:47
#define CPUID_ALDERLAKE_K0
Definition: cpu_ids.h:56
#define CPUID_TIGERLAKE_A0
Definition: cpu_ids.h:48
#define CPUID_WHISKEYLAKE_V0
Definition: cpu_ids.h:33
#define CPUID_SKYLAKE_HR0
Definition: cpu_ids.h:17
#define CPUID_COMETLAKE_H_S_10_2_P0
Definition: cpu_ids.h:46
#define CPUID_SKYLAKE_C0
Definition: cpu_ids.h:14
#define CPUID_ALDERLAKE_J0
Definition: cpu_ids.h:54
#define CPUID_APOLLOLAKE_E0
Definition: cpu_ids.h:29
#define CPUID_APOLLOLAKE_A0
Definition: cpu_ids.h:27
#define CPUID_METEORLAKE_A0_1
Definition: cpu_ids.h:60
#define CPUID_GLK_A0
Definition: cpu_ids.h:30
#define CPUID_COFFEELAKE_P0
Definition: cpu_ids.h:37
#define CPUID_ICELAKE_A0
Definition: cpu_ids.h:39
#define CPUID_ALDERLAKE_R0
Definition: cpu_ids.h:58
#define CPUID_KABYLAKE_H0
Definition: cpu_ids.h:19
#define CPUID_JASPERLAKE_A0
Definition: cpu_ids.h:41
#define CPUID_ELKHARTLAKE_A0
Definition: cpu_ids.h:51
#define CPUID_CANNONLAKE_A0
Definition: cpu_ids.h:23
#define CPUID_ALDERLAKE_N_A0
Definition: cpu_ids.h:59
#define CPUID_CANNONLAKE_C0
Definition: cpu_ids.h:25
#define CPUID_GLK_R0
Definition: cpu_ids.h:32
#define CPUID_COFFEELAKE_B0
Definition: cpu_ids.h:36
#define CPUID_GLK_B0
Definition: cpu_ids.h:31
#define CPUID_APOLLOLAKE_B0
Definition: cpu_ids.h:28
#define CPUID_METEORLAKE_A0_2
Definition: cpu_ids.h:61
#define CPUID_CANNONLAKE_D0
Definition: cpu_ids.h:26
#define CPUID_COMETLAKE_H_S_6_2_G1
Definition: cpu_ids.h:45
#define CPUID_ALDERLAKE_S_A0
Definition: cpu_ids.h:53
#define CPUID_WHISKEYLAKE_W0
Definition: cpu_ids.h:34
#define CPUID_KABYLAKE_HA0
Definition: cpu_ids.h:21
#define CPUID_KABYLAKE_HB0
Definition: cpu_ids.h:22
#define CPUID_COFFEELAKE_U0
Definition: cpu_ids.h:35
#define CPUID_TIGERLAKE_R0
Definition: cpu_ids.h:50
#define CPUID_COFFEELAKE_R0
Definition: cpu_ids.h:38
#define CPUID_ALDERLAKE_L0
Definition: cpu_ids.h:57
#define CPUID_ELKHARTLAKE_B0
Definition: cpu_ids.h:52
#define CPUID_KABYLAKE_G0
Definition: cpu_ids.h:18
#define CPUID_SKYLAKE_D0
Definition: cpu_ids.h:15
#define CPUID_ALDERLAKE_Q0
Definition: cpu_ids.h:55
#define CPUID_COMETLAKE_U_A0
Definition: cpu_ids.h:42
#define CPUID_SKYLAKE_HQ0
Definition: cpu_ids.h:16
int cpu_read_topology(unsigned int *num_phys, unsigned int *num_virt)
Definition: cpulib.c:267
DEVTREE_CONST struct device * dev_find_path(DEVTREE_CONST struct device *prev_match, enum device_path_type path_type)
Given a Device Path Type, find the device structure.
Definition: device_const.c:53
void add_more_links(struct device *dev, unsigned int total_links)
Ensure the device has a minimum number of bus links.
Definition: device_util.c:652
@ CONFIG
Definition: dsi_common.h:201
void fast_spi_cache_bios_region(void)
Definition: fast_spi.c:292
static const void * microcode_patch
Definition: haswell_init.c:567
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
void intel_microcode_load_unlocked(const void *microcode_patch)
Definition: microcode.c:71
const void * intel_microcode_find(void)
Definition: microcode.c:223
@ DEVICE_PATH_CPU_CLUSTER
Definition: path.h:14
void soc_init_cpus(struct bus *cpu_bus)
Definition: cpu.c:183
void soc_core_init(struct device *cpu)
Definition: cpu.c:104
static void init_one_cpu(struct device *dev)
Definition: mp_init.c:18
BOOT_STATE_INIT_ENTRY(BS_DEV_INIT_CHIPS, BS_ON_ENTRY, coreboot_init_cpus, NULL)
int get_cpu_count(void)
Definition: mp_init.c:91
void init_cpus(void)
Definition: mp_init.c:133
static void post_cpus_init(void *unused)
Definition: mp_init.c:170
static void post_cpus_add_romcache(void)
Definition: mp_init.c:156
static const struct cpu_driver driver __cpu_driver
Definition: mp_init.c:82
static void coreboot_init_cpus(void *unused)
Definition: mp_init.c:145
static void wrapper_x86_setup_mtrrs(void *unused)
Definition: mp_init.c:164
void get_microcode_info(const void **microcode, int *parallel)
Definition: mp_init.c:111
static const struct cpu_device_id cpu_table[]
Definition: mp_init.c:30
static struct device_operations cpu_dev_ops
Definition: mp_init.c:26
#define NULL
Definition: stddef.h:19
Definition: cpu.h:13
struct device_operations * ops
Definition: cpu.h:14
void(* init)(struct device *dev)
Definition: device.h:42
Definition: device.h:107
DEVTREE_CONST struct bus * link_list
Definition: device.h:139