summaryrefslogtreecommitdiff
path: root/src/drivers/i2c/tpm/cr50.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/i2c/tpm/cr50.c')
-rw-r--r--src/drivers/i2c/tpm/cr50.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/drivers/i2c/tpm/cr50.c b/src/drivers/i2c/tpm/cr50.c
index 1190262100..66278519b3 100644
--- a/src/drivers/i2c/tpm/cr50.c
+++ b/src/drivers/i2c/tpm/cr50.c
@@ -42,12 +42,9 @@
#include "tpm.h"
-#define SLEEP_DURATION 60 /* in usec */
-#define SLEEP_DURATION_LONG 210 /* in usec */
-#define SLEEP_DURATION_SAFE 750 /* in usec */
-#define SLEEP_DURATION_PROBE_MS 1000 /* in msec */
-
#define CR50_MAX_BUFSIZE 63
+#define CR50_TIMEOUT_LONG_MS 2000 /* Long timeout while waiting for TPM */
+#define CR50_TIMEOUT_SHORT_MS 2 /* Short timeout during transactions */
#define CR50_DID_VID 0x00281ae0L
struct tpm_inf_dev {
@@ -85,7 +82,7 @@ static int iic_tpm_read(uint8_t addr, uint8_t *buffer, size_t len)
}
/* Wait for TPM to be ready with response data */
- udelay(SLEEP_DURATION_SAFE);
+ mdelay(CR50_TIMEOUT_SHORT_MS);
/* Read response data from the TPM */
if (i2c_read_raw(tpm_dev->bus, tpm_dev->addr, buffer, len)) {
@@ -129,7 +126,7 @@ static int iic_tpm_write(uint8_t addr, uint8_t *buffer, size_t len)
}
/* Wait for TPM to be ready */
- udelay(SLEEP_DURATION_SAFE);
+ mdelay(CR50_TIMEOUT_SHORT_MS);
return 0;
}
@@ -201,6 +198,7 @@ static void cr50_tis_i2c_ready(struct tpm_chip *chip)
{
uint8_t buf[4] = { TPM_STS_COMMAND_READY };
iic_tpm_write(TPM_STS(chip->vendor.locality), buf, sizeof(buf));
+ mdelay(CR50_TIMEOUT_SHORT_MS);
}
/* cr50 uses bytes 3:2 of status register for burst count and
@@ -211,13 +209,13 @@ static int cr50_wait_burst_status(struct tpm_chip *chip, uint8_t mask,
uint8_t buf[4];
struct stopwatch sw;
- stopwatch_init_msecs_expire(&sw, 2000);
+ stopwatch_init_msecs_expire(&sw, CR50_TIMEOUT_LONG_MS);
while (!stopwatch_expired(&sw)) {
if (iic_tpm_read(TPM_STS(chip->vendor.locality),
buf, sizeof(buf)) != 0) {
printk(BIOS_WARNING, "%s: Read failed\n", __func__);
- udelay(SLEEP_DURATION_SAFE);
+ mdelay(CR50_TIMEOUT_SHORT_MS);
continue;
}
@@ -229,7 +227,7 @@ static int cr50_wait_burst_status(struct tpm_chip *chip, uint8_t mask,
*burst > 0 && *burst <= CR50_MAX_BUFSIZE)
return 0;
- udelay(SLEEP_DURATION_SAFE);
+ mdelay(CR50_TIMEOUT_SHORT_MS);
}
printk(BIOS_ERR, "%s: Timeout reading burst and status\n", __func__);
@@ -310,7 +308,7 @@ static int cr50_tis_i2c_send(struct tpm_chip *chip, uint8_t *buf, size_t len)
uint8_t tpm_go[4] = { TPM_STS_GO };
struct stopwatch sw;
- stopwatch_init_msecs_expire(&sw, 2000);
+ stopwatch_init_msecs_expire(&sw, CR50_TIMEOUT_LONG_MS);
/* Wait until TPM is ready for a command */
while (!(cr50_tis_i2c_status(chip) & TPM_STS_COMMAND_READY)) {
@@ -321,7 +319,6 @@ static int cr50_tis_i2c_send(struct tpm_chip *chip, uint8_t *buf, size_t len)
}
cr50_tis_i2c_ready(chip);
- udelay(SLEEP_DURATION_SAFE);
}
while (len > 0) {
@@ -388,7 +385,7 @@ int tpm_vendor_probe(unsigned bus, uint32_t addr)
struct stopwatch sw;
uint8_t buf = 0;
int ret;
- long sw_run_duration = SLEEP_DURATION_PROBE_MS;
+ long sw_run_duration = CR50_TIMEOUT_LONG_MS;
tpm_dev->bus = bus;
tpm_dev->addr = addr;
@@ -401,7 +398,7 @@ int tpm_vendor_probe(unsigned bus, uint32_t addr)
sw_run_duration = stopwatch_duration_msecs(&sw);
break;
}
- udelay(SLEEP_DURATION_SAFE);
+ mdelay(CR50_TIMEOUT_SHORT_MS);
} while (!stopwatch_expired(&sw));
printk(BIOS_INFO,