drivers/i2c/tpm/cr50: Increase IRQ timeout

Increase the IRQ timeout to prevent issues if there is a delay
in the TPM responding to a command.  Split the no-IRQ case out
so it doesn't suffer unnecessarily.

BUG=chrome-os-partner:59191
TEST=suspend/resume testing on eve board

Change-Id: I1ea7859bc7a056a450b2b0ee32153ae43ee8699f
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: https://review.coreboot.org/17204
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
This commit is contained in:
Duncan Laurie 2016-11-01 15:03:13 -07:00 committed by Martin Roth
parent a84fa908e2
commit ed4fa099d9
1 changed files with 9 additions and 2 deletions

View File

@ -48,6 +48,8 @@
#define CR50_MAX_BUFSIZE 63 #define CR50_MAX_BUFSIZE 63
#define CR50_TIMEOUT_LONG_MS 2000 /* Long timeout while waiting for TPM */ #define CR50_TIMEOUT_LONG_MS 2000 /* Long timeout while waiting for TPM */
#define CR50_TIMEOUT_SHORT_MS 2 /* Short timeout during transactions */ #define CR50_TIMEOUT_SHORT_MS 2 /* Short timeout during transactions */
#define CR50_TIMEOUT_NOIRQ_MS 20 /* Timeout for TPM ready without IRQ */
#define CR50_TIMEOUT_IRQ_MS 100 /* Timeout for TPM ready with IRQ */
#define CR50_DID_VID 0x00281ae0L #define CR50_DID_VID 0x00281ae0L
struct tpm_inf_dev { struct tpm_inf_dev {
@ -65,11 +67,11 @@ static int cr50_i2c_wait_tpm_ready(struct tpm_chip *chip)
if (!chip->vendor.irq_status) { if (!chip->vendor.irq_status) {
/* Fixed delay if interrupt not supported */ /* Fixed delay if interrupt not supported */
mdelay(CR50_TIMEOUT_SHORT_MS); mdelay(CR50_TIMEOUT_NOIRQ_MS);
return 0; return 0;
} }
stopwatch_init_msecs_expire(&sw, 5 * CR50_TIMEOUT_SHORT_MS); stopwatch_init_msecs_expire(&sw, CR50_TIMEOUT_IRQ_MS);
while (!chip->vendor.irq_status(chip->vendor.irq)) while (!chip->vendor.irq_status(chip->vendor.irq))
if (stopwatch_expired(&sw)) if (stopwatch_expired(&sw))
@ -429,6 +431,11 @@ static void cr50_vendor_init(struct tpm_chip *chip)
chip->vendor.irq = -1; chip->vendor.irq = -1;
#endif #endif
} }
if (chip->vendor.irq <= 0)
printk(BIOS_WARNING,
"%s: No IRQ, will use %ums delay for TPM ready\n",
__func__, CR50_TIMEOUT_NOIRQ_MS);
} }
int tpm_vendor_probe(unsigned bus, uint32_t addr) int tpm_vendor_probe(unsigned bus, uint32_t addr)