Commit 55707d53 authored by James Bottomley's avatar James Bottomley Committed by Jarkko Sakkinen

tpm_tis: Add a check for invalid status

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: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent e08c6d3b
...@@ -239,6 +239,17 @@ static u8 tpm_tis_status(struct tpm_chip *chip) ...@@ -239,6 +239,17 @@ static u8 tpm_tis_status(struct tpm_chip *chip)
if (rc < 0) if (rc < 0)
return 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; return status;
} }
......
...@@ -34,6 +34,7 @@ enum tis_status { ...@@ -34,6 +34,7 @@ enum tis_status {
TPM_STS_GO = 0x20, TPM_STS_GO = 0x20,
TPM_STS_DATA_AVAIL = 0x10, TPM_STS_DATA_AVAIL = 0x10,
TPM_STS_DATA_EXPECT = 0x08, TPM_STS_DATA_EXPECT = 0x08,
TPM_STS_READ_ZERO = 0x23, /* bits that must be zero on read */
}; };
enum tis_int_flags { enum tis_int_flags {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment