aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/i2c/tpm
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2016-11-30 17:46:17 -0800
committerPatrick Georgi <pgeorgi@google.com>2017-01-03 22:13:19 +0100
commita69ac7861b03e438e62c57992c30d9c42996c56b (patch)
treea6080e8a43a2fdd1d61ccf35ce6b07391fa3a5ea /src/drivers/i2c/tpm
parentb431a51086f89e74aa681b61744bc312255b6cb4 (diff)
i2c/tpm: Ignore 0xFF bytes for status and burstCount
We've found that the SLB9645 TPM sometimes seems to randomly start returning 0xFF bytes for all requests. The exact cause is yet unknown, but we should try to write our TIS code such that it avoids bad interactions with this kind of response (e.g. any wait_for_status() immediately succeeds because all "status bits" are set in the response). At least for status and burstCount readings we can say for sure that the value is nonsensical and we're already reading those in a loop until we get valid results anyway, so let's add code to explicitly discount 0xFF bytes. BRANCH=oak BUG=chrome-os-partner:55764 TEST=None Change-Id: I934d42c36d6847a22a185795cea49d282fa113d9 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/420470 Reviewed-by: Nicolas Boichat <drinkcat@chromium.org> Reviewed-on: https://review.coreboot.org/18006 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'src/drivers/i2c/tpm')
-rw-r--r--src/drivers/i2c/tpm/tpm.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/drivers/i2c/tpm/tpm.c b/src/drivers/i2c/tpm/tpm.c
index 55c25fefa4..972b17de42 100644
--- a/src/drivers/i2c/tpm/tpm.c
+++ b/src/drivers/i2c/tpm/tpm.c
@@ -291,6 +291,8 @@ static uint8_t tpm_tis_i2c_status(struct tpm_chip *chip)
uint8_t buf;
if (iic_tpm_read(TPM_STS(chip->vendor.locality), &buf, 1) < 0)
return 0;
+ else if (buf == 0xff) /* Some TPMs sometimes randomly return 0xff. */
+ return 0;
else
return buf;
}
@@ -316,7 +318,7 @@ static ssize_t get_burstcount(struct tpm_chip *chip)
else
burstcnt = (buf[2] << 16) + (buf[1] << 8) + buf[0];
- if (burstcnt)
+ if (burstcnt && burstcnt != 0xffffff)
return burstcnt;
mdelay(TPM_TIMEOUT);
timeout--;