On Fri, Mar 04, 2022 at 07:04:27PM +0530, Sughosh Ganu wrote:
> The 'rng' u-boot command is used for printing a select number of
> random bytes on the console. Currently, the RNG device from which the
> random bytes are read is fixed. However, a platform can have multiple
> RNG devices, one example being qemu, which has a virtio RNG device and
> the RNG pseudo device through the TPM chip.
> 
> Extend the 'rng' command so that the user can provide the RNG device
> number from which the random bytes are to be read. This will be the
> device index under the RNG uclass.
> 
> Signed-off-by: Sughosh Ganu <sughosh.g...@linaro.org>
> Tested-by: Heinrich Schuchardt <xypron.g...@gmx.de>
> ---
> 
> Changes since V2: None
> 
>  cmd/rng.c | 31 +++++++++++++++++++++++--------
>  1 file changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/cmd/rng.c b/cmd/rng.c
> index 1ad5a096c0..bb89cfa784 100644
> --- a/cmd/rng.c
> +++ b/cmd/rng.c
> @@ -13,19 +13,34 @@
>  
>  static int do_rng(struct cmd_tbl *cmdtp, int flag, int argc, char *const 
> argv[])
>  {
> -     size_t n = 0x40;
> +     size_t n;
>       struct udevice *dev;
>       void *buf;
> +     int devnum;
>       int ret = CMD_RET_SUCCESS;
>  
> -     if (uclass_get_device(UCLASS_RNG, 0, &dev) || !dev) {
> +     switch (argc) {
> +     case 1:
> +             devnum = 0;
> +             n = 0x40;
> +             break;
> +     case 2:
> +             devnum = hextoul(argv[1], NULL);
> +             n = 0x40;
> +             break;
> +     case 3:
> +             devnum = hextoul(argv[1], NULL);
> +             n = hextoul(argv[2], NULL);
> +             break;
> +     default:
> +             return CMD_RET_USAGE;
> +     }
> +
> +     if (uclass_get_device(UCLASS_RNG, devnum, &dev) || !dev) {
>               printf("No RNG device\n");
>               return CMD_RET_FAILURE;
>       }
>  
> -     if (argc >= 2)
> -             n = hextoul(argv[1], NULL);
> -
>       buf = malloc(n);
>       if (!buf) {
>               printf("Out of memory\n");
> @@ -46,12 +61,12 @@ static int do_rng(struct cmd_tbl *cmdtp, int flag, int 
> argc, char *const argv[])
>  
>  #ifdef CONFIG_SYS_LONGHELP
>  static char rng_help_text[] =
> -     "[n]\n"
> -     "  - print n random bytes\n";
> +     "[dev [n]]\n"
> +     "  - print n random bytes read from dev\n";
>  #endif
>  
>  U_BOOT_CMD(
> -     rng, 2, 0, do_rng,
> +     rng, 3, 0, do_rng,
>       "print bytes from the hardware random number generator",
>       rng_help_text
>  );
> -- 
> 2.25.1
> 
Reviewed-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>

Reply via email to