Keith Short has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/32365
Change subject: coreboot: Run mainboard specific code before Cr50 reset ......................................................................
coreboot: Run mainboard specific code before Cr50 reset
When coreboot checks the TPM and key-ladder state it issues a reboot of the Cr50 with a delay parameter. Older Cr50 code doesn't support the delay parameter and reboots immediately, which prevented coreboot from running the mainboard specific code needed for the AP to come back up.
This change calls mainboard_prepare_cr50_reset() prior to sending the VENDOR_CC_IMMEDIATE_RESET command.
This change also removes a false error message from the coreboot log that indicated an "Unexpected Cr50 TPM mode 3".
BUG=b:130830178 BRANCH=none TEST=build coreboot on sarien and grunt platforms. TEST=Run 'gsctool -a -m disable; reboot'. Verify corebot send the VENDOR_CC_IMMEDIATE_RESET command and that the AP boots normally.
Change-Id: Ib05c9cfde8e87daffd4233114263de5b30822872 Signed-off-by: Keith Short keithshort@chromium.org --- M src/vendorcode/google/chromeos/cr50_enable_update.c 1 file changed, 9 insertions(+), 1 deletion(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/65/32365/1
diff --git a/src/vendorcode/google/chromeos/cr50_enable_update.c b/src/vendorcode/google/chromeos/cr50_enable_update.c index 91a10cb..315f9dc 100644 --- a/src/vendorcode/google/chromeos/cr50_enable_update.c +++ b/src/vendorcode/google/chromeos/cr50_enable_update.c @@ -68,7 +68,7 @@ * This is not an expected state, as the Cr50 always sets the TPM mode * to TPM_MODE_ENABLED_TENTATIVE during any TPM reset action. */ - if (tpm_mode != TPM_MODE_ENABLED_TENTATIVE) { + if (!cr50_must_reset && tpm_mode != TPM_MODE_ENABLED_TENTATIVE) { printk(BIOS_NOTICE, "NOTICE: Unexpected Cr50 TPM mode (%d). " "A Cr50 reset is required.\n", tpm_mode); @@ -79,6 +79,14 @@ if (!cr50_must_reset) return 0;
+ /* + * Give mainboard a chance to take action - note that older Cr50 + * firmware didn't support the timeout argument and performed an + * immediate reset. If the Cr50 honors the timeout request then + * mainboard_prepare_cr50_reset() is called again without harm. + */ + mainboard_prepare_cr50_reset(); + ret = tlcl_cr50_immediate_reset(timeout_ms);
if (ret != TPM_SUCCESS) {