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