]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tpm: provide a way to override the chip returned durations
authorJerry Snitselaar <jsnitsel@redhat.com>
Mon, 2 Sep 2019 14:27:34 +0000 (07:27 -0700)
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tue, 12 Nov 2019 19:45:36 +0000 (21:45 +0200)
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>
drivers/char/tpm/tpm1-cmd.c
include/linux/tpm.h

index 149e953ca3699a97485e3cc8c809c9915f7432be..ca7158fa6e6cd1c9b0f0e43e542d0d4c73e330f2 100644 (file)
@@ -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.
index 53c0ea9ec9df222b3ec3fab64de475a43cc834e5..bb1d1ac7081da4a2e9cab002bb534457d9d6cada 100644 (file)
@@ -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);