From 02915f491f1621df97de8b1829ffebe62f8de0fe Mon Sep 17 00:00:00 2001 From: Marius Schilder Date: Wed, 5 Oct 2016 19:29:54 -0700 Subject: [PATCH] Update TRNG handling. Enable post processing and churn. Slice low 2 bits. Increase timeout and retry counters. BRANCH=none BUG=none TEST=tcg_tests pass Change-Id: I3a8a6d14d4b113fb6831a5c8b253e5544ce70f8e Reviewed-on: https://chromium-review.googlesource.com/394130 Commit-Ready: Marius Schilder Tested-by: Marius Schilder Reviewed-by: Marius Schilder Reviewed-by: William Wesson Reviewed-by: Bill Richardson --- chip/g/trng.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/chip/g/trng.c b/chip/g/trng.c index a7dbcf4455..02472f46ef 100644 --- a/chip/g/trng.c +++ b/chip/g/trng.c @@ -7,22 +7,25 @@ void init_trng(void) { + GWRITE(TRNG, POST_PROCESSING_CTRL, + GC_TRNG_POST_PROCESSING_CTRL_SHUFFLE_BITS_MASK | + GC_TRNG_POST_PROCESSING_CTRL_CHURN_MODE_MASK); + GWRITE(TRNG, SLICE_MAX_UPPER_LIMIT, 1); + GWRITE(TRNG, SLICE_MIN_LOWER_LIMIT, 0); + GWRITE(TRNG, TIMEOUT_COUNTER, 0x7ff); + GWRITE(TRNG, TIMEOUT_MAX_TRY_NUM, 4); GWRITE(TRNG, POWER_DOWN_B, 1); GWRITE(TRNG, GO_EVENT, 1); - while (GREAD(TRNG, EMPTY)) - ; - GREAD(TRNG, READ_DATA); } uint32_t rand(void) { 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(); + if (GREAD_FIELD(TRNG, FSM_STATE, FSM_TIMEOUT)) { + /* TRNG timed out, restart */ + GWRITE(TRNG, STOP_WORK, 1); + GWRITE(TRNG, GO_EVENT, 1); + } } return GREAD(TRNG, READ_DATA); }