From: Stefan Berger stefanb@linux.vnet.ibm.com
Fix the timeouts and durations -- they are provided in microseconds. Adapt the TPM driver for it.
Get TPM specific timeout and duration values earlier from the device.
Signed-off-by: Stefan Berger stefanb@linux.vnet.ibm.com --- src/hw/tpm_drivers.c | 11 ++++++----- src/hw/tpm_drivers.h | 23 ++++++++++++++--------- src/tcgbios.c | 8 ++++---- 3 files changed, 24 insertions(+), 18 deletions(-)
diff --git a/src/hw/tpm_drivers.c b/src/hw/tpm_drivers.c index 0bf5997..fcf176e 100644 --- a/src/hw/tpm_drivers.c +++ b/src/hw/tpm_drivers.c @@ -93,15 +93,16 @@ static u32 tis_wait_sts(u8 locty, u32 time, u8 mask, u8 expect) return 0;
u32 rc = 1; + u32 ctr = 0;
- while (time > 0) { + while (time > ctr) { u8 sts = readb(TIS_REG(locty, TIS_REG_STS)); if ((sts & mask) == expect) { rc = 0; break; } - msleep(1); - time--; + usleep(1000); + ctr += 1000; } return rc; } @@ -188,8 +189,8 @@ static u32 tis_senddata(const u8 *const data, u32 len) while (burst == 0 && ctr < timeout_d) { burst = readl(TIS_REG(locty, TIS_REG_STS)) >> 8; if (burst == 0) { - msleep(1); - ctr++; + usleep(1000); + ctr += 1000; } }
diff --git a/src/hw/tpm_drivers.h b/src/hw/tpm_drivers.h index 6357d02..a8dfebf 100644 --- a/src/hw/tpm_drivers.h +++ b/src/hw/tpm_drivers.h @@ -66,12 +66,13 @@ extern struct tpm_driver tpm_drivers[]; #define TIS_ACCESS_REQUEST_USE (1 << 1) /* 0x02 */ #define TIS_ACCESS_TPM_ESTABLISHMENT (1 << 0) /* 0x01 */
-#define SCALER 10 - -#define TIS_DEFAULT_TIMEOUT_A (750 * SCALER) -#define TIS_DEFAULT_TIMEOUT_B (2000 * SCALER) -#define TIS_DEFAULT_TIMEOUT_C (750 * SCALER) -#define TIS_DEFAULT_TIMEOUT_D (750 * SCALER) +/* + * Default TIS timeouts used before getting them from the TPM itself + */ +#define TIS_DEFAULT_TIMEOUT_A 750 * 1000 /* ms */ +#define TIS_DEFAULT_TIMEOUT_B 2000 * 1000 /* us */ +#define TIS_DEFAULT_TIMEOUT_C 750 * 1000 /* us */ +#define TIS_DEFAULT_TIMEOUT_D 750 * 1000 /* us */
enum tisTimeoutType { TIS_TIMEOUT_TYPE_A = 0, @@ -80,8 +81,12 @@ enum tisTimeoutType { TIS_TIMEOUT_TYPE_D, };
-#define TPM_DEFAULT_DURATION_SHORT (2000 * SCALER) -#define TPM_DEFAULT_DURATION_MEDIUM (20000 * SCALER) -#define TPM_DEFAULT_DURATION_LONG (60000 * SCALER) +/* + * Default command durations used before getting them from the + * TPM itself + */ +#define TPM_DEFAULT_DURATION_SHORT 2000 * 1000 /* us */ +#define TPM_DEFAULT_DURATION_MEDIUM 20000 * 1000 /* us */ +#define TPM_DEFAULT_DURATION_LONG 60000 * 1000 /* us */
#endif /* TPM_DRIVERS_H */ diff --git a/src/tcgbios.c b/src/tcgbios.c index decf0fd..38bc737 100644 --- a/src/tcgbios.c +++ b/src/tcgbios.c @@ -459,6 +459,10 @@ tpm_startup(void) if (rc || returnCode) goto err_exit;
+ rc = determine_timeouts(); + if (rc) + goto err_exit; + rc = build_and_send_cmd(0, TPM_ORD_SelfTestFull, NULL, 0, NULL, 0, &returnCode, TPM_DURATION_TYPE_LONG);
@@ -477,10 +481,6 @@ tpm_startup(void) if (rc || (returnCode != 0 && returnCode != TPM_BAD_LOCALITY)) goto err_exit;
- rc = determine_timeouts(); - if (rc) - goto err_exit; - rc = tpm_smbios_measure(); if (rc) goto err_exit;