diff --git a/cmd/nvedit_efi.c b/cmd/nvedit_efi.c index 7ebb14e25f..770877c527 100644 --- a/cmd/nvedit_efi.c +++ b/cmd/nvedit_efi.c @@ -182,8 +182,10 @@ static int efi_dump_var_all(int argc, char *const argv[], } free(var_name16); - if (!match && argc == 1) + if (!match && argc == 1) { printf("Error: \"%s\" not defined\n", argv[0]); + return CMD_RET_FAILURE; + } return CMD_RET_SUCCESS; } diff --git a/doc/usage/cmd/bootz.rst b/doc/usage/cmd/bootz.rst new file mode 100644 index 0000000000..78953e9ca2 --- /dev/null +++ b/doc/usage/cmd/bootz.rst @@ -0,0 +1,66 @@ +.. SPDX-License-Identifier: GPL-2.0+: + +bootz command +============= + +Synopsis +-------- + +:: + + bootz [ [[:]] []] + +Description +----------- + +The bootz command is used to boot a Linux kernel in 'zImage' format. + +addr + address of kernel image, defaults to the value of the environment + variable $loadaddr. + +initrd + address of the initial RAM disk. Use '-' to boot a kernel with a device + tree but without an initial RAM disk. + +size + size of the initial RAM disk. This parameter must be specified for raw + initial RAM disks. + +fdt + address of the device tree. + +Example +------- + +This is the boot log of an OrangePi PC board: + +:: + + => load mmc 0:2 $fdt_addr_r dtb + 23093 bytes read in 7 ms (3.1 MiB/s) + => load mmc 0:2 $kernel_addr_r vmlinuz + 5079552 bytes read in 215 ms (22.5 MiB/s) + => load mmc 0:2 $ramdisk_addr_r initrd.img + 23854965 bytes read in 995 ms (22.9 MiB/s) + => bootz $kernel_addr_r $ramdisk_addr_r:$filesize $fdt_addr_r + Kernel image @ 0x42000000 [ 0x000000 - 0x4d8200 ] + ## Flattened Device Tree blob at 43000000 + Booting using the fdt blob at 0x43000000 + EHCI failed to shut down host controller. + Loading Ramdisk to 48940000, end 49ffff75 ... OK + Loading Device Tree to 48937000, end 4893fa34 ... OK + + Starting kernel ... + +Configuration +------------- + +The bootz command is only available if CONFIG_CMD_BOOTZ=y. + +Return value +------------ + +Normally this command does not return. If an error occurs, the return value $? +is set to 1 (false). If the operating system returns to U-Boot, the system is +reset. diff --git a/doc/usage/cmd/printenv.rst b/doc/usage/cmd/printenv.rst new file mode 100644 index 0000000000..9cb20f6ce6 --- /dev/null +++ b/doc/usage/cmd/printenv.rst @@ -0,0 +1,90 @@ +.. SPDX-License-Identifier: GPL-2.0+: + +printenv command +================ + +Synopsis +-------- + +:: + + printenv [-a] [name ...] + printenv -e [-guid guid][-n] [name] + +Description +----------- + +The printenv command is used to print environment or UEFI variables. + +\-a + Print environment variables starting with a period ('.'). + +\-e + Print UEFI variables. Without -e environment variables are printed. + +\-guid *guid* + Specify vendor GUID *guid*. If none is specified, all UEFI variables with + the specified name are printed irrespective of their vendor GUID. + +\-n + don't show hexadecimal dump of value + +name + Variable name. If no name is provided, all variables are printed. + Multiple environment variable names may be specified. + +Examples +-------- + +The following examples demonstrates the effect of the *-a* flag when displaying +environment variables: + +:: + + => setenv .foo bar + => printenv + arch=sandbox + baudrate=115200 + board=sandbox + ... + stdout=serial,vidconsole + + Environment size: 644/8188 bytes + => printenv -a + .foo=bar + arch=sandbox + baudrate=115200 + board=sandbox + ... + stdout=serial,vidconsole + + Environment size: 653/8188 bytes + => + +The next example shows the effect of the *-n* flag when displaying an UEFI +variable and how to specify a vendor GUID: + +:: + + => printenv -e -guid 8be4df61-93ca-11d2-aa0d-00e098032b8c PlatformLangCodes + PlatformLangCodes: + 8be4df61-93ca-11d2-aa0d-00e098032b8c (EFI_GLOBAL_VARIABLE_GUID) + BS|RT|RO, DataSize = 0x6 + 00000000: 65 6e 2d 55 53 00 en-US. + => printenv -e -n PlatformLangCodes + PlatformLangCodes: + 8be4df61-93ca-11d2-aa0d-00e098032b8c (EFI_GLOBAL_VARIABLE_GUID) + BS|RT|RO, DataSize = 0x6 + => + +Configuration +============= + +UEFI variables are only supported if CONFIG_CMD_NVEDIT_EFI=y. The value of UEFI +variables can only be displayed if CONFIG_HEXDUMP=y. + +Return value +------------ + +The return value $? is 1 (false) if a specified variable is not found. +Otherwise $? is set to 0 (true). diff --git a/doc/usage/index.rst b/doc/usage/index.rst index c03f4aef9e..770418434a 100644 --- a/doc/usage/index.rst +++ b/doc/usage/index.rst @@ -30,6 +30,7 @@ Shell commands cmd/bootmenu cmd/bootmeth cmd/button + cmd/bootz cmd/cbsysinfo cmd/conitrace cmd/echo @@ -48,6 +49,7 @@ Shell commands cmd/md cmd/mmc cmd/pinmux + cmd/printenv cmd/pstore cmd/qfw cmd/reset diff --git a/include/efi_loader.h b/include/efi_loader.h index f6651e2c60..c1e00ebac3 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -499,6 +499,8 @@ extern struct list_head efi_register_notify_events; int efi_init_early(void); /* Initialize efi execution environment */ efi_status_t efi_init_obj_list(void); +/* Set up console modes */ +void efi_setup_console_size(void); /* Install device tree */ efi_status_t efi_install_fdt(void *fdt); /* Run loaded UEFI image */ diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c index 60a3fc85ac..3164fd484e 100644 --- a/lib/efi_loader/efi_console.c +++ b/lib/efi_loader/efi_console.c @@ -5,6 +5,8 @@ * Copyright (c) 2016 Alexander Graf */ +#define LOG_CATEGORY LOGC_EFI + #include #include #include @@ -12,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -58,7 +61,12 @@ const efi_guid_t efi_guid_text_output_protocol = #define cESC '\x1b' #define ESC "\x1b" -/* Default to mode 0 */ +/* + * efi_con_mode - mode information of the Simple Text Output Protocol + * + * Use safe settings before efi_setup_console_size() is called. + * By default enable only the 80x25 mode which must always exist. + */ static struct simple_text_output_mode efi_con_mode = { .max_mode = 1, .mode = 0, @@ -333,13 +341,13 @@ static int __maybe_unused query_vidconsole(int *rows, int *cols) } /** - * query_console_size() - update the mode table. + * efi_setup_console_size() - update the mode table. * * By default the only mode available is 80x25. If the console has at least 50 * lines, enable mode 80x50. If we can query the console size and it is neither * 80x25 nor 80x50, set it as an additional mode. */ -static void query_console_size(void) +void efi_setup_console_size(void) { int rows = 25, cols = 80; int ret = -ENODEV; @@ -351,6 +359,8 @@ static void query_console_size(void) if (ret) return; + log_debug("Console size %dx%d\n", rows, cols); + /* Test if we can have Mode 1 */ if (cols >= 80 && rows >= 50) { efi_cout_modes[1].present = 1; @@ -371,7 +381,6 @@ static void query_console_size(void) } } - /** * efi_cout_query_mode() - get terminal size for a text mode * @@ -1262,9 +1271,6 @@ efi_status_t efi_console_register(void) efi_status_t r; struct efi_device_path *dp; - /* Set up mode information */ - query_console_size(); - /* Install protocols on root node */ r = EFI_CALL(efi_install_multiple_protocol_interfaces (&efi_root, diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c index 250eeb2fcd..492ecf4cb1 100644 --- a/lib/efi_loader/efi_setup.c +++ b/lib/efi_loader/efi_setup.c @@ -243,6 +243,10 @@ efi_status_t efi_init_obj_list(void) goto out; } + /* Set up console modes */ + efi_setup_console_size(); + + /* Install EFI_RNG_PROTOCOL */ if (IS_ENABLED(CONFIG_EFI_RNG_PROTOCOL)) { ret = efi_rng_register(); if (ret != EFI_SUCCESS) diff --git a/test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py b/test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py index 5bef84958b..8f75b554ad 100644 --- a/test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py @@ -117,6 +117,7 @@ class TestEfiCapsuleFirmwareFit(object): with u_boot_console.log.section('Test Case 2-a, before reboot'): output = u_boot_console.run_command_list([ 'host bind 0 %s' % disk_img, + 'printenv -e PlatformLangCodes', # workaround for terminal size determination 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""', 'efidebug boot order 1', 'env set -e -nv -bs -rt OsIndications =0x0000000000000004', diff --git a/test/py/tests/test_efi_capsule/test_capsule_firmware_raw.py b/test/py/tests/test_efi_capsule/test_capsule_firmware_raw.py index c8c647d0b1..92bfb14932 100644 --- a/test/py/tests/test_efi_capsule/test_capsule_firmware_raw.py +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware_raw.py @@ -115,6 +115,7 @@ class TestEfiCapsuleFirmwareRaw: with u_boot_console.log.section('Test Case 2-a, before reboot'): output = u_boot_console.run_command_list([ 'host bind 0 %s' % disk_img, + 'printenv -e PlatformLangCodes', # workaround for terminal size determination 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""', 'efidebug boot order 1', 'env set -e OsIndications', @@ -197,6 +198,7 @@ class TestEfiCapsuleFirmwareRaw: with u_boot_console.log.section('Test Case 3-a, before reboot'): output = u_boot_console.run_command_list([ 'host bind 0 %s' % disk_img, + 'printenv -e PlatformLangCodes', # workaround for terminal size determination 'efidebug boot add -b 1 TEST host 0:1 /helloworld.efi -s ""', 'efidebug boot order 1', 'env set -e -nv -bs -rt OsIndications =0x0000000000000004',