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