All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jarkko Sakkinen <jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
To: Tomas Winkler <tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 4/4] tmp/tpm_crb: implement runtime pm for tpm_crb
Date: Sat, 8 Oct 2016 15:47:08 +0300	[thread overview]
Message-ID: <20161008124708.GA10317@intel.com> (raw)
In-Reply-To: <1475927979-23484-5-git-send-email-tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

On Sat, Oct 08, 2016 at 02:59:39PM +0300, Tomas Winkler wrote:
> From: "Winkler, Tomas" <tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> 
> Utilize runtime_pm for driving tpm crb idle states.
> The framework calls cmd_ready from the pm_runtime_resume handler
> and go idle from the pm_runtime_suspend handler.
> The TPM framework should wake the device before transmit and receive.
> In case the runtime_pm framework is not compiled in or enabled, the device
> will be in the permanent ready state.
> 
> Signed-off-by: Tomas Winkler <tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

I would rather want the fix as a separate patch to make review + testing
easier (without and with). Thanks.

/Jarkko

> ---
> V2: new in the series
> V3: resend
> V4: fix unbalanced runtime pm put and get
> 
>  drivers/char/tpm/tpm-interface.c |  5 +++++
>  drivers/char/tpm/tpm_crb.c       | 42 ++++++++++++++++++++++++++++++++++++----
>  2 files changed, 43 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
> index 8de61876f633..7743e8a21b82 100644
> --- a/drivers/char/tpm/tpm-interface.c
> +++ b/drivers/char/tpm/tpm-interface.c
> @@ -29,6 +29,7 @@
>  #include <linux/mutex.h>
>  #include <linux/spinlock.h>
>  #include <linux/freezer.h>
> +#include <linux/pm_runtime.h>
>  
>  #include "tpm.h"
>  #include "tpm_eventlog.h"
> @@ -356,6 +357,8 @@ ssize_t tpm_transmit(struct tpm_chip *chip, const u8 *buf, size_t bufsiz,
>  	if (!(flags & TPM_TRANSMIT_UNLOCKED))
>  		mutex_lock(&chip->tpm_mutex);
>  
> +	pm_runtime_get_sync(chip->dev.parent);
> +
>  	rc = chip->ops->send(chip, (u8 *) buf, count);
>  	if (rc < 0) {
>  		dev_err(&chip->dev,
> @@ -397,6 +400,8 @@ out_recv:
>  		dev_err(&chip->dev,
>  			"tpm_transmit: tpm_recv: error %zd\n", rc);
>  out:
> +	pm_runtime_put_sync(chip->dev.parent);
> +
>  	if (!(flags & TPM_TRANSMIT_UNLOCKED))
>  		mutex_unlock(&chip->tpm_mutex);
>  	return rc;
> diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
> index def50b7d47b2..eccd82af6215 100644
> --- a/drivers/char/tpm/tpm_crb.c
> +++ b/drivers/char/tpm/tpm_crb.c
> @@ -19,6 +19,7 @@
>  #include <linux/highmem.h>
>  #include <linux/rculist.h>
>  #include <linux/module.h>
> +#include <linux/pm_runtime.h>
>  #include "tpm.h"
>  
>  #define ACPI_SIG_TPM2 "TPM2"
> @@ -153,8 +154,6 @@ static int __maybe_unused crb_cmd_ready(struct device *dev,
>  	return 0;
>  }
>  
> -static SIMPLE_DEV_PM_OPS(crb_pm, tpm_pm_suspend, tpm_pm_resume);
> -
>  static u8 crb_status(struct tpm_chip *chip)
>  {
>  	struct crb_priv *priv = dev_get_drvdata(&chip->dev);
> @@ -437,11 +436,21 @@ static int crb_acpi_add(struct acpi_device *device)
>  	if (rc)
>  		return rc;
>  
> +	pm_runtime_get_noresume(dev);
> +	pm_runtime_set_active(dev);
> +	pm_runtime_enable(dev);
> +
>  	rc = tpm_chip_register(chip);
> -	if (rc)
> +	if (rc) {
>  		crb_go_idle(dev, priv);
> +		pm_runtime_put_noidle(dev);
> +		pm_runtime_disable(dev);
> +		return rc;
> +	}
>  
> -	return rc;
> +	pm_runtime_put(dev);
> +
> +	return 0;
>  }
>  
>  static int crb_acpi_remove(struct acpi_device *device)
> @@ -451,9 +460,34 @@ static int crb_acpi_remove(struct acpi_device *device)
>  
>  	tpm_chip_unregister(chip);
>  
> +	pm_runtime_disable(dev);
> +
>  	return 0;
>  }
>  
> +#ifdef CONFIG_PM
> +static int crb_pm_runtime_suspend(struct device *dev)
> +{
> +	struct tpm_chip *chip = dev_get_drvdata(dev);
> +	struct crb_priv *priv = dev_get_drvdata(&chip->dev);
> +
> +	return crb_go_idle(dev, priv);
> +}
> +
> +static int crb_pm_runtime_resume(struct device *dev)
> +{
> +	struct tpm_chip *chip = dev_get_drvdata(dev);
> +	struct crb_priv *priv = dev_get_drvdata(&chip->dev);
> +
> +	return crb_cmd_ready(dev, priv);
> +}
> +#endif /* CONFIG_PM */
> +
> +static const struct dev_pm_ops crb_pm = {
> +	SET_SYSTEM_SLEEP_PM_OPS(tpm_pm_suspend, tpm_pm_resume)
> +	SET_RUNTIME_PM_OPS(crb_pm_runtime_suspend, crb_pm_runtime_resume, NULL)
> +};
> +
>  static struct acpi_device_id crb_device_ids[] = {
>  	{"MSFT0101", 0},
>  	{"", 0},
> -- 
> 2.7.4
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot

WARNING: multiple messages have this Message-ID (diff)
From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
To: Tomas Winkler <tomas.winkler@intel.com>
Cc: tpmdd-devel@lists.sourceforge.net,
	Jason Gunthorpe <jgunthorpe@obsidianresearch.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 4/4] tmp/tpm_crb: implement runtime pm for tpm_crb
Date: Sat, 8 Oct 2016 15:47:08 +0300	[thread overview]
Message-ID: <20161008124708.GA10317@intel.com> (raw)
In-Reply-To: <1475927979-23484-5-git-send-email-tomas.winkler@intel.com>

On Sat, Oct 08, 2016 at 02:59:39PM +0300, Tomas Winkler wrote:
> From: "Winkler, Tomas" <tomas.winkler@intel.com>
> 
> Utilize runtime_pm for driving tpm crb idle states.
> The framework calls cmd_ready from the pm_runtime_resume handler
> and go idle from the pm_runtime_suspend handler.
> The TPM framework should wake the device before transmit and receive.
> In case the runtime_pm framework is not compiled in or enabled, the device
> will be in the permanent ready state.
> 
> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>

I would rather want the fix as a separate patch to make review + testing
easier (without and with). Thanks.

/Jarkko

> ---
> V2: new in the series
> V3: resend
> V4: fix unbalanced runtime pm put and get
> 
>  drivers/char/tpm/tpm-interface.c |  5 +++++
>  drivers/char/tpm/tpm_crb.c       | 42 ++++++++++++++++++++++++++++++++++++----
>  2 files changed, 43 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
> index 8de61876f633..7743e8a21b82 100644
> --- a/drivers/char/tpm/tpm-interface.c
> +++ b/drivers/char/tpm/tpm-interface.c
> @@ -29,6 +29,7 @@
>  #include <linux/mutex.h>
>  #include <linux/spinlock.h>
>  #include <linux/freezer.h>
> +#include <linux/pm_runtime.h>
>  
>  #include "tpm.h"
>  #include "tpm_eventlog.h"
> @@ -356,6 +357,8 @@ ssize_t tpm_transmit(struct tpm_chip *chip, const u8 *buf, size_t bufsiz,
>  	if (!(flags & TPM_TRANSMIT_UNLOCKED))
>  		mutex_lock(&chip->tpm_mutex);
>  
> +	pm_runtime_get_sync(chip->dev.parent);
> +
>  	rc = chip->ops->send(chip, (u8 *) buf, count);
>  	if (rc < 0) {
>  		dev_err(&chip->dev,
> @@ -397,6 +400,8 @@ out_recv:
>  		dev_err(&chip->dev,
>  			"tpm_transmit: tpm_recv: error %zd\n", rc);
>  out:
> +	pm_runtime_put_sync(chip->dev.parent);
> +
>  	if (!(flags & TPM_TRANSMIT_UNLOCKED))
>  		mutex_unlock(&chip->tpm_mutex);
>  	return rc;
> diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
> index def50b7d47b2..eccd82af6215 100644
> --- a/drivers/char/tpm/tpm_crb.c
> +++ b/drivers/char/tpm/tpm_crb.c
> @@ -19,6 +19,7 @@
>  #include <linux/highmem.h>
>  #include <linux/rculist.h>
>  #include <linux/module.h>
> +#include <linux/pm_runtime.h>
>  #include "tpm.h"
>  
>  #define ACPI_SIG_TPM2 "TPM2"
> @@ -153,8 +154,6 @@ static int __maybe_unused crb_cmd_ready(struct device *dev,
>  	return 0;
>  }
>  
> -static SIMPLE_DEV_PM_OPS(crb_pm, tpm_pm_suspend, tpm_pm_resume);
> -
>  static u8 crb_status(struct tpm_chip *chip)
>  {
>  	struct crb_priv *priv = dev_get_drvdata(&chip->dev);
> @@ -437,11 +436,21 @@ static int crb_acpi_add(struct acpi_device *device)
>  	if (rc)
>  		return rc;
>  
> +	pm_runtime_get_noresume(dev);
> +	pm_runtime_set_active(dev);
> +	pm_runtime_enable(dev);
> +
>  	rc = tpm_chip_register(chip);
> -	if (rc)
> +	if (rc) {
>  		crb_go_idle(dev, priv);
> +		pm_runtime_put_noidle(dev);
> +		pm_runtime_disable(dev);
> +		return rc;
> +	}
>  
> -	return rc;
> +	pm_runtime_put(dev);
> +
> +	return 0;
>  }
>  
>  static int crb_acpi_remove(struct acpi_device *device)
> @@ -451,9 +460,34 @@ static int crb_acpi_remove(struct acpi_device *device)
>  
>  	tpm_chip_unregister(chip);
>  
> +	pm_runtime_disable(dev);
> +
>  	return 0;
>  }
>  
> +#ifdef CONFIG_PM
> +static int crb_pm_runtime_suspend(struct device *dev)
> +{
> +	struct tpm_chip *chip = dev_get_drvdata(dev);
> +	struct crb_priv *priv = dev_get_drvdata(&chip->dev);
> +
> +	return crb_go_idle(dev, priv);
> +}
> +
> +static int crb_pm_runtime_resume(struct device *dev)
> +{
> +	struct tpm_chip *chip = dev_get_drvdata(dev);
> +	struct crb_priv *priv = dev_get_drvdata(&chip->dev);
> +
> +	return crb_cmd_ready(dev, priv);
> +}
> +#endif /* CONFIG_PM */
> +
> +static const struct dev_pm_ops crb_pm = {
> +	SET_SYSTEM_SLEEP_PM_OPS(tpm_pm_suspend, tpm_pm_resume)
> +	SET_RUNTIME_PM_OPS(crb_pm_runtime_suspend, crb_pm_runtime_resume, NULL)
> +};
> +
>  static struct acpi_device_id crb_device_ids[] = {
>  	{"MSFT0101", 0},
>  	{"", 0},
> -- 
> 2.7.4
> 

  parent reply	other threads:[~2016-10-08 12:47 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-08 11:59 [PATCH v4 0/4] tpm/tpm_crb: implement power management Tomas Winkler
     [not found] ` <1475927979-23484-1-git-send-email-tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 11:59   ` [PATCH v4 1/4] tpm/tpm_crb: implement tpm crb idle state Tomas Winkler
2016-10-08 11:59     ` Tomas Winkler
     [not found]     ` <1475927979-23484-2-git-send-email-tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 16:30       ` Jarkko Sakkinen
2016-10-08 16:30         ` Jarkko Sakkinen
2016-10-08 11:59   ` [PATCH 2/4] tmp/tpm_crb: fix Intel PTT hw bug during " Tomas Winkler
2016-10-08 11:59     ` Tomas Winkler
     [not found]     ` <1475927979-23484-3-git-send-email-tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 12:50       ` Jarkko Sakkinen
2016-10-08 12:50         ` Jarkko Sakkinen
     [not found]         ` <20161008125003.GB10317-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 14:27           ` Winkler, Tomas
2016-10-08 14:27             ` Winkler, Tomas
     [not found]             ` <5B8DA87D05A7694D9FA63FD143655C1B542F6768-Jy8z56yoSI8MvF1YICWikbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2016-10-08 16:00               ` Jarkko Sakkinen
2016-10-08 16:00                 ` Jarkko Sakkinen
     [not found]                 ` <20161008160006.GA25893-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 16:42                   ` Jason Gunthorpe
2016-10-08 16:42                     ` Jason Gunthorpe
     [not found]                     ` <20161008164203.GB29734-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2016-10-08 16:58                       ` Winkler, Tomas
2016-10-08 16:58                         ` Winkler, Tomas
2016-10-08 17:08                       ` Jarkko Sakkinen
2016-10-08 17:08                         ` Jarkko Sakkinen
2016-10-08 16:56                 ` Winkler, Tomas
     [not found]                   ` <5B8DA87D05A7694D9FA63FD143655C1B542F67C8-Jy8z56yoSI8MvF1YICWikbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2016-10-08 17:06                     ` Jarkko Sakkinen
2016-10-08 17:06                       ` Jarkko Sakkinen
     [not found]                       ` <20161008170651.GA8747-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 17:27                         ` Winkler, Tomas
2016-10-08 17:27                           ` Winkler, Tomas
2016-10-08 18:53                           ` [tpmdd-devel] " Winkler, Tomas
2016-10-08 11:59   ` [PATCH 3/4] tpm/tpm_crb: open code the crb_init into acpi_add Tomas Winkler
2016-10-08 11:59     ` Tomas Winkler
2016-10-08 11:59   ` [PATCH 4/4] tmp/tpm_crb: implement runtime pm for tpm_crb Tomas Winkler
2016-10-08 11:59     ` Tomas Winkler
     [not found]     ` <1475927979-23484-5-git-send-email-tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 12:47       ` Jarkko Sakkinen [this message]
2016-10-08 12:47         ` Jarkko Sakkinen
     [not found]         ` <20161008124708.GA10317-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 13:37           ` Winkler, Tomas
2016-10-08 13:37             ` Winkler, Tomas
2016-10-08 16:01             ` Jarkko Sakkinen
     [not found]               ` <20161008160112.GB25893-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2016-10-08 18:18                 ` Winkler, Tomas
2016-10-08 18:18                   ` Winkler, Tomas
     [not found]                   ` <5B8DA87D05A7694D9FA63FD143655C1B542F684D-Jy8z56yoSI8MvF1YICWikbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2016-10-08 18:43                     ` Jarkko Sakkinen
2016-10-08 18:43                       ` 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=20161008124708.GA10317@intel.com \
    --to=jarkko.sakkinen-vuqaysv1563yd54fqh9/ca@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /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.