aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Berger <stefanb@linux.vnet.ibm.com>2018-03-19 12:00:27 -0400
committerKevin O'Connor <kevin@koconnor.net>2018-03-21 10:34:53 -0400
commit408630ef19499ed9ca5a7e90721271adf599c975 (patch)
treeb0fe7adfcb8ed8c4a4f2c34b8552c70d9b8829d5
parent5adc8bdea6a77bdb457d9cbca9a49a7d01cc25cd (diff)
downloadseabios-408630ef19499ed9ca5a7e90721271adf599c975.tar.gz
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 <stephend@silicom-usa.com> Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
-rw-r--r--src/hw/tpm_drivers.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/hw/tpm_drivers.c b/src/hw/tpm_drivers.c
index ed58bf58..7e6a96a4 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) {