linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/4] tpm/tpm_crb: implement power management.
@ 2016-10-08 11:59 Tomas Winkler
  2016-10-08 11:59 ` [PATCH v4 1/4] tpm/tpm_crb: implement tpm crb idle state Tomas Winkler
                   ` (3 more replies)
  0 siblings, 4 replies; 23+ messages in thread
From: Tomas Winkler @ 2016-10-08 11:59 UTC (permalink / raw)
  To: tpmdd-devel, Jason Gunthorpe, Jarkko Sakkinen; +Cc: linux-kernel, Tomas Winkler

Te overall platform ability to enter a low power state is also
conditioned on the ability of a tpm device to go to idle state.
This series should provide this feature.

Unfortunately, there is a HW bug on Intel PTT devices on Skylake,
Kabylake, and Broxton devices, where certain registers lost retention
during TPM idle state. Hence this implementation takes this into
consideration and implement the feature based only on access to
registers that retain their state. This still conforms to the spec
and should be correct also on non Intle devices.

V2: Utilize runtime_pm for driving tpm crb idle states.
V3. fix lower case corruption in the first patch
V4. Fix unbalanced runtime pm get and put

Tomas Winkler (4):
  tpm/tpm_crb: implement tpm crb idle state
  tmp/tpm_crb: fix Intel PTT hw bug during idle state
  tpm/tpm_crb: open code the crb_init into acpi_add
  tmp/tpm_crb: implement runtime pm for tpm_crb

 drivers/char/tpm/tpm-interface.c |   5 ++
 drivers/char/tpm/tpm_crb.c       | 166 +++++++++++++++++++++++++++++++++------
 2 files changed, 147 insertions(+), 24 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 23+ messages in thread
* [PATCH v4 1/4] tpm/tpm_crb: implement tpm crb idle state
@ 2016-09-15  7:27 Tomas Winkler
  2016-09-15 10:52 ` Jarkko Sakkinen
  0 siblings, 1 reply; 23+ messages in thread
From: Tomas Winkler @ 2016-09-15  7:27 UTC (permalink / raw)
  To: tpmdd-devel, Jason Gunthorpe, Jarkko Sakkinen; +Cc: linux-kernel, Tomas Winkler

The register TPM_CRB_CTRL_REQ_x contains bits goIdle and cmdReady for
SW to indicate that the device can enter or should exit the idle state.

The legacy ACPI-start (SMI + DMA) based devices do not support these
bits and the idle state management is not exposed to the host SW.
Thus, this functionality only is enabled only for a CRB start (MMIO)
based devices.

Based on Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
original patch:
'tpm_crb: implement power tpm crb power management'

To keep the implementation local to the hw we don't use wait_for_tpm_stat
for polling the TPM_CRB_CTRL_REQ.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
V2: do not export the functions via tpm ops
V3: fix lower case corruption; adjust function documentation
V4: comment on wait_for_tpm_stat.

 drivers/char/tpm/tpm_crb.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
index 6e9d1bca712f..b6923a8b3ff7 100644
--- a/drivers/char/tpm/tpm_crb.c
+++ b/drivers/char/tpm/tpm_crb.c
@@ -83,6 +83,75 @@ struct crb_priv {
 	u32 cmd_size;
 };
 
+/**
+ * crb_go_idle - request tpm crb device to go the idle state
+ *
+ * @dev:  crb device
+ * @priv: crb private data
+ *
+ * Write CRB_CTRL_REQ_GO_IDLE to TPM_CRB_CTRL_REQ
+ * The device should respond within TIMEOUT_C by clearing the bit.
+ * Anyhow, we do not wait here as a consequent CMD_READY request
+ * will be handled correctly even if idle was not completed.
+ *
+ * The function does nothing for devices with ACPI-start method.
+ *
+ * Return: 0 always
+ */
+static int __maybe_unused crb_go_idle(struct device *dev, struct crb_priv *priv)
+{
+	if (priv->flags & CRB_FL_ACPI_START)
+		return 0;
+
+	iowrite32(CRB_CTRL_REQ_GO_IDLE, &priv->cca->req);
+	/* we don't really care when this settles */
+
+	return 0;
+}
+
+/**
+ * crb_cmd_ready - request tpm crb device to enter ready state
+ *
+ * @dev:  crb device
+ * @priv: crb private data
+ *
+ * Write CRB_CTRL_REQ_CMD_READY to TPM_CRB_CTRL_REQ
+ * and poll till the device acknowledge it by clearing the bit.
+ * The device should respond within TIMEOUT_C.
+ *
+ * The function does nothing for devices with ACPI-start method
+ *
+ * Return: 0 on success -ETIME on timeout;
+ */
+static int __maybe_unused crb_cmd_ready(struct device *dev,
+					struct crb_priv *priv)
+{
+	ktime_t stop, start;
+
+	if (priv->flags & CRB_FL_ACPI_START)
+		return 0;
+
+	iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->cca->req);
+
+	start = ktime_get();
+	stop = ktime_add(start, ms_to_ktime(TPM2_TIMEOUT_C));
+	do {
+		if (!(ioread32(&priv->cca->req) & CRB_CTRL_REQ_CMD_READY)) {
+			dev_dbg(dev, "cmdReady in %lld usecs\n",
+				ktime_to_us(ktime_sub(ktime_get(), start)));
+			return 0;
+		}
+		usleep_range(50, 100);
+	} while (ktime_before(ktime_get(), stop));
+
+	if (ioread32(&priv->cca->req) & CRB_CTRL_REQ_CMD_READY) {
+		dev_warn(dev, "cmdReady timed out\n");
+		return -ETIME;
+	}
+
+	return 0;
+}
+
 static SIMPLE_DEV_PM_OPS(crb_pm, tpm_pm_suspend, tpm_pm_resume);
 
 static u8 crb_status(struct tpm_chip *chip)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2016-10-08 18:53 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-08 11:59 [PATCH v4 0/4] tpm/tpm_crb: implement power management Tomas Winkler
2016-10-08 11:59 ` [PATCH v4 1/4] tpm/tpm_crb: implement tpm crb idle state Tomas Winkler
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 12:50   ` Jarkko Sakkinen
2016-10-08 14:27     ` Winkler, Tomas
2016-10-08 16:00       ` Jarkko Sakkinen
2016-10-08 16:42         ` Jason Gunthorpe
2016-10-08 16:58           ` Winkler, Tomas
2016-10-08 17:08           ` Jarkko Sakkinen
2016-10-08 16:56         ` Winkler, Tomas
2016-10-08 17:06           ` Jarkko Sakkinen
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 ` [PATCH 4/4] tmp/tpm_crb: implement runtime pm for tpm_crb Tomas Winkler
2016-10-08 12:47   ` Jarkko Sakkinen
2016-10-08 13:37     ` Winkler, Tomas
2016-10-08 16:01       ` Jarkko Sakkinen
2016-10-08 18:18         ` Winkler, Tomas
2016-10-08 18:43           ` Jarkko Sakkinen
  -- strict thread matches above, loose matches on Subject: below --
2016-09-15  7:27 [PATCH v4 1/4] tpm/tpm_crb: implement tpm crb idle state Tomas Winkler
2016-09-15 10:52 ` Jarkko Sakkinen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).