From: Stephen Douthit Date: Tue, 27 Feb 2018 19:17:11 +0000 (-0500) Subject: tpm: Handle unimplemented TIS_REG_IFACE_ID in tis_get_tpm_version() X-Git-Tag: rel-1.12.0~28 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=5adc8bdea6a77bdb457d9cbca9a49a7d01cc25cd;p=seabios.git tpm: Handle unimplemented TIS_REG_IFACE_ID in tis_get_tpm_version() If a device reports 0xf in the InterfaceType field of the TPM_INTERFACE_ID, then the rest of the fields are invalid, and the InterfaceVersion field of the TPM_INTF_CAPABILITY register must be checked instead. Signed-off-by: Stephen Douthit Tested-by: Stefan Berger Reviewed-by: Stefan Berger --- diff --git a/src/hw/tpm_drivers.c b/src/hw/tpm_drivers.c index da8bb63..ed58bf5 100644 --- a/src/hw/tpm_drivers.c +++ b/src/hw/tpm_drivers.c @@ -142,13 +142,23 @@ static u32 tis_probe(void) static TPMVersion tis_get_tpm_version(void) { - /* TPM 2 has an interface register */ - u32 ifaceid = readl(TIS_REG(0, TIS_REG_IFACE_ID)); - - if ((ifaceid & 0xf) == 0) { - /* TPM 2 */ + u32 reg = readl(TIS_REG(0, TIS_REG_IFACE_ID)); + + /* + * FIFO interface as defined in TIS1.3 is active + * Interface capabilities are defined in TIS_REG_INTF_CAPABILITY + */ + if ((reg & 0xf) == 0xf) { + reg = readl(TIS_REG(0, TIS_REG_INTF_CAPABILITY)); + /* Interface 1.3 for TPM 2.0 */ + if (((reg >> 28) & 0x7) == 3) + return TPM_VERSION_2; + } + /* FIFO interface as defined in PTP for TPM 2.0 is active */ + else if ((reg & 0xf) == 0) { return TPM_VERSION_2; } + return TPM_VERSION_1_2; }