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 Glassint 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