1 /* 2 * Copyright (c) 2015 Google, Inc 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 * 6 * Access to the EFI information table 7 */ 8 9 #include <common.h> 10 #include <efi.h> 11 #include <errno.h> 12 #include <mapmem.h> 13 14 int efi_info_get(enum efi_entry_t type, void **datap, int *sizep) 15 { 16 struct efi_entry_hdr *entry; 17 struct efi_info_hdr *info; 18 int ret; 19 20 if (!gd->arch.table) 21 return -ENODATA; 22 23 info = map_sysmem(gd->arch.table, 0); 24 if (info->version != EFI_TABLE_VERSION) { 25 ret = -EPROTONOSUPPORT; 26 goto err; 27 } 28 29 entry = (struct efi_entry_hdr *)((ulong)info + info->hdr_size); 30 while (entry->type != EFIET_END) { 31 if (entry->type == type) { 32 if (entry->addr) 33 *datap = map_sysmem(entry->addr, entry->size); 34 else 35 *datap = entry + 1; 36 *sizep = entry->size; 37 return 0; 38 } 39 entry = (struct efi_entry_hdr *)((ulong)entry + entry->link); 40 } 41 42 ret = -ENOENT; 43 err: 44 unmap_sysmem(info); 45 46 return ret; 47 } 48