All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jarkko Sakkinen <jarkko@kernel.org>
To: Jim Broadus <jbroadus@gmail.com>
Cc: linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-doc@vger.kernel.org, peterhuewe@gmx.de, jgg@ziepe.ca
Subject: Re: [PATCH] tpm: tpm_tis: Add optional delay after relinquish
Date: Fri, 22 May 2026 02:48:08 +0300	[thread overview]
Message-ID: <ag-ZuEt4uXnrO8AK@kernel.org> (raw)
In-Reply-To: <20260519060926.103727-1-jbroadus@gmail.com>

On Mon, May 18, 2026 at 11:09:26PM -0700, Jim Broadus wrote:
> Some TPMs fail to grant locality when requested immediately after being
> relinquished. In this case, the TPM_ACCESS_REQUEST_USE bit of the
> TPM_ACCESS register is cleared immediately without setting
> TPM_ACCESS_ACTIVE_LOCALITY.
> 
> This issue can be seen at boot since tpm_chip_start, called right
> after locality is relinquished, fails. This causes the probe to fail:
> 
> tpm_tis MSFT0101:00: probe with driver tpm_tis failed with error -1
> 
> This occurs on some older Dell Latitudes and maybe others. To work
> around this, add a "settle" boolean param to tpm_tis. When this is
> enabled, a delay is added after locality is relinquished.
> 
> Signed-off-by: Jim Broadus <jbroadus@gmail.com>

It would be better idea first to replace priv->manufacturer_id with
priv->did_vid, and make necessary changes to sites where it is used.

Then in the if-statement compare DID/VID of the device to priv->did_vid
and apply quirk only if it matches.

> ---
>  Documentation/admin-guide/kernel-parameters.txt | 7 +++++++
>  drivers/char/tpm/tpm_tis.c                      | 7 +++++++
>  drivers/char/tpm/tpm_tis_core.c                 | 3 +++
>  drivers/char/tpm/tpm_tis_core.h                 | 1 +
>  4 files changed, 18 insertions(+)
> 
> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
> index 4d0f545fb3ec..5b7111033fbb 100644
> --- a/Documentation/admin-guide/kernel-parameters.txt
> +++ b/Documentation/admin-guide/kernel-parameters.txt
> @@ -7651,6 +7651,13 @@ Kernel parameters
>  			defined by Trusted Computing Group (TCG) see
>  			https://trustedcomputinggroup.org/resource/pc-client-platform-tpm-profile-ptp-specification/
>  
> +	tpm_tis.settle= [HW,TPM]
> +			Format: <bool>
> +			When enabled, this adds a delay after locality is
> +			relinquished. Some TPMs will fail to grant locality if
> +			requested immediately after being relinquished. This
> +			causes the probe to fail.
> +
>  	tp_printk	[FTRACE]
>  			Have the tracepoints sent to printk as well as the
>  			tracing ring buffer. This is useful for early boot up
> diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
> index 9aa230a63616..8ac0ea78570e 100644
> --- a/drivers/char/tpm/tpm_tis.c
> +++ b/drivers/char/tpm/tpm_tis.c
> @@ -101,6 +101,10 @@ module_param(force, bool, 0444);
>  MODULE_PARM_DESC(force, "Force device probe rather than using ACPI entry");
>  #endif
>  
> +static bool settle;
> +module_param(settle, bool, 0444);
> +MODULE_PARM_DESC(settle, "Add settle time after relinquish");
> +
>  #if defined(CONFIG_PNP) && defined(CONFIG_ACPI)
>  static int has_hid(struct acpi_device *dev, const char *hid)
>  {
> @@ -242,6 +246,9 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info)
>  	if (itpm || is_itpm(ACPI_COMPANION(dev)))
>  		set_bit(TPM_TIS_ITPM_WORKAROUND, &phy->priv.flags);
>  
> +	if (settle)
> +		set_bit(TPM_TIS_SETTLE_AFTER_RELINQUISH, &phy->priv.flags);
> +
>  	return tpm_tis_core_init(dev, &phy->priv, irq, &tpm_tcg,
>  				 ACPI_HANDLE(dev));
>  }
> diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
> index 21d79ad3b164..68be26fa5817 100644
> --- a/drivers/char/tpm/tpm_tis_core.c
> +++ b/drivers/char/tpm/tpm_tis_core.c
> @@ -184,6 +184,9 @@ static int tpm_tis_relinquish_locality(struct tpm_chip *chip, int l)
>  		__tpm_tis_relinquish_locality(priv, l);
>  	mutex_unlock(&priv->locality_count_mutex);
>  
> +	if (test_bit(TPM_TIS_SETTLE_AFTER_RELINQUISH, &priv->flags))
> +		tpm_msleep(TPM_TIMEOUT);
> +
>  	return 0;
>  }
>  
> diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h
> index 6c3aa480396b..413cac5e0f31 100644
> --- a/drivers/char/tpm/tpm_tis_core.h
> +++ b/drivers/char/tpm/tpm_tis_core.h
> @@ -90,6 +90,7 @@ enum tpm_tis_flags {
>  	TPM_TIS_DEFAULT_CANCELLATION	= 2,
>  	TPM_TIS_IRQ_TESTED		= 3,
>  	TPM_TIS_STATUS_VALID_RETRY	= 4,
> +	TPM_TIS_SETTLE_AFTER_RELINQUISH	= 5,
>  };
>  
>  struct tpm_tis_data {
> -- 
> 2.54.0
> 

BR, Jarkko

  parent reply	other threads:[~2026-05-21 23:48 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-19  6:09 [PATCH] tpm: tpm_tis: Add optional delay after relinquish Jim Broadus
2026-05-19 13:38 ` Jim Broadus
2026-05-21 23:48 ` Jarkko Sakkinen [this message]
2026-05-22  6:03   ` Jim Broadus
2026-05-22 12:37     ` Jarkko Sakkinen
2026-05-24  1:39       ` Jim Broadus
2026-05-24 23:10         ` 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=ag-ZuEt4uXnrO8AK@kernel.org \
    --to=jarkko@kernel.org \
    --cc=jbroadus@gmail.com \
    --cc=jgg@ziepe.ca \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@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.