[SeaBIOS] [PATCH v2 2/5] tpm: Set timeouts and durations to microsecond values

Kevin O'Connor kevin at koconnor.net
Sat Nov 21 18:27:37 CET 2015


On Sat, Nov 21, 2015 at 08:32:37AM -0500, Stefan Berger wrote:
> From: Stefan Berger <stefanb at 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 at 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;
>      }

The preferred way to do this is:

    u32 end = timer_calc_usec(time);
    for (;;) {
        ...
        if (timer_check(end)) {
            warn_timeout();
            return -1;
        }
        yield();
    }

[...]
> --- 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 */

Parenthesis need to be around any math in macros (eg, (750*1000) ).

Otherwise the series looks good to me.  Thanks!

-Kevin



More information about the SeaBIOS mailing list