diff options
| -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 + |
