mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 17:12:06 +00:00
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:
parent
f2f5820e3b
commit
15d0b22c01
@ -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.
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user