diff options
Diffstat (limited to 'config')
13 files changed, 1625 insertions, 9 deletions
diff --git a/config/u-boot/amd64coreboot/config/default b/config/u-boot/amd64coreboot/config/default index fdd0ccf2..d44de2d3 100644 --- a/config/u-boot/amd64coreboot/config/default +++ b/config/u-boot/amd64coreboot/config/default @@ -500,6 +500,7 @@ CONFIG_CMD_BOOTM=y CONFIG_CMD_BOOTDEV=y CONFIG_CMD_BOOTFLOW=y CONFIG_CMD_BOOTFLOW_FULL=y +CONFIG_CMD_BOOTFLOW_BOOTDELAY=8 CONFIG_CMD_BOOTMETH=y CONFIG_BOOTM_EFI=y CONFIG_BOOTM_ELF=y diff --git a/config/u-boot/default/patches/0006-Support-auto-boot-timeout-delay-bootflow-menu.patch b/config/u-boot/default/patches/0006-Support-auto-boot-timeout-delay-bootflow-menu.patch new file mode 100644 index 00000000..ffc7b581 --- /dev/null +++ b/config/u-boot/default/patches/0006-Support-auto-boot-timeout-delay-bootflow-menu.patch @@ -0,0 +1,302 @@ +From d9371422ac74ea73d1620f01300a7136a7649754 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 4 Dec 2024 06:52:39 +0000 +Subject: [PATCH 1/1] Support auto-boot timeout delay bootflow menu + +The bootflow menu cannot currently auto-boot a selected entry, +which means that the user must press enter to boot their system. +This can be a problem on headless setups; for example, it is not +currently feasible to set up a headless server with U-Boot, when +using it to boot via UEFI on a coreboot setup. + +This patch adds the following build-time configuration option: + +CONFIG_CMD_BOOTFLOW_BOOTDELAY + +This creates a timeout delay in the given number of seconds. +If an arrow key is press to navigate the menu, the timer is +disabled and the user must then press enter to boot the selected +option. When this happens, the timeout display is replaced by +the old message indicating that the user should press enter. + +The default boot delay is 30 seconds, and the timeout is enabled +by default. Setting it to zero will restore the old behaviour, +whereby no timeout is provided and the user must press enter. + +If a negative integer is provided, the timer will default to +zero. The timer value is further filtered by modulus of 100, +so that the maximum number of seconds allowed is 99 seconds. + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + boot/bootflow_menu.c | 117 +++++++++++++++++++++++++++++++++++-- + cmd/Kconfig | 12 ++++ + doc/usage/cmd/bootflow.rst | 11 ++++ + include/bootflow.h | 10 +++- + 4 files changed, 143 insertions(+), 7 deletions(-) + +diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c +index 9d0dc352f9..172139b187 100644 +--- a/boot/bootflow_menu.c ++++ b/boot/bootflow_menu.c +@@ -30,7 +30,7 @@ struct menu_priv { + int num_bootflows; + }; + +-int bootflow_menu_new(struct expo **expp) ++int bootflow_menu_new(struct expo **expp, const char *prompt) + { + struct udevice *last_bootdev; + struct scene_obj_menu *menu; +@@ -54,7 +54,7 @@ int bootflow_menu_new(struct expo **expp) + return log_msg_ret("scn", ret); + + ret |= scene_txt_str(scn, "prompt", OBJ_PROMPT, STR_PROMPT, +- "UP and DOWN to choose, ENTER to select", NULL); ++ prompt, NULL); + + ret = scene_menu(scn, "main", OBJ_MENU, &menu); + ret |= scene_obj_set_pos(scn, OBJ_MENU, MARGIN_LEFT, 100); +@@ -138,6 +138,29 @@ int bootflow_menu_new(struct expo **expp) + return 0; + } + ++int bootflow_menu_show_countdown(struct expo *exp, char *prompt, ++ char bootflow_delay) ++{ ++ char *i; ++ ++ if (prompt == NULL) ++ return 0; ++ if (strlen(prompt) < 2) ++ return 0; ++ ++ i = prompt + strlen(prompt) - 2; ++ ++ if (bootflow_delay >= 10) { ++ *(i) = 48 + (bootflow_delay / 10); ++ *(i + 1) = 48 + (bootflow_delay % 10); ++ } else { ++ *(i) = 48 + bootflow_delay; ++ *(i + 1) = ' '; ++ } ++ ++ return expo_render(exp); ++} ++ + int bootflow_menu_apply_theme(struct expo *exp, ofnode node) + { + struct menu_priv *priv = exp->priv; +@@ -184,14 +207,62 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + struct expo *exp; + uint sel_id; + bool done; +- int ret; ++ int i, ret; ++ ++ /* Auto-boot countdown */ ++ char bootflow_delay_secs, *prompt; ++ int bootflow_time, bootflow_delay; ++ bool skip_render_once = false; ++ bool bootflow_countdown = false; ++ ++ /* TODO: perhaps set based on defconfig? */ ++ /* WARNING: These two strings must be of the same length. */ ++ char promptChoice[] = "UP and DOWN to choose, ENTER to select"; ++ char promptTimeout[] = "UP and DOWN to choose. Auto-boot in "; ++/* ++ // Uncomment if the strings become configurable (defconfig): ++ // (to prevent buffer overflows) ++ char promptDefault[] = "UP and DOWN to choose, ENTER to select"; ++ if (promptTimeout = NULL) ++ promptTimeout = promptDefault; ++ if (promptChoice = NULL) ++ promptChoice = promptDefault; ++ if (strlen(promptChoice) < 2) ++ promptChoice = promptDefault; ++ if (strlen(promptTimeout) < 2) ++ promptTimeout = promptDefault; ++ if (strlen(promptChoice) != strlen(promptTimeout)) ++ promptChoice = promptTimeout; ++*/ ++ prompt = promptChoice; ++ ++ bootflow_delay_secs = 15; /* TODO: set based on defconfig. */ ++ ++#if defined(CONFIG_CMD_BOOTFLOW_BOOTDELAY) ++ /* If set to zero, the auto-boot timeout is disabled. */ ++ bootflow_delay_secs = CONFIG_CMD_BOOTFLOW_BOOTDELAY; ++#else ++ bootflow_delay_secs = 30; ++#endif ++ ++ if (bootflow_delay_secs < 0) ++ bootflow_delay_secs = 0; /* disable countdown if negative */ ++ bootflow_delay_secs %= 100; /* No higher than 99 seconds */ ++ ++ if (bootflow_delay_secs > 0) { ++ bootflow_countdown = true; /* enable auto-boot countdown */ ++ prompt = promptTimeout; ++ bootflow_time = 0; /* Time elapsed in milliseconds */ ++ bootflow_delay = ++ (int)bootflow_delay_secs * 1000; /* milliseconds */ ++ } + + cli_ch_init(cch); + + sel_bflow = NULL; + *bflowp = NULL; + +- ret = bootflow_menu_new(&exp); ++ ret = bootflow_menu_new(&exp, prompt); + if (ret) + return log_msg_ret("exp", ret); + +@@ -216,12 +287,20 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + if (text_mode) + expo_set_text_mode(exp, text_mode); + ++ if (bootflow_countdown) { ++ ret = bootflow_menu_show_countdown(exp, prompt, ++ bootflow_delay_secs); ++ skip_render_once = true; /* Don't print menu twice on start */ ++ } + done = false; + do { + struct expo_action act; + int ichar, key; + +- ret = expo_render(exp); ++ if (skip_render_once) ++ skip_render_once = false; ++ else ++ ret = expo_render(exp); + if (ret) + break; + +@@ -231,7 +310,23 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + schedule(); + mdelay(2); + ichar = cli_ch_process(cch, -ETIMEDOUT); ++ if (bootflow_countdown) { ++ bootflow_delay -= 2; ++ bootflow_time += 2; ++ if (bootflow_delay <= 0) ++ ichar='\n'; ++ if (bootflow_time < 1000) ++ continue; ++ bootflow_time = 0; ++ --bootflow_delay_secs; ++ ret = bootflow_menu_show_countdown(exp, ++ prompt, bootflow_delay_secs); ++ if (ret) ++ break; ++ } + } ++ if (ret) ++ break; + if (!ichar) { + ichar = getchar(); + ichar = cli_ch_process(cch, ichar); +@@ -265,6 +360,17 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + break; + } + } ++ if (bootflow_countdown) { ++ /* A key press interrupted the auto-boot timeout */ ++ bootflow_countdown = false; ++ if (strlen(prompt) == strlen(promptChoice)) { ++ /* "Auto-boot in" becomes "Press ENTER" */ ++ (void) memcpy(prompt, promptChoice, ++ strlen(promptChoice)); ++ ret = expo_render(exp); ++ skip_render_once = true; ++ } ++ } + } while (!done); + + if (ret) +@@ -272,7 +378,6 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + + if (sel_id) { + struct bootflow *bflow; +- int i; + + for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36; + ret = bootflow_next_glob(&bflow), i++) { +diff --git a/cmd/Kconfig b/cmd/Kconfig +index 978f44eda4..0303869625 100644 +--- a/cmd/Kconfig ++++ b/cmd/Kconfig +@@ -288,6 +288,7 @@ config CMD_BOOTDEV + config CMD_BOOTFLOW + bool "bootflow" + depends on BOOTSTD ++ select CMD_BOOTFLOW_BOOTDELAY + default y + help + Support scanning for bootflows available with the bootdevs. The +@@ -303,6 +304,17 @@ config CMD_BOOTFLOW_FULL + + This command is not necessary for bootstd to work. + ++config CMD_BOOTFLOW_BOOTDELAY ++ int "bootflow - delay in seconds before booting the first menu option" ++ depends on CMD_BOOTFLOW ++ default 30 ++ help ++ On the bootflow menu, wait for the defined number of seconds before ++ automatically booting. Unless interrupted, this will auto-boot the ++ first option in the generated list of boot options. ++ ++ Set this to zero if you wish to disable the auto-boot timeout. ++ + config CMD_BOOTMETH + bool "bootmeth" + depends on BOOTSTD +diff --git a/doc/usage/cmd/bootflow.rst b/doc/usage/cmd/bootflow.rst +index 5d41fe37a7..728f294274 100644 +--- a/doc/usage/cmd/bootflow.rst ++++ b/doc/usage/cmd/bootflow.rst +@@ -32,6 +32,17 @@ Note that `CONFIG_BOOTSTD_FULL` (which enables `CONFIG_CMD_BOOTFLOW_FULL) must + be enabled to obtain full functionality with this command. Otherwise, it only + supports `bootflow scan` which scans and boots the first available bootflow. + ++The `CONFIG_CMD_BOOTFLOW_BOOTDELAY` option can be set, defining (in seconds) the ++amount of time that U-Boot will wait; after this time passes, it will ++automatically boot the first item when generating a bootflow menu. If the value ++is set to zero, the timeout is disabled and the user must press enter; if it's ++negative, the timeout is disabled, and the maximum number of seconds is 99 ++seconds. If a value higher than 100 is provided, the value is changed to a ++modulus of 100 (remainder of the value divided by 100). ++ ++If the `CONFIG_BOOTFLOW_BOOTFLOW` option is undefined, the timeout will default ++to 30 seconds. ++ + bootflow scan + ~~~~~~~~~~~~~ + +diff --git a/include/bootflow.h b/include/bootflow.h +index 4d2fc7b69b..9f4245caa7 100644 +--- a/include/bootflow.h ++++ b/include/bootflow.h +@@ -452,7 +452,15 @@ int bootflow_iter_check_system(const struct bootflow_iter *iter); + * @expp: Returns the expo created + * Returns 0 on success, -ve on error + */ +-int bootflow_menu_new(struct expo **expp); ++int bootflow_menu_new(struct expo **expp, const char *prompt); ++ ++/** ++ * bootflow_menu_show_countdown() - Show countdown timer for auto-boot ++ * ++ * Returns the value of expo_render() ++ */ ++int bootflow_menu_show_countdown(struct expo *exp, char *prompt, ++ char bootflow_delay); + + /** + * bootflow_menu_apply_theme() - Apply a theme to a bootmenu +-- +2.39.5 + diff --git a/config/u-boot/default/patches/0007-Libreboot-branding-version-on-the-bootflow-menu.patch b/config/u-boot/default/patches/0007-Libreboot-branding-version-on-the-bootflow-menu.patch new file mode 100644 index 00000000..f913572f --- /dev/null +++ b/config/u-boot/default/patches/0007-Libreboot-branding-version-on-the-bootflow-menu.patch @@ -0,0 +1,213 @@ +From 4ff0f509aa28eb8e85f1c0c9929c63996c646bb8 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 4 Dec 2024 18:20:19 +0000 +Subject: [PATCH 1/1] Libreboot branding/version on the bootflow menu + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + boot/bootflow_menu.c | 2 +- + drivers/video/u_boot_logo.bmp | Bin 6932 -> 27350 bytes + 2 files changed, 1 insertion(+), 1 deletion(-) + +diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c +index 84831915a2..8e26ec2aef 100644 +--- a/boot/bootflow_menu.c ++++ b/boot/bootflow_menu.c +@@ -59,7 +59,7 @@ int bootflow_menu_new(struct expo **expp, const char *prompt) + ret = scene_menu(scn, "main", OBJ_MENU, &menu); + ret |= scene_obj_set_pos(scn, OBJ_MENU, MARGIN_LEFT, 100); + ret |= scene_txt_str(scn, "title", OBJ_MENU_TITLE, STR_MENU_TITLE, +- "U-Boot - Boot Menu", NULL); ++ "Libreboot 20241205 release (U-Boot Menu) https://libreboot.org/", NULL); + ret |= scene_menu_set_title(scn, OBJ_MENU, OBJ_PROMPT); + + logo = video_get_u_boot_logo(); +diff --git a/drivers/video/u_boot_logo.bmp b/drivers/video/u_boot_logo.bmp +index 47f1e9b99789584d2f6dd71e954b51927b35d783..bc9ae001badb25bc900058c167a47247ef91dc7c 100644 +GIT binary patch +literal 27350 +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 + +literal 6932 +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 + +-- +2.39.5 + diff --git a/config/u-boot/gru_bob/config/default b/config/u-boot/gru_bob/config/default index 863a0fee..bdd3ee98 100644 --- a/config/u-boot/gru_bob/config/default +++ b/config/u-boot/gru_bob/config/default @@ -4,7 +4,7 @@ # # -# Compiler: gcc (Debian 14.2.0-8) 14.2.0 +# Compiler: gcc (Debian 12.2.0-14) 12.2.0 # CONFIG_CREATE_ARCH_SYMLINK=y CONFIG_SUPPORT_LITTLE_ENDIAN=y @@ -327,7 +327,7 @@ CONFIG_SYS_LITTLE_ENDIAN=y CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=140200 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_CC_OPTIMIZE_FOR_SIZE=y # CONFIG_CC_OPTIMIZE_FOR_SPEED is not set @@ -475,7 +475,7 @@ CONFIG_ARCH_FIXUP_FDT_MEMORY=y # CONFIG_USE_BOOTARGS is not set # CONFIG_BOOTARGS_SUBST is not set CONFIG_USE_BOOTCOMMAND=y -CONFIG_BOOTCOMMAND="bootflow scan -lb" +CONFIG_BOOTCOMMAND="bootflow scan -l; if bootflow menu; then cls; bootflow boot; fi" CONFIG_USE_PREBOOT=y CONFIG_PREBOOT="usb start" CONFIG_PREBOOT_DEFINED=y @@ -713,6 +713,7 @@ CONFIG_CMD_BOOTM=y CONFIG_CMD_BOOTDEV=y CONFIG_CMD_BOOTFLOW=y CONFIG_CMD_BOOTFLOW_FULL=y +CONFIG_CMD_BOOTFLOW_BOOTDELAY=8 CONFIG_CMD_BOOTMETH=y CONFIG_BOOTM_EFI=y CONFIG_BOOTM_ELF=y diff --git a/config/u-boot/gru_kevin/config/default b/config/u-boot/gru_kevin/config/default index 1e14cdba..2a15b9bf 100644 --- a/config/u-boot/gru_kevin/config/default +++ b/config/u-boot/gru_kevin/config/default @@ -4,7 +4,7 @@ # # -# Compiler: gcc (Debian 14.2.0-8) 14.2.0 +# Compiler: gcc (Debian 12.2.0-14) 12.2.0 # CONFIG_CREATE_ARCH_SYMLINK=y CONFIG_SUPPORT_LITTLE_ENDIAN=y @@ -327,7 +327,7 @@ CONFIG_SYS_LITTLE_ENDIAN=y CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=140200 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_CC_OPTIMIZE_FOR_SIZE=y # CONFIG_CC_OPTIMIZE_FOR_SPEED is not set @@ -475,7 +475,7 @@ CONFIG_ARCH_FIXUP_FDT_MEMORY=y # CONFIG_USE_BOOTARGS is not set # CONFIG_BOOTARGS_SUBST is not set CONFIG_USE_BOOTCOMMAND=y -CONFIG_BOOTCOMMAND="bootflow scan -lb" +CONFIG_BOOTCOMMAND="bootflow scan -l; if bootflow menu; then cls; bootflow boot; fi" CONFIG_USE_PREBOOT=y CONFIG_PREBOOT="usb start" CONFIG_PREBOOT_DEFINED=y @@ -713,6 +713,7 @@ CONFIG_CMD_BOOTM=y CONFIG_CMD_BOOTDEV=y CONFIG_CMD_BOOTFLOW=y CONFIG_CMD_BOOTFLOW_FULL=y +CONFIG_CMD_BOOTFLOW_BOOTDELAY=8 CONFIG_CMD_BOOTMETH=y CONFIG_BOOTM_EFI=y CONFIG_BOOTM_ELF=y diff --git a/config/u-boot/i386coreboot/config/default b/config/u-boot/i386coreboot/config/default index d01984d5..ba4fd18b 100644 --- a/config/u-boot/i386coreboot/config/default +++ b/config/u-boot/i386coreboot/config/default @@ -390,6 +390,7 @@ CONFIG_CMD_BOOTM=y CONFIG_CMD_BOOTDEV=y CONFIG_CMD_BOOTFLOW=y CONFIG_CMD_BOOTFLOW_FULL=y +CONFIG_CMD_BOOTFLOW_BOOTDELAY=8 CONFIG_CMD_BOOTMETH=y CONFIG_BOOTM_EFI=y CONFIG_BOOTM_ELF=y diff --git a/config/u-boot/qemu_arm64_12mb/config/default b/config/u-boot/qemu_arm64_12mb/config/default index ecdef9e4..4824cc79 100644 --- a/config/u-boot/qemu_arm64_12mb/config/default +++ b/config/u-boot/qemu_arm64_12mb/config/default @@ -4,7 +4,7 @@ # # -# Compiler: gcc (Debian 14.2.0-8) 14.2.0 +# Compiler: gcc (Debian 12.2.0-14) 12.2.0 # CONFIG_CREATE_ARCH_SYMLINK=y CONFIG_SUPPORT_LITTLE_ENDIAN=y @@ -253,7 +253,7 @@ CONFIG_SYS_LITTLE_ENDIAN=y CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=140200 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_CC_OPTIMIZE_FOR_SIZE=y # CONFIG_CC_OPTIMIZE_FOR_SPEED is not set @@ -387,7 +387,7 @@ CONFIG_ARCH_FIXUP_FDT_MEMORY=y # CONFIG_USE_BOOTARGS is not set # CONFIG_BOOTARGS_SUBST is not set CONFIG_USE_BOOTCOMMAND=y -CONFIG_BOOTCOMMAND="bootflow scan -lb" +CONFIG_BOOTCOMMAND="bootflow scan -l; if bootflow menu; then cls; bootflow boot; fi" CONFIG_USE_PREBOOT=y CONFIG_PREBOOT="usb start" CONFIG_PREBOOT_DEFINED=y @@ -523,6 +523,7 @@ CONFIG_CMD_BOOTM=y CONFIG_CMD_BOOTDEV=y CONFIG_CMD_BOOTFLOW=y CONFIG_CMD_BOOTFLOW_FULL=y +CONFIG_CMD_BOOTFLOW_BOOTDELAY=8 CONFIG_CMD_BOOTMETH=y CONFIG_BOOTM_EFI=y CONFIG_BOOTM_ELF=y diff --git a/config/u-boot/x86/patches/0004-Support-auto-boot-timeout-delay-bootflow-menu.patch b/config/u-boot/x86/patches/0004-Support-auto-boot-timeout-delay-bootflow-menu.patch new file mode 100644 index 00000000..ffc7b581 --- /dev/null +++ b/config/u-boot/x86/patches/0004-Support-auto-boot-timeout-delay-bootflow-menu.patch @@ -0,0 +1,302 @@ +From d9371422ac74ea73d1620f01300a7136a7649754 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 4 Dec 2024 06:52:39 +0000 +Subject: [PATCH 1/1] Support auto-boot timeout delay bootflow menu + +The bootflow menu cannot currently auto-boot a selected entry, +which means that the user must press enter to boot their system. +This can be a problem on headless setups; for example, it is not +currently feasible to set up a headless server with U-Boot, when +using it to boot via UEFI on a coreboot setup. + +This patch adds the following build-time configuration option: + +CONFIG_CMD_BOOTFLOW_BOOTDELAY + +This creates a timeout delay in the given number of seconds. +If an arrow key is press to navigate the menu, the timer is +disabled and the user must then press enter to boot the selected +option. When this happens, the timeout display is replaced by +the old message indicating that the user should press enter. + +The default boot delay is 30 seconds, and the timeout is enabled +by default. Setting it to zero will restore the old behaviour, +whereby no timeout is provided and the user must press enter. + +If a negative integer is provided, the timer will default to +zero. The timer value is further filtered by modulus of 100, +so that the maximum number of seconds allowed is 99 seconds. + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + boot/bootflow_menu.c | 117 +++++++++++++++++++++++++++++++++++-- + cmd/Kconfig | 12 ++++ + doc/usage/cmd/bootflow.rst | 11 ++++ + include/bootflow.h | 10 +++- + 4 files changed, 143 insertions(+), 7 deletions(-) + +diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c +index 9d0dc352f9..172139b187 100644 +--- a/boot/bootflow_menu.c ++++ b/boot/bootflow_menu.c +@@ -30,7 +30,7 @@ struct menu_priv { + int num_bootflows; + }; + +-int bootflow_menu_new(struct expo **expp) ++int bootflow_menu_new(struct expo **expp, const char *prompt) + { + struct udevice *last_bootdev; + struct scene_obj_menu *menu; +@@ -54,7 +54,7 @@ int bootflow_menu_new(struct expo **expp) + return log_msg_ret("scn", ret); + + ret |= scene_txt_str(scn, "prompt", OBJ_PROMPT, STR_PROMPT, +- "UP and DOWN to choose, ENTER to select", NULL); ++ prompt, NULL); + + ret = scene_menu(scn, "main", OBJ_MENU, &menu); + ret |= scene_obj_set_pos(scn, OBJ_MENU, MARGIN_LEFT, 100); +@@ -138,6 +138,29 @@ int bootflow_menu_new(struct expo **expp) + return 0; + } + ++int bootflow_menu_show_countdown(struct expo *exp, char *prompt, ++ char bootflow_delay) ++{ ++ char *i; ++ ++ if (prompt == NULL) ++ return 0; ++ if (strlen(prompt) < 2) ++ return 0; ++ ++ i = prompt + strlen(prompt) - 2; ++ ++ if (bootflow_delay >= 10) { ++ *(i) = 48 + (bootflow_delay / 10); ++ *(i + 1) = 48 + (bootflow_delay % 10); ++ } else { ++ *(i) = 48 + bootflow_delay; ++ *(i + 1) = ' '; ++ } ++ ++ return expo_render(exp); ++} ++ + int bootflow_menu_apply_theme(struct expo *exp, ofnode node) + { + struct menu_priv *priv = exp->priv; +@@ -184,14 +207,62 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + struct expo *exp; + uint sel_id; + bool done; +- int ret; ++ int i, ret; ++ ++ /* Auto-boot countdown */ ++ char bootflow_delay_secs, *prompt; ++ int bootflow_time, bootflow_delay; ++ bool skip_render_once = false; ++ bool bootflow_countdown = false; ++ ++ /* TODO: perhaps set based on defconfig? */ ++ /* WARNING: These two strings must be of the same length. */ ++ char promptChoice[] = "UP and DOWN to choose, ENTER to select"; ++ char promptTimeout[] = "UP and DOWN to choose. Auto-boot in "; ++/* ++ // Uncomment if the strings become configurable (defconfig): ++ // (to prevent buffer overflows) ++ char promptDefault[] = "UP and DOWN to choose, ENTER to select"; ++ if (promptTimeout = NULL) ++ promptTimeout = promptDefault; ++ if (promptChoice = NULL) ++ promptChoice = promptDefault; ++ if (strlen(promptChoice) < 2) ++ promptChoice = promptDefault; ++ if (strlen(promptTimeout) < 2) ++ promptTimeout = promptDefault; ++ if (strlen(promptChoice) != strlen(promptTimeout)) ++ promptChoice = promptTimeout; ++*/ ++ prompt = promptChoice; ++ ++ bootflow_delay_secs = 15; /* TODO: set based on defconfig. */ ++ ++#if defined(CONFIG_CMD_BOOTFLOW_BOOTDELAY) ++ /* If set to zero, the auto-boot timeout is disabled. */ ++ bootflow_delay_secs = CONFIG_CMD_BOOTFLOW_BOOTDELAY; ++#else ++ bootflow_delay_secs = 30; ++#endif ++ ++ if (bootflow_delay_secs < 0) ++ bootflow_delay_secs = 0; /* disable countdown if negative */ ++ bootflow_delay_secs %= 100; /* No higher than 99 seconds */ ++ ++ if (bootflow_delay_secs > 0) { ++ bootflow_countdown = true; /* enable auto-boot countdown */ ++ prompt = promptTimeout; ++ bootflow_time = 0; /* Time elapsed in milliseconds */ ++ bootflow_delay = ++ (int)bootflow_delay_secs * 1000; /* milliseconds */ ++ } + + cli_ch_init(cch); + + sel_bflow = NULL; + *bflowp = NULL; + +- ret = bootflow_menu_new(&exp); ++ ret = bootflow_menu_new(&exp, prompt); + if (ret) + return log_msg_ret("exp", ret); + +@@ -216,12 +287,20 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + if (text_mode) + expo_set_text_mode(exp, text_mode); + ++ if (bootflow_countdown) { ++ ret = bootflow_menu_show_countdown(exp, prompt, ++ bootflow_delay_secs); ++ skip_render_once = true; /* Don't print menu twice on start */ ++ } + done = false; + do { + struct expo_action act; + int ichar, key; + +- ret = expo_render(exp); ++ if (skip_render_once) ++ skip_render_once = false; ++ else ++ ret = expo_render(exp); + if (ret) + break; + +@@ -231,7 +310,23 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + schedule(); + mdelay(2); + ichar = cli_ch_process(cch, -ETIMEDOUT); ++ if (bootflow_countdown) { ++ bootflow_delay -= 2; ++ bootflow_time += 2; ++ if (bootflow_delay <= 0) ++ ichar='\n'; ++ if (bootflow_time < 1000) ++ continue; ++ bootflow_time = 0; ++ --bootflow_delay_secs; ++ ret = bootflow_menu_show_countdown(exp, ++ prompt, bootflow_delay_secs); ++ if (ret) ++ break; ++ } + } ++ if (ret) ++ break; + if (!ichar) { + ichar = getchar(); + ichar = cli_ch_process(cch, ichar); +@@ -265,6 +360,17 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + break; + } + } ++ if (bootflow_countdown) { ++ /* A key press interrupted the auto-boot timeout */ ++ bootflow_countdown = false; ++ if (strlen(prompt) == strlen(promptChoice)) { ++ /* "Auto-boot in" becomes "Press ENTER" */ ++ (void) memcpy(prompt, promptChoice, ++ strlen(promptChoice)); ++ ret = expo_render(exp); ++ skip_render_once = true; ++ } ++ } + } while (!done); + + if (ret) +@@ -272,7 +378,6 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + + if (sel_id) { + struct bootflow *bflow; +- int i; + + for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36; + ret = bootflow_next_glob(&bflow), i++) { +diff --git a/cmd/Kconfig b/cmd/Kconfig +index 978f44eda4..0303869625 100644 +--- a/cmd/Kconfig ++++ b/cmd/Kconfig +@@ -288,6 +288,7 @@ config CMD_BOOTDEV + config CMD_BOOTFLOW + bool "bootflow" + depends on BOOTSTD ++ select CMD_BOOTFLOW_BOOTDELAY + default y + help + Support scanning for bootflows available with the bootdevs. The +@@ -303,6 +304,17 @@ config CMD_BOOTFLOW_FULL + + This command is not necessary for bootstd to work. + ++config CMD_BOOTFLOW_BOOTDELAY ++ int "bootflow - delay in seconds before booting the first menu option" ++ depends on CMD_BOOTFLOW ++ default 30 ++ help ++ On the bootflow menu, wait for the defined number of seconds before ++ automatically booting. Unless interrupted, this will auto-boot the ++ first option in the generated list of boot options. ++ ++ Set this to zero if you wish to disable the auto-boot timeout. ++ + config CMD_BOOTMETH + bool "bootmeth" + depends on BOOTSTD +diff --git a/doc/usage/cmd/bootflow.rst b/doc/usage/cmd/bootflow.rst +index 5d41fe37a7..728f294274 100644 +--- a/doc/usage/cmd/bootflow.rst ++++ b/doc/usage/cmd/bootflow.rst +@@ -32,6 +32,17 @@ Note that `CONFIG_BOOTSTD_FULL` (which enables `CONFIG_CMD_BOOTFLOW_FULL) must + be enabled to obtain full functionality with this command. Otherwise, it only + supports `bootflow scan` which scans and boots the first available bootflow. + ++The `CONFIG_CMD_BOOTFLOW_BOOTDELAY` option can be set, defining (in seconds) the ++amount of time that U-Boot will wait; after this time passes, it will ++automatically boot the first item when generating a bootflow menu. If the value ++is set to zero, the timeout is disabled and the user must press enter; if it's ++negative, the timeout is disabled, and the maximum number of seconds is 99 ++seconds. If a value higher than 100 is provided, the value is changed to a ++modulus of 100 (remainder of the value divided by 100). ++ ++If the `CONFIG_BOOTFLOW_BOOTFLOW` option is undefined, the timeout will default ++to 30 seconds. ++ + bootflow scan + ~~~~~~~~~~~~~ + +diff --git a/include/bootflow.h b/include/bootflow.h +index 4d2fc7b69b..9f4245caa7 100644 +--- a/include/bootflow.h ++++ b/include/bootflow.h +@@ -452,7 +452,15 @@ int bootflow_iter_check_system(const struct bootflow_iter *iter); + * @expp: Returns the expo created + * Returns 0 on success, -ve on error + */ +-int bootflow_menu_new(struct expo **expp); ++int bootflow_menu_new(struct expo **expp, const char *prompt); ++ ++/** ++ * bootflow_menu_show_countdown() - Show countdown timer for auto-boot ++ * ++ * Returns the value of expo_render() ++ */ ++int bootflow_menu_show_countdown(struct expo *exp, char *prompt, ++ char bootflow_delay); + + /** + * bootflow_menu_apply_theme() - Apply a theme to a bootmenu +-- +2.39.5 + diff --git a/config/u-boot/x86/patches/0005-Libreboot-branding-version-on-the-bootflow-menu.patch b/config/u-boot/x86/patches/0005-Libreboot-branding-version-on-the-bootflow-menu.patch new file mode 100644 index 00000000..f913572f --- /dev/null +++ b/config/u-boot/x86/patches/0005-Libreboot-branding-version-on-the-bootflow-menu.patch @@ -0,0 +1,213 @@ +From 4ff0f509aa28eb8e85f1c0c9929c63996c646bb8 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 4 Dec 2024 18:20:19 +0000 +Subject: [PATCH 1/1] Libreboot branding/version on the bootflow menu + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + boot/bootflow_menu.c | 2 +- + drivers/video/u_boot_logo.bmp | Bin 6932 -> 27350 bytes + 2 files changed, 1 insertion(+), 1 deletion(-) + +diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c +index 84831915a2..8e26ec2aef 100644 +--- a/boot/bootflow_menu.c ++++ b/boot/bootflow_menu.c +@@ -59,7 +59,7 @@ int bootflow_menu_new(struct expo **expp, const char *prompt) + ret = scene_menu(scn, "main", OBJ_MENU, &menu); + ret |= scene_obj_set_pos(scn, OBJ_MENU, MARGIN_LEFT, 100); + ret |= scene_txt_str(scn, "title", OBJ_MENU_TITLE, STR_MENU_TITLE, +- "U-Boot - Boot Menu", NULL); ++ "Libreboot 20241205 release (U-Boot Menu) https://libreboot.org/", NULL); + ret |= scene_menu_set_title(scn, OBJ_MENU, OBJ_PROMPT); + + logo = video_get_u_boot_logo(); +diff --git a/drivers/video/u_boot_logo.bmp b/drivers/video/u_boot_logo.bmp +index 47f1e9b99789584d2f6dd71e954b51927b35d783..bc9ae001badb25bc900058c167a47247ef91dc7c 100644 +GIT binary patch +literal 27350 +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 + +literal 6932 +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 + +-- +2.39.5 + diff --git a/config/u-boot/x86/patches/0006-i-made-it-purple.patch b/config/u-boot/x86/patches/0006-i-made-it-purple.patch new file mode 100644 index 00000000..594a1b35 --- /dev/null +++ b/config/u-boot/x86/patches/0006-i-made-it-purple.patch @@ -0,0 +1,33 @@ +From 9c1ceb5a5b302275da146149001f4210a1d7fc86 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 4 Dec 2024 20:13:42 +0000 +Subject: [PATCH 1/1] i made it purple + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + boot/expo.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/boot/expo.c b/boot/expo.c +index ed01483f1d..04726d1c9a 100644 +--- a/boot/expo.c ++++ b/boot/expo.c +@@ -189,13 +189,10 @@ int expo_render(struct expo *exp) + struct udevice *dev = exp->display; + struct video_priv *vid_priv = dev_get_uclass_priv(dev); + struct scene *scn = NULL; +- enum colour_idx back; +- u32 colour; + int ret; + +- back = CONFIG_IS_ENABLED(SYS_WHITE_ON_BLACK) ? VID_BLACK : VID_WHITE; +- colour = video_index_to_colour(vid_priv, back); +- ret = video_fill(dev, colour); ++ /* sexy libreboot purple background */ ++ ret = video_fill(dev, 0x280b22); /* #280b22 in HTML RGB notation */ + if (ret) + return log_msg_ret("fill", ret); + +-- +2.39.5 + diff --git a/config/u-boot/x86_64/patches/0004-Support-auto-boot-timeout-delay-bootflow-menu.patch b/config/u-boot/x86_64/patches/0004-Support-auto-boot-timeout-delay-bootflow-menu.patch new file mode 100644 index 00000000..ffc7b581 --- /dev/null +++ b/config/u-boot/x86_64/patches/0004-Support-auto-boot-timeout-delay-bootflow-menu.patch @@ -0,0 +1,302 @@ +From d9371422ac74ea73d1620f01300a7136a7649754 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 4 Dec 2024 06:52:39 +0000 +Subject: [PATCH 1/1] Support auto-boot timeout delay bootflow menu + +The bootflow menu cannot currently auto-boot a selected entry, +which means that the user must press enter to boot their system. +This can be a problem on headless setups; for example, it is not +currently feasible to set up a headless server with U-Boot, when +using it to boot via UEFI on a coreboot setup. + +This patch adds the following build-time configuration option: + +CONFIG_CMD_BOOTFLOW_BOOTDELAY + +This creates a timeout delay in the given number of seconds. +If an arrow key is press to navigate the menu, the timer is +disabled and the user must then press enter to boot the selected +option. When this happens, the timeout display is replaced by +the old message indicating that the user should press enter. + +The default boot delay is 30 seconds, and the timeout is enabled +by default. Setting it to zero will restore the old behaviour, +whereby no timeout is provided and the user must press enter. + +If a negative integer is provided, the timer will default to +zero. The timer value is further filtered by modulus of 100, +so that the maximum number of seconds allowed is 99 seconds. + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + boot/bootflow_menu.c | 117 +++++++++++++++++++++++++++++++++++-- + cmd/Kconfig | 12 ++++ + doc/usage/cmd/bootflow.rst | 11 ++++ + include/bootflow.h | 10 +++- + 4 files changed, 143 insertions(+), 7 deletions(-) + +diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c +index 9d0dc352f9..172139b187 100644 +--- a/boot/bootflow_menu.c ++++ b/boot/bootflow_menu.c +@@ -30,7 +30,7 @@ struct menu_priv { + int num_bootflows; + }; + +-int bootflow_menu_new(struct expo **expp) ++int bootflow_menu_new(struct expo **expp, const char *prompt) + { + struct udevice *last_bootdev; + struct scene_obj_menu *menu; +@@ -54,7 +54,7 @@ int bootflow_menu_new(struct expo **expp) + return log_msg_ret("scn", ret); + + ret |= scene_txt_str(scn, "prompt", OBJ_PROMPT, STR_PROMPT, +- "UP and DOWN to choose, ENTER to select", NULL); ++ prompt, NULL); + + ret = scene_menu(scn, "main", OBJ_MENU, &menu); + ret |= scene_obj_set_pos(scn, OBJ_MENU, MARGIN_LEFT, 100); +@@ -138,6 +138,29 @@ int bootflow_menu_new(struct expo **expp) + return 0; + } + ++int bootflow_menu_show_countdown(struct expo *exp, char *prompt, ++ char bootflow_delay) ++{ ++ char *i; ++ ++ if (prompt == NULL) ++ return 0; ++ if (strlen(prompt) < 2) ++ return 0; ++ ++ i = prompt + strlen(prompt) - 2; ++ ++ if (bootflow_delay >= 10) { ++ *(i) = 48 + (bootflow_delay / 10); ++ *(i + 1) = 48 + (bootflow_delay % 10); ++ } else { ++ *(i) = 48 + bootflow_delay; ++ *(i + 1) = ' '; ++ } ++ ++ return expo_render(exp); ++} ++ + int bootflow_menu_apply_theme(struct expo *exp, ofnode node) + { + struct menu_priv *priv = exp->priv; +@@ -184,14 +207,62 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + struct expo *exp; + uint sel_id; + bool done; +- int ret; ++ int i, ret; ++ ++ /* Auto-boot countdown */ ++ char bootflow_delay_secs, *prompt; ++ int bootflow_time, bootflow_delay; ++ bool skip_render_once = false; ++ bool bootflow_countdown = false; ++ ++ /* TODO: perhaps set based on defconfig? */ ++ /* WARNING: These two strings must be of the same length. */ ++ char promptChoice[] = "UP and DOWN to choose, ENTER to select"; ++ char promptTimeout[] = "UP and DOWN to choose. Auto-boot in "; ++/* ++ // Uncomment if the strings become configurable (defconfig): ++ // (to prevent buffer overflows) ++ char promptDefault[] = "UP and DOWN to choose, ENTER to select"; ++ if (promptTimeout = NULL) ++ promptTimeout = promptDefault; ++ if (promptChoice = NULL) ++ promptChoice = promptDefault; ++ if (strlen(promptChoice) < 2) ++ promptChoice = promptDefault; ++ if (strlen(promptTimeout) < 2) ++ promptTimeout = promptDefault; ++ if (strlen(promptChoice) != strlen(promptTimeout)) ++ promptChoice = promptTimeout; ++*/ ++ prompt = promptChoice; ++ ++ bootflow_delay_secs = 15; /* TODO: set based on defconfig. */ ++ ++#if defined(CONFIG_CMD_BOOTFLOW_BOOTDELAY) ++ /* If set to zero, the auto-boot timeout is disabled. */ ++ bootflow_delay_secs = CONFIG_CMD_BOOTFLOW_BOOTDELAY; ++#else ++ bootflow_delay_secs = 30; ++#endif ++ ++ if (bootflow_delay_secs < 0) ++ bootflow_delay_secs = 0; /* disable countdown if negative */ ++ bootflow_delay_secs %= 100; /* No higher than 99 seconds */ ++ ++ if (bootflow_delay_secs > 0) { ++ bootflow_countdown = true; /* enable auto-boot countdown */ ++ prompt = promptTimeout; ++ bootflow_time = 0; /* Time elapsed in milliseconds */ ++ bootflow_delay = ++ (int)bootflow_delay_secs * 1000; /* milliseconds */ ++ } + + cli_ch_init(cch); + + sel_bflow = NULL; + *bflowp = NULL; + +- ret = bootflow_menu_new(&exp); ++ ret = bootflow_menu_new(&exp, prompt); + if (ret) + return log_msg_ret("exp", ret); + +@@ -216,12 +287,20 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + if (text_mode) + expo_set_text_mode(exp, text_mode); + ++ if (bootflow_countdown) { ++ ret = bootflow_menu_show_countdown(exp, prompt, ++ bootflow_delay_secs); ++ skip_render_once = true; /* Don't print menu twice on start */ ++ } + done = false; + do { + struct expo_action act; + int ichar, key; + +- ret = expo_render(exp); ++ if (skip_render_once) ++ skip_render_once = false; ++ else ++ ret = expo_render(exp); + if (ret) + break; + +@@ -231,7 +310,23 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + schedule(); + mdelay(2); + ichar = cli_ch_process(cch, -ETIMEDOUT); ++ if (bootflow_countdown) { ++ bootflow_delay -= 2; ++ bootflow_time += 2; ++ if (bootflow_delay <= 0) ++ ichar='\n'; ++ if (bootflow_time < 1000) ++ continue; ++ bootflow_time = 0; ++ --bootflow_delay_secs; ++ ret = bootflow_menu_show_countdown(exp, ++ prompt, bootflow_delay_secs); ++ if (ret) ++ break; ++ } + } ++ if (ret) ++ break; + if (!ichar) { + ichar = getchar(); + ichar = cli_ch_process(cch, ichar); +@@ -265,6 +360,17 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + break; + } + } ++ if (bootflow_countdown) { ++ /* A key press interrupted the auto-boot timeout */ ++ bootflow_countdown = false; ++ if (strlen(prompt) == strlen(promptChoice)) { ++ /* "Auto-boot in" becomes "Press ENTER" */ ++ (void) memcpy(prompt, promptChoice, ++ strlen(promptChoice)); ++ ret = expo_render(exp); ++ skip_render_once = true; ++ } ++ } + } while (!done); + + if (ret) +@@ -272,7 +378,6 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, + + if (sel_id) { + struct bootflow *bflow; +- int i; + + for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36; + ret = bootflow_next_glob(&bflow), i++) { +diff --git a/cmd/Kconfig b/cmd/Kconfig +index 978f44eda4..0303869625 100644 +--- a/cmd/Kconfig ++++ b/cmd/Kconfig +@@ -288,6 +288,7 @@ config CMD_BOOTDEV + config CMD_BOOTFLOW + bool "bootflow" + depends on BOOTSTD ++ select CMD_BOOTFLOW_BOOTDELAY + default y + help + Support scanning for bootflows available with the bootdevs. The +@@ -303,6 +304,17 @@ config CMD_BOOTFLOW_FULL + + This command is not necessary for bootstd to work. + ++config CMD_BOOTFLOW_BOOTDELAY ++ int "bootflow - delay in seconds before booting the first menu option" ++ depends on CMD_BOOTFLOW ++ default 30 ++ help ++ On the bootflow menu, wait for the defined number of seconds before ++ automatically booting. Unless interrupted, this will auto-boot the ++ first option in the generated list of boot options. ++ ++ Set this to zero if you wish to disable the auto-boot timeout. ++ + config CMD_BOOTMETH + bool "bootmeth" + depends on BOOTSTD +diff --git a/doc/usage/cmd/bootflow.rst b/doc/usage/cmd/bootflow.rst +index 5d41fe37a7..728f294274 100644 +--- a/doc/usage/cmd/bootflow.rst ++++ b/doc/usage/cmd/bootflow.rst +@@ -32,6 +32,17 @@ Note that `CONFIG_BOOTSTD_FULL` (which enables `CONFIG_CMD_BOOTFLOW_FULL) must + be enabled to obtain full functionality with this command. Otherwise, it only + supports `bootflow scan` which scans and boots the first available bootflow. + ++The `CONFIG_CMD_BOOTFLOW_BOOTDELAY` option can be set, defining (in seconds) the ++amount of time that U-Boot will wait; after this time passes, it will ++automatically boot the first item when generating a bootflow menu. If the value ++is set to zero, the timeout is disabled and the user must press enter; if it's ++negative, the timeout is disabled, and the maximum number of seconds is 99 ++seconds. If a value higher than 100 is provided, the value is changed to a ++modulus of 100 (remainder of the value divided by 100). ++ ++If the `CONFIG_BOOTFLOW_BOOTFLOW` option is undefined, the timeout will default ++to 30 seconds. ++ + bootflow scan + ~~~~~~~~~~~~~ + +diff --git a/include/bootflow.h b/include/bootflow.h +index 4d2fc7b69b..9f4245caa7 100644 +--- a/include/bootflow.h ++++ b/include/bootflow.h +@@ -452,7 +452,15 @@ int bootflow_iter_check_system(const struct bootflow_iter *iter); + * @expp: Returns the expo created + * Returns 0 on success, -ve on error + */ +-int bootflow_menu_new(struct expo **expp); ++int bootflow_menu_new(struct expo **expp, const char *prompt); ++ ++/** ++ * bootflow_menu_show_countdown() - Show countdown timer for auto-boot ++ * ++ * Returns the value of expo_render() ++ */ ++int bootflow_menu_show_countdown(struct expo *exp, char *prompt, ++ char bootflow_delay); + + /** + * bootflow_menu_apply_theme() - Apply a theme to a bootmenu +-- +2.39.5 + diff --git a/config/u-boot/x86_64/patches/0005-Libreboot-branding-version-on-the-bootflow-menu.patch b/config/u-boot/x86_64/patches/0005-Libreboot-branding-version-on-the-bootflow-menu.patch new file mode 100644 index 00000000..f913572f --- /dev/null +++ b/config/u-boot/x86_64/patches/0005-Libreboot-branding-version-on-the-bootflow-menu.patch @@ -0,0 +1,213 @@ +From 4ff0f509aa28eb8e85f1c0c9929c63996c646bb8 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 4 Dec 2024 18:20:19 +0000 +Subject: [PATCH 1/1] Libreboot branding/version on the bootflow menu + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + boot/bootflow_menu.c | 2 +- + drivers/video/u_boot_logo.bmp | Bin 6932 -> 27350 bytes + 2 files changed, 1 insertion(+), 1 deletion(-) + +diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c +index 84831915a2..8e26ec2aef 100644 +--- a/boot/bootflow_menu.c ++++ b/boot/bootflow_menu.c +@@ -59,7 +59,7 @@ int bootflow_menu_new(struct expo **expp, const char *prompt) + ret = scene_menu(scn, "main", OBJ_MENU, &menu); + ret |= scene_obj_set_pos(scn, OBJ_MENU, MARGIN_LEFT, 100); + ret |= scene_txt_str(scn, "title", OBJ_MENU_TITLE, STR_MENU_TITLE, +- "U-Boot - Boot Menu", NULL); ++ "Libreboot 20241205 release (U-Boot Menu) https://libreboot.org/", NULL); + ret |= scene_menu_set_title(scn, OBJ_MENU, OBJ_PROMPT); + + logo = video_get_u_boot_logo(); +diff --git a/drivers/video/u_boot_logo.bmp b/drivers/video/u_boot_logo.bmp +index 47f1e9b99789584d2f6dd71e954b51927b35d783..bc9ae001badb25bc900058c167a47247ef91dc7c 100644 +GIT binary patch +literal 27350 +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 + +literal 6932 +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 + +-- +2.39.5 + diff --git a/config/u-boot/x86_64/patches/0006-i-made-it-purple.patch b/config/u-boot/x86_64/patches/0006-i-made-it-purple.patch new file mode 100644 index 00000000..594a1b35 --- /dev/null +++ b/config/u-boot/x86_64/patches/0006-i-made-it-purple.patch @@ -0,0 +1,33 @@ +From 9c1ceb5a5b302275da146149001f4210a1d7fc86 Mon Sep 17 00:00:00 2001 +From: Leah Rowe <info@minifree.org> +Date: Wed, 4 Dec 2024 20:13:42 +0000 +Subject: [PATCH 1/1] i made it purple + +Signed-off-by: Leah Rowe <info@minifree.org> +--- + boot/expo.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/boot/expo.c b/boot/expo.c +index ed01483f1d..04726d1c9a 100644 +--- a/boot/expo.c ++++ b/boot/expo.c +@@ -189,13 +189,10 @@ int expo_render(struct expo *exp) + struct udevice *dev = exp->display; + struct video_priv *vid_priv = dev_get_uclass_priv(dev); + struct scene *scn = NULL; +- enum colour_idx back; +- u32 colour; + int ret; + +- back = CONFIG_IS_ENABLED(SYS_WHITE_ON_BLACK) ? VID_BLACK : VID_WHITE; +- colour = video_index_to_colour(vid_priv, back); +- ret = video_fill(dev, colour); ++ /* sexy libreboot purple background */ ++ ret = video_fill(dev, 0x280b22); /* #280b22 in HTML RGB notation */ + if (ret) + return log_msg_ret("fill", ret); + +-- +2.39.5 + |