]> git.baikalelectronics.ru Git - kernel.git/commitdiff
tpm_tis: Add a check for invalid status
authorJames Bottomley <James.Bottomley@HansenPartnership.com>
Mon, 28 Sep 2020 18:00:12 +0000 (11:00 -0700)
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Thu, 1 Oct 2020 21:21:03 +0000 (00:21 +0300)
Some TIS based TPMs can return 0xff to status reads if the locality
hasn't been properly requested.  Detect this condition by checking the
bits that the TIS spec specifies must return zero are clear and return
zero in that case.  Also drop a warning so the problem can be
identified in the calling path and fixed (usually a missing
try_get_ops()).

Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
drivers/char/tpm/tpm_tis_core.c
drivers/char/tpm/tpm_tis_core.h

index 65ab1b027949c7cb59db9a19df6b6d998cc5f2d8..92c51c6cfd1b781efde95cea0e9aacba3776924c 100644 (file)
@@ -239,6 +239,17 @@ static u8 tpm_tis_status(struct tpm_chip *chip)
        if (rc < 0)
                return 0;
 
+       if (unlikely((status & TPM_STS_READ_ZERO) != 0)) {
+               /*
+                * If this trips, the chances are the read is
+                * returning 0xff because the locality hasn't been
+                * acquired.  Usually because tpm_try_get_ops() hasn't
+                * been called before doing a TPM operation.
+                */
+               WARN_ONCE(1, "TPM returned invalid status\n");
+               return 0;
+       }
+
        return status;
 }
 
index 7337819f5d7b5d80e76ee528d69e8f7a2378c1a5..9b2d32a59f6704645d13bef82b5d265e020eee03 100644 (file)
@@ -34,6 +34,7 @@ enum tis_status {
        TPM_STS_GO = 0x20,
        TPM_STS_DATA_AVAIL = 0x10,
        TPM_STS_DATA_EXPECT = 0x08,
+       TPM_STS_READ_ZERO = 0x23, /* bits that must be zero on read */
 };
 
 enum tis_int_flags {