sandbox: rng: Add a random number generator(rng) driver
[oweals/u-boot.git] / drivers / rng / sandbox_rng.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) 2019, Linaro Limited
4  */
5
6 #include <common.h>
7 #include <dm.h>
8 #include <rng.h>
9
10 #include <linux/string.h>
11
12 static int sandbox_rng_read(struct udevice *dev, void *data, size_t len)
13 {
14         unsigned int i, seed, random;
15         unsigned char *buf = data;
16         size_t nrem, nloops;
17
18         if (!len)
19                 return 0;
20
21         nloops = len / sizeof(random);
22         seed = get_timer(0) ^ rand();
23         srand(seed);
24
25         for (i = 0, nrem = len; i < nloops; i++) {
26                 random = rand();
27                 memcpy(buf, &random, sizeof(random));
28                 buf += sizeof(random);
29                 nrem -= sizeof(random);
30         }
31
32         if (nrem) {
33                 random = rand();
34                 memcpy(buf, &random, nrem);
35         }
36
37         return 0;
38 }
39
40 static const struct dm_rng_ops sandbox_rng_ops = {
41         .read = sandbox_rng_read,
42 };
43
44 static const struct udevice_id sandbox_rng_match[] = {
45         {
46                 .compatible = "sandbox,sandbox-rng",
47         },
48         {},
49 };
50
51 U_BOOT_DRIVER(sandbox_rng) = {
52         .name = "sandbox-rng",
53         .id = UCLASS_RNG,
54         .of_match = sandbox_rng_match,
55         .ops = &sandbox_rng_ops,
56 };