]> xenbits.xensource.com Git - seabios.git/commitdiff
tpm: Handle unimplemented TIS_REG_IFACE_ID in tis_get_tpm_version()
authorStephen Douthit <stephend@silicom-usa.com>
Tue, 27 Feb 2018 19:17:11 +0000 (14:17 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Fri, 2 Mar 2018 15:59:36 +0000 (10:59 -0500)
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>
src/hw/tpm_drivers.c

index da8bb634414d2235e18214b1c9adc8648873973a..ed58bf58849096f0e62a3b61fe9ead886c1b13f6 100644 (file)
@@ -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;
 }