On Fri, Apr 12, 2019 at 06:20:47AM +0200, Heinrich Schuchardt wrote: > On 4/12/19 4:49 AM, AKASHI Takahiro wrote: > >On Thu, Apr 11, 2019 at 07:23:54PM +0200, Heinrich Schuchardt wrote: > >>The UEFI variables PlatformLang and PlatformLangCodes specify the current > >>firmware language and the list of all available languages. > >> > >>Currently their values are hard coded. With the patch a new configuration > >>variable EFI_PLATFORM_LANG_CODES is provided. > > > >Generally speaking, what I expect is that we should have a single place > >where arbitrary number of UEFI variables can be configured by default. > > In U-Boot the only place for configuration is Kconfig. > > For most of the variables described in the UEFI spec configuration does > not make much sense. But it may be worthwhile to look at all of them and > think about an efficient way of initialization many via an array with > names, values, and attributes. > > I am looking forward to your suggestions.
One of difficulties here is that UEFI variable is not always a human-readable string, but has a complex format. So one possibility is that we will have a dedicated U-boot variable to define a list of commands to be executed at boot time, most of which are "env set -e". -Takahiro Akashi > Best regards > > Heinrich > > > > >>When initializing the UEFI subsystem this configuration variable is used to > >>initialize PlatformLangCodes. The value of variable PlatformLang is read. > >>If it is not set, the first language specified in EFI_PLATFORM_LANG_CODES > >>is used to initialize PlatformLang. > >> > >>Suggested-by: Takahiro Akashi <takahiro.aka...@linaro.org> > >>Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de> > >>--- > >> lib/efi_loader/Kconfig | 10 ++++++ > >> lib/efi_loader/efi_setup.c | 70 ++++++++++++++++++++++++++++++-------- > >> 2 files changed, 66 insertions(+), 14 deletions(-) > >> > >>diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig > >>index a6489ca534..50b050159c 100644 > >>--- a/lib/efi_loader/Kconfig > >>+++ b/lib/efi_loader/Kconfig > >>@@ -26,6 +26,16 @@ config EFI_UNICODE_CAPITALIZATION > >> set, only the the correct handling of the letters of the codepage > >> used by the FAT file system is ensured. > >> > >>+config EFI_PLATFORM_LANG_CODES > >>+ string "Language codes supported by firmware" > >>+ depends on EFI_LOADER > >>+ default "en-US" > >>+ help > >>+ This value is used to initialize the PlatformLangCodes variable. Its > >>+ value is a semicolon (;) separated list of language codes in native > >>+ RFC 4646 format, e.g. "en-US;de-DE". The first language code is used > >>+ to initialize the PlatformLang variable. > >>+ > >> config EFI_LOADER_BOUNCE_BUFFER > >> bool "EFI Applications use bounce buffers for DMA operations" > >> depends on EFI_LOADER && ARM64 > >>diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c > >>index 6e9d5fe5b7..8f0da35ba4 100644 > >>--- a/lib/efi_loader/efi_setup.c > >>+++ b/lib/efi_loader/efi_setup.c > >>@@ -10,37 +10,79 @@ > >> > >> #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 | > > > >Are you going to distinguish non-volatile from volatile from now on? > >FYI, I have finished a prototype code with which UEFI variables > >are managed separately from U-Boot variables (environment). > >This will allow us to implement full semantics of non-volatile > >(and authentication in the future) attribute easily. > > > >> EFI_VARIABLE_BOOTSERVICE_ACCESS | > >> EFI_VARIABLE_RUNTIME_ACCESS, > >>- sizeof(EN_US), EN_US)); > >>+ 1 + strlen(lang), lang)); > >>+out: > >>+ if (ret != EFI_SUCCESS) > >>+ printf("EFI: cannot initialize platform language settings\n"); > >>+ return ret; > >>+} > >>+ > >>+/** > >>+ * efi_init_obj_list() - Initialize and populate EFI object list > > > >Well, efi_init_obj_list() is getting bigger and bigger. > >The name doesn't reflect its function precisely any more. > > > >-Takahiro Akashi > > > > > >>+ * Return: status code > >>+ */ > >>+efi_status_t efi_init_obj_list(void) > >>+{ > >>+ efi_status_t ret = EFI_SUCCESS; > >>+ > >>+ /* Define supported languages */ > >>+ ret = efi_init_platform_lang(); > >> if (ret != EFI_SUCCESS) > >> goto out; > >> > >>-- > >>2.20.1 > >> > > > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot