blob: 4e0036e2d35ac4455bbdb3b43e39d278af7ea813 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
|
/* This file is part of the coreboot project. */
/*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; version 2 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef ME_H
#define ME_H
#include <inttypes.h>
#include <pci/pci.h>
#define ME_RETRY 100000 /* 1 second */
#define ME_DELAY 10 /* 10 us */
#pragma pack(1)
/*
* Management Engine PCI registers
*/
#define PCI_ME_HFS 0x40
#define ME_HFS_CWS_RESET 0
#define ME_HFS_CWS_INIT 1
#define ME_HFS_CWS_REC 2
#define ME_HFS_CWS_TEST 3
#define ME_HFS_CWS_DISABLED 4
#define ME_HFS_CWS_NORMAL 5
#define ME_HFS_CWS_WAIT 6
#define ME_HFS_CWS_TRANS 7
#define ME_HFS_CWS_INVALID 8
#define ME_HFS_STATE_PREBOOT 0
#define ME_HFS_STATE_M0_UMA 1
#define ME_HFS_STATE_M3 4
#define ME_HFS_STATE_M0 5
#define ME_HFS_STATE_BRINGUP 6
#define ME_HFS_STATE_ERROR 7
#define ME_HFS_ERROR_NONE 0
#define ME_HFS_ERROR_UNCAT 1
#define ME_HFS_ERROR_DISABLED 2
#define ME_HFS_ERROR_IMAGE 3
#define ME_HFS_ERROR_DEBUG 4
#define ME_HFS_MODE_NORMAL 0
#define ME_HFS_MODE_DEBUG 2
#define ME_HFS_MODE_DIS 3
#define ME_HFS_MODE_OVER_JMPR 4
#define ME_HFS_MODE_OVER_MEI 5
#define ME_HFS_BIOS_DRAM_ACK 1
#define ME_HFS_ACK_NO_DID 0
#define ME_HFS_ACK_RESET 1
#define ME_HFS_ACK_PWR_CYCLE 2
#define ME_HFS_ACK_S3 3
#define ME_HFS_ACK_S4 4
#define ME_HFS_ACK_S5 5
#define ME_HFS_ACK_GBL_RESET 6
#define ME_HFS_ACK_CONTINUE 7
struct me_hfs {
uint32_t working_state: 4;
uint32_t mfg_mode: 1;
uint32_t fpt_bad: 1;
uint32_t operation_state: 3;
uint32_t fw_init_complete: 1;
uint32_t ft_bup_ld_flr: 1;
uint32_t update_in_progress: 1;
uint32_t error_code: 4;
uint32_t operation_mode: 4;
uint32_t reserved: 4;
uint32_t boot_options_present: 1;
uint32_t ack_data: 3;
uint32_t bios_msg_ack: 4;
} __attribute__((packed));
#define PCI_ME_UMA 0x44
struct me_uma {
uint32_t size: 6;
uint32_t reserved_1: 10;
uint32_t valid: 1;
uint32_t reserved_0: 14;
uint32_t set_to_one: 1;
} __attribute__((packed));
#define PCI_ME_H_GS 0x4c
#define ME_INIT_DONE 1
#define ME_INIT_STATUS_SUCCESS 0
#define ME_INIT_STATUS_NOMEM 1
#define ME_INIT_STATUS_ERROR 2
struct me_did {
uint32_t uma_base: 16;
uint32_t reserved: 8;
uint32_t status: 4;
uint32_t init_done: 4;
} __attribute__((packed));
#define PCI_ME_GMES 0x48
#define ME_GMES_PHASE_ROM 0
#define ME_GMES_PHASE_BUP 1
#define ME_GMES_PHASE_UKERNEL 2
#define ME_GMES_PHASE_POLICY 3
#define ME_GMES_PHASE_MODULE 4
#define ME_GMES_PHASE_UNKNOWN 5
#define ME_GMES_PHASE_HOST 6
struct me_gmes {
uint32_t bist_in_prog : 1;
uint32_t icc_prog_sts : 2;
uint32_t invoke_mebx : 1;
uint32_t cpu_replaced_sts : 1;
uint32_t mbp_rdy : 1;
uint32_t mfs_failure : 1;
uint32_t warm_rst_req_for_df : 1;
uint32_t cpu_replaced_valid : 1;
uint32_t reserved_1 : 2;
uint32_t fw_upd_ipu : 1;
uint32_t reserved_2 : 4;
uint32_t current_state: 8;
uint32_t current_pmevent: 4;
uint32_t progress_code: 4;
} __attribute__((packed));
#define PCI_ME_HERES 0xbc
#define PCI_ME_EXT_SHA1 0x00
#define PCI_ME_EXT_SHA256 0x02
#define PCI_ME_HER(x) (0xc0+(4*(x)))
struct me_heres {
uint32_t extend_reg_algorithm: 4;
uint32_t reserved: 26;
uint32_t extend_feature_present: 1;
uint32_t extend_reg_valid: 1;
} __attribute__((packed));
struct me_thermal_reporting {
uint32_t polling_timeout: 8;
uint32_t smbus_ec_msglen: 8;
uint32_t smbus_ec_msgpec: 8;
uint32_t dimmnumber: 8;
} __attribute__((packed));
/*
* Management Engine MEI registers
*/
#define MEI_H_CB_WW 0x00
#define MEI_H_CSR 0x04
#define MEI_ME_CB_RW 0x08
#define MEI_ME_CSR_HA 0x0c
struct mei_csr {
uint32_t interrupt_enable: 1;
uint32_t interrupt_status: 1;
uint32_t interrupt_generate: 1;
uint32_t ready: 1;
uint32_t reset: 1;
uint32_t reserved: 3;
uint32_t buffer_read_ptr: 8;
uint32_t buffer_write_ptr: 8;
uint32_t buffer_depth: 8;
} __attribute__((packed));
#define MEI_ADDRESS_HBM 0x00
#define MEI_ADDRESS_CORE_WD 0x01
#define MEI_ADDRESS_AMT 0x02
#define MEI_ADDRESS_RESERVED 0x03
#define MEI_ADDRESS_WDT 0x04
#define MEI_ADDRESS_POLICY 0x05
#define MEI_ADDRESS_PASSWORD 0x06
#define MEI_ADDRESS_MKHI 0x07
#define MEI_ADDRESS_ICC 0x08
#define MEI_ADDRESS_THERMAL 0x09
#define MEI_ADDRESS_SPI 0x0a
#define MEI_HOST_ADDRESS 0
struct mei_header {
uint32_t client_address: 8;
uint32_t host_address: 8;
uint32_t length: 9;
uint32_t reserved: 6;
uint32_t is_complete: 1;
} __attribute__((packed));
#define MKHI_GROUP_ID_CBM 0x00
#define MKHI_GROUP_ID_PM 0x01
#define MKHI_GROUP_ID_PWD 0x02
#define MKHI_GROUP_ID_FWCAPS 0x03
#define MKHI_GROUP_ID_APP 0x04
#define MKHI_GROUP_ID_SPI 0x05
#define MKHI_GROUP_ID_MDES 0x08
#define MKHI_GROUP_ID_MAX 0x09
#define MKHI_GROUP_ID_GEN 0xff
#define MKHI_FWCAPS_GET_RULE 0x02
#define MKHI_FWCAPS_SET_RULE 0x03
#define MKHI_GLOBAL_RESET 0x0b
#define GEN_GET_MKHI_VERSION 0x01
#define GEN_GET_FW_VERSION 0x02
#define GEN_UNCONFIG_NO_PWD 0x0d
#define GEN_SET_DEBUG_MEM 0x11
#define FWCAPS_ME_FWU_RULE 0x2e
#define FWCAPS_OVERRIDE 0x14
#define MKHI_THERMAL_REPORTING 0x00
#define MKHI_GET_FW_VERSION 0x02
#define MKHI_MDES_ENABLE 0x09
#define MKHI_END_OF_POST 0x0c
#define MKHI_FEATURE_OVERRIDE 0x14
#define HBM_HOST_START_REQ_CMD 0x01
#define HBM_HOST_STOP_REQ_CMD 0x02
#define HBM_ME_STOP_REQ_CMD 0x03
#define HBM_HOST_ENUM_REQ_CMD 0x04
#define HBM_HOST_CLIENT_PROPERTIES_REQ_CMD 0x05
#define HBM_CLIENT_CONNECT_REQ_CMD 0x06
#define HBM_CLIENT_DISCONNECT_REQ_CMD 0x07
struct mkhi_header {
uint32_t group_id: 8;
uint32_t command: 7;
uint32_t is_response: 1;
uint32_t reserved: 8;
uint32_t result: 8;
} __attribute__((packed));
struct me_fw_version {
uint16_t code_minor;
uint16_t code_major;
uint16_t code_build_number;
uint16_t code_hot_fix;
uint16_t recovery_minor;
uint16_t recovery_major;
uint16_t recovery_build_number;
uint16_t recovery_hot_fix;
uint16_t fitcminor;
uint16_t fitcmajor;
uint16_t fitcbuildno;
uint16_t fitchotfix;
} __attribute__((packed));
#define HECI_EOP_STATUS_SUCCESS 0x0
#define HECI_EOP_PERFORM_GLOBAL_RESET 0x1
#define CBM_RR_GLOBAL_RESET 0x01
#define GLOBAL_RESET_BIOS_MRC 0x01
#define GLOBAL_RESET_BIOS_POST 0x02
#define GLOBAL_RESET_MEBX 0x03
struct me_global_reset {
uint8_t request_origin;
uint8_t reset_type;
} __attribute__((packed));
typedef enum {
ME_NORMAL_BIOS_PATH,
ME_S3WAKE_BIOS_PATH,
ME_ERROR_BIOS_PATH,
ME_RECOVERY_BIOS_PATH,
ME_DISABLE_BIOS_PATH,
ME_FIRMWARE_UPDATE_BIOS_PATH,
} me_bios_path;
typedef struct {
uint32_t major_version : 16;
uint32_t minor_version : 16;
uint32_t hotfix_version : 16;
uint32_t build_version : 16;
} __attribute__((packed)) mbp_fw_version_name;
typedef struct {
uint8_t num_icc_profiles;
uint8_t icc_profile_soft_strap;
uint8_t icc_profile_index;
uint8_t reserved;
uint32_t register_lock_mask[3];
} __attribute__((packed)) mbp_icc_profile;
typedef struct {
uint32_t full_net : 1;
uint32_t std_net : 1;
uint32_t manageability : 1;
uint32_t small_business : 1;
uint32_t l3manageability : 1;
uint32_t intel_at : 1;
uint32_t intel_cls : 1;
uint32_t reserved : 3;
uint32_t intel_mpc : 1;
uint32_t icc_over_clocking : 1;
uint32_t pavp : 1;
uint32_t reserved_1 : 4;
uint32_t ipv6 : 1;
uint32_t kvm : 1;
uint32_t och : 1;
uint32_t vlan : 1;
uint32_t tls : 1;
uint32_t reserved_4 : 1;
uint32_t wlan : 1;
uint32_t reserved_5 : 8;
} __attribute__((packed)) mefwcaps_sku;
typedef struct {
uint16_t lock_state : 1;
uint16_t authenticate_module : 1;
uint16_t s3authentication : 1;
uint16_t flash_wear_out : 1;
uint16_t flash_variable_security : 1;
uint16_t wwan3gpresent : 1;
uint16_t wwan3goob : 1;
uint16_t reserved : 9;
} __attribute__((packed)) tdt_state_flag;
typedef struct {
uint8_t state;
uint8_t last_theft_trigger;
tdt_state_flag flags;
} __attribute__((packed)) tdt_state_info;
typedef struct {
uint32_t platform_target_usage_type : 4;
uint32_t platform_target_market_type : 2;
uint32_t super_sku : 1;
uint32_t reserved : 1;
uint32_t intel_me_fw_image_type : 4;
uint32_t platform_brand : 4;
uint32_t reserved_1 : 16;
} __attribute__((packed)) platform_type_rule_data;
typedef struct {
mefwcaps_sku fw_capabilities;
uint8_t available;
} mbp_fw_caps;
typedef struct {
uint16_t device_id;
uint16_t fuse_test_flags;
uint32_t umchid[4];
} __attribute__((packed)) mbp_rom_bist_data;
typedef struct {
uint32_t key[8];
} mbp_platform_key;
typedef struct {
platform_type_rule_data rule_data;
uint8_t available;
} mbp_plat_type;
typedef struct {
mbp_fw_version_name fw_version_name;
mbp_fw_caps fw_caps_sku;
mbp_rom_bist_data rom_bist_data;
mbp_platform_key platform_key;
mbp_plat_type fw_plat_type;
mbp_icc_profile icc_profile;
tdt_state_info at_state;
uint32_t mfsintegrity;
} me_bios_payload;
typedef struct {
uint32_t mbp_size : 8;
uint32_t num_entries : 8;
uint32_t rsvd : 16;
} __attribute__((packed)) mbp_header;
typedef struct {
uint32_t app_id : 8;
uint32_t item_id : 8;
uint32_t length : 8;
uint32_t rsvd : 8;
} __attribute__((packed)) mbp_item_header;
struct me_fwcaps {
uint32_t id;
uint8_t length;
mefwcaps_sku caps_sku;
uint8_t reserved[3];
} __attribute__((packed));
struct me_debug_mem {
uint32_t debug_phys;
uint32_t debug_size;
uint32_t me_phys;
uint32_t me_size;
} __attribute__((packed));
void intel_me_status(uint32_t hfs, uint32_t gmes);
void mkhi_thermal(void);
uint32_t intel_mei_setup(struct pci_dev *dev);
void intel_mei_unmap(void);
int mkhi_get_fwcaps(void);
int mkhi_get_fw_version(int *major, int *minor);
int mkhi_debug_me_memory(void *addr);
void mei_reset(void);
int intel_me_extend_valid(struct pci_dev *dev);
#endif
|