180815f84SMichael Wildt /* SPDX-License-Identifier: BSD-3-Clause 2*e6e8f03eSRandy Schacher * Copyright(c) 2019-2023 Broadcom 380815f84SMichael Wildt * All rights reserved. 480815f84SMichael Wildt */ 580815f84SMichael Wildt 680815f84SMichael Wildt /* Random Number Functions */ 780815f84SMichael Wildt 880815f84SMichael Wildt #include <stdio.h> 980815f84SMichael Wildt #include <stdint.h> 1080815f84SMichael Wildt #include "rand.h" 1180815f84SMichael Wildt 1280815f84SMichael Wildt #define TF_RAND_LFSR_INIT_VALUE 0xACE1u 1380815f84SMichael Wildt 1480815f84SMichael Wildt uint16_t lfsr = TF_RAND_LFSR_INIT_VALUE; 1580815f84SMichael Wildt uint32_t bit; 1680815f84SMichael Wildt 1780815f84SMichael Wildt /** 1880815f84SMichael Wildt * Generates a 16 bit pseudo random number 1980815f84SMichael Wildt * 2080815f84SMichael Wildt * Returns: 2180815f84SMichael Wildt * uint16_t number 2280815f84SMichael Wildt */ rand16(void)2380815f84SMichael Wildtuint16_t rand16(void) 2480815f84SMichael Wildt { 2580815f84SMichael Wildt bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5)) & 1; 2680815f84SMichael Wildt return lfsr = (lfsr >> 1) | (bit << 15); 2780815f84SMichael Wildt } 2880815f84SMichael Wildt 2980815f84SMichael Wildt /** 3080815f84SMichael Wildt * Generates a 32 bit pseudo random number 3180815f84SMichael Wildt * 3280815f84SMichael Wildt * Returns: 3380815f84SMichael Wildt * uint32_t number 3480815f84SMichael Wildt */ rand32(void)3580815f84SMichael Wildtuint32_t rand32(void) 3680815f84SMichael Wildt { 3780815f84SMichael Wildt return (rand16() << 16) | rand16(); 3880815f84SMichael Wildt } 3980815f84SMichael Wildt 4080815f84SMichael Wildt /** 4180815f84SMichael Wildt * Resets the seed used by the pseudo random number generator 4280815f84SMichael Wildt */ rand_init(void)4380815f84SMichael Wildtvoid rand_init(void) 4480815f84SMichael Wildt { 4580815f84SMichael Wildt lfsr = TF_RAND_LFSR_INIT_VALUE; 4680815f84SMichael Wildt bit = 0; 4780815f84SMichael Wildt } 48