Tim Wawrzynczak has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/32527
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints what appears to be correct information on Kled (hatch_whl).
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc A src/soc/intel/cannonlake/me.c 2 files changed, 309 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/1
diff --git a/src/soc/intel/cannonlake/Makefile.inc b/src/soc/intel/cannonlake/Makefile.inc index 7ad0c7c..1328944 100644 --- a/src/soc/intel/cannonlake/Makefile.inc +++ b/src/soc/intel/cannonlake/Makefile.inc @@ -43,6 +43,7 @@ ramstage-y += i2c.c ramstage-y += lockdown.c ramstage-y += lpc.c +ramstage-y += me.c ramstage-y += memmap.c ramstage-y += nhlt.c ramstage-y += p2sb.c diff --git a/src/soc/intel/cannonlake/me.c b/src/soc/intel/cannonlake/me.c new file mode 100644 index 0000000..59ba879 --- /dev/null +++ b/src/soc/intel/cannonlake/me.c @@ -0,0 +1,308 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Google LLC. + * + * 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. + */ + +#include <device/pci_ops.h> +#include <bootstate.h> +#include <commonlib/helpers.h> +#include <console/console.h> +#include <device/pci.h> +#include <intelblocks/cse.h> +#include <soc/pci_devs.h> +#include <stdint.h> +#include <stdlib.h> + +/* Miscellaneous constants */ +enum +{ + MKHI_GEN_GROUP_ID = 0xFF, + MKHI_GET_FW_VERSION = 0x02, + ME_OPMODE_NORMAL = 0x00, + ME_WSTATE_NORMAL = 0x05, + BIOS_HOST_ADD = 0x00, + HECI_MKHI_ADD = 0x07, +}; + +/* HFSTS register offsets in PCI config space */ +enum +{ + PCI_ME_HFSTS1 = 0x40, + PCI_ME_HFSTS2 = 0x48, + PCI_ME_HFSTS3 = 0x60, + PCI_ME_HFSTS4 = 0x64, + PCI_ME_HFSTS5 = 0x68, + PCI_ME_HFSTS6 = 0x6C, +}; + +/* Host Firmware Status Register 1 */ +union hfsts1 +{ + uint32_t raw; + struct { + 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 fw_upd_in_progress : 1; + uint32_t error_code : 4; + uint32_t operation_mode : 4; + uint32_t reset_count : 4; + uint32_t boot_options : 1; + uint32_t rsvd0 : 1; + uint32_t bist_state : 1; + uint32_t bist_reset_req : 1; + uint32_t power_source : 2; + uint32_t reserved1 : 1; + uint32_t d0i3_support_valid : 1; + } __packed fields; +}; + +/* Host Firmware Status Register 2 */ +union hfsts2 +{ + uint32_t raw; + struct { + uint32_t nftp_load_failure : 1; + uint32_t icc_prog_status : 2; + uint32_t invoke_mebx : 1; + uint32_t cpu_replaced : 1; + uint32_t rsvd0 : 1; + uint32_t mfs_failure : 1; + uint32_t warm_reset_rqst : 1; + uint32_t cpu_replaced_valid : 1; + uint32_t low_power_state : 1; + uint32_t me_power_gate : 1; + uint32_t ipu_needed : 1; + uint32_t forced_safe_boot : 1; + uint32_t rsvd1 : 2; + uint32_t listener_change : 1; + uint32_t status_data : 8; + uint32_t current_pmevent : 4; + uint32_t phase : 4; + } __packed fields; +}; + +/* Host Firmware Status Register 3 */ +union hfsts3 +{ + uint32_t raw; +}; + +/* Host Firmware Status Register 4 */ +union hfsts4 +{ + uint32_t raw; + struct { + uint32_t rsvd0 : 9; + uint32_t enforcement_flow : 1; + uint32_t sx_resume_type : 1; + uint32_t rsvd1 : 1; + uint32_t tpms_disconnected : 1; + uint32_t rvsd2 : 1; + uint32_t fwsts_valid : 1; + uint32_t boot_guard_self_test: 1; + uint32_t rsvd3 : 16; + } __packed fields; +}; + +/* Host Firmware Status Register 5 */ +union hfsts5 +{ + uint32_t raw; + struct { + uint32_t acm_active : 1; + uint32_t valid : 1; + uint32_t result_code_source : 1; + uint32_t error_status_code : 5; + uint32_t acm_done_sts : 1; + uint32_t timeout_count : 7; + uint32_t scrtm_indicator : 1; + uint32_t inc_boot_guard_acm : 4; + uint32_t inc_key_manifest : 4; + uint32_t inc_boot_policy : 4; + uint32_t rsvd0 : 2; + uint32_t start_enforcement : 1; + } __packed fields; +}; + +/* Host Firmware Status Register 6 */ +union hfsts6 +{ + uint32_t raw; + struct { + uint32_t force_boot_guard_acm: 1; + uint32_t cpu_debug_disable : 1; + uint32_t bsp_init_disable : 1; + uint32_t protect_bios_env : 1; + uint32_t rsvd0 : 2; + uint32_t error_enforce_policy: 2; + uint32_t measured_boot : 1; + uint32_t verified_boot : 1; + uint32_t boot_guard_acmsvn : 4; + uint32_t kmsvn : 4; + uint32_t bpmsvn : 4; + uint32_t key_manifest_id : 4; + uint32_t boot_policy_status : 1; + uint32_t error : 1; + uint32_t boot_guard_disable : 1; + uint32_t fpf_disable : 1; + uint32_t fpf_soc_lock : 1; + uint32_t txt_support : 1; + } __packed fields; +}; + +static uint32_t me_read_config32(int offset) +{ + return pci_read_config32(PCH_DEV_CSE, offset); +} + +/* + * From reading the documentation, this should work for both WHL and CML + * platforms + */ +static void print_me_version(void *unused) +{ + (void)unused; + + struct mkhi_hdr { + uint8_t group_id; + uint8_t command:7; + uint8_t is_resp:1; + uint8_t rsvd; + uint8_t result; + } __packed; + + struct version { + uint16_t minor; + uint16_t major; + uint16_t build; + uint16_t hotfix; + } __packed; + + struct fw_ver_resp { + struct mkhi_hdr hdr; + struct version code; + struct version rec; + struct version fitc; + } __packed; + + union hfsts1 hfsts1; + const struct mkhi_hdr fw_ver_msg = { + .group_id = MKHI_GEN_GROUP_ID, + .command = MKHI_GET_FW_VERSION, + }; + struct fw_ver_resp resp; + size_t resp_size = sizeof(resp); + + /* Ignore if UART debugging is disabled */ + if (!CONFIG(CONSOLE_SERIAL)) + return; + + hfsts1.raw = me_read_config32(PCI_ME_HFSTS1); + + /* + * Prerequisites: + * 1) HFSTS1 Current Working State is Normal + * 2) HFSTS1 Current Operation Mode is Normal + * 3) It's after DRAM INIT DONE message (taken care of by calling it + * during ramstage + */ + if ((hfsts1.fields.working_state != ME_WSTATE_NORMAL) || + (hfsts1.fields.operation_mode != ME_OPMODE_NORMAL)) + goto fail; + + heci_reset(); + + if (!heci_send(&fw_ver_msg, sizeof(fw_ver_msg), BIOS_HOST_ADD, + HECI_MKHI_ADD)) + goto fail; + + if (!heci_receive(&resp, &resp_size)) + goto fail; + + if (resp.hdr.result) + goto fail; + + printk(BIOS_DEBUG, "ME: Version: %d.%d.%d.%d\n", resp.code.major, + resp.code.minor, resp.code.hotfix, resp.code.build); + return; + +fail: + printk(BIOS_DEBUG, "ME: Version: Unavailable\n"); +} +BOOT_STATE_INIT_ENTRY(BS_DEV_ENABLE, BS_ON_EXIT, print_me_version, NULL); + +static void dump_me_status(void *unused) +{ + + union hfsts1 hfsts1; + union hfsts2 hfsts2; + union hfsts3 hfsts3; + union hfsts4 hfsts4; + union hfsts5 hfsts5; + union hfsts6 hfsts6; + + (void)unused; + + hfsts1.raw = me_read_config32(PCI_ME_HFSTS1); + hfsts2.raw = me_read_config32(PCI_ME_HFSTS2); + hfsts3.raw = me_read_config32(PCI_ME_HFSTS3); + hfsts4.raw = me_read_config32(PCI_ME_HFSTS4); + hfsts5.raw = me_read_config32(PCI_ME_HFSTS5); + hfsts6.raw = me_read_config32(PCI_ME_HFSTS6); + + printk(BIOS_DEBUG, "ME: HFSTS1 : 0x%08X\n", hfsts1.raw); + printk(BIOS_DEBUG, "ME: HFSTS2 : 0x%08X\n", hfsts2.raw); + printk(BIOS_DEBUG, "ME: HFSTS3 : 0x%08X\n", hfsts3.raw); + printk(BIOS_DEBUG, "ME: HFSTS4 : 0x%08X\n", hfsts4.raw); + printk(BIOS_DEBUG, "ME: HFSTS5 : 0x%08X\n", hfsts5.raw); + printk(BIOS_DEBUG, "ME: HFSTS6 : 0x%08X\n", hfsts6.raw); + + printk(BIOS_DEBUG, "ME: Manufacturing Mode : %s\n", + hfsts1.fields.mfg_mode ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: FW Partition Table : %s\n", + hfsts1.fields.fpt_bad ? "BAD" : "OK"); + printk(BIOS_DEBUG, "ME: Bringup Loader Failure : %s\n", + hfsts1.fields.ft_bup_ld_flr ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Firmware Init Complete : %s\n", + hfsts1.fields.fw_init_complete ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Boot Options Present : %s\n", + hfsts1.fields.boot_options ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Update In Progress : %s\n", + hfsts1.fields.fw_upd_in_progress ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: D0i3 Support : %s\n", + hfsts1.fields.d0i3_support_valid ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Low Power State Enabled : %s\n", + hfsts2.fields.low_power_state ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: CPU Replaced : %s\n", + hfsts2.fields.cpu_replaced ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: CPU Replacement Valid : %s\n", + hfsts2.fields.cpu_replaced_valid ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Current Working State : %u\n", + hfsts1.fields.working_state); + printk(BIOS_DEBUG, "ME: Current Operation State : %u\n", + hfsts1.fields.operation_state); + printk(BIOS_DEBUG, "ME: Current Operation Mode : %u\n", + hfsts1.fields.operation_mode); + printk(BIOS_DEBUG, "ME: Error Code : %u\n", + hfsts1.fields.error_code); + printk(BIOS_DEBUG, "ME: CPU Debug Disabled : %s\n", + hfsts6.fields.cpu_debug_disable ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: TXT Support : %s\n", + hfsts6.fields.txt_support ? "YES" : "NO"); +} +BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, dump_me_status, NULL); +BOOT_STATE_INIT_ENTRY(BS_PAYLOAD_LOAD, BS_ON_EXIT, dump_me_status, NULL);
build bot (Jenkins) has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 1:
(14 comments)
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@28 PS1, Line 28: { open brace '{' following enum go on the same line
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@39 PS1, Line 39: { open brace '{' following enum go on the same line
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@50 PS1, Line 50: { open brace '{' following union go on the same line
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@75 PS1, Line 75: { open brace '{' following union go on the same line
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@100 PS1, Line 100: { open brace '{' following union go on the same line
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@106 PS1, Line 106: { open brace '{' following union go on the same line
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@123 PS1, Line 123: { open brace '{' following union go on the same line
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@143 PS1, Line 143: { open brace '{' following union go on the same line
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@267 PS1, Line 267: printk(BIOS_DEBUG, "ME: HFSTS1 : 0x%08X\n", hfsts1.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@268 PS1, Line 268: printk(BIOS_DEBUG, "ME: HFSTS2 : 0x%08X\n", hfsts2.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@269 PS1, Line 269: printk(BIOS_DEBUG, "ME: HFSTS3 : 0x%08X\n", hfsts3.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@270 PS1, Line 270: printk(BIOS_DEBUG, "ME: HFSTS4 : 0x%08X\n", hfsts4.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@271 PS1, Line 271: printk(BIOS_DEBUG, "ME: HFSTS5 : 0x%08X\n", hfsts5.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/1/src/soc/intel/cannonlake/me.c@272 PS1, Line 272: printk(BIOS_DEBUG, "ME: HFSTS6 : 0x%08X\n", hfsts6.raw); line over 80 characters
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 1:
I didn't see any changes between ME f/w v12 and ME f/w v14 that would affect obtaining the version or printing the firmware status registers.
Hello Patrick Rudolph, Shelley Chen, Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#2).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints what appears to be correct information on Kled (hatch_whl).
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc A src/soc/intel/cannonlake/me.c 2 files changed, 301 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/2
build bot (Jenkins) has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 2:
(6 comments)
https://review.coreboot.org/#/c/32527/2/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/2/src/soc/intel/cannonlake/me.c@259 PS2, Line 259: printk(BIOS_DEBUG, "ME: HFSTS1 : 0x%08X\n", hfsts1.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/2/src/soc/intel/cannonlake/me.c@260 PS2, Line 260: printk(BIOS_DEBUG, "ME: HFSTS2 : 0x%08X\n", hfsts2.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/2/src/soc/intel/cannonlake/me.c@261 PS2, Line 261: printk(BIOS_DEBUG, "ME: HFSTS3 : 0x%08X\n", hfsts3.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/2/src/soc/intel/cannonlake/me.c@262 PS2, Line 262: printk(BIOS_DEBUG, "ME: HFSTS4 : 0x%08X\n", hfsts4.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/2/src/soc/intel/cannonlake/me.c@263 PS2, Line 263: printk(BIOS_DEBUG, "ME: HFSTS5 : 0x%08X\n", hfsts5.raw); line over 80 characters
https://review.coreboot.org/#/c/32527/2/src/soc/intel/cannonlake/me.c@264 PS2, Line 264: printk(BIOS_DEBUG, "ME: HFSTS6 : 0x%08X\n", hfsts6.raw); line over 80 characters
Hello Patrick Rudolph, Shelley Chen, build bot (Jenkins), Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#3).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints what appears to be correct information on Kled (hatch_whl).
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc A src/soc/intel/cannonlake/me.c 2 files changed, 307 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/3
Paul Fagerburg has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 3: Code-Review+1
LGTM
Hello Patrick Rudolph, Paul Fagerburg, Shelley Chen, build bot (Jenkins), Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#4).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc A src/soc/intel/cannonlake/me.c 2 files changed, 307 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/4
Patrick Rudolph has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 4: Code-Review+1
Can the code (or parts of it) be shared with https://review.coreboot.org/#/c/coreboot/+/23857/ ?
Hello Patrick Rudolph, Paul Fagerburg, Shelley Chen, build bot (Jenkins), Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#5).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints seemingly sane values for all fields in question on Kled.
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc A src/soc/intel/cannonlake/me.c 2 files changed, 307 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/5
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5:
Re: Patrick's comment, I'm kind of the opinion that each family should keep its code separate from the others, in case something changes going forward. Thoughts?
Paul Fagerburg has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5:
Because it's debug code, I wouldn't support refactoring it at this time. However, if it gets cut-and-pasted again (which would make for 3 copies), then it should probably be refactored into a common area.
Paul Fagerburg has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5: Code-Review+1
Lijian Zhao has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5:
Did we test the impact to boot time?
Lijian Zhao has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5:
Patch Set 5:
Did we test the impact to boot time?
A quick check seems the impact on warm boot is within few microseconds, but I am not sure about cold boot impact.
Lijian Zhao has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5: Code-Review+1
Shelley Chen has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5: Code-Review+2
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5:
(1 comment)
https://review.coreboot.org/#/c/32527/5/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
PS5: Are the messages and addresses same for WHL and CML since the file is shared by both?
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5:
(1 comment)
https://review.coreboot.org/#/c/32527/5/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
PS5:
Are the messages and addresses same for WHL and CML since the file is shared by both?
Based on my reading of the ME F/W document for both, yes. I also tested it on Kled proto (WHL) and Kohaku proto (CML).
Lijian Zhao has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 5:
(1 comment)
https://review.coreboot.org/#/c/32527/5/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/5/src/soc/intel/cannonlake/me.c@32 PS5, Line 32: BIOS_HOST_ADD ADDR instead of ADD to avoid confusion?
Hello Patrick Rudolph, Paul Fagerburg, Shelley Chen, Lijian Zhao, build bot (Jenkins), Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#6).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints seemingly sane values on WHL and CML devices.
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc A src/soc/intel/cannonlake/me.c 2 files changed, 305 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/6
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 6:
(1 comment)
https://review.coreboot.org/#/c/32527/5/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/5/src/soc/intel/cannonlake/me.c@32 PS5, Line 32: BIOS_HOST_ADD
ADDR instead of ADD to avoid confusion?
Actually, my bad, these (*_ADDR) are already defined in cse.h. Removing these instead.
Paul Fagerburg has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 6: Code-Review+2
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 6:
(3 comments)
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@168 PS6, Line 168: (void)unused; I don't think this is required.
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@238 PS6, Line 238: dump_me_status One thing to check would be when Heci is disabled. +Subrata, can you please confirm this?
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@248 PS6, Line 248: (void)unused; Why?
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 6:
(2 comments)
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@168 PS6, Line 168: (void)unused;
I don't think this is required.
No not required, it's an old habit of mine for documentation purposes.
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@248 PS6, Line 248: (void)unused;
Why?
See above. I can remove these if you like.
Paul Fagerburg has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 6:
(1 comment)
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@168 PS6, Line 168: (void)unused;
No not required, it's an old habit of mine for documentation purposes.
FWIW, I like it.
Lijian Zhao has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 6:
(1 comment)
https://review.coreboot.org/#/c/32527/5/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
PS5:
Based on my reading of the ME F/W document for both, yes. […]
I have checked that as well and I can confirm the register definition is same.
Subrata Banik has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 6: Code-Review-1
(1 comment)
need to fix this comment
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@238 PS6, Line 238: dump_me_status
One thing to check would be when Heci is disabled. […]
it will give all 0xFFFFF when heci is disable hence the right check should be just before heci gets disable from finalize.c
example: https://github.com/coreboot/coreboot/blob/aa2157430f96c658b9629bf69d507f1f16...
Hello Patrick Rudolph, Paul Fagerburg, Subrata Banik, Shelley Chen, Lijian Zhao, build bot (Jenkins), Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#7).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints seemingly sane values on WHL and CML devices.
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc M src/soc/intel/cannonlake/finalize.c A src/soc/intel/cannonlake/me.c 3 files changed, 303 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/7
Paul Fagerburg has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 7: Code-Review+1
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 7:
Subrata, can you please confirm that your Heci disabling changes have no impact on the dump_me_status? Or if you can provide the steps to test it out to Tim, he should be able to check it as well.
Subrata Banik has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 7:
Subrata, can you please confirm that your Heci disabling changes have no impact on the dump_me_status? Or if you can provide the steps to test it out to Tim, he should be able to check it as well.
yes, it will have impact for sure, because dump_me_status relying on PCI config register which will be read as 0xFF hence i have recommended to move this code from state machine to fixed call from finalized.c and dump me status just before and make HECI disable.
You can take example of KBL based platform, log below
Finalizing chipset. ME: FW Partition Table : OK ME: Bringup Loader Failure : NO ME: Firmware Init Complete : YES ME: Manufacturing Mode : YES ME: Boot Options Present : NO ME: Update In Progress : NO ME: D3 Support : NO ME: D0i3 Support : YES ME: Low Power State Enabled : YES ME: Power Gated : NO ME: CPU Replaced : NO ME: CPU Replacement Valid : NO ME: Current Working State : Normal ME: Current Operation State : M0 with UMA ME: Current Operation Mode : Normal ME: Error Code : No Error ME: Progress Phase : Unknown (8) ME: Power Management Event : Clean Intel ME reset ME: Progress Phase State : Unknown phase: 0x08 state: 0x10 ME: Power Down Mitigation : NO ME: FPF status : unfused
Subrata Banik has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 7:
(2 comments)
https://review.coreboot.org/#/c/32527/7/src/soc/intel/cannonlake/finalize.c File src/soc/intel/cannonlake/finalize.c:
https://review.coreboot.org/#/c/32527/7/src/soc/intel/cannonlake/finalize.c@... PS7, Line 98: dump_me_status this is good, i believe this function will call prior to FSP-notify 2 call to make HECI function disable
https://review.coreboot.org/#/c/32527/7/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/7/src/soc/intel/cannonlake/me.c@22 PS7, Line 22: #include <soc/me.h> i don't see this file ?
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 7:
(5 comments)
https://review.coreboot.org/#/c/32527/7/src/soc/intel/cannonlake/finalize.c File src/soc/intel/cannonlake/finalize.c:
https://review.coreboot.org/#/c/32527/7/src/soc/intel/cannonlake/finalize.c@... PS7, Line 98: dump_me_status
this is good, i believe this function will call prior to FSP-notify 2 call to make HECI function dis […]
Ack
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@168 PS6, Line 168: (void)unused;
FWIW, I like it.
Done
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@238 PS6, Line 238: dump_me_status
it will give all 0xFFFFF when heci is disable hence the right check should be just before heci gets […]
Done
https://review.coreboot.org/#/c/32527/6/src/soc/intel/cannonlake/me.c@248 PS6, Line 248: (void)unused;
See above. I can remove these if you like.
Done
https://review.coreboot.org/#/c/32527/7/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/7/src/soc/intel/cannonlake/me.c@22 PS7, Line 22: #include <soc/me.h>
i don't see this file ?
Oops, missed it.
Hello Patrick Rudolph, Paul Fagerburg, Subrata Banik, Shelley Chen, build bot (Jenkins), Lijian Zhao, Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#8).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints seemingly sane values on WHL and CML devices.
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc M src/soc/intel/cannonlake/finalize.c A src/soc/intel/cannonlake/include/soc/me.h A src/soc/intel/cannonlake/me.c 4 files changed, 324 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/8
Paul Fagerburg has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 8: Code-Review+1
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 8:
(2 comments)
https://review.coreboot.org/#/c/32527/8/src/soc/intel/cannonlake/include/soc... File src/soc/intel/cannonlake/include/soc/me.h:
https://review.coreboot.org/#/c/32527/8/src/soc/intel/cannonlake/include/soc... PS8, Line 4: Inc. LLC
https://review.coreboot.org/#/c/32527/8/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/8/src/soc/intel/cannonlake/me.c@235 PS8, Line 235: print_me_version And the reason why this cannot be called from dump_me_status() is probably because its too late and ME does not respond to GET_FW_VERSION command? At least that was the observation on SKL/KBL.
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 8:
(2 comments)
https://review.coreboot.org/#/c/32527/8/src/soc/intel/cannonlake/include/soc... File src/soc/intel/cannonlake/include/soc/me.h:
https://review.coreboot.org/#/c/32527/8/src/soc/intel/cannonlake/include/soc... PS8, Line 4: Inc.
LLC
Done
https://review.coreboot.org/#/c/32527/8/src/soc/intel/cannonlake/me.c File src/soc/intel/cannonlake/me.c:
https://review.coreboot.org/#/c/32527/8/src/soc/intel/cannonlake/me.c@235 PS8, Line 235: print_me_version
And the reason why this cannot be called from dump_me_status() is probably because its too late and […]
I tried calling this from dump_me_status(), and the HECI command times out, so I followed the SKL/KBL model and that worked. I don't see any notes in the CSME document (either version) about when the command can and cannot be sent, but maybe I missed it. Added a comment explaining this.
Hello Patrick Rudolph, Paul Fagerburg, Subrata Banik, Shelley Chen, build bot (Jenkins), Lijian Zhao, Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#9).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information.
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints seemingly sane values on WHL and CML devices.
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc M src/soc/intel/cannonlake/finalize.c A src/soc/intel/cannonlake/include/soc/me.h A src/soc/intel/cannonlake/me.c 4 files changed, 324 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/9
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 9: Code-Review+2
Subrata Banik has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 9: Code-Review+2
Paul Menzel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information. ......................................................................
Patch Set 9: Code-Review+1
(1 comment)
https://review.coreboot.org/#/c/32527/9//COMMIT_MSG Commit Message:
https://review.coreboot.org/#/c/32527/9//COMMIT_MSG@7 PS9, Line 7: soc/intel/cannonlake: Dump ME f/w version and status information. Please remove the dot/period at the end.
Hello Patrick Rudolph, Paul Fagerburg, Subrata Banik, Paul Menzel, Shelley Chen, build bot (Jenkins), Lijian Zhao, Furquan Shaikh, Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/32527
to look at the new patch set (#10).
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints seemingly sane values on WHL and CML devices.
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org --- M src/soc/intel/cannonlake/Makefile.inc M src/soc/intel/cannonlake/finalize.c A src/soc/intel/cannonlake/include/soc/me.h A src/soc/intel/cannonlake/me.c 4 files changed, 324 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/32527/10
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information ......................................................................
Patch Set 10:
(1 comment)
Patch Set 9: Code-Review+1
(1 comment)
https://review.coreboot.org/#/c/32527/9//COMMIT_MSG Commit Message:
https://review.coreboot.org/#/c/32527/9//COMMIT_MSG@7 PS9, Line 7: soc/intel/cannonlake: Dump ME f/w version and status information.
Please remove the dot/period at the end.
Done
Paul Fagerburg has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information ......................................................................
Patch Set 10: Code-Review+2
Patrick Georgi has submitted this change and it was merged. ( https://review.coreboot.org/c/coreboot/+/32527 )
Change subject: soc/intel/cannonlake: Dump ME f/w version and status information ......................................................................
soc/intel/cannonlake: Dump ME f/w version and status information
At the end of device enable, print the ME f/w version number. Before resume or loading payload, dump the ME's Host Firmware Status registers.
BUG=b:131437724 BRANCH=none TEST=Prints seemingly sane values on WHL and CML devices.
Change-Id: Ibeb3a2a85cd84c9baa45f90f20a3dcf69f7d5646 Signed-off-by: Tim Wawrzynczak twawrzynczak@chromium.org Reviewed-on: https://review.coreboot.org/c/coreboot/+/32527 Reviewed-by: Paul Fagerburg pfagerburg@chromium.org Reviewed-by: Furquan Shaikh furquan@google.com Reviewed-by: Subrata Banik subrata.banik@intel.com Reviewed-by: Paul Menzel paulepanter@users.sourceforge.net Tested-by: build bot (Jenkins) no-reply@coreboot.org --- M src/soc/intel/cannonlake/Makefile.inc M src/soc/intel/cannonlake/finalize.c A src/soc/intel/cannonlake/include/soc/me.h A src/soc/intel/cannonlake/me.c 4 files changed, 324 insertions(+), 0 deletions(-)
Approvals: build bot (Jenkins): Verified Paul Menzel: Looks good to me, but someone else must approve Furquan Shaikh: Looks good to me, approved Subrata Banik: Looks good to me, approved Paul Fagerburg: Looks good to me, approved
diff --git a/src/soc/intel/cannonlake/Makefile.inc b/src/soc/intel/cannonlake/Makefile.inc index 7ad0c7c..1328944 100644 --- a/src/soc/intel/cannonlake/Makefile.inc +++ b/src/soc/intel/cannonlake/Makefile.inc @@ -43,6 +43,7 @@ ramstage-y += i2c.c ramstage-y += lockdown.c ramstage-y += lpc.c +ramstage-y += me.c ramstage-y += memmap.c ramstage-y += nhlt.c ramstage-y += p2sb.c diff --git a/src/soc/intel/cannonlake/finalize.c b/src/soc/intel/cannonlake/finalize.c index 4dfd15b..eb4c5c2 100644 --- a/src/soc/intel/cannonlake/finalize.c +++ b/src/soc/intel/cannonlake/finalize.c @@ -26,6 +26,7 @@ #include <intelblocks/tco.h> #include <reg_script.h> #include <spi-generic.h> +#include <soc/me.h> #include <soc/p2sb.h> #include <soc/pci_devs.h> #include <soc/pcr_ids.h> @@ -94,6 +95,8 @@ { printk(BIOS_DEBUG, "Finalizing chipset.\n");
+ dump_me_status(); + pch_finalize();
printk(BIOS_DEBUG, "Finalizing SMM.\n"); diff --git a/src/soc/intel/cannonlake/include/soc/me.h b/src/soc/intel/cannonlake/include/soc/me.h new file mode 100644 index 0000000..1d782c1 --- /dev/null +++ b/src/soc/intel/cannonlake/include/soc/me.h @@ -0,0 +1,21 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Google LLC + * + * 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 _CANNONLAKE_ME_H_ +#define _CANNONLAKE_ME_H_ + +void dump_me_status(void); + +#endif /* _CANNONLAKE_ME_H_ */ diff --git a/src/soc/intel/cannonlake/me.c b/src/soc/intel/cannonlake/me.c new file mode 100644 index 0000000..3fedc63 --- /dev/null +++ b/src/soc/intel/cannonlake/me.c @@ -0,0 +1,299 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Google LLC. + * + * 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. + */ + +#include <device/pci_ops.h> +#include <bootstate.h> +#include <commonlib/helpers.h> +#include <console/console.h> +#include <device/pci.h> +#include <intelblocks/cse.h> +#include <soc/me.h> +#include <soc/pci_devs.h> +#include <stdint.h> +#include <stdlib.h> + +/* Miscellaneous constants */ +enum { + MKHI_GEN_GROUP_ID = 0xFF, + MKHI_GET_FW_VERSION = 0x02, + ME_OPMODE_NORMAL = 0x00, + ME_WSTATE_NORMAL = 0x05, +}; + +/* HFSTS register offsets in PCI config space */ +enum { + PCI_ME_HFSTS1 = 0x40, + PCI_ME_HFSTS2 = 0x48, + PCI_ME_HFSTS3 = 0x60, + PCI_ME_HFSTS4 = 0x64, + PCI_ME_HFSTS5 = 0x68, + PCI_ME_HFSTS6 = 0x6C, +}; + +/* Host Firmware Status Register 1 */ +union hfsts1 { + uint32_t raw; + struct { + 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 fw_upd_in_progress : 1; + uint32_t error_code : 4; + uint32_t operation_mode : 4; + uint32_t reset_count : 4; + uint32_t boot_options : 1; + uint32_t rsvd0 : 1; + uint32_t bist_state : 1; + uint32_t bist_reset_req : 1; + uint32_t power_source : 2; + uint32_t reserved1 : 1; + uint32_t d0i3_support_valid : 1; + } __packed fields; +}; + +/* Host Firmware Status Register 2 */ +union hfsts2 { + uint32_t raw; + struct { + uint32_t nftp_load_failure : 1; + uint32_t icc_prog_status : 2; + uint32_t invoke_mebx : 1; + uint32_t cpu_replaced : 1; + uint32_t rsvd0 : 1; + uint32_t mfs_failure : 1; + uint32_t warm_reset_rqst : 1; + uint32_t cpu_replaced_valid : 1; + uint32_t low_power_state : 1; + uint32_t me_power_gate : 1; + uint32_t ipu_needed : 1; + uint32_t forced_safe_boot : 1; + uint32_t rsvd1 : 2; + uint32_t listener_change : 1; + uint32_t status_data : 8; + uint32_t current_pmevent : 4; + uint32_t phase : 4; + } __packed fields; +}; + +/* Host Firmware Status Register 3 */ +union hfsts3 { + uint32_t raw; +}; + +/* Host Firmware Status Register 4 */ +union hfsts4 { + uint32_t raw; + struct { + uint32_t rsvd0 : 9; + uint32_t enforcement_flow : 1; + uint32_t sx_resume_type : 1; + uint32_t rsvd1 : 1; + uint32_t tpms_disconnected : 1; + uint32_t rvsd2 : 1; + uint32_t fwsts_valid : 1; + uint32_t boot_guard_self_test : 1; + uint32_t rsvd3 : 16; + } __packed fields; +}; + +/* Host Firmware Status Register 5 */ +union hfsts5 { + uint32_t raw; + struct { + uint32_t acm_active : 1; + uint32_t valid : 1; + uint32_t result_code_source : 1; + uint32_t error_status_code : 5; + uint32_t acm_done_sts : 1; + uint32_t timeout_count : 7; + uint32_t scrtm_indicator : 1; + uint32_t inc_boot_guard_acm : 4; + uint32_t inc_key_manifest : 4; + uint32_t inc_boot_policy : 4; + uint32_t rsvd0 : 2; + uint32_t start_enforcement : 1; + } __packed fields; +}; + +/* Host Firmware Status Register 6 */ +union hfsts6 { + uint32_t raw; + struct { + uint32_t force_boot_guard_acm : 1; + uint32_t cpu_debug_disable : 1; + uint32_t bsp_init_disable : 1; + uint32_t protect_bios_env : 1; + uint32_t rsvd0 : 2; + uint32_t error_enforce_policy : 2; + uint32_t measured_boot : 1; + uint32_t verified_boot : 1; + uint32_t boot_guard_acmsvn : 4; + uint32_t kmsvn : 4; + uint32_t bpmsvn : 4; + uint32_t key_manifest_id : 4; + uint32_t boot_policy_status : 1; + uint32_t error : 1; + uint32_t boot_guard_disable : 1; + uint32_t fpf_disable : 1; + uint32_t fpf_soc_lock : 1; + uint32_t txt_support : 1; + } __packed fields; +}; + +static uint32_t me_read_config32(int offset) +{ + return pci_read_config32(PCH_DEV_CSE, offset); +} + +/* + * From reading the documentation, this should work for both WHL and CML + * platforms. Also, calling this function from dump_me_status() does not + * work, as the ME does not respond and the command times out. + */ +static void print_me_version(void *unused) +{ + struct mkhi_hdr { + uint8_t group_id; + uint8_t command :7; + uint8_t is_resp :1; + uint8_t rsvd; + uint8_t result; + } __packed; + + struct version { + uint16_t minor; + uint16_t major; + uint16_t build; + uint16_t hotfix; + } __packed; + + struct fw_ver_resp { + struct mkhi_hdr hdr; + struct version code; + struct version rec; + struct version fitc; + } __packed; + + union hfsts1 hfsts1; + const struct mkhi_hdr fw_ver_msg = { + .group_id = MKHI_GEN_GROUP_ID, + .command = MKHI_GET_FW_VERSION, + }; + struct fw_ver_resp resp; + size_t resp_size = sizeof(resp); + + /* Ignore if UART debugging is disabled */ + if (!CONFIG(CONSOLE_SERIAL)) + return; + + hfsts1.raw = me_read_config32(PCI_ME_HFSTS1); + + /* + * Prerequisites: + * 1) HFSTS1 Current Working State is Normal + * 2) HFSTS1 Current Operation Mode is Normal + * 3) It's after DRAM INIT DONE message (taken care of by calling it + * during ramstage + */ + if ((hfsts1.fields.working_state != ME_WSTATE_NORMAL) || + (hfsts1.fields.operation_mode != ME_OPMODE_NORMAL)) + goto fail; + + heci_reset(); + + if (!heci_send(&fw_ver_msg, sizeof(fw_ver_msg), BIOS_HOST_ADDR, + HECI_MKHI_ADDR)) + goto fail; + + if (!heci_receive(&resp, &resp_size)) + goto fail; + + if (resp.hdr.result) + goto fail; + + printk(BIOS_DEBUG, "ME: Version: %d.%d.%d.%d\n", resp.code.major, + resp.code.minor, resp.code.hotfix, resp.code.build); + return; + +fail: + printk(BIOS_DEBUG, "ME: Version: Unavailable\n"); +} +BOOT_STATE_INIT_ENTRY(BS_DEV_ENABLE, BS_ON_EXIT, print_me_version, NULL); + +void dump_me_status(void) +{ + union hfsts1 hfsts1; + union hfsts2 hfsts2; + union hfsts3 hfsts3; + union hfsts4 hfsts4; + union hfsts5 hfsts5; + union hfsts6 hfsts6; + + hfsts1.raw = me_read_config32(PCI_ME_HFSTS1); + hfsts2.raw = me_read_config32(PCI_ME_HFSTS2); + hfsts3.raw = me_read_config32(PCI_ME_HFSTS3); + hfsts4.raw = me_read_config32(PCI_ME_HFSTS4); + hfsts5.raw = me_read_config32(PCI_ME_HFSTS5); + hfsts6.raw = me_read_config32(PCI_ME_HFSTS6); + + printk(BIOS_DEBUG, "ME: HFSTS1 : 0x%08X\n", + hfsts1.raw); + printk(BIOS_DEBUG, "ME: HFSTS2 : 0x%08X\n", + hfsts2.raw); + printk(BIOS_DEBUG, "ME: HFSTS3 : 0x%08X\n", + hfsts3.raw); + printk(BIOS_DEBUG, "ME: HFSTS4 : 0x%08X\n", + hfsts4.raw); + printk(BIOS_DEBUG, "ME: HFSTS5 : 0x%08X\n", + hfsts5.raw); + printk(BIOS_DEBUG, "ME: HFSTS6 : 0x%08X\n", + hfsts6.raw); + + printk(BIOS_DEBUG, "ME: Manufacturing Mode : %s\n", + hfsts1.fields.mfg_mode ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: FW Partition Table : %s\n", + hfsts1.fields.fpt_bad ? "BAD" : "OK"); + printk(BIOS_DEBUG, "ME: Bringup Loader Failure : %s\n", + hfsts1.fields.ft_bup_ld_flr ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Firmware Init Complete : %s\n", + hfsts1.fields.fw_init_complete ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Boot Options Present : %s\n", + hfsts1.fields.boot_options ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Update In Progress : %s\n", + hfsts1.fields.fw_upd_in_progress ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: D0i3 Support : %s\n", + hfsts1.fields.d0i3_support_valid ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Low Power State Enabled : %s\n", + hfsts2.fields.low_power_state ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: CPU Replaced : %s\n", + hfsts2.fields.cpu_replaced ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: CPU Replacement Valid : %s\n", + hfsts2.fields.cpu_replaced_valid ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: Current Working State : %u\n", + hfsts1.fields.working_state); + printk(BIOS_DEBUG, "ME: Current Operation State : %u\n", + hfsts1.fields.operation_state); + printk(BIOS_DEBUG, "ME: Current Operation Mode : %u\n", + hfsts1.fields.operation_mode); + printk(BIOS_DEBUG, "ME: Error Code : %u\n", + hfsts1.fields.error_code); + printk(BIOS_DEBUG, "ME: CPU Debug Disabled : %s\n", + hfsts6.fields.cpu_debug_disable ? "YES" : "NO"); + printk(BIOS_DEBUG, "ME: TXT Support : %s\n", + hfsts6.fields.txt_support ? "YES" : "NO"); +}