summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2019-08-14 18:45:02 -0700
committerCommit Bot <commit-bot@chromium.org>2019-10-01 06:15:48 +0000
commit4805196e894a73a2a1285f1cd622d160ad248f77 (patch)
tree11f055890aad15fb87f079023132147678b91ed7
parent24996f6911bd12eacc927f991ea169bad4c7c1f9 (diff)
downloadchrome-ec-4805196e894a73a2a1285f1cd622d160ad248f77.tar.gz
cr50: debounce successive TPM reset pulses
Some platforms generate more than one pulse when resetting, many Intel SOCs generate two pulses, some other chips could go even higher. TPM reset on Cr50 is processed asynchronously, repetitive pulses result in multiple reset processing cycles.In case pulses are coming too soon one after another this could cause some race conditions. Let's ignore repetitive reset pulses unless there has been an attempt by the host to read a register (which is usually the very first action of the AP when booting up). BRANCH=cr50, cr50-mp BUG=none TEST=observed that only one reset is happening on an Octopus device, while there are two pulses present on the PLT_RST_L line. Verified proper reboot multiple times in a row. Change-Id: Ie1b124d41be0388bd8e12d0084827782de62cfa0 Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1755059 Reviewed-by: Mary Ruthven <mruthven@chromium.org>
-rw-r--r--common/tpm_registers.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/common/tpm_registers.c b/common/tpm_registers.c
index f228503e7a..6a57fa814f 100644
--- a/common/tpm_registers.c
+++ b/common/tpm_registers.c
@@ -424,9 +424,6 @@ void tpm_register_put(uint32_t regaddr, const uint8_t *data, uint32_t data_size)
{
uint32_t i;
- if (reset_in_progress)
- return;
-
CPRINTF("%s(0x%03x, %d,", __func__, regaddr, data_size);
for (i = 0; i < data_size && i < 4; i++)
CPRINTF(" %02x", data[i]);
@@ -498,6 +495,8 @@ void tpm_register_get(uint32_t regaddr, uint8_t *dest, uint32_t data_size)
{
int i;
+ reset_in_progress = 0;
+
CPRINTF("%s(0x%06x, %d)", __func__, regaddr, data_size);
switch (regaddr) {
case TPM_DID_VID:
@@ -890,8 +889,6 @@ static void tpm_reset_now(int wipe_first)
*/
hook_call_deferred(&reinstate_nvmem_commits_data, 3 * SECOND);
- reset_in_progress = 0;
-
/*
* In chip factory mode SPI idle byte sent on MISO is used for
* progress reporting. TPM flow control messes it up, do not start TPM