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: Alexey Klimov <aklimov@redhat.com> Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> (!update_durations path) Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
This commit is contained in:
committed by
Jarkko Sakkinen
parent
f2f5820e3b
commit
15d0b22c01
@@ -343,6 +343,7 @@ int tpm1_get_timeouts(struct tpm_chip *chip)
|
|||||||
{
|
{
|
||||||
cap_t cap;
|
cap_t cap;
|
||||||
unsigned long timeout_old[4], timeout_chip[4], timeout_eff[4];
|
unsigned long timeout_old[4], timeout_chip[4], timeout_eff[4];
|
||||||
|
unsigned long durations[3];
|
||||||
ssize_t rc;
|
ssize_t rc;
|
||||||
|
|
||||||
rc = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, NULL,
|
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));
|
usecs_to_jiffies(be32_to_cpu(cap.duration.tpm_long));
|
||||||
chip->duration[TPM_LONG_LONG] = 0; /* not used under 1.2 */
|
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
|
/* The Broadcom BCM0102 chipset in a Dell Latitude D820 gets the above
|
||||||
* value wrong and apparently reports msecs rather than usecs. So we
|
* value wrong and apparently reports msecs rather than usecs. So we
|
||||||
* fix up the resulting too-small TPM_SHORT value to make things work.
|
* fix up the resulting too-small TPM_SHORT value to make things work.
|
||||||
|
|||||||
@@ -67,6 +67,8 @@ struct tpm_class_ops {
|
|||||||
u8 (*status) (struct tpm_chip *chip);
|
u8 (*status) (struct tpm_chip *chip);
|
||||||
void (*update_timeouts)(struct tpm_chip *chip,
|
void (*update_timeouts)(struct tpm_chip *chip,
|
||||||
unsigned long *timeout_cap);
|
unsigned long *timeout_cap);
|
||||||
|
void (*update_durations)(struct tpm_chip *chip,
|
||||||
|
unsigned long *duration_cap);
|
||||||
int (*go_idle)(struct tpm_chip *chip);
|
int (*go_idle)(struct tpm_chip *chip);
|
||||||
int (*cmd_ready)(struct tpm_chip *chip);
|
int (*cmd_ready)(struct tpm_chip *chip);
|
||||||
int (*request_locality)(struct tpm_chip *chip, int loc);
|
int (*request_locality)(struct tpm_chip *chip, int loc);
|
||||||
|
|||||||
Reference in New Issue
Block a user