From: Tomas Winkler <tomas.winkler@intel.com> To: tpmdd-devel@lists.sourceforge.net, Jason Gunthorpe <jgunthorpe@obsidianresearch.com>, Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Cc: linux-kernel@vger.kernel.org, Tomas Winkler <tomas.winkler@intel.com> Subject: [PATCH v4 4/4] tmp/tpm_crb: implement runtime pm for tpm_crb Date: Mon, 12 Sep 2016 16:04:21 +0300 [thread overview] Message-ID: <1473685461-6540-5-git-send-email-tomas.winkler@intel.com> (raw) In-Reply-To: <1473685461-6540-1-git-send-email-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 enabled, the device will be in ready state. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> --- V2: new in the series V3: resend drivers/char/tpm/tpm-interface.c | 5 +++++ drivers/char/tpm/tpm_crb.c | 37 ++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c index fd863ff30f79..9ccad3a9875f 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" @@ -353,6 +354,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, @@ -394,6 +397,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 b0c0e2c9022b..94700f71d65e 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" @@ -152,8 +153,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); @@ -436,9 +435,16 @@ static int crb_acpi_add(struct acpi_device *device) if (rc) return rc; + 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_disable(dev); + } + + pm_runtime_put(dev); return rc; } @@ -450,9 +456,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
WARNING: multiple messages have this Message-ID (diff)
From: Tomas Winkler <tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> To: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org, Jason Gunthorpe <jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>, Jarkko Sakkinen <jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Subject: [PATCH v4 4/4] tmp/tpm_crb: implement runtime pm for tpm_crb Date: Mon, 12 Sep 2016 16:04:21 +0300 [thread overview] Message-ID: <1473685461-6540-5-git-send-email-tomas.winkler@intel.com> (raw) In-Reply-To: <1473685461-6540-1-git-send-email-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 enabled, the device will be in ready state. Signed-off-by: Tomas Winkler <tomas.winkler-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> --- V2: new in the series V3: resend drivers/char/tpm/tpm-interface.c | 5 +++++ drivers/char/tpm/tpm_crb.c | 37 ++++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c index fd863ff30f79..9ccad3a9875f 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" @@ -353,6 +354,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, @@ -394,6 +397,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 b0c0e2c9022b..94700f71d65e 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" @@ -152,8 +153,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); @@ -436,9 +435,16 @@ static int crb_acpi_add(struct acpi_device *device) if (rc) return rc; + 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_disable(dev); + } + + pm_runtime_put(dev); return rc; } @@ -450,9 +456,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 ------------------------------------------------------------------------------
next prev parent reply other threads:[~2016-09-12 13:06 UTC|newest] Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-09-12 13:04 [PATCH v3 0/4] tpm/tpm_crb: implement power management Tomas Winkler 2016-09-12 13:04 ` Tomas Winkler 2016-09-12 13:04 ` [PATCH v3 1/4] tpm/tpm_crb: implement tpm crb idle state Tomas Winkler 2016-09-12 13:04 ` Tomas Winkler 2016-09-15 6:22 ` Jarkko Sakkinen 2016-09-15 6:22 ` Jarkko Sakkinen 2016-09-15 6:28 ` Winkler, Tomas 2016-09-15 6:28 ` Winkler, Tomas 2016-09-15 8:20 ` Jarkko Sakkinen 2016-09-15 8:20 ` Jarkko Sakkinen 2016-09-15 8:23 ` Winkler, Tomas 2016-09-15 8:23 ` Winkler, Tomas 2016-09-15 10:53 ` Jarkko Sakkinen 2016-09-15 10:53 ` Jarkko Sakkinen 2016-09-15 13:09 ` Winkler, Tomas 2016-09-15 13:09 ` Winkler, Tomas 2016-09-12 13:04 ` [PATCH v3 2/4] tmp/tpm_crb: fix Intel PTT hw bug during " Tomas Winkler 2016-09-12 13:04 ` Tomas Winkler 2016-09-15 6:23 ` Jarkko Sakkinen 2016-09-27 9:31 ` Jarkko Sakkinen 2016-09-27 9:31 ` Jarkko Sakkinen 2016-09-27 9:54 ` Winkler, Tomas 2016-09-27 9:54 ` Winkler, Tomas 2016-09-12 13:04 ` [PATCH v3 3/4] tpm/tpm_crb: open code the crb_init into acpi_add Tomas Winkler 2016-09-12 13:04 ` Tomas Winkler 2016-09-15 6:24 ` Jarkko Sakkinen 2016-09-12 13:04 ` Tomas Winkler [this message] 2016-09-12 13:04 ` [PATCH v4 4/4] tmp/tpm_crb: implement runtime pm for tpm_crb Tomas Winkler 2016-09-14 6:28 ` [PATCH v3 0/4] tpm/tpm_crb: implement power management Winkler, Tomas 2016-09-14 6:28 ` Winkler, Tomas 2016-09-14 16:06 ` Jarkko Sakkinen 2016-09-14 16:06 ` Jarkko Sakkinen 2016-09-14 16:06 ` Jarkko Sakkinen 2016-09-14 16:06 ` Jarkko Sakkinen 2016-09-14 18:25 ` Jarkko Sakkinen 2016-09-14 18:25 ` 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=1473685461-6540-5-git-send-email-tomas.winkler@intel.com \ --to=tomas.winkler@intel.com \ --cc=jarkko.sakkinen@linux.intel.com \ --cc=jgunthorpe@obsidianresearch.com \ --cc=linux-kernel@vger.kernel.org \ --cc=tpmdd-devel@lists.sourceforge.net \ /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: linkBe 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.