2019-03-29 14:12:17 +08:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2018-11-06 04:14:04 +08:00
|
|
|
From: Tomas Winkler <tomas.winkler@intel.com>
|
|
|
|
Date: Sun, 11 Mar 2018 09:55:27 +0200
|
2019-03-29 14:12:17 +08:00
|
|
|
Subject: [PATCH] tpm: add tpm_calc_ordinal_duration() wrapper
|
2018-11-06 04:14:04 +08:00
|
|
|
|
|
|
|
Add convenient wrapper for ordinal duration computation
|
|
|
|
to remove boiler plate if else statement over TPM2.
|
|
|
|
|
|
|
|
if (chip->flags & TPM_CHIP_FLAG_TPM2)
|
|
|
|
tpm2_calc_ordinal_duration(chip, ordinal);
|
|
|
|
else
|
|
|
|
tpm1_calc_ordinal_duration(chip, ordinal);
|
|
|
|
|
|
|
|
V2-V3: Rebase.
|
|
|
|
V4: Add Kdoc.
|
|
|
|
V5: Adjust the kdoc to the new standard.
|
|
|
|
V6: Rebase novuton
|
|
|
|
|
|
|
|
Change-Id: Ib1621409488c034ab5aa77da2c67e4a95bfe9a09
|
|
|
|
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
|
|
|
|
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
|
|
|
Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
|
|
|
---
|
|
|
|
drivers/char/tpm/st33zp24/st33zp24.c | 2 +-
|
|
|
|
drivers/char/tpm/tpm-interface.c | 24 ++++++++++++++++++++----
|
|
|
|
drivers/char/tpm/tpm.h | 1 +
|
|
|
|
drivers/char/tpm/tpm1-cmd.c | 1 -
|
|
|
|
drivers/char/tpm/tpm2-cmd.c | 1 -
|
|
|
|
drivers/char/tpm/tpm_i2c_nuvoton.c | 5 +----
|
|
|
|
drivers/char/tpm/tpm_tis_core.c | 6 +-----
|
|
|
|
drivers/char/tpm/xen-tpmfront.c | 2 +-
|
|
|
|
8 files changed, 25 insertions(+), 17 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/char/tpm/st33zp24/st33zp24.c b/drivers/char/tpm/st33zp24/st33zp24.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index be4d82974a96..694fc58888c1 100644
|
2018-11-06 04:14:04 +08:00
|
|
|
--- a/drivers/char/tpm/st33zp24/st33zp24.c
|
|
|
|
+++ b/drivers/char/tpm/st33zp24/st33zp24.c
|
|
|
|
@@ -430,7 +430,7 @@ static int st33zp24_send(struct tpm_chip *chip, unsigned char *buf,
|
|
|
|
ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));
|
|
|
|
|
|
|
|
ret = wait_for_stat(chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID,
|
|
|
|
- tpm1_calc_ordinal_duration(chip, ordinal),
|
|
|
|
+ tpm_calc_ordinal_duration(chip, ordinal),
|
|
|
|
&tpm_dev->read_queue, false);
|
|
|
|
if (ret < 0)
|
|
|
|
goto out_err;
|
|
|
|
diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index 5540c9c23cca..ad8e4a29184e 100644
|
2018-11-06 04:14:04 +08:00
|
|
|
--- a/drivers/char/tpm/tpm-interface.c
|
|
|
|
+++ b/drivers/char/tpm/tpm-interface.c
|
|
|
|
@@ -47,6 +47,25 @@ module_param_named(suspend_pcr, tpm_suspend_pcr, uint, 0644);
|
|
|
|
MODULE_PARM_DESC(suspend_pcr,
|
|
|
|
"PCR to use for dummy writes to facilitate flush on suspend.");
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * tpm_calc_ordinal_duration() - calculate the maximum command duration
|
|
|
|
+ * @chip: TPM chip to use.
|
|
|
|
+ * @ordinal: TPM command ordinal.
|
|
|
|
+ *
|
|
|
|
+ * The function returns the maximum amount of time the chip could take
|
|
|
|
+ * to return the result for a particular ordinal in jiffies.
|
|
|
|
+ *
|
|
|
|
+ * Return: A maximal duration time for an ordinal in jiffies.
|
|
|
|
+ */
|
|
|
|
+unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal)
|
|
|
|
+{
|
|
|
|
+ if (chip->flags & TPM_CHIP_FLAG_TPM2)
|
|
|
|
+ return tpm2_calc_ordinal_duration(chip, ordinal);
|
|
|
|
+ else
|
|
|
|
+ return tpm1_calc_ordinal_duration(chip, ordinal);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(tpm_calc_ordinal_duration);
|
|
|
|
+
|
|
|
|
static int tpm_validate_command(struct tpm_chip *chip,
|
|
|
|
struct tpm_space *space,
|
|
|
|
const u8 *cmd,
|
2019-03-29 14:12:17 +08:00
|
|
|
@@ -231,10 +250,7 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip,
|
2018-11-06 04:14:04 +08:00
|
|
|
if (chip->flags & TPM_CHIP_FLAG_IRQ)
|
|
|
|
goto out_recv;
|
|
|
|
|
|
|
|
- if (chip->flags & TPM_CHIP_FLAG_TPM2)
|
|
|
|
- stop = jiffies + tpm2_calc_ordinal_duration(chip, ordinal);
|
|
|
|
- else
|
|
|
|
- stop = jiffies + tpm1_calc_ordinal_duration(chip, ordinal);
|
|
|
|
+ stop = jiffies + tpm_calc_ordinal_duration(chip, ordinal);
|
|
|
|
do {
|
|
|
|
u8 status = chip->ops->status(chip);
|
|
|
|
if ((status & chip->ops->req_complete_mask) ==
|
|
|
|
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
|
2020-10-27 02:14:06 +08:00
|
|
|
index 92b630760d57..f3bed7513c2b 100644
|
2018-11-06 04:14:04 +08:00
|
|
|
--- a/drivers/char/tpm/tpm.h
|
|
|
|
+++ b/drivers/char/tpm/tpm.h
|
2020-10-27 02:14:06 +08:00
|
|
|
@@ -551,6 +551,7 @@ int tpm_get_timeouts(struct tpm_chip *);
|
2018-11-06 04:14:04 +08:00
|
|
|
int tpm1_auto_startup(struct tpm_chip *chip);
|
|
|
|
int tpm_do_selftest(struct tpm_chip *chip);
|
|
|
|
unsigned long tpm1_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal);
|
|
|
|
+unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal);
|
|
|
|
int tpm_pm_suspend(struct device *dev);
|
|
|
|
int tpm_pm_resume(struct device *dev);
|
|
|
|
|
|
|
|
diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index 991260134659..dfbe9c60cbcf 100644
|
2018-11-06 04:14:04 +08:00
|
|
|
--- a/drivers/char/tpm/tpm1-cmd.c
|
|
|
|
+++ b/drivers/char/tpm/tpm1-cmd.c
|
|
|
|
@@ -307,4 +307,3 @@ unsigned long tpm1_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal)
|
|
|
|
else
|
|
|
|
return duration;
|
|
|
|
}
|
|
|
|
-EXPORT_SYMBOL_GPL(tpm1_calc_ordinal_duration);
|
|
|
|
diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index 9f0daaf3711a..56ad80a91aa1 100644
|
2018-11-06 04:14:04 +08:00
|
|
|
--- a/drivers/char/tpm/tpm2-cmd.c
|
|
|
|
+++ b/drivers/char/tpm/tpm2-cmd.c
|
|
|
|
@@ -132,7 +132,6 @@ unsigned long tpm2_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal)
|
|
|
|
else
|
|
|
|
return msecs_to_jiffies(TPM2_DURATION_DEFAULT);
|
|
|
|
}
|
|
|
|
-EXPORT_SYMBOL_GPL(tpm2_calc_ordinal_duration);
|
|
|
|
|
|
|
|
|
|
|
|
struct tpm2_pcr_read_out {
|
|
|
|
diff --git a/drivers/char/tpm/tpm_i2c_nuvoton.c b/drivers/char/tpm/tpm_i2c_nuvoton.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index 289ccca35feb..315a3b4548f7 100644
|
2018-11-06 04:14:04 +08:00
|
|
|
--- a/drivers/char/tpm/tpm_i2c_nuvoton.c
|
|
|
|
+++ b/drivers/char/tpm/tpm_i2c_nuvoton.c
|
2019-09-19 15:09:25 +08:00
|
|
|
@@ -454,10 +454,7 @@ static int i2c_nuvoton_send(struct tpm_chip *chip, u8 *buf, size_t len)
|
2018-11-06 04:14:04 +08:00
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));
|
|
|
|
- if (chip->flags & TPM_CHIP_FLAG_TPM2)
|
|
|
|
- duration = tpm2_calc_ordinal_duration(chip, ordinal);
|
|
|
|
- else
|
|
|
|
- duration = tpm1_calc_ordinal_duration(chip, ordinal);
|
|
|
|
+ duration = tpm_calc_ordinal_duration(chip, ordinal);
|
|
|
|
|
|
|
|
rc = i2c_nuvoton_wait_for_data_avail(chip, duration, &priv->read_queue);
|
|
|
|
if (rc) {
|
|
|
|
diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index fcb4326d230c..72f9ca7157fa 100644
|
2018-11-06 04:14:04 +08:00
|
|
|
--- a/drivers/char/tpm/tpm_tis_core.c
|
|
|
|
+++ b/drivers/char/tpm/tpm_tis_core.c
|
2020-05-05 09:02:46 +08:00
|
|
|
@@ -476,11 +476,7 @@ static int tpm_tis_send_main(struct tpm_chip *chip, const u8 *buf, size_t len)
|
2018-11-06 04:14:04 +08:00
|
|
|
if (chip->flags & TPM_CHIP_FLAG_IRQ) {
|
|
|
|
ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));
|
|
|
|
|
|
|
|
- if (chip->flags & TPM_CHIP_FLAG_TPM2)
|
|
|
|
- dur = tpm2_calc_ordinal_duration(chip, ordinal);
|
|
|
|
- else
|
|
|
|
- dur = tpm1_calc_ordinal_duration(chip, ordinal);
|
|
|
|
-
|
|
|
|
+ dur = tpm_calc_ordinal_duration(chip, ordinal);
|
|
|
|
if (wait_for_tpm_stat
|
|
|
|
(chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID, dur,
|
|
|
|
&priv->read_queue, false) < 0) {
|
|
|
|
diff --git a/drivers/char/tpm/xen-tpmfront.c b/drivers/char/tpm/xen-tpmfront.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index 5bb2fb3e72ba..5a327eb7f63a 100644
|
2018-11-06 04:14:04 +08:00
|
|
|
--- a/drivers/char/tpm/xen-tpmfront.c
|
|
|
|
+++ b/drivers/char/tpm/xen-tpmfront.c
|
|
|
|
@@ -164,7 +164,7 @@ static int vtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
|
|
|
notify_remote_via_evtchn(priv->evtchn);
|
|
|
|
|
|
|
|
ordinal = be32_to_cpu(((struct tpm_input_header*)buf)->ordinal);
|
|
|
|
- duration = tpm1_calc_ordinal_duration(chip, ordinal);
|
|
|
|
+ duration = tpm_calc_ordinal_duration(chip, ordinal);
|
|
|
|
|
|
|
|
if (wait_for_tpm_stat(chip, VTPM_STATUS_IDLE, duration,
|
|
|
|
&priv->read_queue, true) < 0) {
|
|
|
|
--
|
2019-04-08 18:08:36 +08:00
|
|
|
https://clearlinux.org
|
2018-11-06 04:14:04 +08:00
|
|
|
|