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