coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
me_status.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/pci_ops.h>
4 #include <console/console.h>
5 #include <device/pci.h>
6 #include <string.h>
7 #include <soc/pci_devs.h>
8 #include <soc/me.h>
9 #include <delay.h>
10 
11 #define ARRAY_TO_ELEMENT(__array__, __index__, __default__) \
12  (((__index__) < ARRAY_SIZE((__array__))) ? \
13  (__array__)[(__index__)] : \
14  (__default__))
15 
16 static inline void me_read_dword_ptr(void *ptr, int offset)
17 {
19  memcpy(ptr, &dword, sizeof(dword));
20 }
21 
22 /* HFS1[3:0] Current Working State Values */
23 static const char *me_cws_values[] = {
24  [ME_HFS_CWS_RESET] = "Reset",
25  [ME_HFS_CWS_INIT] = "Initializing",
26  [ME_HFS_CWS_REC] = "Recovery",
27  [3] = "Unknown (3)",
28  [4] = "Unknown (4)",
29  [ME_HFS_CWS_NORMAL] = "Normal",
30  [ME_HFS_CWS_WAIT] = "Platform Disable Wait",
31  [ME_HFS_CWS_TRANS] = "OP State Transition",
32  [ME_HFS_CWS_INVALID] = "Invalid CPU Plugged In",
33  [9] = "Unknown (9)",
34  [10] = "Unknown (10)",
35  [11] = "Unknown (11)",
36  [12] = "Unknown (12)",
37  [13] = "Unknown (13)",
38  [14] = "Unknown (14)",
39  [15] = "Unknown (15)",
40 };
41 
42 /* HFS1[8:6] Current Operation State Values */
43 static const char *me_opstate_values[] = {
44  [ME_HFS_STATE_PREBOOT] = "Preboot",
45  [ME_HFS_STATE_M0_UMA] = "M0 with UMA",
46  [ME_HFS_STATE_M3] = "M3 without UMA",
47  [ME_HFS_STATE_M0] = "M0 without UMA",
48  [ME_HFS_STATE_BRINGUP] = "Bring up",
49  [ME_HFS_STATE_ERROR] = "M0 without UMA but with error"
50 };
51 
52 /* HFS[19:16] Current Operation Mode Values */
53 static const char *me_opmode_values[] = {
54  [ME_HFS_MODE_NORMAL] = "Normal",
55  [ME_HFS_MODE_DEBUG] = "Debug",
56  [ME_HFS_MODE_DIS] = "Soft Temporary Disable",
57  [ME_HFS_MODE_OVER_JMPR] = "Security Override via Jumper",
58  [ME_HFS_MODE_OVER_MEI] = "Security Override via MEI Message"
59 };
60 
61 /* HFS[15:12] Error Code Values */
62 static const char *me_error_values[] = {
63  [ME_HFS_ERROR_NONE] = "No Error",
64  [ME_HFS_ERROR_UNCAT] = "Uncategorized Failure",
65  [ME_HFS_ERROR_IMAGE] = "Image Failure",
66  [ME_HFS_ERROR_DEBUG] = "Debug Failure"
67 };
68 
69 /* HFS2[31:28] ME Progress Code */
70 static const char *me_progress_values[] = {
71  [ME_HFS2_PHASE_ROM] = "ROM Phase",
72  [ME_HFS2_PHASE_BUP] = "BUP Phase",
73  [ME_HFS2_PHASE_UKERNEL] = "uKernel Phase",
74  [ME_HFS2_PHASE_POLICY] = "Policy Module",
75  [ME_HFS2_PHASE_MODULE_LOAD] = "Module Loading",
76  [ME_HFS2_PHASE_UNKNOWN] = "Unknown",
77  [ME_HFS2_PHASE_HOST_COMM] = "Host Communication"
78 };
79 
80 /* HFS2[27:24] Power Management Event */
81 static const char *me_pmevent_values[] = {
83  "Clean Moff->Mx wake",
85  "Moff->Mx wake after an error",
87  "Clean global reset",
89  "Global reset after an error",
91  "Clean Intel ME reset",
93  "Intel ME reset due to exception",
95  "Pseudo-global reset",
97  "S0/M0->Sx/M3",
99  "Sx/M3->S0/M0",
101  "Non-power cycle reset",
103  "Power cycle reset through M3",
105  "Power cycle reset through Moff",
107  "Sx/Mx->Sx/Moff"
108 };
109 
110 /* Progress Code 0 states */
111 static const char *me_progress_rom_values[] = {
112  [ME_HFS2_STATE_ROM_BEGIN] = "BEGIN",
113  [ME_HFS2_STATE_ROM_DISABLE] = "DISABLE"
114 };
115 
116 /* Progress Code 1 states */
117 static const char *me_progress_bup_values[] = {
119  "Initialization starts",
121  "Disable the host wake event",
123  "Flow determination start process",
125  "Error reading/matching the VSCC table in the descriptor",
127  "Check to see if straps say ME DISABLED",
129  "Timeout waiting for PWROK",
131  "Possibly handle BUP manufacturing override strap",
133  "Bringup in M3",
135  "Bringup in M0",
137  "Flow detection error",
139  "M3 clock switching error",
141  "Host error - CPU reset timeout, DID timeout, memory missing",
143  "M3 kernel load",
145  "T34 missing - cannot program ICC",
147  "Waiting for DID BIOS message",
149  "Waiting for DID BIOS message failure",
151  "DID reported no error",
153  "Enabling UMA",
155  "Enabling UMA error",
157  "Sending DID Ack to BIOS",
159  "Sending DID Ack to BIOS error",
161  "Switching clocks in M0",
163  "Switching clocks in M0 error",
165  "ME in temp disable",
167  "M0 kernel load",
168 };
169 
170 /* Progress Code 3 states */
171 static const char *me_progress_policy_values[] = {
172  [ME_HFS2_STATE_POLICY_ENTRY] = "Entry into Policy Module",
173  [ME_HFS2_STATE_POLICY_RCVD_S3] = "Received S3 entry",
174  [ME_HFS2_STATE_POLICY_RCVD_S4] = "Received S4 entry",
175  [ME_HFS2_STATE_POLICY_RCVD_S5] = "Received S5 entry",
176  [ME_HFS2_STATE_POLICY_RCVD_UPD] = "Received UPD entry",
177  [ME_HFS2_STATE_POLICY_RCVD_PCR] = "Received PCR entry",
178  [ME_HFS2_STATE_POLICY_RCVD_NPCR] = "Received NPCR entry",
179  [ME_HFS2_STATE_POLICY_RCVD_HOST_WAKE] = "Received host wake",
180  [ME_HFS2_STATE_POLICY_RCVD_AC_DC] = "Received AC<>DC switch",
181  [ME_HFS2_STATE_POLICY_RCVD_DID] = "Received DRAM Init Done",
183  "VSCC Data not found for flash device",
185  "VSCC Table is not valid",
187  "Flash Partition Boundary is outside address space",
189  "ME cannot access the chipset descriptor region",
191  "Required VSCC values for flash parts do not match",
192 };
193 
194 void intel_me_status(void)
195 {
196  if (CONFIG_DEFAULT_CONSOLE_LOGLEVEL < BIOS_DEBUG)
197  return;
198 
199  struct me_hfs _hfs, *hfs = &_hfs;
200  struct me_hfs2 _hfs2, *hfs2 = &_hfs2;
201 
204 
205  /* Check Current States */
206  printk(BIOS_DEBUG, "ME: FW Partition Table : %s\n",
207  hfs->fpt_bad ? "BAD" : "OK");
208  printk(BIOS_DEBUG, "ME: Bringup Loader Failure : %s\n",
209  hfs->ft_bup_ld_flr ? "YES" : "NO");
210  printk(BIOS_DEBUG, "ME: Firmware Init Complete : %s\n",
211  hfs->fw_init_complete ? "YES" : "NO");
212  printk(BIOS_DEBUG, "ME: Manufacturing Mode : %s\n",
213  hfs->mfg_mode ? "YES" : "NO");
214  printk(BIOS_DEBUG, "ME: Boot Options Present : %s\n",
215  hfs->boot_options_present ? "YES" : "NO");
216  printk(BIOS_DEBUG, "ME: Update In Progress : %s\n",
217  hfs->update_in_progress ? "YES" : "NO");
218  printk(BIOS_DEBUG, "ME: Current Working State : %s\n",
220  hfs->working_state,
221  "Unknown (OOB)"));
222  printk(BIOS_DEBUG, "ME: Current Operation State : %s\n",
224  hfs->operation_state,
225  "Unknown (OOB)"));
226  printk(BIOS_DEBUG, "ME: Current Operation Mode : %s\n",
228  hfs->operation_mode,
229  "Unknown (OOB)"));
230  printk(BIOS_DEBUG, "ME: Error Code : %s\n",
232  hfs->error_code,
233  "Unknown (OOB)"));
234  printk(BIOS_DEBUG, "ME: Progress Phase : %s\n",
236  hfs2->progress_code,
237  "Unknown (OOB)"));
238  printk(BIOS_DEBUG, "ME: Power Management Event : %s\n",
240  hfs2->current_pmevent,
241  "Unknown (OOB)"));
242 
243  printk(BIOS_DEBUG, "ME: Progress Phase State : ");
244  switch (hfs2->progress_code) {
245  case ME_HFS2_PHASE_ROM: /* ROM Phase */
246  printk(BIOS_DEBUG, "%s",
248  hfs2->current_state,
249  "Unknown (OOB)"));
250  break;
251 
252  case ME_HFS2_PHASE_UKERNEL: /* uKernel Phase */
253  printk(BIOS_DEBUG, "0x%02x", hfs2->current_state);
254  break;
255 
256  case ME_HFS2_PHASE_BUP: /* Bringup Phase */
258  hfs2->current_state, NULL))
259  printk(BIOS_DEBUG, "%s",
261  hfs2->current_state,
262  NULL));
263  else
264  printk(BIOS_DEBUG, "0x%02x", hfs2->current_state);
265  break;
266 
267  case ME_HFS2_PHASE_POLICY: /* Policy Module Phase */
269  hfs2->current_state, NULL))
270  printk(BIOS_DEBUG, "%s",
272  hfs2->current_state,
273  NULL));
274  else
275  printk(BIOS_DEBUG, "0x%02x", hfs2->current_state);
276  break;
277 
278  case ME_HFS2_PHASE_HOST_COMM: /* Host Communication Phase */
279  if (!hfs2->current_state)
280  printk(BIOS_DEBUG, "Host communication established");
281  else
282  printk(BIOS_DEBUG, "0x%02x", hfs2->current_state);
283  break;
284 
285  default:
286  printk(BIOS_DEBUG, "Unknown phase: 0x%02x state: 0x%02x",
287  hfs2->progress_code, hfs2->current_state);
288  }
289  printk(BIOS_DEBUG, "\n");
290 }
291 
293 {
294  int count;
295  u32 hsiover;
296  struct me_hfs hfs;
297 
298  /* Query for HSIO version, overloads H_GS and HFS */
301 
302  /* Must wait for ME acknowledgement */
303  for (count = ME_RETRY; count > 0; --count) {
305  if (hfs.bios_msg_ack)
306  break;
307  udelay(ME_DELAY);
308  }
309  if (!count) {
310  printk(BIOS_ERR, "ME failed to respond\n");
311  return;
312  }
313 
314  /* HSIO version should be in HFS_5 */
316  *version = hsiover >> 16;
317  *checksum = hsiover & 0xffff;
318 
319  printk(BIOS_DEBUG, "ME: HSIO Version : %d (CRC 0x%04x)\n",
320  *version, *checksum);
321 
322  /* Reset registers to normal behavior */
325 }
void * memcpy(void *dest, const void *src, size_t n)
Definition: memcpy.c:7
#define printk(level,...)
Definition: stdlib.h:16
static size_t offset
Definition: flashconsole.c:16
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
static uint8_t checksum(uint8_t *data, int offset)
Definition: ipmi_fru.c:70
unsigned int version[2]
Definition: edid.c:55
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
#define ME_HFS2_PMEVENT_PWR_CYCLE_RESET_MOFF
Definition: me.h:167
#define ME_HFS2_STATE_POLICY_VSCC_INVALID
Definition: me.h:151
#define ME_HFS2_PHASE_BUP
Definition: me.h:103
#define ME_RETRY
Definition: me.h:8
#define ME_HFS2_STATE_BUP_M0_CLK
Definition: me.h:135
#define ME_HFS2_PHASE_HOST_COMM
Definition: me.h:108
#define ME_HFS_ERROR_IMAGE
Definition: me.h:34
#define ME_DELAY
Definition: me.h:9
#define ME_HFS2_STATE_BUP_MANUF_OVRD_STRAP
Definition: me.h:120
#define ME_HFS2_STATE_BUP_WAIT_DID
Definition: me.h:128
#define ME_HFS2_STATE_BUP_CHECK_STRAP
Definition: me.h:118
#define ME_HFS2_STATE_BUP_M3_CLK_ERR
Definition: me.h:124
#define ME_HFS2_PMEVENT_SXMX_SXMOFF
Definition: me.h:168
#define ME_HFS_ERROR_UNCAT
Definition: me.h:33
#define ME_HFS2_PHASE_MODULE_LOAD
Definition: me.h:106
#define ME_HFS_CWS_REC
Definition: me.h:21
#define ME_HFS_MODE_NORMAL
Definition: me.h:36
#define ME_HFS2_STATE_BUP_ENABLE_UMA_ERR
Definition: me.h:132
#define ME_HFS2_STATE_POLICY_VSCC_NOT_FOUND
Definition: me.h:150
#define ME_HFS2_STATE_BUP_M3
Definition: me.h:121
#define ME_HFS_ERROR_DEBUG
Definition: me.h:35
#define ME_HFS2_PMEVENT_NON_PWR_CYCLE_RESET
Definition: me.h:165
#define ME_HFS2_PMEVENT_PWR_CYCLE_RESET_M3
Definition: me.h:166
#define ME_HFS2_PHASE_UKERNEL
Definition: me.h:104
#define ME_HFS2_STATE_BUP_INIT
Definition: me.h:114
#define ME_HFS2_STATE_BUP_DID_NO_FAIL
Definition: me.h:130
#define ME_HFS_MODE_DIS
Definition: me.h:38
#define ME_HSIO_CMD_GETHSIOVER
Definition: me.h:85
#define ME_HFS_STATE_M0
Definition: me.h:29
#define ME_HFS2_STATE_POLICY_DESCRIPTOR_ERR
Definition: me.h:153
#define PCI_ME_HFS2
Definition: me.h:100
#define ME_HFS2_PHASE_POLICY
Definition: me.h:105
#define ME_HFS2_PHASE_ROM
Definition: me.h:102
#define ME_HFS2_PHASE_UNKNOWN
Definition: me.h:107
#define ME_HFS2_STATE_POLICY_RCVD_UPD
Definition: me.h:144
#define ME_HFS2_STATE_BUP_T32_MISSING
Definition: me.h:127
#define ME_HFS2_PMEVENT_PSEUDO_ME_RESET
Definition: me.h:162
#define ME_HFS2_STATE_BUP_TEMP_DIS
Definition: me.h:137
#define ME_HFS2_STATE_BUP_M0_KERN_LOAD
Definition: me.h:138
#define ME_HFS2_STATE_BUP_PWR_OK_TIMEOUT
Definition: me.h:119
#define ME_HFS2_PMEVENT_CLEAN_ME_RESET
Definition: me.h:160
#define ME_HFS_STATE_M0_UMA
Definition: me.h:27
#define ME_HFS2_PMEVENT_S0MO_SXM3
Definition: me.h:163
#define ME_HFS2_PMEVENT_SXM3_S0M0
Definition: me.h:164
#define ME_HFS_MODE_OVER_MEI
Definition: me.h:40
#define ME_HFS_CWS_RESET
Definition: me.h:19
#define ME_HFS2_STATE_POLICY_RCVD_AC_DC
Definition: me.h:148
#define ME_HSIO_MESSAGE
Definition: me.h:84
#define ME_HFS2_STATE_POLICY_RCVD_NPCR
Definition: me.h:146
#define ME_HFS2_STATE_BUP_CPU_RESET_DID_TIMEOUT_MEM_MISSING
Definition: me.h:125
#define ME_HFS2_STATE_BUP_DIS_HOST_WAKE
Definition: me.h:115
#define ME_HFS2_STATE_POLICY_RCVD_PCR
Definition: me.h:145
#define PCI_ME_HFS
Definition: me.h:18
#define ME_HFS2_STATE_BUP_M3_KERN_LOAD
Definition: me.h:126
#define ME_HFS_CWS_NORMAL
Definition: me.h:22
#define ME_HFS_STATE_PREBOOT
Definition: me.h:26
#define ME_HFS2_PMEVENT_MOFF_MX_WAKE_ERROR
Definition: me.h:157
#define ME_HFS2_STATE_POLICY_FPB_ERR
Definition: me.h:152
#define ME_HFS2_PMEVENT_ME_RESET_EXCEPTION
Definition: me.h:161
#define ME_HFS2_STATE_POLICY_VSCC_NO_MATCH
Definition: me.h:154
#define ME_HFS_CWS_INIT
Definition: me.h:20
#define ME_HFS_CWS_WAIT
Definition: me.h:23
#define ME_HFS_CWS_TRANS
Definition: me.h:24
#define ME_HFS2_STATE_BUP_SEND_DID_ACK_ERR
Definition: me.h:134
#define PCI_ME_HFS5
Definition: me.h:187
#define ME_HFS2_PMEVENT_CLEAN_GLOBAL_RESET_ERROR
Definition: me.h:159
#define ME_HFS_MODE_OVER_JMPR
Definition: me.h:39
#define ME_HFS2_STATE_BUP_VSCC_ERR
Definition: me.h:117
#define ME_HFS2_STATE_BUP_WAIT_DID_FAIL
Definition: me.h:129
#define ME_HFS2_STATE_POLICY_RCVD_S4
Definition: me.h:142
#define ME_HFS2_STATE_BUP_ENABLE_UMA
Definition: me.h:131
#define ME_HFS2_STATE_ROM_DISABLE
Definition: me.h:112
#define ME_HFS2_STATE_POLICY_ENTRY
Definition: me.h:140
#define ME_HFS2_STATE_ROM_BEGIN
Definition: me.h:111
#define ME_HFS_STATE_M3
Definition: me.h:28
#define ME_HFS2_STATE_POLICY_RCVD_S5
Definition: me.h:143
#define ME_HFS2_PMEVENT_CLEAN_MOFF_MX_WAKE
Definition: me.h:156
#define PCI_ME_H_GS
Definition: me.h:77
#define ME_HFS2_STATE_POLICY_RCVD_S3
Definition: me.h:141
#define ME_HFS2_STATE_BUP_M0_CLK_ERR
Definition: me.h:136
#define ME_HFS_STATE_BRINGUP
Definition: me.h:30
#define ME_HFS2_STATE_BUP_FLOW_DET_ERR
Definition: me.h:123
#define ME_HFS_MODE_DEBUG
Definition: me.h:37
#define ME_HFS_CWS_INVALID
Definition: me.h:25
#define ME_HFS_ERROR_NONE
Definition: me.h:32
#define ME_HFS2_STATE_BUP_SEND_DID_ACK
Definition: me.h:133
#define ME_HFS2_PMEVENT_CLEAN_GLOBAL_RESET
Definition: me.h:158
#define ME_HFS2_STATE_POLICY_RCVD_HOST_WAKE
Definition: me.h:147
#define ME_HFS2_STATE_POLICY_RCVD_DID
Definition: me.h:149
#define ME_HFS2_STATE_BUP_FLOW_DET
Definition: me.h:116
#define ME_HFS_STATE_ERROR
Definition: me.h:31
#define ME_HFS2_STATE_BUP_M0
Definition: me.h:122
#define PCH_DEV_ME
Definition: pci_devs.h:55
static const char * me_progress_bup_values[]
Definition: me_status.c:117
static void me_read_dword_ptr(void *ptr, int offset)
Definition: me_status.c:16
void intel_me_status(void)
Definition: me_status.c:194
static const char * me_opstate_values[]
Definition: me_status.c:43
void intel_me_hsio_version(uint16_t *version, uint16_t *checksum)
Definition: me_status.c:292
static const char * me_cws_values[]
Definition: me_status.c:23
#define ARRAY_TO_ELEMENT(__array__, __index__, __default__)
Definition: me_status.c:11
static const char * me_pmevent_values[]
Definition: me_status.c:81
static const char * me_progress_rom_values[]
Definition: me_status.c:111
static const char * me_progress_values[]
Definition: me_status.c:70
static const char * me_error_values[]
Definition: me_status.c:62
static const char * me_progress_policy_values[]
Definition: me_status.c:171
static const char * me_opmode_values[]
Definition: me_status.c:53
#define NULL
Definition: stddef.h:19
unsigned short uint16_t
Definition: stdint.h:11
uint32_t u32
Definition: stdint.h:51
Definition: me.h:170
u32 current_state
Definition: me.h:182
u32 current_pmevent
Definition: me.h:183
u32 progress_code
Definition: me.h:184
Definition: me.h:51
u32 fpt_bad
Definition: me.h:54
u32 fw_init_complete
Definition: me.h:56
u32 operation_state
Definition: me.h:55
u32 working_state
Definition: me.h:52
u32 mfg_mode
Definition: me.h:53
u32 bios_msg_ack
Definition: me.h:64
u32 update_in_progress
Definition: me.h:58
u32 ft_bup_ld_flr
Definition: me.h:57
u32 operation_mode
Definition: me.h:60
u32 error_code
Definition: me.h:59
u32 boot_options_present
Definition: me.h:62
void udelay(uint32_t us)
Definition: udelay.c:15
#define count