From: Stefan Berger Date: Mon, 19 Mar 2018 16:00:27 +0000 (-0400) Subject: tpm: Wait for tpmRegValidSts flag on CRB interface before probing X-Git-Tag: rel-1.12.0~27 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=408630ef19499ed9ca5a7e90721271adf599c975;p=people%2Fandrewcoop%2Fseabios.git tpm: Wait for tpmRegValidSts flag on CRB interface before probing Wait for the tpmRegValidSts flag on the TPM_LOC_STATE_x register to be set; we expect the locAssigned flag to not be set. Real hardware seems to set the tpmRegValidSts flag without for example requesting access to a locality. Tested-by: Stephen Douthit Signed-off-by: Stefan Berger --- diff --git a/src/hw/tpm_drivers.c b/src/hw/tpm_drivers.c index ed58bf5..7e6a96a 100644 --- a/src/hw/tpm_drivers.c +++ b/src/hw/tpm_drivers.c @@ -374,12 +374,22 @@ static u32 tis_waitrespready(enum tpmDurationType to_t) return rc; } +#define CRB_STATE_VALID_STS 0b10000000 +#define CRB_STATE_LOC_ASSIGNED 0x00000010 +#define CRB_STATE_READY_MASK (CRB_STATE_VALID_STS | CRB_STATE_LOC_ASSIGNED) + /* if device is not there, return '0', '1' otherwise */ static u32 crb_probe(void) { if (!CONFIG_TCGBIOS) return 0; + /* Wait for the interface to report it's ready */ + u32 rc = crb_wait_reg(0, CRB_REG_LOC_STATE, TIS2_DEFAULT_TIMEOUT_D, + CRB_STATE_READY_MASK, CRB_STATE_VALID_STS); + if (rc) + return 0; + u32 ifaceid = readl(CRB_REG(0, CRB_REG_INTF_ID)); if ((ifaceid & 0xf) != 0xf) {