efi_setup.c 5.4 KB

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