diff options
author | Vadim Bendebury <vbendeb@chromium.org> | 2016-03-14 13:49:55 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-03-14 20:11:30 -0700 |
commit | 06d3155c51c5024be567ad5a2f5bc3a76141176f (patch) | |
tree | 678c4668842a227ed47ae8567122520c24ff6c7e | |
parent | 395a2840040d9688b49b4c30ebee9daa7e0abe8b (diff) | |
download | chrome-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.c | 10 |
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); } |