summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2016-03-14 13:49:55 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-03-14 20:11:30 -0700
commit06d3155c51c5024be567ad5a2f5bc3a76141176f (patch)
tree678c4668842a227ed47ae8567122520c24ff6c7e
parent395a2840040d9688b49b4c30ebee9daa7e0abe8b (diff)
downloadchrome-ec-06d3155c51c5024be567ad5a2f5bc3a76141176f.tar.gz
cr50: trng: handle (unlikely) TRNG timeout
It turns out TRNG could turn idle under certain circumstances, and needs to be restarted in that case. This code adds a check for the idle state and necessary recovery. BRANCH=none BUG=b:27646393 TEST=none yet Change-Id: Ibd0a13f40f5ce081d4211b2c0f1026468967f826 Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/332573 Reviewed-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r--chip/g/trng.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/chip/g/trng.c b/chip/g/trng.c
index b6a062d58d..a7dbcf4455 100644
--- a/chip/g/trng.c
+++ b/chip/g/trng.c
@@ -16,8 +16,14 @@ void init_trng(void)
uint32_t rand(void)
{
- while (GREAD(TRNG, EMPTY))
- ;
+ while (GREAD(TRNG, EMPTY)) {
+ if (!GREAD_FIELD(TRNG, FSM_STATE, FSM_IDLE))
+ continue;
+
+ /* TRNG must have stopped, needs to be restarted. */
+ GWRITE(TRNG, STOP_WORK, 1);
+ init_trng();
+ }
return GREAD(TRNG, READ_DATA);
}