| // SPDX-License-Identifier: GPL-2.0-or-later | |
| /* | |
| * Copyright (c) 2019, Linaro Limited | |
| */ | |
| #include <common.h> | |
| #include <dm.h> | |
| #include <rng.h> | |
| #include <linux/string.h> | |
| static int sandbox_rng_read(struct udevice *dev, void *data, size_t len) | |
| { | |
| unsigned int i, seed, random; | |
| unsigned char *buf = data; | |
| size_t nrem, nloops; | |
| if (!len) | |
| return 0; | |
| nloops = len / sizeof(random); | |
| seed = get_timer(0) ^ rand(); | |
| srand(seed); | |
| for (i = 0, nrem = len; i < nloops; i++) { | |
| random = rand(); | |
| memcpy(buf, &random, sizeof(random)); | |
| buf += sizeof(random); | |
| nrem -= sizeof(random); | |
| } | |
| if (nrem) { | |
| random = rand(); | |
| memcpy(buf, &random, nrem); | |
| } | |
| return 0; | |
| } | |
| static const struct dm_rng_ops sandbox_rng_ops = { | |
| .read = sandbox_rng_read, | |
| }; | |
| static const struct udevice_id sandbox_rng_match[] = { | |
| { | |
| .compatible = "sandbox,sandbox-rng", | |
| }, | |
| {}, | |
| }; | |
| U_BOOT_DRIVER(sandbox_rng) = { | |
| .name = "sandbox-rng", | |
| .id = UCLASS_RNG, | |
| .of_match = sandbox_rng_match, | |
| .ops = &sandbox_rng_ops, | |
| }; |