]>
Commit | Line | Data |
---|---|---|
16c220d0 SG |
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 | } |