drivers/pc80/tpm: Add some optional delay to tis_readresponse()

Certain TPMs (observed on Infineon SLB9635 installed on revolve 810 g1)
seem to need some delay between tis_wait_valid() and
tis_has_valid_data(), or tis_has_valid_data() may invalidly return 0,
ending the loop immaturely with some bytes left unread, and fail to
pass the check below, causing the current command not finalized by
tis_command_ready(), and blocking any later tis_wait_ready().

This time the added delay is controlled by a Kconfig option
TPM_RDRESP_NEED_DELAY.

Change-Id: Ic2a2f252e72a0bbce51e2863f8e46647b1570ba5
Signed-off-by: Bill XIE <persmule@gmail.com>
Reviewed-on: https://review.coreboot.org/25322
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Bill XIE 2018-03-22 17:07:43 +08:00 committed by Philipp Deppenwiese
parent c8412ed1f9
commit a4bf0b7cd1
2 changed files with 17 additions and 0 deletions

View File

@ -46,3 +46,12 @@ config TPM_DEACTIVATE
depends on LPC_TPM
help
Deactivate TPM by issuing deactivate command.
config TPM_RDRESP_NEED_DELAY
bool "Enable Delay Workaround for TPM"
default n
depends on LPC_TPM
help
Certain TPMs seem to need some delay when reading response
to work around a race-condition-related issue, possibly
caused by ill-programmed TPM firmware.

View File

@ -595,6 +595,14 @@ static u32 tis_readresponse(u8 *buffer, size_t *len)
if (offset == expected_count)
break; /* We got all we need */
/*
* Certain TPMs seem to need some delay between tis_wait_valid()
* and tis_has_valid_data(), or some race-condition-related
* issue will occur.
*/
if (IS_ENABLED(CONFIG_TPM_RDRESP_NEED_DELAY))
udelay(10);
} while (tis_has_valid_data(locality));
/* * Make sure we indeed read all there was. */