xref: /dpdk/drivers/net/bnxt/tf_core/rand.c (revision e6e8f03e5459f25153f1e4cd3e9ac30d3e473a61)
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 Wildt uint16_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 Wildt uint32_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 Wildt void rand_init(void)
4480815f84SMichael Wildt {
4580815f84SMichael Wildt 	lfsr = TF_RAND_LFSR_INIT_VALUE;
4680815f84SMichael Wildt 	bit = 0;
4780815f84SMichael Wildt }
48