diff options
Diffstat (limited to 'drivers/char/tpm/tpm_tis.c')
-rw-r--r-- | drivers/char/tpm/tpm_tis.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index a9ed2270c25d..2c46734b266d 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c | |||
@@ -373,6 +373,36 @@ out_err: | |||
373 | return rc; | 373 | return rc; |
374 | } | 374 | } |
375 | 375 | ||
376 | struct tis_vendor_timeout_override { | ||
377 | u32 did_vid; | ||
378 | unsigned long timeout_us[4]; | ||
379 | }; | ||
380 | |||
381 | static const struct tis_vendor_timeout_override vendor_timeout_overrides[] = { | ||
382 | /* Atmel 3204 */ | ||
383 | { 0x32041114, { (TIS_SHORT_TIMEOUT*1000), (TIS_LONG_TIMEOUT*1000), | ||
384 | (TIS_SHORT_TIMEOUT*1000), (TIS_SHORT_TIMEOUT*1000) } }, | ||
385 | }; | ||
386 | |||
387 | static bool tpm_tis_update_timeouts(struct tpm_chip *chip, | ||
388 | unsigned long *timeout_cap) | ||
389 | { | ||
390 | int i; | ||
391 | u32 did_vid; | ||
392 | |||
393 | did_vid = ioread32(chip->vendor.iobase + TPM_DID_VID(0)); | ||
394 | |||
395 | for (i = 0; i != ARRAY_SIZE(vendor_timeout_overrides); i++) { | ||
396 | if (vendor_timeout_overrides[i].did_vid != did_vid) | ||
397 | continue; | ||
398 | memcpy(timeout_cap, vendor_timeout_overrides[i].timeout_us, | ||
399 | sizeof(vendor_timeout_overrides[i].timeout_us)); | ||
400 | return true; | ||
401 | } | ||
402 | |||
403 | return false; | ||
404 | } | ||
405 | |||
376 | /* | 406 | /* |
377 | * Early probing for iTPM with STS_DATA_EXPECT flaw. | 407 | * Early probing for iTPM with STS_DATA_EXPECT flaw. |
378 | * Try sending command without itpm flag set and if that | 408 | * Try sending command without itpm flag set and if that |
@@ -437,6 +467,7 @@ static const struct tpm_class_ops tpm_tis = { | |||
437 | .recv = tpm_tis_recv, | 467 | .recv = tpm_tis_recv, |
438 | .send = tpm_tis_send, | 468 | .send = tpm_tis_send, |
439 | .cancel = tpm_tis_ready, | 469 | .cancel = tpm_tis_ready, |
470 | .update_timeouts = tpm_tis_update_timeouts, | ||
440 | .req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID, | 471 | .req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID, |
441 | .req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID, | 472 | .req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID, |
442 | .req_canceled = tpm_tis_req_canceled, | 473 | .req_canceled = tpm_tis_req_canceled, |