On Thu, Apr 16, 2020 at 08:22:10AM +0200, Paul Menzel wrote: > Dear Omar, > > > Am 16.04.20 um 02:23 schrieb Omar Sandoval: > > From: Omar Sandoval <osandov@xxxxxx> > > Thank you for the patch. > > > We've encountered a particular model of STMicroelectronics TPM that > > Please add models you are encountering this with to the commit message. > > > transiently returns a bad value in the status register. This causes the > > Have you contacted STMMicroelectronics? > > > kernel to believe that the TPM is ready to receive a command when it > > actually isn't, which in turn causes the send to time out in > > get_burstcount(). In testing, reading the status register one extra time > > convinces the TPM to return a valid value. > > > > Signed-off-by: Omar Sandoval <osandov@xxxxxx> > > --- > > drivers/char/tpm/tpm_tis_core.c | 19 +++++++++++++++++++ > > 1 file changed, 19 insertions(+) > > > > diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c > > index 27c6ca031e23..5a2f6acaf768 100644 > > --- a/drivers/char/tpm/tpm_tis_core.c > > +++ b/drivers/char/tpm/tpm_tis_core.c > > @@ -238,6 +238,25 @@ static u8 tpm_tis_status(struct tpm_chip *chip) > > rc = tpm_tis_read8(priv, TPM_STS(priv->locality), &status); > > if (rc < 0) > > return 0; > > + /* > > + * Some STMicroelectronics TPMs have a bug where the status register is > > + * sometimes bogus (all 1s) if read immediately after the access > > + * register is written to. Bits 0, 1, and 5 are always supposed to read > > + * as 0, so this is clearly invalid. Reading the register a second time > > + * returns a valid value. > > + */ > > + if (unlikely(status == 0xff)) { > > I’d like to see a debug message here, saying the TPM is buggy. Maybe the > model can be printed to, and that the TPM manufacturer should be contacted. How can I get the model information? (Sorry, I'm not very familiar with TPMs, I'm just the guy on the team that ended up tracking this down.) Thanks!