Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59f5a6b0 authored by Nayna Jain's avatar Nayna Jain Committed by Jarkko Sakkinen
Browse files

tpm: reduce poll sleep time in tpm_transmit()



tpm_try_transmit currently checks TPM status every 5 msecs between
send and recv. It does so in a loop for the maximum timeout as defined
in the TPM Interface Specification. However, the TPM may return before
5 msecs. Thus the polling interval for each iteration can be reduced,
which improves overall performance. This patch changes the polling sleep
time from 5 msecs to 1 msec.

Additionally, this patch renames TPM_POLL_SLEEP to TPM_TIMEOUT_POLL and
moves it to tpm.h as an enum value.

After this change, performance on a system[1] with a TPM 1.2 with an 8 byte
burstcount for 1000 extends improved from ~14 sec to ~10.7 sec.

[1] All tests are performed on an x86 based, locked down, single purpose
closed system. It has Infineon TPM 1.2 using LPC Bus.

Signed-off-by: default avatarNayna Jain <nayna@linux.vnet.ibm.com>
Acked-by: default avatarJay Freyensee <why2jjj.linux@gmail.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tested-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent 33bafe90
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -489,7 +489,7 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip,
			goto out;
		}

		tpm_msleep(TPM_TIMEOUT);
		tpm_msleep(TPM_TIMEOUT_POLL);
		rmb();
	} while (time_before(jiffies, stop));

+2 −1
Original line number Diff line number Diff line
@@ -53,7 +53,8 @@ enum tpm_const {
enum tpm_timeout {
	TPM_TIMEOUT = 5,	/* msecs */
	TPM_TIMEOUT_RETRY = 100, /* msecs */
	TPM_TIMEOUT_RANGE_US = 300	/* usecs */
	TPM_TIMEOUT_RANGE_US = 300,	/* usecs */
	TPM_TIMEOUT_POLL = 1	/* msecs */
};

/* TPM addresses */
+2 −8
Original line number Diff line number Diff line
@@ -31,12 +31,6 @@
#include "tpm.h"
#include "tpm_tis_core.h"

/* This is a polling delay to check for status and burstcount.
 * As per ddwg input, expectation is that status check and burstcount
 * check should return within few usecs.
 */
#define TPM_POLL_SLEEP	1  /* msec */

static void tpm_tis_clkrun_enable(struct tpm_chip *chip, bool value);

static bool wait_for_tpm_stat_cond(struct tpm_chip *chip, u8 mask,
@@ -90,7 +84,7 @@ static int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask,
		}
	} else {
		do {
			tpm_msleep(TPM_POLL_SLEEP);
			tpm_msleep(TPM_TIMEOUT_POLL);
			status = chip->ops->status(chip);
			if ((status & mask) == mask)
				return 0;
@@ -279,7 +273,7 @@ static int get_burstcount(struct tpm_chip *chip)
		burstcnt = (value >> 8) & 0xFFFF;
		if (burstcnt)
			return burstcnt;
		tpm_msleep(TPM_POLL_SLEEP);
		tpm_msleep(TPM_TIMEOUT_POLL);
	} while (time_before(jiffies, stop));
	return -EBUSY;
}