coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
me.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef _INTEL_ME_H
4 #define _INTEL_ME_H
5 
6 #include <device/device.h>
7 #include <types.h>
8 
9 #define ME_RETRY 100000 /* 1 second */
10 #define ME_DELAY 10 /* 10 us */
11 
12 /*
13  * Management Engine PCI registers
14  */
15 
16 #define PCI_CPU_DEVICE PCI_DEV(0,0,0)
17 #define PCI_CPU_MEBASE_L 0x70 /* Set by MRC */
18 #define PCI_CPU_MEBASE_H 0x74 /* Set by MRC */
19 
20 #define PCI_ME_HFS 0x40
21 #define ME_HFS_CWS_RESET 0
22 #define ME_HFS_CWS_INIT 1
23 #define ME_HFS_CWS_REC 2
24 #define ME_HFS_CWS_NORMAL 5
25 #define ME_HFS_CWS_WAIT 6
26 #define ME_HFS_CWS_TRANS 7
27 #define ME_HFS_CWS_INVALID 8
28 #define ME_HFS_STATE_PREBOOT 0
29 #define ME_HFS_STATE_M0_UMA 1
30 #define ME_HFS_STATE_M3 4
31 #define ME_HFS_STATE_M0 5
32 #define ME_HFS_STATE_BRINGUP 6
33 #define ME_HFS_STATE_ERROR 7
34 #define ME_HFS_ERROR_NONE 0
35 #define ME_HFS_ERROR_UNCAT 1
36 #define ME_HFS_ERROR_IMAGE 3
37 #define ME_HFS_ERROR_DEBUG 4
38 #define ME_HFS_MODE_NORMAL 0
39 #define ME_HFS_MODE_DEBUG 2
40 #define ME_HFS_MODE_DIS 3
41 #define ME_HFS_MODE_OVER_JMPR 4
42 #define ME_HFS_MODE_OVER_MEI 5
43 #define ME_HFS_BIOS_DRAM_ACK 1
44 #define ME_HFS_ACK_NO_DID 0
45 #define ME_HFS_ACK_RESET 1
46 #define ME_HFS_ACK_PWR_CYCLE 2
47 #define ME_HFS_ACK_S3 3
48 #define ME_HFS_ACK_S4 4
49 #define ME_HFS_ACK_S5 5
50 #define ME_HFS_ACK_GBL_RESET 6
51 #define ME_HFS_ACK_CONTINUE 7
52 
53 union me_hfs {
54  struct __packed {
68  };
69  u32 raw;
70 };
71 
72 #define PCI_ME_UMA 0x44
73 
74 union me_uma {
75  struct __packed {
76  u32 size: 6;
78  u32 valid: 1;
81  };
82  u32 raw;
83 };
84 
85 #define PCI_ME_H_GS 0x4c
86 #define ME_INIT_DONE 1
87 #define ME_INIT_STATUS_SUCCESS 0
88 #define ME_INIT_STATUS_NOMEM 1
89 #define ME_INIT_STATUS_ERROR 2
90 #define ME_INIT_STATUS_SUCCESS_OTHER 3 /* SEE ME9 BWG */
91 
92 union me_did {
93  struct __packed {
97  u32 status: 4;
99  };
100  u32 raw;
101 };
102 
103 /*
104  * Apparently the GMES register is renamed to HFS2 (or HFSTS2 according
105  * to ME9 BWG). Sadly the PCH EDS and the ME BWG do not match on nomenclature.
106  */
107 #define PCI_ME_HFS2 0x48
108 /* Infrastructure Progress Values */
109 #define ME_HFS2_PHASE_ROM 0
110 #define ME_HFS2_PHASE_BUP 1
111 #define ME_HFS2_PHASE_UKERNEL 2
112 #define ME_HFS2_PHASE_POLICY 3
113 #define ME_HFS2_PHASE_MODULE_LOAD 4
114 #define ME_HFS2_PHASE_UNKNOWN 5
115 #define ME_HFS2_PHASE_HOST_COMM 6
116 /* Current State - Based on Infra Progress values. */
117 /* ROM State */
118 #define ME_HFS2_STATE_ROM_BEGIN 0
119 #define ME_HFS2_STATE_ROM_DISABLE 6
120 /* BUP State */
121 #define ME_HFS2_STATE_BUP_INIT 0
122 #define ME_HFS2_STATE_BUP_DIS_HOST_WAKE 1
123 #define ME_HFS2_STATE_BUP_FLOW_DET 4
124 #define ME_HFS2_STATE_BUP_VSCC_ERR 8
125 #define ME_HFS2_STATE_BUP_CHECK_STRAP 0xa
126 #define ME_HFS2_STATE_BUP_PWR_OK_TIMEOUT 0xb
127 #define ME_HFS2_STATE_BUP_MANUF_OVRD_STRAP 0xd
128 #define ME_HFS2_STATE_BUP_M3 0x11
129 #define ME_HFS2_STATE_BUP_M0 0x12
130 #define ME_HFS2_STATE_BUP_FLOW_DET_ERR 0x13
131 #define ME_HFS2_STATE_BUP_M3_CLK_ERR 0x15
132 #define ME_HFS2_STATE_BUP_CPU_RESET_DID_TIMEOUT_MEM_MISSING 0x17
133 #define ME_HFS2_STATE_BUP_M3_KERN_LOAD 0x18
134 #define ME_HFS2_STATE_BUP_T32_MISSING 0x1c
135 #define ME_HFS2_STATE_BUP_WAIT_DID 0x1f
136 #define ME_HFS2_STATE_BUP_WAIT_DID_FAIL 0x20
137 #define ME_HFS2_STATE_BUP_DID_NO_FAIL 0x21
138 #define ME_HFS2_STATE_BUP_ENABLE_UMA 0x22
139 #define ME_HFS2_STATE_BUP_ENABLE_UMA_ERR 0x23
140 #define ME_HFS2_STATE_BUP_SEND_DID_ACK 0x24
141 #define ME_HFS2_STATE_BUP_SEND_DID_ACK_ERR 0x25
142 #define ME_HFS2_STATE_BUP_M0_CLK 0x26
143 #define ME_HFS2_STATE_BUP_M0_CLK_ERR 0x27
144 #define ME_HFS2_STATE_BUP_TEMP_DIS 0x28
145 #define ME_HFS2_STATE_BUP_M0_KERN_LOAD 0x32
146 /* Policy Module State */
147 #define ME_HFS2_STATE_POLICY_ENTRY 0
148 #define ME_HFS2_STATE_POLICY_RCVD_S3 3
149 #define ME_HFS2_STATE_POLICY_RCVD_S4 4
150 #define ME_HFS2_STATE_POLICY_RCVD_S5 5
151 #define ME_HFS2_STATE_POLICY_RCVD_UPD 6
152 #define ME_HFS2_STATE_POLICY_RCVD_PCR 7
153 #define ME_HFS2_STATE_POLICY_RCVD_NPCR 8
154 #define ME_HFS2_STATE_POLICY_RCVD_HOST_WAKE 9
155 #define ME_HFS2_STATE_POLICY_RCVD_AC_DC 0xa
156 #define ME_HFS2_STATE_POLICY_RCVD_DID 0xb
157 #define ME_HFS2_STATE_POLICY_VSCC_NOT_FOUND 0xc
158 #define ME_HFS2_STATE_POLICY_VSCC_INVALID 0xd
159 #define ME_HFS2_STATE_POLICY_FPB_ERR 0xe
160 #define ME_HFS2_STATE_POLICY_DESCRIPTOR_ERR 0xf
161 #define ME_HFS2_STATE_POLICY_VSCC_NO_MATCH 0x10
162 /* Current PM Event Values */
163 #define ME_HFS2_PMEVENT_CLEAN_MOFF_MX_WAKE 0
164 #define ME_HFS2_PMEVENT_MOFF_MX_WAKE_ERROR 1
165 #define ME_HFS2_PMEVENT_CLEAN_GLOBAL_RESET 2
166 #define ME_HFS2_PMEVENT_CLEAN_GLOBAL_RESET_ERROR 3
167 #define ME_HFS2_PMEVENT_CLEAN_ME_RESET 4
168 #define ME_HFS2_PMEVENT_ME_RESET_EXCEPTION 5
169 #define ME_HFS2_PMEVENT_PSEUDO_ME_RESET 6
170 #define ME_HFS2_PMEVENT_S0MO_SXM3 7
171 #define ME_HFS2_PMEVENT_SXM3_S0M0 8
172 #define ME_HFS2_PMEVENT_NON_PWR_CYCLE_RESET 9
173 #define ME_HFS2_PMEVENT_PWR_CYCLE_RESET_M3 0xa
174 #define ME_HFS2_PMEVENT_PWR_CYCLE_RESET_MOFF 0xb
175 #define ME_HFS2_PMEVENT_SXMX_SXMOFF 0xc
176 
177 union me_hfs2 {
178  struct __packed {
193  };
195 };
196 
197 #define PCI_ME_H_GS2 0x70
198 #define PCI_ME_MBP_GIVE_UP 0x01
199 
200 #define PCI_ME_HERES 0xbc
201 #define PCI_ME_EXT_SHA1 0x00
202 #define PCI_ME_EXT_SHA256 0x02
203 #define PCI_ME_HER(x) (0xc0+(4*(x)))
204 
205 union me_heres {
206  struct __packed {
211  };
212  u32 raw;
213 };
214 
215 /*
216  * Management Engine MEI registers
217  */
218 
219 #define MEI_H_CB_WW 0x00
220 #define MEI_H_CSR 0x04
221 #define MEI_ME_CB_RW 0x08
222 #define MEI_ME_CSR_HA 0x0c
223 
224 union mei_csr {
225  struct __packed {
229  u32 ready: 1;
230  u32 reset: 1;
235  };
237 };
238 
239 #define MEI_ADDRESS_CORE 0x01
240 #define MEI_ADDRESS_AMT 0x02
241 #define MEI_ADDRESS_RESERVED 0x03
242 #define MEI_ADDRESS_WDT 0x04
243 #define MEI_ADDRESS_MKHI 0x07
244 #define MEI_ADDRESS_ICC 0x08
245 #define MEI_ADDRESS_THERMAL 0x09
246 
247 #define MEI_HOST_ADDRESS 0
248 
249 union mei_header {
250  struct __packed {
256  };
258 };
259 
260 #define MKHI_GROUP_ID_CBM 0x00
261 #define MKHI_GROUP_ID_FWCAPS 0x03
262 #define MKHI_GROUP_ID_MDES 0x08
263 #define MKHI_GROUP_ID_GEN 0xff
264 
265 #define MKHI_GLOBAL_RESET 0x0b
266 
267 #define MKHI_FWCAPS_GET_RULE 0x02
268 
269 #define MKHI_MDES_ENABLE 0x09
270 
271 #define MKHI_GET_FW_VERSION 0x02
272 #define MKHI_END_OF_POST 0x0c
273 #define MKHI_FEATURE_OVERRIDE 0x14
274 
275 struct mkhi_header {
276  u32 group_id: 8;
277  u32 command: 7;
278  u32 is_response: 1;
279  u32 reserved: 8;
280  u32 result: 8;
282 
283 struct me_fw_version {
284  u16 code_minor;
285  u16 code_major;
292 } __packed;
293 
294 /* ICC Messages */
295 #define ICC_SET_CLOCK_ENABLES 0x3
296 #define ICC_API_VERSION_LYNXPOINT 0x00030000
297 
298 struct icc_header {
301  u32 icc_status;
302  u32 length;
303  u32 reserved;
304 } __packed;
305 
306 struct icc_clock_enables_msg {
308  u32 clock_mask;
309  u32 no_response: 1;
310  u32 reserved: 31;
311 } __packed;
312 
313 #define HECI_EOP_STATUS_SUCCESS 0x0
314 #define HECI_EOP_PERFORM_GLOBAL_RESET 0x1
315 
316 #define CBM_RR_GLOBAL_RESET 0x01
317 
318 #define GLOBAL_RESET_BIOS_MRC 0x01
319 #define GLOBAL_RESET_BIOS_POST 0x02
320 #define GLOBAL_RESET_MEBX 0x03
321 
322 struct me_global_reset {
324  u8 reset_type;
325 } __packed;
326 
334 };
335 
336 /* Defined in me_status.c for both romstage and ramstage */
337 void intel_me_status(union me_hfs hfs, union me_hfs2 hfs2);
338 
339 void intel_early_me_status(void);
340 int intel_early_me_init(void);
341 int intel_early_me_uma_size(void);
342 int intel_early_me_init_done(u8 status);
343 
344 void intel_me_finalize(struct device *dev);
345 
346 /*
347  * ME to BIOS Payload Datastructures and definitions. The ordering of the
348  * structures follows the ordering in the ME9 BWG.
349  */
350 
351 #define MBP_APPID_KERNEL 1
352 #define MBP_APPID_INTEL_AT 3
353 #define MBP_APPID_HWA 4
354 #define MBP_APPID_ICC 5
355 #define MBP_APPID_NFC 6
356 /* Kernel items: */
357 #define MBP_KERNEL_FW_VER_ITEM 1
358 #define MBP_KERNEL_FW_CAP_ITEM 2
359 #define MBP_KERNEL_ROM_BIST_ITEM 3
360 #define MBP_KERNEL_PLAT_KEY_ITEM 4
361 #define MBP_KERNEL_FW_TYPE_ITEM 5
362 #define MBP_KERNEL_MFS_FAILURE_ITEM 6
363 #define MBP_KERNEL_PLAT_TIME_ITEM 7
364 /* Intel AT items: */
365 #define MBP_INTEL_AT_STATE_ITEM 1
366 /* ICC Items: */
367 #define MBP_ICC_PROFILE_ITEM 1
368 /* HWA Items: */
369 #define MBP_HWA_REQUEST_ITEM 1
370 /* NFC Items: */
371 #define MBP_NFC_SUPPORT_DATA_ITEM 1
372 
373 #define MBP_MAKE_IDENT(appid, item) ((appid << 8) | item)
374 #define MBP_IDENT(appid, item) \
375  MBP_MAKE_IDENT(MBP_APPID_##appid, MBP_##appid##_##item##_ITEM)
376 
377 union mbp_header {
378  struct __packed {
381  u32 rsvd : 16;
382  };
384 };
385 
387  u32 app_id : 8;
389  u32 length : 8;
390  u32 rsvd : 8;
391 } __packed;
392 
398 } __packed;
399 
400 struct mbp_mefwcaps {
410  u32 pavp : 1;
412  u32 ipv6 : 1;
413  u32 kvm : 1;
414  u32 och : 1;
415  u32 vlan : 1;
416  u32 tls : 1;
418  u32 wlan : 1;
420 } __packed;
421 
426 } __packed;
427 
428 struct mbp_platform_key {
429  u32 key[8];
430 };
431 
440  u32 rsvd: 1;
442  u32 brand: 4;
443  u32 rsvd1: 16;
444 } __packed;
445 
446 struct mbp_plat_type {
448  u8 available;
449 };
450 
454 } __packed;
455 
463 } __packed;
464 
471  u16 reserved : 11;
472 } __packed;
473 
474 struct mbp_at_state {
477  struct tdt_state_flag flags;
478 } __packed;
479 
484 } __packed;
485 
486 struct mbp_nfc_data {
488  u32 reserved : 30;
489 } __packed;
490 
491 struct me_bios_payload {
499  u32 *mfsintegrity;
502 };
503 
504 struct me_fwcaps {
505  u32 id;
507  struct mbp_mefwcaps caps_sku;
508  u8 reserved[3];
509 } __packed;
510 
511 #endif /* _INTEL_ME_H */
struct me_hfs __packed
void intel_me_status(void)
Definition: me_status.c:194
me_bios_path
Definition: me.h:310
@ ME_ERROR_BIOS_PATH
Definition: me.h:313
@ ME_RECOVERY_BIOS_PATH
Definition: me.h:314
@ ME_DISABLE_BIOS_PATH
Definition: me.h:315
@ ME_FIRMWARE_UPDATE_BIOS_PATH
Definition: me.h:316
@ ME_S3WAKE_BIOS_PATH
Definition: me.h:312
@ ME_NORMAL_BIOS_PATH
Definition: me.h:311
int intel_early_me_init(void)
Definition: early_me.c:43
void intel_early_me_status(void)
Definition: early_me.c:26
int intel_early_me_uma_size(void)
Definition: early_me.c:74
int intel_early_me_init_done(u8 status)
Definition: early_me.c:88
void intel_me_finalize(struct device *dev)
Definition: me.c:519
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
Definition: device.h:107
u16 icc_start_address
Definition: me.h:452
u16 mask
Definition: me.h:453
Definition: me.h:281
u32 reserved
Definition: me.h:286
u32 icc_command
Definition: me.h:283
u32 api_version
Definition: me.h:282
u32 icc_status
Definition: me.h:284
u32 length
Definition: me.h:285
struct tdt_state_flag flags
Definition: me.h:477
u8 state
Definition: me.h:475
u8 last_theft_trigger
Definition: me.h:476
u32 minor_version
Definition: me.h:395
u32 hotfix_version
Definition: me.h:396
u32 major_version
Definition: me.h:394
u32 build_version
Definition: me.h:397
u8 icc_profile_index
Definition: me.h:459
u32 icc_reg_bundles
Definition: me.h:461
u8 num_icc_profiles
Definition: me.h:457
u8 icc_profile_soft_strap
Definition: me.h:458
u8 reserved
Definition: me.h:460
u32 length
Definition: me.h:389
u32 app_id
Definition: me.h:387
u32 rsvd
Definition: me.h:390
u32 item_id
Definition: me.h:388
u32 regular_super_sku
Definition: me.h:439
u32 reserved
Definition: me.h:407
u32 wlan
Definition: me.h:418
u32 full_net
Definition: me.h:401
u32 reserved_4
Definition: me.h:417
u32 icc_over_clocking
Definition: me.h:409
u32 och
Definition: me.h:414
u32 reserved_5
Definition: me.h:419
u32 intel_cls
Definition: me.h:406
u32 intel_mpc
Definition: me.h:408
u32 pavp
Definition: me.h:410
u32 tls
Definition: me.h:416
u32 kvm
Definition: me.h:413
u32 manageability
Definition: me.h:403
u32 ipv6
Definition: me.h:412
u32 reserved_2
Definition: me.h:404
u32 vlan
Definition: me.h:415
u32 reserved_1
Definition: me.h:411
u32 std_net
Definition: me.h:402
u32 intel_at
Definition: me.h:405
u32 device_type
Definition: me.h:487
u32 reserved
Definition: me.h:488
u32 pltrst_cpurst_time_ms
Definition: me.h:483
u32 wake_event_mrst_time_ms
Definition: me.h:481
u32 mrst_pltrst_time_ms
Definition: me.h:482
u8 available
Definition: me.h:418
mbp_me_firmware_type rule_data
Definition: me.h:417
u32 key[8]
Definition: me.h:399
u32 umchid[4]
Definition: me.h:425
u16 device_id
Definition: me.h:423
u16 fuse_test_flags
Definition: me.h:424
struct mbp_rom_bist_data * rom_bist_data
Definition: me.h:494
u32 * mfsintegrity
Definition: me.h:469
struct mbp_at_state * at_state
Definition: me.h:498
struct mbp_nfc_data * nfc_data
Definition: me.h:501
struct mbp_plat_time * plat_time
Definition: me.h:500
struct mbp_platform_key * platform_key
Definition: me.h:495
struct mbp_plat_type * fw_plat_type
Definition: me.h:496
struct mbp_mefwcaps * fw_capabilities
Definition: me.h:493
struct mbp_icc_profile * icc_profile
Definition: me.h:497
struct mbp_fw_version_name * fw_version_name
Definition: me.h:492
u32 status
Definition: me.h:97
u32 init_done
Definition: me.h:98
u32 uma_base
Definition: me.h:94
u32 reserved
Definition: me.h:95
u32 rapid_start
Definition: me.h:96
Definition: me.h:88
u32 raw
Definition: me.h:98
u16 recovery_build_number
Definition: me.h:273
u16 code_build_number
Definition: me.h:269
u16 recovery_minor
Definition: me.h:271
u16 code_major
Definition: me.h:268
u16 code_minor
Definition: me.h:267
u16 recovery_major
Definition: me.h:272
u16 recovery_hot_fix
Definition: me.h:274
u16 code_hot_fix
Definition: me.h:270
Definition: me.h:474
u8 length
Definition: me.h:476
mbp_mefwcaps caps_sku
Definition: me.h:477
u32 id
Definition: me.h:475
u8 reserved[3]
Definition: me.h:478
u8 reset_type
Definition: me.h:307
u8 request_origin
Definition: me.h:306
u32 extend_reg_valid
Definition: me.h:210
u32 extend_feature_present
Definition: me.h:209
u32 extend_reg_algorithm
Definition: me.h:207
u32 reserved
Definition: me.h:208
Definition: me.h:197
u32 raw
Definition: me.h:142
u32 cpu_replaced_valid
Definition: me.h:186
u32 progress_code
Definition: me.h:192
u32 mbp_rdy
Definition: me.h:183
u32 reserved2
Definition: me.h:187
u32 bist_in_progress
Definition: me.h:179
u32 warm_reset_request
Definition: me.h:185
u32 mbp_cleared
Definition: me.h:188
u32 cpu_replaced_sts
Definition: me.h:182
u32 mfs_failure
Definition: me.h:184
u32 reserved3
Definition: me.h:189
u32 current_state
Definition: me.h:190
u32 invoke_mebx
Definition: me.h:181
u32 current_pmevent
Definition: me.h:191
u32 reserved1
Definition: me.h:180
Definition: me.h:170
u32 raw
Definition: me.h:194
u32 ft_bup_ld_flr
Definition: me.h:60
u32 fw_init_complete
Definition: me.h:59
u32 update_in_progress
Definition: me.h:61
u32 operation_state
Definition: me.h:58
u32 working_state
Definition: me.h:55
u32 bios_msg_ack
Definition: me.h:67
u32 fpt_bad
Definition: me.h:57
u32 error_code
Definition: me.h:62
u32 operation_mode
Definition: me.h:63
u32 boot_options_present
Definition: me.h:65
u32 ack_data
Definition: me.h:66
u32 reserved
Definition: me.h:64
u32 mfg_mode
Definition: me.h:56
Definition: me.h:51
u32 raw
Definition: me.h:69
u32 size
Definition: me.h:76
u32 set_to_one
Definition: me.h:80
u32 reserved_0
Definition: me.h:79
u32 valid
Definition: me.h:78
u32 reserved_1
Definition: me.h:77
Definition: me.h:69
u32 raw
Definition: me.h:82
u32 buffer_write_ptr
Definition: me.h:233
u32 interrupt_status
Definition: me.h:227
u32 interrupt_generate
Definition: me.h:228
u32 buffer_depth
Definition: me.h:234
u32 interrupt_enable
Definition: me.h:226
u32 reserved
Definition: me.h:231
u32 buffer_read_ptr
Definition: me.h:232
Definition: me.h:213
u32 raw
Definition: me.h:236
u32 client_address
Definition: me.h:251
u32 host_address
Definition: me.h:252
Definition: me.h:235
u32 raw
Definition: me.h:257
u32 result
Definition: me.h:263
u32 is_response
Definition: me.h:261
u32 group_id
Definition: me.h:259
u32 reserved
Definition: me.h:262
u32 command
Definition: me.h:260
u16 s3authentication
Definition: me.h:468
u16 reserved
Definition: me.h:471
u16 flash_wear_out
Definition: me.h:469
u16 lock_state
Definition: me.h:466
u16 flash_variable_security
Definition: me.h:470
u16 authenticate_module
Definition: me.h:467
Definition: me.h:377
u32 raw
Definition: me.h:383