coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
me.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <bootstate.h>
4 #include <intelblocks/cse.h>
5 #include <intelblocks/spi.h>
6 #include <console/console.h>
7 #include <soc/me.h>
8 #include <stdint.h>
9 
10 /* Host Firmware Status Register 2 */
11 union me_hfsts2 {
13  struct {
32 };
33 
34 /* Host Firmware Status Register 4 */
35 union me_hfsts4 {
37  struct {
48 };
49 
50 /* Host Firmware Status Register 5 */
51 union me_hfsts5 {
53  struct {
67 };
68 
69 /* Host Firmware Status Register 6 */
70 union me_hfsts6 {
72  struct {
92 };
93 
94 static void log_me_ro_write_protection_info(bool mfg_mode)
95 {
96  bool cse_ro_wp_en = is_spi_wp_cse_ro_en();
97 
98  printk(BIOS_DEBUG, "ME: WP for RO is enabled : %s\n",
99  cse_ro_wp_en ? "YES" : "NO");
100 
101  if (cse_ro_wp_en) {
102  uint32_t base, limit;
103  spi_get_wp_cse_ro_range(&base, &limit);
104  printk(BIOS_DEBUG, "ME: RO write protection scope - Start=0x%X, End=0x%X\n",
105  base, limit);
106  }
107 
108  /* If EOM is disabled, but CSE RO is not write protected, log error */
109  if (!mfg_mode && !cse_ro_wp_en)
110  printk(BIOS_ERR, "ME: Write protection for CSE RO is not enabled\n");
111 }
112 
113 static void dump_me_status(void *unused)
114 {
115  union me_hfsts1 hfsts1;
116  union me_hfsts2 hfsts2;
117  union me_hfsts3 hfsts3;
118  union me_hfsts4 hfsts4;
119  union me_hfsts5 hfsts5;
120  union me_hfsts6 hfsts6;
121 
122  if (!is_cse_enabled())
123  return;
124 
131 
132  printk(BIOS_DEBUG, "ME: HFSTS1 : 0x%08X\n", hfsts1.data);
133  printk(BIOS_DEBUG, "ME: HFSTS2 : 0x%08X\n", hfsts2.data);
134  printk(BIOS_DEBUG, "ME: HFSTS3 : 0x%08X\n", hfsts3.data);
135  printk(BIOS_DEBUG, "ME: HFSTS4 : 0x%08X\n", hfsts4.data);
136  printk(BIOS_DEBUG, "ME: HFSTS5 : 0x%08X\n", hfsts5.data);
137  printk(BIOS_DEBUG, "ME: HFSTS6 : 0x%08X\n", hfsts6.data);
138 
139  /*
140  * Lock Descriptor, and Fuses must be programmed on a
141  * production system to indicate ME Manufacturing mode is disabled.
142  */
143  printk(BIOS_DEBUG, "ME: Manufacturing Mode : %s\n",
144  ((hfsts1.fields.mfg_mode == 0) &&
145  (hfsts6.fields.fpf_soc_lock == 1)) ? "NO" : "YES");
146  /*
147  * The SPI Protection Mode bit reflects SPI descriptor
148  * locked(0) or unlocked(1).
149  */
150  printk(BIOS_DEBUG, "ME: SPI Protection Mode Enabled : %s\n",
151  hfsts1.fields.mfg_mode ? "NO" : "YES");
152  printk(BIOS_DEBUG, "ME: FW Partition Table : %s\n",
153  hfsts1.fields.fpt_bad ? "BAD" : "OK");
154  printk(BIOS_DEBUG, "ME: Bringup Loader Failure : %s\n",
155  hfsts1.fields.ft_bup_ld_flr ? "YES" : "NO");
156  printk(BIOS_DEBUG, "ME: Firmware Init Complete : %s\n",
157  hfsts1.fields.fw_init_complete ? "YES" : "NO");
158  printk(BIOS_DEBUG, "ME: Boot Options Present : %s\n",
159  hfsts1.fields.boot_options_present ? "YES" : "NO");
160  printk(BIOS_DEBUG, "ME: Update In Progress : %s\n",
161  hfsts1.fields.update_in_progress ? "YES" : "NO");
162  printk(BIOS_DEBUG, "ME: D0i3 Support : %s\n",
163  hfsts1.fields.d0i3_support_valid ? "YES" : "NO");
164  printk(BIOS_DEBUG, "ME: Low Power State Enabled : %s\n",
165  hfsts2.fields.low_power_state ? "YES" : "NO");
166  printk(BIOS_DEBUG, "ME: CPU Replaced : %s\n",
167  hfsts2.fields.cpu_replaced ? "YES" : "NO");
168  printk(BIOS_DEBUG, "ME: CPU Replacement Valid : %s\n",
169  hfsts2.fields.cpu_replaced_valid ? "YES" : "NO");
170  printk(BIOS_DEBUG, "ME: Current Working State : %u\n",
171  hfsts1.fields.working_state);
172  printk(BIOS_DEBUG, "ME: Current Operation State : %u\n",
173  hfsts1.fields.operation_state);
174  printk(BIOS_DEBUG, "ME: Current Operation Mode : %u\n",
175  hfsts1.fields.operation_mode);
176  printk(BIOS_DEBUG, "ME: Error Code : %u\n",
177  hfsts1.fields.error_code);
178  printk(BIOS_DEBUG, "ME: Enhanced Debug Mode : %s\n",
179  hfsts1.fields.invoke_enhance_dbg_mode ? "YES" : "NO");
180  printk(BIOS_DEBUG, "ME: CPU Debug Disabled : %s\n",
181  hfsts6.fields.cpu_debug_disable ? "YES" : "NO");
182  printk(BIOS_DEBUG, "ME: TXT Support : %s\n",
183  hfsts6.fields.txt_support ? "YES" : "NO");
184 
185  if (CONFIG(SOC_INTEL_CSE_LITE_SKU))
187 }
188 
@ BS_OS_RESUME_CHECK
Definition: bootstate.h:85
@ BS_DEV_ENABLE
Definition: bootstate.h:82
@ BS_ON_EXIT
Definition: bootstate.h:96
void print_me_fw_version(void *unused)
Definition: cse.c:855
bool is_cse_enabled(void)
Definition: cse.c:640
uint32_t me_read_config32(int offset)
Definition: cse.c:645
#define printk(level,...)
Definition: stdlib.h:16
@ PCI_ME_HFSTS3
Definition: cse.h:73
@ PCI_ME_HFSTS4
Definition: cse.h:74
@ PCI_ME_HFSTS2
Definition: cse.h:72
@ PCI_ME_HFSTS6
Definition: cse.h:76
@ PCI_ME_HFSTS5
Definition: cse.h:75
@ PCI_ME_HFSTS1
Definition: cse.h:71
@ CONFIG
Definition: dsi_common.h:201
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
uintptr_t base
Definition: uart.c:17
BOOT_STATE_INIT_ENTRY(BS_DEV_ENABLE, BS_ON_EXIT, print_me_fw_version, NULL)
static void dump_me_status(void *unused)
Definition: me.c:113
static void log_me_ro_write_protection_info(bool mfg_mode)
Definition: me.c:94
void spi_get_wp_cse_ro_range(uint32_t *base, uint32_t *limit)
Definition: spi.c:95
bool is_spi_wp_cse_ro_en(void)
Definition: spi.c:87
#define NULL
Definition: stddef.h:19
unsigned int uint32_t
Definition: stdint.h:14
Definition: x86.c:23
Definition: me.h:9
u32 boot_options_present
Definition: me.h:22
u32 operation_state
Definition: me.h:15
u32 invoke_enhance_dbg_mode
Definition: me.h:23
u32 update_in_progress
Definition: me.h:18
u32 d0i3_support_valid
Definition: me.h:28
u32 fw_init_complete
Definition: me.h:16
u32 mfg_mode
Definition: me.h:13
u32 ft_bup_ld_flr
Definition: me.h:17
u32 operation_mode
Definition: me.h:20
u32 error_code
Definition: me.h:19
struct me_hfsts1::@464 fields
u32 data
Definition: me.h:10
u32 working_state
Definition: me.h:12
u32 fpt_bad
Definition: me.h:14
Definition: me.c:11
uint32_t status_data
Definition: me.c:28
uint32_t cpu_replaced_valid
Definition: me.c:21
uint32_t listener_change
Definition: me.c:27
uint32_t cpu_replaced
Definition: me.c:17
uint32_t phase
Definition: me.c:30
uint32_t icc_prog_status
Definition: me.c:15
uint32_t rsvd1
Definition: me.c:26
uint32_t low_power_state
Definition: me.c:22
uint32_t invoke_mebx
Definition: me.c:16
uint32_t data
Definition: me.c:12
uint32_t warm_reset_rqst
Definition: me.c:20
uint32_t current_pmevent
Definition: me.c:29
uint32_t me_power_gate
Definition: me.c:23
uint32_t ipu_needed
Definition: me.c:24
uint32_t rsvd0
Definition: me.c:18
uint32_t mfs_failure
Definition: me.c:19
uint32_t forced_safe_boot
Definition: me.c:25
uint32_t nftp_load_failure
Definition: me.c:14
struct me_hfsts2::@477 fields
Definition: me.h:33
u32 data
Definition: me.h:34
Definition: me.c:35
uint32_t data
Definition: me.c:36
uint32_t boot_guard_self_test
Definition: me.c:45
uint32_t fwsts_valid
Definition: me.c:44
uint32_t rsvd0
Definition: me.c:38
uint32_t enforcement_flow
Definition: me.c:39
uint32_t rvsd2
Definition: me.c:43
uint32_t tpms_disconnected
Definition: me.c:42
uint32_t sx_resume_type
Definition: me.c:40
uint32_t rsvd1
Definition: me.c:41
uint32_t rsvd3
Definition: me.c:46
struct me_hfsts4::@478 fields
Definition: me.c:51
uint32_t inc_key_manifest
Definition: me.c:62
uint32_t error_status_code
Definition: me.c:57
uint32_t inc_boot_policy
Definition: me.c:63
uint32_t result_code_source
Definition: me.c:56
uint32_t data
Definition: me.c:52
struct me_hfsts5::@479 fields
uint32_t valid
Definition: me.c:55
uint32_t scrtm_indicator
Definition: me.c:60
uint32_t start_enforcement
Definition: me.c:65
uint32_t timeout_count
Definition: me.c:59
uint32_t rsvd0
Definition: me.c:64
uint32_t acm_active
Definition: me.c:54
uint32_t acm_done_sts
Definition: me.c:58
uint32_t inc_boot_guard_acm
Definition: me.c:61
Definition: me.c:70
uint32_t verified_boot
Definition: me.c:80
uint32_t fpf_disable
Definition: me.c:88
uint32_t force_boot_guard_acm
Definition: me.c:73
uint32_t measured_boot
Definition: me.c:79
uint32_t bsp_init_disable
Definition: me.c:75
uint32_t protect_bios_env
Definition: me.c:76
uint32_t data
Definition: me.c:71
uint32_t error_enforce_policy
Definition: me.c:78
uint32_t error
Definition: me.c:86
uint32_t kmsvn
Definition: me.c:82
struct me_hfsts6::@480 fields
uint32_t rsvd0
Definition: me.c:77
uint32_t boot_policy_status
Definition: me.c:85
uint32_t cpu_debug_disable
Definition: me.c:74
uint32_t fpf_soc_lock
Definition: me.c:89
uint32_t bpmsvn
Definition: me.c:83
uint32_t txt_support
Definition: me.c:90
uint32_t boot_guard_acmsvn
Definition: me.c:81
uint32_t boot_guard_disable
Definition: me.c:87
uint32_t key_manifest_id
Definition: me.c:84