tpm: turn on TPM on suspend for TPM 1.x
diff mbox series

Message ID 20190322105120.8441-1-jarkko.sakkinen@linux.intel.com
State New
Headers show
Series
  • tpm: turn on TPM on suspend for TPM 1.x
Related show

Commit Message

Jarkko Sakkinen March 22, 2019, 10:51 a.m. UTC
tpm_chip_start/stop() should be also called for TPM 1.x devices on
suspend. Add that functionality back. Do not lock the chip because
it is unnecessary as there are no multiple threads using it when
doing the suspend.

Fixes: a3fbfae82b4c ("tpm: take TPM chip power gating out of tpm_transmit()")
Reported-by: Paul Zimmerman <pauldzim@gmail.com>
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
---
 drivers/char/tpm/tpm-interface.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

Comments

Domenico Andreoli March 28, 2019, 5:19 p.m. UTC | #1
On Fri, Mar 22, 2019 at 12:51:20PM +0200, Jarkko Sakkinen wrote:
> tpm_chip_start/stop() should be also called for TPM 1.x devices on
> suspend. Add that functionality back. Do not lock the chip because
> it is unnecessary as there are no multiple threads using it when
> doing the suspend.
> 
> Fixes: a3fbfae82b4c ("tpm: take TPM chip power gating out of tpm_transmit()")
> Reported-by: Paul Zimmerman <pauldzim@gmail.com>
> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> ---
>  drivers/char/tpm/tpm-interface.c | 14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
> index 83ece5639f86..ae1030c9b086 100644
> --- a/drivers/char/tpm/tpm-interface.c
> +++ b/drivers/char/tpm/tpm-interface.c
> @@ -402,15 +402,13 @@ int tpm_pm_suspend(struct device *dev)
>  	if (chip->flags & TPM_CHIP_FLAG_ALWAYS_POWERED)
>  		return 0;
>  
> -	if (chip->flags & TPM_CHIP_FLAG_TPM2) {
> -		mutex_lock(&chip->tpm_mutex);
> -		if (!tpm_chip_start(chip)) {
> +	if (!tpm_chip_start(chip)) {
> +		if (chip->flags & TPM_CHIP_FLAG_TPM2)
>  			tpm2_shutdown(chip, TPM2_SU_STATE);
> -			tpm_chip_stop(chip);
> -		}
> -		mutex_unlock(&chip->tpm_mutex);
> -	} else {
> -		rc = tpm1_pm_suspend(chip, tpm_suspend_pcr);
> +		else
> +			rc = tpm1_pm_suspend(chip, tpm_suspend_pcr);
> +
> +		tpm_chip_stop(chip);
>  	}
>  
>  	return rc;

Tested-by: Domenico Andreoli <domenico.andreoli@linux.com>
Jarkko Sakkinen March 29, 2019, 9:41 a.m. UTC | #2
On Thu, Mar 28, 2019 at 06:19:26PM +0100, Domenico Andreoli wrote:
> On Fri, Mar 22, 2019 at 12:51:20PM +0200, Jarkko Sakkinen wrote:
> > tpm_chip_start/stop() should be also called for TPM 1.x devices on
> > suspend. Add that functionality back. Do not lock the chip because
> > it is unnecessary as there are no multiple threads using it when
> > doing the suspend.
> > 
> > Fixes: a3fbfae82b4c ("tpm: take TPM chip power gating out of tpm_transmit()")
> > Reported-by: Paul Zimmerman <pauldzim@gmail.com>
> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> > ---
> >  drivers/char/tpm/tpm-interface.c | 14 ++++++--------
> >  1 file changed, 6 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
> > index 83ece5639f86..ae1030c9b086 100644
> > --- a/drivers/char/tpm/tpm-interface.c
> > +++ b/drivers/char/tpm/tpm-interface.c
> > @@ -402,15 +402,13 @@ int tpm_pm_suspend(struct device *dev)
> >  	if (chip->flags & TPM_CHIP_FLAG_ALWAYS_POWERED)
> >  		return 0;
> >  
> > -	if (chip->flags & TPM_CHIP_FLAG_TPM2) {
> > -		mutex_lock(&chip->tpm_mutex);
> > -		if (!tpm_chip_start(chip)) {
> > +	if (!tpm_chip_start(chip)) {
> > +		if (chip->flags & TPM_CHIP_FLAG_TPM2)
> >  			tpm2_shutdown(chip, TPM2_SU_STATE);
> > -			tpm_chip_stop(chip);
> > -		}
> > -		mutex_unlock(&chip->tpm_mutex);
> > -	} else {
> > -		rc = tpm1_pm_suspend(chip, tpm_suspend_pcr);
> > +		else
> > +			rc = tpm1_pm_suspend(chip, tpm_suspend_pcr);
> > +
> > +		tpm_chip_stop(chip);
> >  	}
> >  
> >  	return rc;
> 
> Tested-by: Domenico Andreoli <domenico.andreoli@linux.com>

Thank you! I'll do a PR to James during the weekend.

/Jarkko

Patch
diff mbox series

diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
index 83ece5639f86..ae1030c9b086 100644
--- a/drivers/char/tpm/tpm-interface.c
+++ b/drivers/char/tpm/tpm-interface.c
@@ -402,15 +402,13 @@  int tpm_pm_suspend(struct device *dev)
 	if (chip->flags & TPM_CHIP_FLAG_ALWAYS_POWERED)
 		return 0;
 
-	if (chip->flags & TPM_CHIP_FLAG_TPM2) {
-		mutex_lock(&chip->tpm_mutex);
-		if (!tpm_chip_start(chip)) {
+	if (!tpm_chip_start(chip)) {
+		if (chip->flags & TPM_CHIP_FLAG_TPM2)
 			tpm2_shutdown(chip, TPM2_SU_STATE);
-			tpm_chip_stop(chip);
-		}
-		mutex_unlock(&chip->tpm_mutex);
-	} else {
-		rc = tpm1_pm_suspend(chip, tpm_suspend_pcr);
+		else
+			rc = tpm1_pm_suspend(chip, tpm_suspend_pcr);
+
+		tpm_chip_stop(chip);
 	}
 
 	return rc;