]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tpm: Add a flag to indicate TPM power is managed by firmware
authorStephen Boyd <swboyd@chromium.org>
Fri, 20 Sep 2019 18:32:36 +0000 (11:32 -0700)
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tue, 12 Nov 2019 19:45:37 +0000 (21:45 +0200)
On some platforms, the TPM power is managed by firmware and therefore we
don't need to stop the TPM on suspend when going to a light version of
suspend such as S0ix ("freeze" suspend state). Add a chip flag,
TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED, to indicate this so that certain
platforms can probe for the usage of this light suspend and avoid
touching the TPM state across suspend/resume.

Cc: Andrey Pronin <apronin@chromium.org>
Cc: Duncan Laurie <dlaurie@chromium.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Guenter Roeck <groeck@chromium.org>
Cc: Alexander Steffen <Alexander.Steffen@infineon.com>
Cc: Heiko Stuebner <heiko@sntech.de>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
drivers/char/tpm/tpm-interface.c
drivers/char/tpm/tpm.h

index d7a3888ad80f0a60b88f0193ada481c304e70e08..7f105490604c836263cf86bea05b2a6e5ea37574 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/slab.h>
 #include <linux/mutex.h>
 #include <linux/spinlock.h>
+#include <linux/suspend.h>
 #include <linux/freezer.h>
 #include <linux/tpm_eventlog.h>
 
@@ -394,7 +395,11 @@ int tpm_pm_suspend(struct device *dev)
                return -ENODEV;
 
        if (chip->flags & TPM_CHIP_FLAG_ALWAYS_POWERED)
-               return 0;
+               goto suspended;
+
+       if ((chip->flags & TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED) &&
+           !pm_suspend_via_firmware())
+               goto suspended;
 
        if (!tpm_chip_start(chip)) {
                if (chip->flags & TPM_CHIP_FLAG_TPM2)
@@ -405,6 +410,7 @@ int tpm_pm_suspend(struct device *dev)
                tpm_chip_stop(chip);
        }
 
+suspended:
        return rc;
 }
 EXPORT_SYMBOL_GPL(tpm_pm_suspend);
index a4f74dd02a3541cd196e9b1531dbfd15cbeb4449..80bca88b1f9196e9f4dacc19462b8bbd4d869767 100644 (file)
@@ -162,6 +162,7 @@ enum tpm_chip_flags {
        TPM_CHIP_FLAG_VIRTUAL           = BIT(3),
        TPM_CHIP_FLAG_HAVE_TIMEOUTS     = BIT(4),
        TPM_CHIP_FLAG_ALWAYS_POWERED    = BIT(5),
+       TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED    = BIT(6),
 };
 
 #define to_tpm_chip(d) container_of(d, struct tpm_chip, dev)