efi_info.c 902 B

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