efi_setup.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * EFI setup code
  4. *
  5. * Copyright (c) 2016-2018 Alexander Graf et al.
  6. */
  7. #include <common.h>
  8. #include <bootm.h>
  9. #include <efi_loader.h>
  10. #define OBJ_LIST_NOT_INITIALIZED 1
  11. efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
  12. /*
  13. * Allow unaligned memory access.
  14. *
  15. * This routine is overridden by architectures providing this feature.
  16. */
  17. void __weak allow_unaligned(void)
  18. {
  19. }
  20. /**
  21. * efi_init_platform_lang() - define supported languages
  22. *
  23. * Set the PlatformLangCodes and PlatformLang variables.
  24. *
  25. * Return: status code
  26. */
  27. static efi_status_t efi_init_platform_lang(void)
  28. {
  29. efi_status_t ret;
  30. efi_uintn_t data_size = 0;
  31. char *lang = CONFIG_EFI_PLATFORM_LANG_CODES;
  32. char *pos;
  33. /*
  34. * Variable PlatformLangCodes defines the language codes that the
  35. * machine can support.
  36. */
  37. ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
  38. &efi_global_variable_guid,
  39. EFI_VARIABLE_BOOTSERVICE_ACCESS |
  40. EFI_VARIABLE_RUNTIME_ACCESS,
  41. sizeof(CONFIG_EFI_PLATFORM_LANG_CODES),
  42. CONFIG_EFI_PLATFORM_LANG_CODES));
  43. if (ret != EFI_SUCCESS)
  44. goto out;
  45. /*
  46. * Variable PlatformLang defines the language that the machine has been
  47. * configured for.
  48. */
  49. ret = EFI_CALL(efi_get_variable(L"PlatformLang",
  50. &efi_global_variable_guid,
  51. NULL, &data_size, &pos));
  52. if (ret == EFI_BUFFER_TOO_SMALL) {
  53. /* The variable is already set. Do not change it. */
  54. ret = EFI_SUCCESS;
  55. goto out;
  56. }
  57. /*
  58. * The list of supported languages is semicolon separated. Use the first
  59. * language to initialize PlatformLang.
  60. */
  61. pos = strchr(lang, ';');
  62. if (pos)
  63. *pos = 0;
  64. ret = EFI_CALL(efi_set_variable(L"PlatformLang",
  65. &efi_global_variable_guid,
  66. EFI_VARIABLE_NON_VOLATILE |
  67. EFI_VARIABLE_BOOTSERVICE_ACCESS |
  68. EFI_VARIABLE_RUNTIME_ACCESS,
  69. 1 + strlen(lang), lang));
  70. out:
  71. if (ret != EFI_SUCCESS)
  72. printf("EFI: cannot initialize platform language settings\n");
  73. return ret;
  74. }
  75. #ifdef CONFIG_EFI_SECURE_BOOT
  76. /**
  77. * efi_init_secure_boot - initialize secure boot state
  78. *
  79. * Return: status code
  80. */
  81. static efi_status_t efi_init_secure_boot(void)
  82. {
  83. efi_guid_t signature_types[] = {
  84. EFI_CERT_SHA256_GUID,
  85. EFI_CERT_X509_GUID,
  86. };
  87. efi_status_t ret;
  88. /* TODO: read-only */
  89. ret = EFI_CALL(efi_set_variable(L"SignatureSupport",
  90. &efi_global_variable_guid,
  91. EFI_VARIABLE_BOOTSERVICE_ACCESS
  92. | EFI_VARIABLE_RUNTIME_ACCESS,
  93. sizeof(signature_types),
  94. &signature_types));
  95. if (ret != EFI_SUCCESS)
  96. printf("EFI: cannot initialize SignatureSupport variable\n");
  97. return ret;
  98. }
  99. #else
  100. static efi_status_t efi_init_secure_boot(void)
  101. {
  102. return EFI_SUCCESS;
  103. }
  104. #endif /* CONFIG_EFI_SECURE_BOOT */
  105. /**
  106. * efi_init_obj_list() - Initialize and populate EFI object list
  107. *
  108. * Return: status code
  109. */
  110. efi_status_t efi_init_obj_list(void)
  111. {
  112. u64 os_indications_supported = 0; /* None */
  113. efi_status_t ret = EFI_SUCCESS;
  114. /* Initialize once only */
  115. if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
  116. return efi_obj_list_initialized;
  117. /* Allow unaligned memory access */
  118. allow_unaligned();
  119. /* On ARM switch from EL3 or secure mode to EL2 or non-secure mode */
  120. switch_to_non_secure_mode();
  121. /* Initialize root node */
  122. ret = efi_root_node_register();
  123. if (ret != EFI_SUCCESS)
  124. goto out;
  125. ret = efi_console_register();
  126. if (ret != EFI_SUCCESS)
  127. goto out;
  128. #ifdef CONFIG_PARTITIONS
  129. ret = efi_disk_register();
  130. if (ret != EFI_SUCCESS)
  131. goto out;
  132. #endif
  133. /* Initialize variable services */
  134. ret = efi_init_variables();
  135. if (ret != EFI_SUCCESS)
  136. goto out;
  137. /* Define supported languages */
  138. ret = efi_init_platform_lang();
  139. if (ret != EFI_SUCCESS)
  140. goto out;
  141. /* Indicate supported features */
  142. ret = EFI_CALL(efi_set_variable(L"OsIndicationsSupported",
  143. &efi_global_variable_guid,
  144. EFI_VARIABLE_BOOTSERVICE_ACCESS |
  145. EFI_VARIABLE_RUNTIME_ACCESS,
  146. sizeof(os_indications_supported),
  147. &os_indications_supported));
  148. if (ret != EFI_SUCCESS)
  149. goto out;
  150. /* Initialize system table */
  151. ret = efi_initialize_system_table();
  152. if (ret != EFI_SUCCESS)
  153. goto out;
  154. /* Secure boot */
  155. ret = efi_init_secure_boot();
  156. if (ret != EFI_SUCCESS)
  157. goto out;
  158. /* Indicate supported runtime services */
  159. ret = efi_init_runtime_supported();
  160. if (ret != EFI_SUCCESS)
  161. goto out;
  162. /* Initialize EFI driver uclass */
  163. ret = efi_driver_init();
  164. if (ret != EFI_SUCCESS)
  165. goto out;
  166. #if defined(CONFIG_LCD) || defined(CONFIG_DM_VIDEO)
  167. ret = efi_gop_register();
  168. if (ret != EFI_SUCCESS)
  169. goto out;
  170. #endif
  171. #ifdef CONFIG_EFI_LOAD_FILE2_INITRD
  172. ret = efi_initrd_register();
  173. if (ret != EFI_SUCCESS)
  174. goto out;
  175. #endif
  176. #ifdef CONFIG_NET
  177. ret = efi_net_register();
  178. if (ret != EFI_SUCCESS)
  179. goto out;
  180. #endif
  181. #ifdef CONFIG_GENERATE_ACPI_TABLE
  182. ret = efi_acpi_register();
  183. if (ret != EFI_SUCCESS)
  184. goto out;
  185. #endif
  186. #ifdef CONFIG_GENERATE_SMBIOS_TABLE
  187. ret = efi_smbios_register();
  188. if (ret != EFI_SUCCESS)
  189. goto out;
  190. #endif
  191. ret = efi_watchdog_register();
  192. if (ret != EFI_SUCCESS)
  193. goto out;
  194. /* Initialize EFI runtime services */
  195. ret = efi_reset_system_init();
  196. if (ret != EFI_SUCCESS)
  197. goto out;
  198. out:
  199. efi_obj_list_initialized = ret;
  200. return ret;
  201. }