Message ID | 20211102152056.241769-5-amirmizi6@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add tpm i2c ptp driver | expand |
On Tue, 2021-11-02 at 17:20 +0200, amirmizi6@gmail.com wrote: > From: Amir Mizinski <amirmizi6@gmail.com> > > An invalid TPM_STS value could be used when the following two events occur: > TPM does not update TPM_STS register after a locality request (TPM_STS > Initial value = 0xFF), and a TPM_STS register read occurs in the > tpm_tis_status(chip) function call. > > In probe_itpm(), a call to tpm_tis_send_data() function is made after a > request_locality() call, and the condition > ("if ((status & TPM_STS_COMMAND_READY) == 0)") is checked. At this moment > if the status value is 0xFF, then it is considered, wrongly, in “ready” > state (by checking only one bit). However, at this moment the TPM is, in > fact, in "Idle" state and remains in "Idle" state because > "tpm_tis_ready(chip);" was not executed. > Waiting for the condition TPM_STS.tpmGo == 0, will ensure that the TPM > status register has the correct value. > > Suggested-by: Benoit Houyere <benoit.houyere@st.com> > Signed-off-by: Amir Mizinski <amirmizi6@gmail.com> > --- > drivers/char/tpm/tpm_tis_core.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c > index 90d92a1..f06c6c6 100644 > --- a/drivers/char/tpm/tpm_tis_core.c > +++ b/drivers/char/tpm/tpm_tis_core.c > @@ -177,8 +177,14 @@ static int request_locality(struct tpm_chip *chip, int l) > } else { > /* wait for burstcount */ > do { > - if (check_locality(chip, l)) > + if (check_locality(chip, l)) { > + if (wait_for_tpm_stat(chip, TPM_STS_GO, 0, > + chip->timeout_c, > + &priv->int_queue, > + false) < 0) Does this compile with the change in 1/6? /Jarkko
diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c index 90d92a1..f06c6c6 100644 --- a/drivers/char/tpm/tpm_tis_core.c +++ b/drivers/char/tpm/tpm_tis_core.c @@ -177,8 +177,14 @@ static int request_locality(struct tpm_chip *chip, int l) } else { /* wait for burstcount */ do { - if (check_locality(chip, l)) + if (check_locality(chip, l)) { + if (wait_for_tpm_stat(chip, TPM_STS_GO, 0, + chip->timeout_c, + &priv->int_queue, + false) < 0) + return -ETIME; return l; + } tpm_msleep(TPM_TIMEOUT); } while (time_before(jiffies, stop)); }