efi_setup.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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 <efi_loader.h>
  9. #define OBJ_LIST_NOT_INITIALIZED 1
  10. static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
  11. /**
  12. * efi_init_platform_lang() - define supported languages
  13. *
  14. * Set the PlatformLangCodes and PlatformLang variables.
  15. *
  16. * Return: status code
  17. */
  18. static efi_status_t efi_init_platform_lang(void)
  19. {
  20. efi_status_t ret;
  21. efi_uintn_t data_size = 0;
  22. char *lang = CONFIG_EFI_PLATFORM_LANG_CODES;
  23. char *pos;
  24. /*
  25. * Variable PlatformLangCodes defines the language codes that the
  26. * machine can support.
  27. */
  28. ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
  29. &efi_global_variable_guid,
  30. EFI_VARIABLE_BOOTSERVICE_ACCESS |
  31. EFI_VARIABLE_RUNTIME_ACCESS,
  32. sizeof(CONFIG_EFI_PLATFORM_LANG_CODES),
  33. CONFIG_EFI_PLATFORM_LANG_CODES));
  34. if (ret != EFI_SUCCESS)
  35. goto out;
  36. /*
  37. * Variable PlatformLang defines the language that the machine has been
  38. * configured for.
  39. */
  40. ret = EFI_CALL(efi_get_variable(L"PlatformLang",
  41. &efi_global_variable_guid,
  42. NULL, &data_size, &pos));
  43. if (ret == EFI_BUFFER_TOO_SMALL) {
  44. /* The variable is already set. Do not change it. */
  45. ret = EFI_SUCCESS;
  46. goto out;
  47. }
  48. /*
  49. * The list of supported languages is semicolon separated. Use the first
  50. * language to initialize PlatformLang.
  51. */
  52. pos = strchr(lang, ';');
  53. if (pos)
  54. *pos = 0;
  55. ret = EFI_CALL(efi_set_variable(L"PlatformLang",
  56. &efi_global_variable_guid,
  57. EFI_VARIABLE_NON_VOLATILE |
  58. EFI_VARIABLE_BOOTSERVICE_ACCESS |
  59. EFI_VARIABLE_RUNTIME_ACCESS,
  60. 1 + strlen(lang), lang));
  61. out:
  62. if (ret != EFI_SUCCESS)
  63. printf("EFI: cannot initialize platform language settings\n");
  64. return ret;
  65. }
  66. /**
  67. * efi_init_obj_list() - Initialize and populate EFI object list
  68. *
  69. * Return: status code
  70. */
  71. efi_status_t efi_init_obj_list(void)
  72. {
  73. efi_status_t ret = EFI_SUCCESS;
  74. /* Initialize once only */
  75. if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
  76. return efi_obj_list_initialized;
  77. /* Define supported languages */
  78. ret = efi_init_platform_lang();
  79. if (ret != EFI_SUCCESS)
  80. goto out;
  81. /* Initialize system table */
  82. ret = efi_initialize_system_table();
  83. if (ret != EFI_SUCCESS)
  84. goto out;
  85. /* Initialize root node */
  86. ret = efi_root_node_register();
  87. if (ret != EFI_SUCCESS)
  88. goto out;
  89. /* Initialize EFI driver uclass */
  90. ret = efi_driver_init();
  91. if (ret != EFI_SUCCESS)
  92. goto out;
  93. ret = efi_console_register();
  94. if (ret != EFI_SUCCESS)
  95. goto out;
  96. #ifdef CONFIG_PARTITIONS
  97. ret = efi_disk_register();
  98. if (ret != EFI_SUCCESS)
  99. goto out;
  100. #endif
  101. #if defined(CONFIG_LCD) || defined(CONFIG_DM_VIDEO)
  102. ret = efi_gop_register();
  103. if (ret != EFI_SUCCESS)
  104. goto out;
  105. #endif
  106. #ifdef CONFIG_NET
  107. ret = efi_net_register();
  108. if (ret != EFI_SUCCESS)
  109. goto out;
  110. #endif
  111. #ifdef CONFIG_GENERATE_ACPI_TABLE
  112. ret = efi_acpi_register();
  113. if (ret != EFI_SUCCESS)
  114. goto out;
  115. #endif
  116. #ifdef CONFIG_GENERATE_SMBIOS_TABLE
  117. ret = efi_smbios_register();
  118. if (ret != EFI_SUCCESS)
  119. goto out;
  120. #endif
  121. ret = efi_watchdog_register();
  122. if (ret != EFI_SUCCESS)
  123. goto out;
  124. /* Initialize EFI runtime services */
  125. ret = efi_reset_system_init();
  126. if (ret != EFI_SUCCESS)
  127. goto out;
  128. out:
  129. efi_obj_list_initialized = ret;
  130. return ret;
  131. }