efi_setup.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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. /* Initialize variable services */
  141. ret = efi_init_variables();
  142. if (ret != EFI_SUCCESS)
  143. goto out;
  144. /* Define supported languages */
  145. ret = efi_init_platform_lang();
  146. if (ret != EFI_SUCCESS)
  147. goto out;
  148. /* Indicate supported features */
  149. ret = efi_set_variable_int(L"OsIndicationsSupported",
  150. &efi_global_variable_guid,
  151. EFI_VARIABLE_BOOTSERVICE_ACCESS |
  152. EFI_VARIABLE_RUNTIME_ACCESS |
  153. EFI_VARIABLE_READ_ONLY,
  154. sizeof(os_indications_supported),
  155. &os_indications_supported, false);
  156. if (ret != EFI_SUCCESS)
  157. goto out;
  158. /* Initialize system table */
  159. ret = efi_initialize_system_table();
  160. if (ret != EFI_SUCCESS)
  161. goto out;
  162. /* Secure boot */
  163. ret = efi_init_secure_boot();
  164. if (ret != EFI_SUCCESS)
  165. goto out;
  166. /* Indicate supported runtime services */
  167. ret = efi_init_runtime_supported();
  168. if (ret != EFI_SUCCESS)
  169. goto out;
  170. /* Initialize EFI driver uclass */
  171. ret = efi_driver_init();
  172. if (ret != EFI_SUCCESS)
  173. goto out;
  174. #if defined(CONFIG_LCD) || defined(CONFIG_DM_VIDEO)
  175. ret = efi_gop_register();
  176. if (ret != EFI_SUCCESS)
  177. goto out;
  178. #endif
  179. #ifdef CONFIG_EFI_LOAD_FILE2_INITRD
  180. ret = efi_initrd_register();
  181. if (ret != EFI_SUCCESS)
  182. goto out;
  183. #endif
  184. #ifdef CONFIG_NET
  185. ret = efi_net_register();
  186. if (ret != EFI_SUCCESS)
  187. goto out;
  188. #endif
  189. #ifdef CONFIG_GENERATE_ACPI_TABLE
  190. ret = efi_acpi_register();
  191. if (ret != EFI_SUCCESS)
  192. goto out;
  193. #endif
  194. #ifdef CONFIG_GENERATE_SMBIOS_TABLE
  195. ret = efi_smbios_register();
  196. if (ret != EFI_SUCCESS)
  197. goto out;
  198. #endif
  199. ret = efi_watchdog_register();
  200. if (ret != EFI_SUCCESS)
  201. goto out;
  202. /* Initialize EFI runtime services */
  203. ret = efi_reset_system_init();
  204. if (ret != EFI_SUCCESS)
  205. goto out;
  206. out:
  207. efi_obj_list_initialized = ret;
  208. return ret;
  209. }