efi_info.c 931 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. #include <asm/global_data.h>
  12. int efi_info_get(enum efi_entry_t type, void **datap, int *sizep)
  13. {
  14. struct efi_entry_hdr *entry;
  15. struct efi_info_hdr *info;
  16. int ret;
  17. if (!gd->arch.table)
  18. return -ENODATA;
  19. info = map_sysmem(gd->arch.table, 0);
  20. if (info->version != EFI_TABLE_VERSION) {
  21. ret = -EPROTONOSUPPORT;
  22. goto err;
  23. }
  24. entry = (struct efi_entry_hdr *)((ulong)info + info->hdr_size);
  25. while (entry->type != EFIET_END) {
  26. if (entry->type == type) {
  27. if (entry->addr)
  28. *datap = map_sysmem(entry->addr, entry->size);
  29. else
  30. *datap = entry + 1;
  31. *sizep = entry->size;
  32. return 0;
  33. }
  34. entry = (struct efi_entry_hdr *)((ulong)entry + entry->link);
  35. }
  36. ret = -ENOENT;
  37. err:
  38. unmap_sysmem(info);
  39. return ret;
  40. }