All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerry Snitselaar <jsnitsel@redhat.com>
To: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: linux-integrity@vger.kernel.org, Jason Gunthorpe <jgg@ziepe.ca>,
	"Jarkko Sakkinen" <jarkko.sakkinen@linux.intel.com>,
	Peter Huewe <peterhuewe@gmx.de>
Subject: Re: [PATCH v2 3/5] tpm_tis: Fix interrupts for TIS TPMs without legacy cycles
Date: Tue, 01 Dec 2020 14:47:12 -0700	[thread overview]
Message-ID: <87zh2xkxlr.fsf@redhat.com> (raw)
In-Reply-To: <2bf904f16673c4443bfc95f19d7fb49b97b9b159.camel@HansenPartnership.com>


James Bottomley @ 2020-12-01 14:06 MST:

> On Tue, 2020-12-01 at 12:49 -0700, Jerry Snitselaar wrote:
>> Jerry Snitselaar @ 2020-12-01 11:12 MST:
>> 
>> > James Bottomley @ 2020-10-01 11:09 MST:
>> > 
>> > > If a TIS TPM doesn't have legacy cycles, any write to the
>> > > interrupt
>> > > registers is ignored unless a locality is active.  This means
>> > > even to
>> > > set up the interrupt vectors a locality must first be
>> > > activated.  Fix
>> > > this by activating the 0 locality in the interrupt probe setup.
>> > > 
>> > > Since the TPM_EOI signalling also requires an active locality,
>> > > the
>> > > interrupt routine cannot end an interrupt if the locality is
>> > > released.
>> > > This can lead to a situation where the TPM goes command ready
>> > > after
>> > > locality release and since the interrupt cannot be ended it
>> > > refires
>> > > continuously.  Fix this by disabling all interrupts except
>> > > locality
>> > > change when a locality is released (this only fires when a
>> > > locality
>> > > becomes active, meaning the TPM_EOI should work).
>> > > 
>> > > Finally, since we now disable all status based interrupts in the
>> > > locality release, they must be re-enabled before waiting to check
>> > > the
>> > > condition, so add interrupt enabling to the status wait.
>> > > 
>> > > Signed-off-by: James Bottomley <
>> > > James.Bottomley@HansenPartnership.com>
>> > > 
>> > > ---
>> > > 
>> > > v2: renamed functions
>> > > ---
>> > >  drivers/char/tpm/tpm_tis_core.c | 125
>> > > ++++++++++++++++++++++++++------
>> > >  1 file changed, 101 insertions(+), 24 deletions(-)
>> > > 
>> > > diff --git a/drivers/char/tpm/tpm_tis_core.c
>> > > b/drivers/char/tpm/tpm_tis_core.c
>> > > index 431919d5f48a..0c07da8cd680 100644
>> > > --- a/drivers/char/tpm/tpm_tis_core.c
>> > > +++ b/drivers/char/tpm/tpm_tis_core.c
>> > > @@ -29,6 +29,46 @@
>> > >  
>> > >  static void tpm_tis_clkrun_enable(struct tpm_chip *chip, bool
>> > > value);
>> > >  
>> > > +static void tpm_tis_enable_interrupt(struct tpm_chip *chip, u8
>> > > mask)
>> > > +{
>> > > +	struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
>> > > +	u32 intmask;
>> > > +
>> > > +	/* Take control of the TPM's interrupt hardware and shut it off
>> > > */
>> > > +	tpm_tis_read32(priv, TPM_INT_ENABLE(priv->locality), &intmask);
>> > > +
>> > > +	intmask |= mask | TPM_GLOBAL_INT_ENABLE;
>> > > +
>> > > +	tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask);
>> > > +}
>> > > +
>> > > +static void tpm_tis_disable_interrupt(struct tpm_chip *chip, u8
>> > > mask)
>> > > +{
>> > > +	struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
>> > > +	u32 intmask;
>> > > +
>> > > +	/* Take control of the TPM's interrupt hardware and shut it off
>> > > */
>> > > +	tpm_tis_read32(priv, TPM_INT_ENABLE(priv->locality), &intmask);
>> > > +
>> > > +	intmask &= ~mask;
>> > > +
>> > > +	tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask);
>> > > +}
>> > > +
>> > > +static void tpm_tis_enable_stat_interrupts(struct tpm_chip
>> > > *chip, u8 stat)
>> > > +{
>> > > +	u32 mask = 0;
>> > > +
>> > > +	if (stat & TPM_STS_COMMAND_READY)
>> > > +		mask |= TPM_INTF_CMD_READY_INT;
>> > > +	if (stat & TPM_STS_VALID)
>> > > +		mask |= TPM_INTF_STS_VALID_INT;
>> > > +	if (stat & TPM_STS_DATA_AVAIL)
>> > > +		mask |= TPM_INTF_DATA_AVAIL_INT;
>> > > +
>> > > +	tpm_tis_enable_interrupt(chip, mask);
>> > > +}
>> > > +
>> > >  static bool wait_for_tpm_stat_cond(struct tpm_chip *chip, u8
>> > > mask,
>> > >  					bool check_cancel, bool
>> > > *canceled)
>> > >  {
>> > > @@ -65,11 +105,14 @@ static int wait_for_tpm_stat(struct tpm_chip
>> > > *chip, u8 mask,
>> > >  		timeout = stop - jiffies;
>> > >  		if ((long)timeout <= 0)
>> > >  			return -ETIME;
>> > > +		tpm_tis_enable_stat_interrupts(chip, mask);
>> > >  		rc = wait_event_interruptible_timeout(*queue,
>> > >  			wait_for_tpm_stat_cond(chip, mask,
>> > > check_cancel,
>> > >  					       &canceled),
>> > >  			timeout);
>> > >  		if (rc > 0) {
>> > > +			if (rc == 1)
>> > > +				dev_err(&chip->dev, "Lost Interrupt
>> > > waiting for TPM stat\n");
>> > 
>> > With my proposed patch to check for the interrupt storm condition I
>> > sometimes see this message. Do you think it would make sense to
>> > have a check here and in the request_locality location to see that
>> > TPM_CHIP_FLAG is still enabled? It will print a message about the
>> > interrupt storm being detected, and switching to polling, so I
>> > don't know if this will cause confusion for people to have this
>> > show up as well in that case.
>> > 
>> 
>> I guess it wouldn't be too confusing since the messages will appear
>> close together.
>
> But since we have a discriminator I'll try to use it and see if we can
> tidy up the messages.  I think the condition just becomes
>
> if (rc == 1 && (chip->flags & TPM_CHIP_FLAG_IRQ))
>
> because you'll have reset that if you found a storm?
>
> James


Yes, the worker calls disable_interrupts() and that clears the flag.

Jerry


  reply	other threads:[~2020-12-01 21:48 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-01 18:09 [PATCH v2 0/5] tpm_tis: fix interrupts (again) James Bottomley
2020-10-01 18:09 ` [PATCH v2 1/5] tpm_tis: Fix check_locality for correct locality acquisition James Bottomley
2020-10-05 15:34   ` Jarkko Sakkinen
2020-10-05 19:00     ` James Bottomley
2020-10-05 20:32       ` Jarkko Sakkinen
2020-10-19 23:16   ` Jerry Snitselaar
2020-10-24 12:07     ` Jarkko Sakkinen
2020-10-30 12:13       ` Jarkko Sakkinen
2020-10-01 18:09 ` [PATCH v2 2/5] tpm_tis: Clean up locality release James Bottomley
2020-10-05 17:02   ` Jarkko Sakkinen
2020-10-05 19:05     ` James Bottomley
2020-10-05 20:34       ` Jarkko Sakkinen
2020-10-05 17:03   ` Jarkko Sakkinen
2020-10-19 23:17   ` Jerry Snitselaar
2020-10-24 12:10     ` Jarkko Sakkinen
2020-10-30 12:17       ` Jarkko Sakkinen
2020-10-30 15:47         ` James Bottomley
2020-10-30 21:52           ` Jarkko Sakkinen
2020-10-01 18:09 ` [PATCH v2 3/5] tpm_tis: Fix interrupts for TIS TPMs without legacy cycles James Bottomley
2020-10-05 17:05   ` Jarkko Sakkinen
2020-10-20  0:14   ` Jerry Snitselaar
2020-10-24 12:15     ` Jarkko Sakkinen
2020-10-30 12:18       ` Jarkko Sakkinen
2020-10-30 16:06         ` Jerry Snitselaar
2020-11-03  4:16           ` Jarkko Sakkinen
2020-12-01 18:12   ` Jerry Snitselaar
2020-12-01 19:49     ` Jerry Snitselaar
2020-12-01 21:06       ` James Bottomley
2020-12-01 21:47         ` Jerry Snitselaar [this message]
2020-10-01 18:09 ` [PATCH v2 4/5] tpm_tis: fix IRQ probing James Bottomley
2020-10-05 17:05   ` Jarkko Sakkinen
2020-10-19 23:41   ` Jerry Snitselaar
2020-10-24 12:17     ` Jarkko Sakkinen
2020-10-30 12:43       ` Jarkko Sakkinen
2020-10-30 15:49         ` James Bottomley
2020-10-30 16:11           ` Jerry Snitselaar
2020-11-03  4:43             ` Jarkko Sakkinen
2020-11-03 23:00               ` Jerry Snitselaar
2020-11-04  0:31                 ` Jarkko Sakkinen
2020-11-03  4:17           ` Jarkko Sakkinen
2020-11-06 15:32         ` Jarkko Sakkinen
2020-11-06 16:21           ` James Bottomley
2020-11-06 22:07             ` Jarkko Sakkinen
2020-10-01 18:09 ` [PATCH v2 5/5] Revert "tpm: Revert "tpm_tis_core: Turn on the TPM before probing IRQ's"" James Bottomley
2020-10-19 20:23   ` Jerry Snitselaar
2020-10-19 22:54     ` James Bottomley
2020-10-19 23:40   ` Jerry Snitselaar
2020-10-12  5:39 ` [PATCH v2 0/5] tpm_tis: fix interrupts (again) Jerry Snitselaar
2020-10-13  1:23   ` Jarkko Sakkinen
2020-10-18  5:34     ` Jarkko Sakkinen
2020-10-13  1:17 ` Jarkko Sakkinen
2020-10-13 15:15   ` Jerry Snitselaar
2020-10-13 15:24     ` James Bottomley
2020-10-13 16:05       ` Jerry Snitselaar
2020-10-14 15:03         ` Hans de Goede
2020-10-14 15:23           ` James Bottomley
2020-10-14 16:04             ` Hans de Goede
2020-10-14 16:34               ` Jerry Snitselaar
2020-10-14 16:46                 ` Hans de Goede
2020-10-14 17:01                   ` Jerry Snitselaar
2020-10-14 17:04                     ` Jerry Snitselaar
2020-10-14 20:58                   ` Jerry Snitselaar
2020-10-15  7:38                     ` Hans de Goede
2020-10-18 21:09                       ` Jarkko Sakkinen
2020-10-15 15:36                     ` James Bottomley
2020-10-15 18:48                       ` Jerry Snitselaar
2020-10-15 18:57                         ` James Bottomley
2020-10-15 19:16                           ` Jerry Snitselaar
2020-10-14 16:49                 ` James Bottomley
2020-10-18 21:05     ` Jarkko Sakkinen
2020-10-20 23:10       ` Jerry Snitselaar
2020-10-24 12:20         ` Jarkko Sakkinen
2020-10-26 18:29           ` Jerry Snitselaar
2020-10-27 17:14             ` 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=87zh2xkxlr.fsf@redhat.com \
    --to=jsnitsel@redhat.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=jarkko.sakkinen@linux.intel.com \
    --cc=jgg@ziepe.ca \
    --cc=linux-integrity@vger.kernel.org \
    --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.