9e954e3680
Move content from stx-gplv2 into stx-integ Packages will be relocated to stx-integ: base/ bash cgcs-users cluster-resource-agents dpkg haproxy libfdt netpbm rpm database/ mariadb filesystem/ iscsi-initiator-utils filesystem/drbd/ drbd-tools kernel/kernel-modules/ drbd integrity intel-e1000e intel-i40e intel-i40evf intel-ixgbe intel-ixgbevf qat17 tpmdd ldap/ ldapscripts networking/ iptables net-tools Change-Id: I0a9070e35559e5545b14e1fdd933a2ca2e969fd1 Story: 2002801 Task: 22687 Signed-off-by: Scott Little <scott.little@windriver.com>
98 lines
3.2 KiB
Diff
98 lines
3.2 KiB
Diff
From e82060f0cf390ba8e4f79a54e68cef9a38088104 Mon Sep 17 00:00:00 2001
|
||
From: Nayna Jain <nayna@linux.vnet.ibm.com>
|
||
Date: Fri, 10 Nov 2017 17:16:35 -0500
|
||
Subject: [PATCH] tpm: ignore burstcount to improve tpm_tis send() performance
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
The TPM burstcount status indicates the number of bytes that can
|
||
be sent to the TPM without causing bus wait states. Effectively,
|
||
it is the number of empty bytes in the command FIFO.
|
||
|
||
This patch optimizes the tpm_tis_send_data() function by checking
|
||
the burstcount only once. And if the burstcount is valid, it writes
|
||
all the bytes at once, permitting wait state.
|
||
|
||
After this change, performance on a TPM 1.2 with an 8 byte
|
||
burstcount for 1000 extends improved from ~41sec to ~14sec.
|
||
|
||
Suggested-by: Ken Goldman <kgold@linux.vnet.ibm.com> in
|
||
conjunction with the TPM Device Driver work group.
|
||
Signed-off-by: Nayna Jain <nayna@linux.vnet.ibm.com>
|
||
Acked-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
|
||
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
||
Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
||
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
||
---
|
||
tpm_tis_core.c | 42 +++++++++++++++---------------------------
|
||
1 file changed, 15 insertions(+), 27 deletions(-)
|
||
|
||
diff --git a/tpm_tis_core.c b/tpm_tis_core.c
|
||
index a338701..a6b4149 100644
|
||
--- a/tpm_tis_core.c
|
||
+++ b/tpm_tis_core.c
|
||
@@ -256,7 +256,6 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
|
||
{
|
||
struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
|
||
int rc, status, burstcnt;
|
||
- size_t count = 0;
|
||
bool itpm = priv->flags & TPM_TIS_ITPM_WORKAROUND;
|
||
|
||
status = tpm_tis_status(chip);
|
||
@@ -270,36 +269,25 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
|
||
}
|
||
}
|
||
|
||
- while (count < len - 1) {
|
||
- burstcnt = get_burstcount(chip);
|
||
- if (burstcnt < 0) {
|
||
- dev_err(&chip->dev, "Unable to read burstcount\n");
|
||
- rc = burstcnt;
|
||
- goto out_err;
|
||
- }
|
||
- burstcnt = min_t(int, burstcnt, len - count - 1);
|
||
- rc = tpm_tis_write_bytes(priv, TPM_DATA_FIFO(priv->locality),
|
||
- burstcnt, buf + count);
|
||
- if (rc < 0)
|
||
- goto out_err;
|
||
|
||
- count += burstcnt;
|
||
-
|
||
- if (__wait_for_tpm_stat(chip, TPM_STS_VALID,
|
||
- chip->timeout_c, 1,
|
||
- &priv->int_queue, false) < 0) {
|
||
- rc = -ETIME;
|
||
- goto out_err;
|
||
- }
|
||
- status = tpm_tis_status(chip);
|
||
- if (!itpm && (status & TPM_STS_DATA_EXPECT) == 0) {
|
||
- rc = -EIO;
|
||
- goto out_err;
|
||
- }
|
||
+ /*
|
||
+ * Get the initial burstcount to ensure TPM is ready to
|
||
+ * accept data, even when waiting for burstcount is disabled.
|
||
+ */
|
||
+ burstcnt = get_burstcount(chip);
|
||
+ if (burstcnt < 0) {
|
||
+ dev_err(&chip->dev, "Unable to read burstcount\n");
|
||
+ rc = burstcnt;
|
||
+ goto out_err;
|
||
}
|
||
|
||
+ rc = tpm_tis_write_bytes(priv, TPM_DATA_FIFO(priv->locality),
|
||
+ len -1, buf);
|
||
+ if (rc < 0)
|
||
+ goto out_err;
|
||
+
|
||
/* write last byte */
|
||
- rc = tpm_tis_write8(priv, TPM_DATA_FIFO(priv->locality), buf[count]);
|
||
+ rc = tpm_tis_write8(priv, TPM_DATA_FIFO(priv->locality), buf[len-1]);
|
||
if (rc < 0)
|
||
goto out_err;
|
||
|
||
--
|
||
1.8.3.1
|
||
|