|
@@ -10,44 +10,86 @@
|
|
|
|
|
|
#define OBJ_LIST_NOT_INITIALIZED 1
|
|
|
|
|
|
-/* Language code for American English according to RFC 4646 */
|
|
|
-#define EN_US L"en-US"
|
|
|
-
|
|
|
static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
|
|
|
|
|
|
-/* Initialize and populate EFI object list */
|
|
|
-efi_status_t efi_init_obj_list(void)
|
|
|
+/**
|
|
|
+ * efi_init_platform_lang() - define supported languages
|
|
|
+ *
|
|
|
+ * Set the PlatformLangCodes and PlatformLang variables.
|
|
|
+ *
|
|
|
+ * Return: status code
|
|
|
+ */
|
|
|
+static efi_status_t efi_init_platform_lang(void)
|
|
|
{
|
|
|
- efi_status_t ret = EFI_SUCCESS;
|
|
|
+ efi_status_t ret;
|
|
|
+ efi_uintn_t data_size = 0;
|
|
|
+ char *lang = CONFIG_EFI_PLATFORM_LANG_CODES;
|
|
|
+ char *pos;
|
|
|
|
|
|
/*
|
|
|
- * Variable PlatformLang defines the language that the machine has been
|
|
|
- * configured for.
|
|
|
+ * Variable PlatformLangCodes defines the language codes that the
|
|
|
+ * machine can support.
|
|
|
*/
|
|
|
- ret = EFI_CALL(efi_set_variable(L"PlatformLang",
|
|
|
+ ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
|
|
|
&efi_global_variable_guid,
|
|
|
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
|
|
EFI_VARIABLE_RUNTIME_ACCESS,
|
|
|
- sizeof(EN_US), EN_US));
|
|
|
+ sizeof(CONFIG_EFI_PLATFORM_LANG_CODES),
|
|
|
+ CONFIG_EFI_PLATFORM_LANG_CODES));
|
|
|
if (ret != EFI_SUCCESS)
|
|
|
goto out;
|
|
|
|
|
|
/*
|
|
|
- * Variable PlatformLangCodes defines the language codes that the
|
|
|
- * machine can support.
|
|
|
+ * Variable PlatformLang defines the language that the machine has been
|
|
|
+ * configured for.
|
|
|
*/
|
|
|
- ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
|
|
|
+ ret = EFI_CALL(efi_get_variable(L"PlatformLang",
|
|
|
&efi_global_variable_guid,
|
|
|
+ NULL, &data_size, &pos));
|
|
|
+ if (ret == EFI_BUFFER_TOO_SMALL) {
|
|
|
+ /* The variable is already set. Do not change it. */
|
|
|
+ ret = EFI_SUCCESS;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The list of supported languages is semicolon separated. Use the first
|
|
|
+ * language to initialize PlatformLang.
|
|
|
+ */
|
|
|
+ pos = strchr(lang, ';');
|
|
|
+ if (pos)
|
|
|
+ *pos = 0;
|
|
|
+
|
|
|
+ ret = EFI_CALL(efi_set_variable(L"PlatformLang",
|
|
|
+ &efi_global_variable_guid,
|
|
|
+ EFI_VARIABLE_NON_VOLATILE |
|
|
|
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
|
|
EFI_VARIABLE_RUNTIME_ACCESS,
|
|
|
- sizeof(EN_US), EN_US));
|
|
|
+ 1 + strlen(lang), lang));
|
|
|
+out:
|
|
|
if (ret != EFI_SUCCESS)
|
|
|
- goto out;
|
|
|
+ printf("EFI: cannot initialize platform language settings\n");
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * efi_init_obj_list() - Initialize and populate EFI object list
|
|
|
+ *
|
|
|
+ * Return: status code
|
|
|
+ */
|
|
|
+efi_status_t efi_init_obj_list(void)
|
|
|
+{
|
|
|
+ efi_status_t ret = EFI_SUCCESS;
|
|
|
|
|
|
/* Initialize once only */
|
|
|
if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
|
|
|
return efi_obj_list_initialized;
|
|
|
|
|
|
+ /* Define supported languages */
|
|
|
+ ret = efi_init_platform_lang();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
+
|
|
|
/* Initialize system table */
|
|
|
ret = efi_initialize_system_table();
|
|
|
if (ret != EFI_SUCCESS)
|