diff options
Diffstat (limited to 'plat/arm/board/juno/juno_trng.c')
-rw-r--r-- | plat/arm/board/juno/juno_trng.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/plat/arm/board/juno/juno_trng.c b/plat/arm/board/juno/juno_trng.c index b38e49f45..09552a608 100644 --- a/plat/arm/board/juno/juno_trng.c +++ b/plat/arm/board/juno/juno_trng.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include <arm_acle.h> #include <assert.h> #include <stdbool.h> #include <stdint.h> @@ -13,7 +14,11 @@ #include <lib/utils_def.h> #include <platform_def.h> -#include "juno_decl.h" +#include <lib/smccc.h> +#include <services/trng_svc.h> +#include <smccc_helpers.h> + +#include <plat/common/platform.h> #define NSAMPLE_CLOCKS 1 /* min 1 cycle, max 231 cycles */ #define NRETRIES 5 @@ -35,18 +40,24 @@ static bool output_valid(void) return false; /* No output data available. */ } +DEFINE_SVC_UUID2(_plat_trng_uuid, + 0x23523c58, 0x7448, 0x4083, 0x9d, 0x16, + 0xe3, 0xfa, 0xb9, 0xf1, 0x73, 0xbc +); +uuid_t plat_trng_uuid; + +static uint32_t crc_value = ~0U; + /* - * This function fills `buf` with 8 bytes of entropy. - * It uses the Trusted Entropy Source peripheral on Juno. - * Returns 'true' when the buffer has been filled with entropy - * successfully, or 'false' otherwise. + * Uses the Trusted Entropy Source peripheral on Juno to return 8 bytes of + * entropy. Returns 'true' when done successfully, 'false' otherwise. */ -bool juno_getentropy(uint64_t *buf) +bool plat_get_entropy(uint64_t *out) { uint64_t ret; - assert(buf); - assert(!check_uptr_overflow((uintptr_t)buf, sizeof(*buf))); + assert(out); + assert(!check_uptr_overflow((uintptr_t)out, sizeof(*out))); if (!juno_trng_initialized) { /* Disable interrupt mode. */ @@ -69,14 +80,14 @@ bool juno_getentropy(uint64_t *buf) return false; } - /* XOR each two 32-bit registers together, combine the pairs */ - ret = mmio_read_32(TRNG_BASE + 0); - ret ^= mmio_read_32(TRNG_BASE + 4); - ret <<= 32; + /* CRC each two 32-bit registers together, combine the pairs */ + crc_value = __crc32w(crc_value, mmio_read_32(TRNG_BASE + 0)); + crc_value = __crc32w(crc_value, mmio_read_32(TRNG_BASE + 4)); + ret = (uint64_t)crc_value << 32; - ret |= mmio_read_32(TRNG_BASE + 8); - ret ^= mmio_read_32(TRNG_BASE + 12); - *buf = ret; + crc_value = __crc32w(crc_value, mmio_read_32(TRNG_BASE + 8)); + crc_value = __crc32w(crc_value, mmio_read_32(TRNG_BASE + 12)); + *out = ret | crc_value; /* Acknowledge current cycle, clear output registers. */ mmio_write_32(TRNG_BASE + TRNG_STATUS, 1); @@ -85,3 +96,13 @@ bool juno_getentropy(uint64_t *buf) return true; } + +void plat_entropy_setup(void) +{ + uint64_t dummy; + + plat_trng_uuid = _plat_trng_uuid; + + /* Initialise the entropy source and trigger RNG generation */ + plat_get_entropy(&dummy); +} |