Commit 15d0b22c authored by Jerry Snitselaar's avatar Jerry Snitselaar Committed by Jarkko Sakkinen
Browse files

tpm: provide a way to override the chip returned durations



Patch adds method ->update_durations to override returned
durations in case TPM chip misbehaves for TPM 1.2 drivers.

Cc: Peter Huewe <peterhuewe@gmx.de>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Signed-off-by: default avatarAlexey Klimov <aklimov@redhat.com>
Signed-off-by: default avatarJerry Snitselaar <jsnitsel@redhat.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> (!update_durations path)
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent f2f5820e
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -343,6 +343,7 @@ int tpm1_get_timeouts(struct tpm_chip *chip)
{
	cap_t cap;
	unsigned long timeout_old[4], timeout_chip[4], timeout_eff[4];
	unsigned long durations[3];
	ssize_t rc;

	rc = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, NULL,
@@ -427,6 +428,20 @@ int tpm1_get_timeouts(struct tpm_chip *chip)
		usecs_to_jiffies(be32_to_cpu(cap.duration.tpm_long));
	chip->duration[TPM_LONG_LONG] = 0; /* not used under 1.2 */

	/*
	 * Provide the ability for vendor overrides of duration values in case
	 * of misreporting.
	 */
	if (chip->ops->update_durations)
		chip->ops->update_durations(chip, durations);

	if (chip->duration_adjusted) {
		dev_info(&chip->dev, HW_ERR "Adjusting reported durations.");
		chip->duration[TPM_SHORT] = durations[0];
		chip->duration[TPM_MEDIUM] = durations[1];
		chip->duration[TPM_LONG] = durations[2];
	}

	/* The Broadcom BCM0102 chipset in a Dell Latitude D820 gets the above
	 * value wrong and apparently reports msecs rather than usecs. So we
	 * fix up the resulting too-small TPM_SHORT value to make things work.
+2 −0
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@ struct tpm_class_ops {
	u8 (*status) (struct tpm_chip *chip);
	void (*update_timeouts)(struct tpm_chip *chip,
				unsigned long *timeout_cap);
	void (*update_durations)(struct tpm_chip *chip,
				 unsigned long *duration_cap);
	int (*go_idle)(struct tpm_chip *chip);
	int (*cmd_ready)(struct tpm_chip *chip);
	int (*request_locality)(struct tpm_chip *chip, int loc);