diff options
Diffstat (limited to 'drivers/char/tpm')
-rw-r--r-- | drivers/char/tpm/tpm_tis.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index 0b73e4ec1add..27e8de415309 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c | |||
@@ -257,6 +257,10 @@ out: | |||
257 | return size; | 257 | return size; |
258 | } | 258 | } |
259 | 259 | ||
260 | static int itpm; | ||
261 | module_param(itpm, bool, 0444); | ||
262 | MODULE_PARM_DESC(itpm, "Force iTPM workarounds (found on some Lenovo laptops)"); | ||
263 | |||
260 | /* | 264 | /* |
261 | * If interrupts are used (signaled by an irq set in the vendor structure) | 265 | * If interrupts are used (signaled by an irq set in the vendor structure) |
262 | * tpm.c can skip polling for the data to be available as the interrupt is | 266 | * tpm.c can skip polling for the data to be available as the interrupt is |
@@ -293,7 +297,7 @@ static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len) | |||
293 | wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, | 297 | wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, |
294 | &chip->vendor.int_queue); | 298 | &chip->vendor.int_queue); |
295 | status = tpm_tis_status(chip); | 299 | status = tpm_tis_status(chip); |
296 | if ((status & TPM_STS_DATA_EXPECT) == 0) { | 300 | if (!itpm && (status & TPM_STS_DATA_EXPECT) == 0) { |
297 | rc = -EIO; | 301 | rc = -EIO; |
298 | goto out_err; | 302 | goto out_err; |
299 | } | 303 | } |
@@ -467,6 +471,10 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, | |||
467 | "1.2 TPM (device-id 0x%X, rev-id %d)\n", | 471 | "1.2 TPM (device-id 0x%X, rev-id %d)\n", |
468 | vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); | 472 | vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); |
469 | 473 | ||
474 | if (itpm) | ||
475 | dev_info(dev, "Intel iTPM workaround enabled\n"); | ||
476 | |||
477 | |||
470 | /* Figure out the capabilities */ | 478 | /* Figure out the capabilities */ |
471 | intfcaps = | 479 | intfcaps = |
472 | ioread32(chip->vendor.iobase + | 480 | ioread32(chip->vendor.iobase + |