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 <console/console.h>
4 #include "me.h"
5 
6 /* HFS1[3:0] Current Working State Values */
7 static const char *me_cws_values[] = {
8  [ME_HFS_CWS_RESET] = "Reset",
9  [ME_HFS_CWS_INIT] = "Initializing",
10  [ME_HFS_CWS_REC] = "Recovery",
11  [ME_HFS_CWS_NORMAL] = "Normal",
12  [ME_HFS_CWS_WAIT] = "Platform Disable Wait",
13  [ME_HFS_CWS_TRANS] = "OP State Transition",
14  [ME_HFS_CWS_INVALID] = "Invalid CPU Plugged In",
15 };
16 
17 /* HFS1[8:6] Current Operation State Values */
18 static const char *me_opstate_values[] = {
19  [ME_HFS_STATE_PREBOOT] = "Preboot",
20  [ME_HFS_STATE_M0_UMA] = "M0 with UMA",
21  [ME_HFS_STATE_M3] = "M3 without UMA",
22  [ME_HFS_STATE_M0] = "M0 without UMA",
23  [ME_HFS_STATE_BRINGUP] = "Bring up",
24  [ME_HFS_STATE_ERROR] = "M0 without UMA but with error"
25 };
26 
27 /* HFS[19:16] Current Operation Mode Values */
28 static const char *me_opmode_values[] = {
29  [ME_HFS_MODE_NORMAL] = "Normal",
30  [ME_HFS_MODE_DEBUG] = "Debug",
31  [ME_HFS_MODE_DIS] = "Soft Temporary Disable",
32  [ME_HFS_MODE_OVER_JMPR] = "Security Override via Jumper",
33  [ME_HFS_MODE_OVER_MEI] = "Security Override via MEI Message"
34 };
35 
36 /* HFS[15:12] Error Code Values */
37 static const char *me_error_values[] = {
38  [ME_HFS_ERROR_NONE] = "No Error",
39  [ME_HFS_ERROR_UNCAT] = "Uncategorized Failure",
40  [ME_HFS_ERROR_IMAGE] = "Image Failure",
41  [ME_HFS_ERROR_DEBUG] = "Debug Failure"
42 };
43 
44 /* HFS2[31:28] ME Progress Code */
45 static const char *me_progress_values[] = {
46  [ME_HFS2_PHASE_ROM] = "ROM Phase",
47  [ME_HFS2_PHASE_BUP] = "BUP Phase",
48  [ME_HFS2_PHASE_UKERNEL] = "uKernel Phase",
49  [ME_HFS2_PHASE_POLICY] = "Policy Module",
50  [ME_HFS2_PHASE_MODULE_LOAD] = "Module Loading",
51  [ME_HFS2_PHASE_UNKNOWN] = "Unknown",
52  [ME_HFS2_PHASE_HOST_COMM] = "Host Communication"
53 };
54 
55 /* HFS2[27:24] Power Management Event */
56 static const char *me_pmevent_values[] = {
57  [ME_HFS2_PMEVENT_CLEAN_MOFF_MX_WAKE] = "Clean Moff->Mx wake",
58  [ME_HFS2_PMEVENT_MOFF_MX_WAKE_ERROR] = "Moff->Mx wake after an error",
59  [ME_HFS2_PMEVENT_CLEAN_GLOBAL_RESET] = "Clean global reset",
60  [ME_HFS2_PMEVENT_CLEAN_GLOBAL_RESET_ERROR] = "Global reset after an error",
61  [ME_HFS2_PMEVENT_CLEAN_ME_RESET] = "Clean Intel ME reset",
62  [ME_HFS2_PMEVENT_ME_RESET_EXCEPTION] = "Intel ME reset due to exception",
63  [ME_HFS2_PMEVENT_PSEUDO_ME_RESET] = "Pseudo-global reset",
64  [ME_HFS2_PMEVENT_S0MO_SXM3] = "S0/M0->Sx/M3",
65  [ME_HFS2_PMEVENT_SXM3_S0M0] = "Sx/M3->S0/M0",
66  [ME_HFS2_PMEVENT_NON_PWR_CYCLE_RESET] = "Non-power cycle reset",
67  [ME_HFS2_PMEVENT_PWR_CYCLE_RESET_M3] = "Power cycle reset through M3",
68  [ME_HFS2_PMEVENT_PWR_CYCLE_RESET_MOFF] = "Power cycle reset through Moff",
69  [ME_HFS2_PMEVENT_SXMX_SXMOFF] = "Sx/Mx->Sx/Moff"
70 };
71 
72 /* Progress Code 0 states */
73 static const char *me_progress_rom_values[] = {
74  [ME_HFS2_STATE_ROM_BEGIN] = "BEGIN",
75  [ME_HFS2_STATE_ROM_DISABLE] = "DISABLE"
76 };
77 
78 /* Progress Code 1 states */
79 static const char *me_progress_bup_values[] = {
80  [ME_HFS2_STATE_BUP_INIT] = "Initialization starts",
81  [ME_HFS2_STATE_BUP_DIS_HOST_WAKE] = "Disable the host wake event",
82  [ME_HFS2_STATE_BUP_FLOW_DET] = "Flow determination start process",
83  [ME_HFS2_STATE_BUP_VSCC_ERR] = "Error reading/matching the VSCC table in the descriptor",
84  [ME_HFS2_STATE_BUP_CHECK_STRAP] = "Check to see if straps say ME DISABLED",
85  [ME_HFS2_STATE_BUP_PWR_OK_TIMEOUT] = "Timeout waiting for PWROK",
86  [ME_HFS2_STATE_BUP_MANUF_OVRD_STRAP] = "Possibly handle BUP manufacturing override strap",
87  [ME_HFS2_STATE_BUP_M3] = "Bringup in M3",
88  [ME_HFS2_STATE_BUP_M0] = "Bringup in M0",
89  [ME_HFS2_STATE_BUP_FLOW_DET_ERR] = "Flow detection error",
90  [ME_HFS2_STATE_BUP_M3_CLK_ERR] = "M3 clock switching error",
91  [ME_HFS2_STATE_BUP_CPU_RESET_DID_TIMEOUT_MEM_MISSING] = "Host error - CPU reset timeout, DID timeout, memory missing",
92  [ME_HFS2_STATE_BUP_M3_KERN_LOAD] = "M3 kernel load",
93  [ME_HFS2_STATE_BUP_T32_MISSING] = "T34 missing - cannot program ICC",
94  [ME_HFS2_STATE_BUP_WAIT_DID] = "Waiting for DID BIOS message",
95  [ME_HFS2_STATE_BUP_WAIT_DID_FAIL] = "Waiting for DID BIOS message failure",
96  [ME_HFS2_STATE_BUP_DID_NO_FAIL] = "DID reported no error",
97  [ME_HFS2_STATE_BUP_ENABLE_UMA] = "Enabling UMA",
98  [ME_HFS2_STATE_BUP_ENABLE_UMA_ERR] = "Enabling UMA error",
99  [ME_HFS2_STATE_BUP_SEND_DID_ACK] = "Sending DID Ack to BIOS",
100  [ME_HFS2_STATE_BUP_SEND_DID_ACK_ERR] = "Sending DID Ack to BIOS error",
101  [ME_HFS2_STATE_BUP_M0_CLK] = "Switching clocks in M0",
102  [ME_HFS2_STATE_BUP_M0_CLK_ERR] = "Switching clocks in M0 error",
103  [ME_HFS2_STATE_BUP_TEMP_DIS] = "ME in temp disable",
104  [ME_HFS2_STATE_BUP_M0_KERN_LOAD] = "M0 kernel load",
105 };
106 
107 /* Progress Code 3 states */
108 static const char *me_progress_policy_values[] = {
109  [ME_HFS2_STATE_POLICY_ENTRY] = "Entry into Policy Module",
110  [ME_HFS2_STATE_POLICY_RCVD_S3] = "Received S3 entry",
111  [ME_HFS2_STATE_POLICY_RCVD_S4] = "Received S4 entry",
112  [ME_HFS2_STATE_POLICY_RCVD_S5] = "Received S5 entry",
113  [ME_HFS2_STATE_POLICY_RCVD_UPD] = "Received UPD entry",
114  [ME_HFS2_STATE_POLICY_RCVD_PCR] = "Received PCR entry",
115  [ME_HFS2_STATE_POLICY_RCVD_NPCR] = "Received NPCR entry",
116  [ME_HFS2_STATE_POLICY_RCVD_HOST_WAKE] = "Received host wake",
117  [ME_HFS2_STATE_POLICY_RCVD_AC_DC] = "Received AC<>DC switch",
118  [ME_HFS2_STATE_POLICY_RCVD_DID] = "Received DRAM Init Done",
119  [ME_HFS2_STATE_POLICY_VSCC_NOT_FOUND] = "VSCC Data not found for flash device",
120  [ME_HFS2_STATE_POLICY_VSCC_INVALID] = "VSCC Table is not valid",
121  [ME_HFS2_STATE_POLICY_FPB_ERR] = "Flash Partition Boundary is outside address space",
122  [ME_HFS2_STATE_POLICY_DESCRIPTOR_ERR] = "ME cannot access the chipset descriptor region",
123  [ME_HFS2_STATE_POLICY_VSCC_NO_MATCH] = "Required VSCC values for flash parts do not match",
124 };
125 
126 void intel_me_status(union me_hfs hfs, union me_hfs2 hfs2)
127 {
128  if (CONFIG_DEFAULT_CONSOLE_LOGLEVEL < BIOS_DEBUG)
129  return;
130 
131  /* Check Current States */
132  printk(BIOS_DEBUG, "ME: FW Partition Table : %s\n",
133  hfs.fpt_bad ? "BAD" : "OK");
134  printk(BIOS_DEBUG, "ME: Bringup Loader Failure : %s\n",
135  hfs.ft_bup_ld_flr ? "YES" : "NO");
136  printk(BIOS_DEBUG, "ME: Firmware Init Complete : %s\n",
137  hfs.fw_init_complete ? "YES" : "NO");
138  printk(BIOS_DEBUG, "ME: Manufacturing Mode : %s\n",
139  hfs.mfg_mode ? "YES" : "NO");
140  printk(BIOS_DEBUG, "ME: Boot Options Present : %s\n",
141  hfs.boot_options_present ? "YES" : "NO");
142  printk(BIOS_DEBUG, "ME: Update In Progress : %s\n",
143  hfs.update_in_progress ? "YES" : "NO");
144  printk(BIOS_DEBUG, "ME: Current Working State : %s\n",
146  printk(BIOS_DEBUG, "ME: Current Operation State : %s\n",
148  printk(BIOS_DEBUG, "ME: Current Operation Mode : %s\n",
150  printk(BIOS_DEBUG, "ME: Error Code : %s\n",
152  printk(BIOS_DEBUG, "ME: Progress Phase : %s\n",
154  printk(BIOS_DEBUG, "ME: Power Management Event : %s\n",
156 
157  printk(BIOS_DEBUG, "ME: Progress Phase State : ");
158  switch (hfs2.progress_code) {
159  case ME_HFS2_PHASE_ROM: /* ROM Phase */
160  printk(BIOS_DEBUG, "%s",
162  break;
163 
164  case ME_HFS2_PHASE_BUP: /* Bringup Phase */
167  printk(BIOS_DEBUG, "%s",
169  else
170  printk(BIOS_DEBUG, "0x%02x", hfs2.current_state);
171  break;
172 
173  case ME_HFS2_PHASE_POLICY: /* Policy Module Phase */
176  printk(BIOS_DEBUG, "%s",
178  else
179  printk(BIOS_DEBUG, "0x%02x", hfs2.current_state);
180  break;
181 
182  case ME_HFS2_PHASE_HOST_COMM: /* Host Communication Phase */
183  if (!hfs2.current_state)
184  printk(BIOS_DEBUG, "Host communication established");
185  else
186  printk(BIOS_DEBUG, "0x%02x", hfs2.current_state);
187  break;
188 
189  default:
190  printk(BIOS_DEBUG, "Unknown phase: 0x%02x state: 0x%02x",
191  hfs2.progress_code, hfs2.current_state);
192  }
193  printk(BIOS_DEBUG, "\n");
194 }
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define printk(level,...)
Definition: stdlib.h:16
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#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_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_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_HFS_STATE_M0
Definition: me.h:29
#define ME_HFS2_STATE_POLICY_DESCRIPTOR_ERR
Definition: me.h:153
#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_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 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 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 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
void intel_me_status(void)
Definition: me_status.c:194
static const char * me_progress_bup_values[]
Definition: me_status.c:79
static const char * me_opstate_values[]
Definition: me_status.c:18
static const char * me_cws_values[]
Definition: me_status.c:7
static const char * me_pmevent_values[]
Definition: me_status.c:56
static const char * me_progress_rom_values[]
Definition: me_status.c:73
static const char * me_progress_values[]
Definition: me_status.c:45
static const char * me_error_values[]
Definition: me_status.c:37
static const char * me_progress_policy_values[]
Definition: me_status.c:108
static const char * me_opmode_values[]
Definition: me_status.c:28
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 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