From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Cc: Omar Sandoval <osandov@osandov.com>,
Peter Huewe <peterhuewe@gmx.de>, Jason Gunthorpe <jgg@ziepe.ca>,
linux-integrity@vger.kernel.org
Subject: Re: [PATCH] tpm_tis: work around status register bug in STMicroelectronics TPM
Date: Thu, 16 Apr 2020 10:56:18 -0700 [thread overview]
Message-ID: <1587059778.15329.1.camel@HansenPartnership.com> (raw)
In-Reply-To: <20200416170944.GE199110@linux.intel.com>
On Thu, 2020-04-16 at 20:09 +0300, Jarkko Sakkinen wrote:
> On Wed, Apr 15, 2020 at 04:51:39PM -0700, James Bottomley wrote:
> > On Wed, 2020-04-15 at 15:45 -0700, Omar Sandoval wrote:
> > > From: Omar Sandoval <osandov@fb.com>
> > >
> > > We've encountered a particular model of STMicroelectronics TPM
> > > that
> > > transiently returns a bad value in the status register. This
> > > causes
> > > the 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.
> >
> > Interesting, I've got a very early upgradeable nuvoton that seems
> > to be
> > behaving like this.
> >
> > > Signed-off-by: Omar Sandoval <osandov@fb.com>
> > > ---
> > > drivers/char/tpm/tpm_tis_core.c | 12 ++++++++++++
> > > 1 file changed, 12 insertions(+)
> > >
> > > diff --git a/drivers/char/tpm/tpm_tis_core.c
> > > b/drivers/char/tpm/tpm_tis_core.c
> > > index 27c6ca031e23..277a21027fc7 100644
> > > --- a/drivers/char/tpm/tpm_tis_core.c
> > > +++ b/drivers/char/tpm/tpm_tis_core.c
> > > @@ -238,6 +238,18 @@ 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)) {
> > > + rc = tpm_tis_read8(priv, TPM_STS(priv-
> > > >locality),
> > > &status);
> > > + if (rc < 0)
> > > + return 0;
> > > + }
> >
> > You theorize that your case is fixed by the second read, but what
> > if it
> > isn't and the second read also returns 0xff? Shouldn't we have a
> > line
> > here saying
> >
> > if (unlikely(status == 0xff))
> > status = 0;
> >
> > So if we get a second 0xff we just pretend the thing isn't ready?
>
> If it eventually settles, would it be better to poll it for a while?
Omar said they'd never seen the double read fail, so I don't think
polling would be helpful in this case. If we do get a double read of
0xff I think returning 0 is correct which basically means the TPM isn't
ready and the caller needs to wait a bit. If you look, most of the
callers of tpm_tis_status will do their own wait and retry in this
case, so effectively we're getting the caller to poll for us.
James
> Also, the commit message is ambiguous. "bad value" can be any random
> bit sequence.
>
> /Jarkko
>
next prev parent reply other threads:[~2020-04-16 17:56 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-15 22:45 [PATCH] tpm_tis: work around status register bug in STMicroelectronics TPM Omar Sandoval
2020-04-15 23:51 ` James Bottomley
2020-04-16 0:16 ` Omar Sandoval
2020-04-16 0:24 ` Omar Sandoval
2020-04-16 18:02 ` James Bottomley
2020-04-17 23:55 ` Jarkko Sakkinen
2020-04-18 0:12 ` James Bottomley
2020-04-20 20:46 ` Jarkko Sakkinen
2020-04-20 22:28 ` James Bottomley
2020-04-21 14:36 ` Mimi Zohar
2020-04-21 20:25 ` Jarkko Sakkinen
2020-04-21 20:31 ` Mimi Zohar
2020-04-21 20:23 ` Jarkko Sakkinen
2020-04-21 22:08 ` James Bottomley
2020-04-16 17:09 ` Jarkko Sakkinen
2020-04-16 17:56 ` James Bottomley [this message]
2020-08-27 15:24 ` Jason Andryuk
2020-08-28 23:18 ` Jarkko Sakkinen
2020-08-29 0:12 ` Jason Andryuk
2020-08-31 13:55 ` Jarkko Sakkinen
2020-09-04 12:03 ` Jarkko Sakkinen
2020-04-16 17:08 ` Jarkko Sakkinen
2020-04-16 18:54 ` Omar Sandoval
2020-04-17 23:54 ` Jarkko Sakkinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1587059778.15329.1.camel@HansenPartnership.com \
--to=james.bottomley@hansenpartnership.com \
--cc=jarkko.sakkinen@linux.intel.com \
--cc=jgg@ziepe.ca \
--cc=linux-integrity@vger.kernel.org \
--cc=osandov@osandov.com \
--cc=peterhuewe@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.