1e4fbf476SArd Biesheuvel /*
2e4fbf476SArd Biesheuvel  * Copyright (C) 2016 Linaro Ltd;  <ard.biesheuvel@linaro.org>
3e4fbf476SArd Biesheuvel  *
4e4fbf476SArd Biesheuvel  * This program is free software; you can redistribute it and/or modify
5e4fbf476SArd Biesheuvel  * it under the terms of the GNU General Public License version 2 as
6e4fbf476SArd Biesheuvel  * published by the Free Software Foundation.
7e4fbf476SArd Biesheuvel  *
8e4fbf476SArd Biesheuvel  */
9e4fbf476SArd Biesheuvel 
10e4fbf476SArd Biesheuvel #include <linux/efi.h>
11e4fbf476SArd Biesheuvel #include <asm/efi.h>
12e4fbf476SArd Biesheuvel 
13e4fbf476SArd Biesheuvel #include "efistub.h"
14e4fbf476SArd Biesheuvel 
15e4fbf476SArd Biesheuvel struct efi_rng_protocol {
16e4fbf476SArd Biesheuvel 	efi_status_t (*get_info)(struct efi_rng_protocol *,
17e4fbf476SArd Biesheuvel 				 unsigned long *, efi_guid_t *);
18e4fbf476SArd Biesheuvel 	efi_status_t (*get_rng)(struct efi_rng_protocol *,
19e4fbf476SArd Biesheuvel 				efi_guid_t *, unsigned long, u8 *out);
20e4fbf476SArd Biesheuvel };
21e4fbf476SArd Biesheuvel 
22e4fbf476SArd Biesheuvel efi_status_t efi_get_random_bytes(efi_system_table_t *sys_table_arg,
23e4fbf476SArd Biesheuvel 				  unsigned long size, u8 *out)
24e4fbf476SArd Biesheuvel {
25e4fbf476SArd Biesheuvel 	efi_guid_t rng_proto = EFI_RNG_PROTOCOL_GUID;
26e4fbf476SArd Biesheuvel 	efi_status_t status;
27e4fbf476SArd Biesheuvel 	struct efi_rng_protocol *rng;
28e4fbf476SArd Biesheuvel 
29e4fbf476SArd Biesheuvel 	status = efi_call_early(locate_protocol, &rng_proto, NULL,
30e4fbf476SArd Biesheuvel 				(void **)&rng);
31e4fbf476SArd Biesheuvel 	if (status != EFI_SUCCESS)
32e4fbf476SArd Biesheuvel 		return status;
33e4fbf476SArd Biesheuvel 
34e4fbf476SArd Biesheuvel 	return rng->get_rng(rng, NULL, size, out);
35e4fbf476SArd Biesheuvel }
36