aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Douthit <stephend@silicom-usa.com>2018-02-27 14:17:11 -0500
committerKevin O'Connor <kevin@koconnor.net>2018-03-02 10:59:36 -0500
commit5adc8bdea6a77bdb457d9cbca9a49a7d01cc25cd (patch)
tree845cf810edf1339d3bcfb80d654577bdd4b09945
parent96060ad1c38a3e90125aa4676b30828be126a4d5 (diff)
downloadseabios-5adc8bdea6a77bdb457d9cbca9a49a7d01cc25cd.tar.gz
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 <stephend@silicom-usa.com> Tested-by: Stefan Berger <stefanb@linux.vnet.ibm.com> Reviewed-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
-rw-r--r--src/hw/tpm_drivers.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/hw/tpm_drivers.c b/src/hw/tpm_drivers.c
index da8bb634..ed58bf58 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;
}