1 /* SPDX-License-Identifier: GPL-2.0-only */
4 * This is a ramstage driver for the Intel Management Engine found in the
5 * 6-series chipset. It handles the required boot-time messages over the
6 * MMIO-based Management Engine Interface to tell the ME that the BIOS is
7 * finished with POST. Additional messages are defined for debug but are
8 * not used unless the console loglevel is high enough.
11 #include <acpi/acpi.h>
12 #include <device/mmio.h>
13 #include <device/pci_ops.h>
14 #include <console/console.h>
15 #include <device/device.h>
16 #include <device/pci.h>
17 #include <device/pci_ids.h>
27 #include <vendorcode/google/chromeos/chromeos.h>
29 /* Path that the BIOS should take based on ME state */
30 static const char *const me_bios_path_values
[] = {
31 [ME_NORMAL_BIOS_PATH
] = "Normal",
32 [ME_S3WAKE_BIOS_PATH
] = "S3 Wake",
33 [ME_ERROR_BIOS_PATH
] = "Error",
34 [ME_RECOVERY_BIOS_PATH
] = "Recovery",
35 [ME_DISABLE_BIOS_PATH
] = "Disable",
36 [ME_FIRMWARE_UPDATE_BIOS_PATH
] = "Firmware Update",
39 /* MMIO base address for MEI interface */
40 static u8
*mei_base_address
;
42 static void mei_dump(u32 dword
, int offset
, const char *type
)
46 if (!CONFIG(DEBUG_INTEL_ME
))
49 printk(BIOS_SPEW
, "%-9s[%02x] : ", type
, offset
);
55 printk(BIOS_SPEW
, "cbd=%u cbrp=%02u cbwp=%02u ready=%u "
56 "reset=%u ig=%u is=%u ie=%u\n", csr
.buffer_depth
,
57 csr
.buffer_read_ptr
, csr
.buffer_write_ptr
,
58 csr
.ready
, csr
.reset
, csr
.interrupt_generate
,
59 csr
.interrupt_status
, csr
.interrupt_enable
);
63 printk(BIOS_SPEW
, "CB: 0x%08x\n", dword
);
66 printk(BIOS_SPEW
, "0x%08x\n", offset
);
72 * ME/MEI access helpers using memcpy to avoid aliasing.
75 static inline union mei_csr
read_host_csr(void)
77 union mei_csr csr
= { .raw
= read32(mei_base_address
+ MEI_H_CSR
) };
78 mei_dump(csr
.raw
, MEI_H_CSR
, "READ");
82 static inline void write_host_csr(union mei_csr csr
)
84 write32(mei_base_address
+ MEI_H_CSR
, csr
.raw
);
85 mei_dump(csr
.raw
, MEI_H_CSR
, "WRITE");
88 static inline union mei_csr
read_me_csr(void)
90 union mei_csr csr
= { .raw
= read32(mei_base_address
+ MEI_ME_CSR_HA
) };
91 mei_dump(csr
.raw
, MEI_ME_CSR_HA
, "READ");
95 static inline void write_cb(u32 dword
)
97 write32(mei_base_address
+ MEI_H_CB_WW
, dword
);
98 mei_dump(dword
, MEI_H_CB_WW
, "WRITE");
101 static inline u32
read_cb(void)
103 u32 dword
= read32(mei_base_address
+ MEI_ME_CB_RW
);
104 mei_dump(dword
, MEI_ME_CB_RW
, "READ");
108 /* Wait for ME ready bit to be asserted */
109 static int mei_wait_for_me_ready(void)
112 unsigned int try = ME_RETRY
;
121 printk(BIOS_ERR
, "ME: failed to become ready\n");
125 static void mei_reset(void)
129 if (mei_wait_for_me_ready() < 0)
132 /* Reset host and ME circular buffers for next message */
133 host
= read_host_csr();
135 host
.interrupt_generate
= 1;
136 write_host_csr(host
);
138 if (mei_wait_for_me_ready() < 0)
141 /* Re-init and indicate host is ready */
142 host
= read_host_csr();
143 host
.interrupt_generate
= 1;
146 write_host_csr(host
);
149 static int mei_send_packet(union mei_header
*mei
, void *req_data
)
152 unsigned int ndata
, n
;
155 /* Number of dwords to write */
156 ndata
= mei
->length
>> 2;
158 /* Pad non-dword aligned request message length */
162 printk(BIOS_DEBUG
, "ME: request has no data\n");
165 ndata
++; /* Add MEI header */
168 * Make sure there is still room left in the circular buffer.
169 * Reset the buffer pointers if the requested message will not fit.
171 host
= read_host_csr();
172 if ((host
.buffer_depth
- host
.buffer_write_ptr
) < ndata
) {
173 printk(BIOS_ERR
, "ME: circular buffer full, resetting...\n");
175 host
= read_host_csr();
178 /* Ensure the requested length will fit in the circular buffer. */
179 if ((host
.buffer_depth
- host
.buffer_write_ptr
) < ndata
) {
180 printk(BIOS_ERR
, "ME: message (%u) too large for buffer (%u)\n",
181 ndata
+ 2, host
.buffer_depth
);
185 /* Write MEI header */
189 /* Write message data */
191 for (n
= 0; n
< ndata
; ++n
)
194 /* Generate interrupt to the ME */
195 host
= read_host_csr();
196 host
.interrupt_generate
= 1;
197 write_host_csr(host
);
199 /* Make sure ME is ready after sending request data */
200 return mei_wait_for_me_ready();
203 static int mei_send_data(u8 me_address
, u8 host_address
,
204 void *req_data
, int req_bytes
)
206 union mei_header header
= {
207 .client_address
= me_address
,
208 .host_address
= host_address
,
212 u8
*req_ptr
= req_data
;
214 while (!header
.is_complete
) {
215 int remain
= req_bytes
- current
;
218 host
= read_host_csr();
219 buf_len
= host
.buffer_depth
- host
.buffer_write_ptr
;
221 if (buf_len
> remain
) {
222 /* Send all remaining data as final message */
223 header
.length
= req_bytes
- current
;
224 header
.is_complete
= 1;
226 /* Send as much data as the buffer can hold */
227 header
.length
= buf_len
;
230 mei_send_packet(&header
, req_ptr
);
232 req_ptr
+= header
.length
;
233 current
+= header
.length
;
239 static int mei_send_header(u8 me_address
, u8 host_address
,
240 void *header
, int header_len
, int complete
)
242 union mei_header mei
= {
243 .client_address
= me_address
,
244 .host_address
= host_address
,
245 .length
= header_len
,
246 .is_complete
= complete
,
248 return mei_send_packet(&mei
, header
);
251 static int mei_recv_msg(void *header
, int header_bytes
,
252 void *rsp_data
, int rsp_bytes
)
254 union mei_header mei_rsp
;
255 union mei_csr me
, host
;
256 unsigned int ndata
, n
;
257 unsigned int expected
;
260 /* Total number of dwords to read from circular buffer */
261 expected
= (rsp_bytes
+ sizeof(mei_rsp
) + header_bytes
) >> 2;
265 if (mei_wait_for_me_ready() < 0)
269 * The interrupt status bit does not appear to indicate that the
270 * message has actually been received. Instead we wait until the
271 * expected number of dwords are present in the circular buffer.
273 for (n
= ME_RETRY
; n
; --n
) {
275 if ((me
.buffer_write_ptr
- me
.buffer_read_ptr
) >= expected
)
280 printk(BIOS_ERR
, "ME: timeout waiting for data: expected "
281 "%u, available %u\n", expected
,
282 me
.buffer_write_ptr
- me
.buffer_read_ptr
);
286 /* Read and verify MEI response header from the ME */
287 mei_rsp
.raw
= read_cb();
288 if (!mei_rsp
.is_complete
) {
289 printk(BIOS_ERR
, "ME: response is not complete\n");
293 /* Handle non-dword responses and expect at least the header */
294 ndata
= mei_rsp
.length
>> 2;
295 if (mei_rsp
.length
& 3)
297 if (ndata
!= (expected
- 1)) {
298 printk(BIOS_ERR
, "ME: response is missing data %d != %d\n",
299 ndata
, (expected
- 1));
303 /* Read response header from the ME */
305 for (n
= 0; n
< (header_bytes
>> 2); ++n
)
307 ndata
-= header_bytes
>> 2;
309 /* Make sure caller passed a buffer with enough space */
310 if (ndata
!= (rsp_bytes
>> 2)) {
311 printk(BIOS_ERR
, "ME: not enough room in response buffer: "
312 "%u != %u\n", ndata
, rsp_bytes
>> 2);
316 /* Read response data from the circular buffer */
318 for (n
= 0; n
< ndata
; ++n
)
321 /* Tell the ME that we have consumed the response */
322 host
= read_host_csr();
323 host
.interrupt_status
= 1;
324 host
.interrupt_generate
= 1;
325 write_host_csr(host
);
327 return mei_wait_for_me_ready();
330 static inline int mei_sendrecv_mkhi(struct mkhi_header
*mkhi
,
331 void *req_data
, int req_bytes
,
332 void *rsp_data
, int rsp_bytes
)
334 struct mkhi_header mkhi_rsp
;
337 if (mei_send_header(MEI_ADDRESS_MKHI
, MEI_HOST_ADDRESS
,
338 mkhi
, sizeof(*mkhi
), req_bytes
? 0 : 1) < 0)
341 /* Send data if available */
342 if (req_bytes
&& mei_send_data(MEI_ADDRESS_MKHI
, MEI_HOST_ADDRESS
,
343 req_data
, req_bytes
) < 0)
346 /* Return now if no response expected */
350 /* Read header and data */
351 if (mei_recv_msg(&mkhi_rsp
, sizeof(mkhi_rsp
),
352 rsp_data
, rsp_bytes
) < 0)
355 if (!mkhi_rsp
.is_response
||
356 mkhi
->group_id
!= mkhi_rsp
.group_id
||
357 mkhi
->command
!= mkhi_rsp
.command
) {
358 printk(BIOS_ERR
, "ME: invalid response, group %u ?= %u,"
359 "command %u ?= %u, is_response %u\n", mkhi
->group_id
,
360 mkhi_rsp
.group_id
, mkhi
->command
, mkhi_rsp
.command
,
361 mkhi_rsp
.is_response
);
368 static inline int mei_sendrecv_icc(struct icc_header
*icc
,
369 void *req_data
, int req_bytes
,
370 void *rsp_data
, int rsp_bytes
)
372 struct icc_header icc_rsp
;
375 if (mei_send_header(MEI_ADDRESS_ICC
, MEI_HOST_ADDRESS
,
376 icc
, sizeof(*icc
), req_bytes
? 0 : 1) < 0)
379 /* Send data if available */
380 if (req_bytes
&& mei_send_data(MEI_ADDRESS_ICC
, MEI_HOST_ADDRESS
,
381 req_data
, req_bytes
) < 0)
384 /* Read header and data, if needed */
385 if (rsp_bytes
&& mei_recv_msg(&icc_rsp
, sizeof(icc_rsp
),
386 rsp_data
, rsp_bytes
) < 0)
393 * mbp give up routine. This path is taken if hfs.mpb_rdy is 0 or the read
394 * state machine on the BIOS end doesn't match the ME's state machine.
396 static void intel_me_mbp_give_up(struct device
*dev
)
400 pci_write_config32(dev
, PCI_ME_H_GS2
, PCI_ME_MBP_GIVE_UP
);
402 csr
= read_host_csr();
404 csr
.interrupt_generate
= 1;
409 * mbp clear routine. This will wait for the ME to indicate that
410 * the MBP has been read and cleared.
412 static void intel_me_mbp_clear(struct device
*dev
)
417 /* Wait for the mbp_cleared indicator */
418 for (count
= ME_RETRY
; count
> 0; --count
) {
419 hfs2
.raw
= pci_read_config32(dev
, PCI_ME_HFS2
);
420 if (hfs2
.mbp_cleared
)
426 printk(BIOS_WARNING
, "ME: Timeout waiting for mbp_cleared\n");
427 intel_me_mbp_give_up(dev
);
429 printk(BIOS_INFO
, "ME: MBP cleared\n");
433 static void me_print_fw_version(struct mbp_fw_version_name
*vers_name
)
436 printk(BIOS_ERR
, "ME: mbp missing version report\n");
440 printk(BIOS_DEBUG
, "ME: found version %d.%d.%d.%d\n",
441 vers_name
->major_version
, vers_name
->minor_version
,
442 vers_name
->hotfix_version
, vers_name
->build_version
);
445 static inline void print_cap(const char *name
, int state
)
447 printk(BIOS_DEBUG
, "ME Capability: %-41s : %sabled\n",
448 name
, state
? " en" : "dis");
451 /* Get ME Firmware Capabilities */
452 static int mkhi_get_fwcaps(struct mbp_mefwcaps
*cap
)
455 struct me_fwcaps cap_msg
;
456 struct mkhi_header mkhi
= {
457 .group_id
= MKHI_GROUP_ID_FWCAPS
,
458 .command
= MKHI_FWCAPS_GET_RULE
,
461 /* Send request and wait for response */
462 if (mei_sendrecv_mkhi(&mkhi
, &rule_id
, sizeof(u32
),
463 &cap_msg
, sizeof(cap_msg
)) < 0) {
464 printk(BIOS_ERR
, "ME: GET FWCAPS message failed\n");
467 *cap
= cap_msg
.caps_sku
;
471 /* Get ME Firmware Capabilities */
472 static void me_print_fwcaps(struct mbp_mefwcaps
*cap
)
474 struct mbp_mefwcaps local_caps
;
477 printk(BIOS_ERR
, "ME: mbp missing fwcaps report\n");
478 if (mkhi_get_fwcaps(cap
))
482 print_cap("Full Network manageability", cap
->full_net
);
483 print_cap("Regular Network manageability", cap
->std_net
);
484 print_cap("Manageability", cap
->manageability
);
485 print_cap("IntelR Anti-Theft (AT)", cap
->intel_at
);
486 print_cap("IntelR Capability Licensing Service (CLS)", cap
->intel_cls
);
487 print_cap("IntelR Power Sharing Technology (MPC)", cap
->intel_mpc
);
488 print_cap("ICC Over Clocking", cap
->icc_over_clocking
);
489 print_cap("Protected Audio Video Path (PAVP)", cap
->pavp
);
490 print_cap("IPV6", cap
->ipv6
);
491 print_cap("KVM Remote Control (KVM)", cap
->kvm
);
492 print_cap("Outbreak Containment Heuristic (OCH)", cap
->och
);
493 print_cap("Virtual LAN (VLAN)", cap
->vlan
);
494 print_cap("TLS", cap
->tls
);
495 print_cap("Wireless LAN (WLAN)", cap
->wlan
);
498 /* Send END OF POST message to the ME */
499 static int mkhi_end_of_post(void)
501 struct mkhi_header mkhi
= {
502 .group_id
= MKHI_GROUP_ID_GEN
,
503 .command
= MKHI_END_OF_POST
,
507 /* Send request and wait for response */
508 printk(BIOS_NOTICE
, "ME: %s\n", __func__
);
509 if (mei_sendrecv_mkhi(&mkhi
, NULL
, 0, &eop_ack
, sizeof(eop_ack
)) < 0) {
510 printk(BIOS_ERR
, "ME: END OF POST message failed\n");
514 printk(BIOS_INFO
, "ME: END OF POST message successful (%d)\n", eop_ack
);
518 void intel_me_finalize(struct device
*dev
)
523 reg32
= pci_read_config32(dev
, PCI_BASE_ADDRESS_0
);
524 mei_base_address
= (u8
*)(uintptr_t)(reg32
& ~PCI_BASE_ADDRESS_MEM_ATTR_MASK
);
526 /* S3 path will have hidden this device already */
527 if (!mei_base_address
|| mei_base_address
== (u8
*)0xfffffff0)
530 /* Wait for ME MBP Cleared indicator */
531 intel_me_mbp_clear(dev
);
533 /* Make sure ME is in a mode that expects EOP */
534 hfs
.raw
= pci_read_config32(dev
, PCI_ME_HFS
);
536 /* Abort and leave device alone if not normal mode */
538 hfs
.working_state
!= ME_HFS_CWS_NORMAL
||
539 hfs
.operation_mode
!= ME_HFS_MODE_NORMAL
)
542 /* Try to send EOP command so ME stops accepting other commands */
545 if (!CONFIG(DISABLE_ME_PCI
))
548 /* Make sure IO is disabled */
549 pci_and_config16(dev
, PCI_COMMAND
,
550 ~(PCI_COMMAND_MASTER
| PCI_COMMAND_MEMORY
| PCI_COMMAND_IO
));
552 /* Hide the PCI device */
553 RCBA32_OR(FD2
, PCH_DISABLE_MEI1
);
556 static int me_icc_set_clock_enables(u32 mask
)
558 struct icc_clock_enables_msg clk
= {
559 .clock_enables
= 0, /* Turn off specified clocks */
561 .no_response
= 1, /* Do not expect response */
563 struct icc_header icc
= {
564 .api_version
= ICC_API_VERSION_LYNXPOINT
,
565 .icc_command
= ICC_SET_CLOCK_ENABLES
,
566 .length
= sizeof(clk
),
569 /* Send request and wait for response */
570 if (mei_sendrecv_icc(&icc
, &clk
, sizeof(clk
), NULL
, 0) < 0) {
571 printk(BIOS_ERR
, "ME: ICC SET CLOCK ENABLES message failed\n");
574 printk(BIOS_INFO
, "ME: ICC SET CLOCK ENABLES 0x%08x\n", mask
);
578 /* Determine the path that we should take based on ME status */
579 static enum me_bios_path
intel_me_path(struct device
*dev
)
581 enum me_bios_path path
= ME_DISABLE_BIOS_PATH
;
582 union me_hfs hfs
= { .raw
= pci_read_config32(dev
, PCI_ME_HFS
) };
583 union me_hfs2 hfs2
= { .raw
= pci_read_config32(dev
, PCI_ME_HFS2
) };
585 /* Check and dump status */
586 intel_me_status(hfs
, hfs2
);
588 /* Check Current Working State */
589 switch (hfs
.working_state
) {
590 case ME_HFS_CWS_NORMAL
:
591 path
= ME_NORMAL_BIOS_PATH
;
594 path
= ME_RECOVERY_BIOS_PATH
;
597 path
= ME_DISABLE_BIOS_PATH
;
601 /* Check Current Operation Mode */
602 switch (hfs
.operation_mode
) {
603 case ME_HFS_MODE_NORMAL
:
605 case ME_HFS_MODE_DEBUG
:
606 case ME_HFS_MODE_DIS
:
607 case ME_HFS_MODE_OVER_JMPR
:
608 case ME_HFS_MODE_OVER_MEI
:
610 path
= ME_DISABLE_BIOS_PATH
;
614 /* Check for any error code and valid firmware and MBP */
615 if (hfs
.error_code
|| hfs
.fpt_bad
)
616 path
= ME_ERROR_BIOS_PATH
;
618 /* Check if the MBP is ready */
620 printk(BIOS_CRIT
, "%s: mbp is not ready!\n",
622 path
= ME_ERROR_BIOS_PATH
;
625 if (CONFIG(ELOG
) && path
!= ME_NORMAL_BIOS_PATH
) {
626 struct elog_event_data_me_extended data
= {
627 .current_working_state
= hfs
.working_state
,
628 .operation_state
= hfs
.operation_state
,
629 .operation_mode
= hfs
.operation_mode
,
630 .error_code
= hfs
.error_code
,
631 .progress_code
= hfs2
.progress_code
,
632 .current_pmevent
= hfs2
.current_pmevent
,
633 .current_state
= hfs2
.current_state
,
635 elog_add_event_byte(ELOG_TYPE_MANAGEMENT_ENGINE
, path
);
636 elog_add_event_raw(ELOG_TYPE_MANAGEMENT_ENGINE_EXT
,
637 &data
, sizeof(data
));
643 /* Prepare ME for MEI messages */
644 static int intel_mei_setup(struct device
*dev
)
646 struct resource
*res
;
649 /* Find the MMIO base for the ME interface */
650 res
= probe_resource(dev
, PCI_BASE_ADDRESS_0
);
651 if (!res
|| res
->base
== 0 || res
->size
== 0) {
652 printk(BIOS_DEBUG
, "ME: MEI resource not present!\n");
655 mei_base_address
= res2mmio(res
, 0, 0);
657 /* Ensure Memory and Bus Master bits are set */
658 pci_or_config16(dev
, PCI_COMMAND
, PCI_COMMAND_MASTER
| PCI_COMMAND_MEMORY
);
660 /* Clean up status for next message */
661 host
= read_host_csr();
662 host
.interrupt_generate
= 1;
665 write_host_csr(host
);
670 /* Read the Extend register hash of ME firmware */
671 static int intel_me_extend_valid(struct device
*dev
)
673 union me_heres status
= { .raw
= pci_read_config32(dev
, PCI_ME_HERES
) };
677 if (!status
.extend_feature_present
) {
678 printk(BIOS_ERR
, "ME: Extend Feature not present\n");
682 if (!status
.extend_reg_valid
) {
683 printk(BIOS_ERR
, "ME: Extend Register not valid\n");
687 switch (status
.extend_reg_algorithm
) {
688 case PCI_ME_EXT_SHA1
:
690 printk(BIOS_DEBUG
, "ME: Extend SHA-1: ");
692 case PCI_ME_EXT_SHA256
:
694 printk(BIOS_DEBUG
, "ME: Extend SHA-256: ");
697 printk(BIOS_ERR
, "ME: Extend Algorithm %d unknown\n",
698 status
.extend_reg_algorithm
);
702 for (i
= 0; i
< count
; ++i
) {
703 extend
[i
] = pci_read_config32(dev
, PCI_ME_HER(i
));
704 printk(BIOS_DEBUG
, "%08x", extend
[i
]);
706 printk(BIOS_DEBUG
, "\n");
708 /* Save hash in NVS for the OS to verify */
709 if (CONFIG(CHROMEOS_NVS
))
710 chromeos_set_me_hash(extend
, count
);
715 static u32
me_to_host_words_pending(void)
717 union mei_csr me
= read_me_csr();
720 return (me
.buffer_write_ptr
- me
.buffer_read_ptr
) &
721 (me
.buffer_depth
- 1);
725 union mbp_header header
;
730 * Read and print ME MBP data
732 * Return -1 to indicate a problem (give up)
733 * Return 0 to indicate success (send LOCK+EOP)
735 static int intel_me_read_mbp(struct me_bios_payload
*mbp_data
, struct device
*dev
)
737 union mbp_header mbp_hdr
;
740 union me_hfs2 hfs2
= { .raw
= pci_read_config32(dev
, PCI_ME_HFS2
) };
741 struct mbp_payload
*mbp
;
745 printk(BIOS_ERR
, "ME: MBP not ready\n");
749 me2host_pending
= me_to_host_words_pending();
750 if (!me2host_pending
) {
751 printk(BIOS_ERR
, "ME: no mbp data!\n");
755 /* we know for sure that at least the header is there */
756 mbp_hdr
.raw
= read_cb();
758 if ((mbp_hdr
.num_entries
> (mbp_hdr
.mbp_size
/ 2)) ||
759 (me2host_pending
< mbp_hdr
.mbp_size
)) {
760 printk(BIOS_ERR
, "ME: mbp of %d entries, total size %d words"
761 " buffer contains %d words\n",
762 mbp_hdr
.num_entries
, mbp_hdr
.mbp_size
,
766 mbp
= malloc(mbp_hdr
.mbp_size
* sizeof(u32
));
770 mbp
->header
= mbp_hdr
;
774 while (i
!= me2host_pending
) {
775 mbp
->data
[i
] = read_cb();
779 /* Signal to the ME that the host has finished reading the MBP. */
780 host
= read_host_csr();
781 host
.interrupt_generate
= 1;
782 write_host_csr(host
);
784 /* Dump out the MBP contents. */
785 if (CONFIG_DEFAULT_CONSOLE_LOGLEVEL
>= BIOS_DEBUG
) {
786 printk(BIOS_INFO
, "ME MBP: Header: items: %d, size dw: %d\n",
787 mbp
->header
.num_entries
, mbp
->header
.mbp_size
);
788 if (CONFIG(DEBUG_INTEL_ME
)) {
789 for (i
= 0; i
< mbp
->header
.mbp_size
- 1; i
++) {
790 printk(BIOS_INFO
, "ME MBP: %04x: 0x%08x\n", i
, mbp
->data
[i
]);
795 #define ASSIGN_FIELD_PTR(field_,val_) \
797 mbp_data->field_ = (typeof(mbp_data->field_))(void *)val_; \
800 /* Setup the pointers in the me_bios_payload structure. */
801 for (i
= 0; i
< mbp
->header
.mbp_size
- 1;) {
802 struct mbp_item_header
*item
= (void *)&mbp
->data
[i
];
804 switch (MBP_MAKE_IDENT(item
->app_id
, item
->item_id
)) {
805 case MBP_IDENT(KERNEL
, FW_VER
):
806 ASSIGN_FIELD_PTR(fw_version_name
, &mbp
->data
[i
+1]);
808 case MBP_IDENT(ICC
, PROFILE
):
809 ASSIGN_FIELD_PTR(icc_profile
, &mbp
->data
[i
+1]);
811 case MBP_IDENT(INTEL_AT
, STATE
):
812 ASSIGN_FIELD_PTR(at_state
, &mbp
->data
[i
+1]);
814 case MBP_IDENT(KERNEL
, FW_CAP
):
815 ASSIGN_FIELD_PTR(fw_capabilities
, &mbp
->data
[i
+1]);
817 case MBP_IDENT(KERNEL
, ROM_BIST
):
818 ASSIGN_FIELD_PTR(rom_bist_data
, &mbp
->data
[i
+1]);
820 case MBP_IDENT(KERNEL
, PLAT_KEY
):
821 ASSIGN_FIELD_PTR(platform_key
, &mbp
->data
[i
+1]);
823 case MBP_IDENT(KERNEL
, FW_TYPE
):
824 ASSIGN_FIELD_PTR(fw_plat_type
, &mbp
->data
[i
+1]);
826 case MBP_IDENT(KERNEL
, MFS_FAILURE
):
827 ASSIGN_FIELD_PTR(mfsintegrity
, &mbp
->data
[i
+1]);
829 case MBP_IDENT(KERNEL
, PLAT_TIME
):
830 ASSIGN_FIELD_PTR(plat_time
, &mbp
->data
[i
+1]);
832 case MBP_IDENT(NFC
, SUPPORT_DATA
):
833 ASSIGN_FIELD_PTR(nfc_data
, &mbp
->data
[i
+1]);
836 printk(BIOS_ERR
, "ME MBP: unknown item 0x%x @ "
837 "dw offset 0x%x\n", mbp
->data
[i
], i
);
842 #undef ASSIGN_FIELD_PTR
847 intel_me_mbp_give_up(dev
);
851 /* Check whether ME is present and do basic init */
852 static void intel_me_init(struct device
*dev
)
854 struct southbridge_intel_lynxpoint_config
*config
= dev
->chip_info
;
855 enum me_bios_path path
= intel_me_path(dev
);
856 struct me_bios_payload mbp_data
;
858 /* Do initial setup and determine the BIOS path */
859 printk(BIOS_NOTICE
, "ME: BIOS path: %s\n", me_bios_path_values
[path
]);
861 if (path
== ME_NORMAL_BIOS_PATH
) {
862 /* Validate the extend register */
863 intel_me_extend_valid(dev
);
866 memset(&mbp_data
, 0, sizeof(mbp_data
));
869 * According to the ME9 BWG, BIOS is required to fetch MBP data in
870 * all boot flows except S3 Resume.
873 /* Prepare MEI MMIO interface */
874 if (intel_mei_setup(dev
) < 0)
877 if (intel_me_read_mbp(&mbp_data
, dev
))
880 if (CONFIG_DEFAULT_CONSOLE_LOGLEVEL
>= BIOS_DEBUG
) {
881 me_print_fw_version(mbp_data
.fw_version_name
);
883 if (CONFIG(DEBUG_INTEL_ME
))
884 me_print_fwcaps(mbp_data
.fw_capabilities
);
886 if (mbp_data
.plat_time
) {
887 printk(BIOS_DEBUG
, "ME: Wake Event to ME Reset: %u ms\n",
888 mbp_data
.plat_time
->wake_event_mrst_time_ms
);
889 printk(BIOS_DEBUG
, "ME: ME Reset to Platform Reset: %u ms\n",
890 mbp_data
.plat_time
->mrst_pltrst_time_ms
);
891 printk(BIOS_DEBUG
, "ME: Platform Reset to CPU Reset: %u ms\n",
892 mbp_data
.plat_time
->pltrst_cpurst_time_ms
);
896 /* Set clock enables according to devicetree */
897 if (config
&& config
->icc_clock_disable
)
898 me_icc_set_clock_enables(config
->icc_clock_disable
);
901 * Leave the ME unlocked. It will be locked later.
905 static void intel_me_enable(struct device
*dev
)
907 /* Avoid talking to the device in S3 path */
908 if (acpi_is_wakeup_s3() && CONFIG(DISABLE_ME_PCI
)) {
910 pch_disable_devfn(dev
);
914 static struct device_operations device_ops
= {
915 .read_resources
= pci_dev_read_resources
,
916 .set_resources
= pci_dev_set_resources
,
917 .enable_resources
= pci_dev_enable_resources
,
918 .enable
= intel_me_enable
,
919 .init
= intel_me_init
,
920 .final
= intel_me_finalize
,
921 .ops_pci
= &pci_dev_ops_pci
,
924 static const unsigned short pci_device_ids
[] = {
925 PCI_DID_INTEL_LPT_H_MEI
,
926 PCI_DID_INTEL_LPT_H_MEI_9
,
927 PCI_DID_INTEL_LPT_LP_MEI
,
931 static const struct pci_driver intel_me __pci_driver
= {
933 .vendor
= PCI_VID_INTEL
,
934 .devices
= pci_device_ids
,