Add bootflow/branding patches to arm64 U-Boot too

U-Boot on ARM64 also enables the bootflow menu.

Can
U
Boot
????

Signed-off-by: Leah Rowe <leah@libreboot.org>
20250107_branch
Leah Rowe 2024-12-04 18:54:01 +00:00 committed by Leah Rowe
parent 773cd8b384
commit 421e73c04c
5 changed files with 518 additions and 6 deletions

View File

@ -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

View File

@ -0,0 +1,207 @@
From c7c7d0a63978d73b701dc7032e47f8ede768de00 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] Canuboot branding
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..318dbf8b8b 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);
+ "Canoeboot 20241207 release (U-Boot Menu) https://canoeboot.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..4ec647c7200864febd678f39d8775b77b6688101 100644
GIT binary patch
literal 27350
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
Mj^eGhO~v2;0HRmC?*IS*
literal 6932
zcmb7J3sjWXwf?sM%m9M}3aA(*B(X##snNz*U$IeRG>LimKpwtD@qvhnD4<9bH9<{c
zuq4JwK}|`-nLKJMq^L<PK@Al`udF+i3Xw;XLK{Z}O8hCe_d7pBVs3NqT9@Ul|D3(|
z`OZH3?7h!E$7#<54T15u)dZ|(>zL;!@P@FRI}mW$dVc?6U;U=doSVeY|Ld>M|BzlY
zU9fTnu=epjSoH)D$KUFieXwSh32UFUVBJ&Rh=1COl}`m>&9h#JdwL+&%nnBEvw>Lm
zd|#}e>xWg(55mf4?nT1fepoYa2v*F!7i;GaMeMx$urA_mteig#@e4w+EMg?qN8W>k
zsCy9`^&r+pkHE^vM-U$qj%Cq5!TLoHAYsvi*sx?2Vi!)v#-$G-e(6{&T{IQzmyg5p
zrPHxt#ZQqKJ07viXJF~_S=h8{A`(_Vh83}MusC);HmsS7#I@6~aosd5i(7zA@sDHq
z>L?_{&q89tlUTBLA(pIJj*SU(uxwo{HYd)*qWCx@ZQ|HXQCPZREjA`aW8sEP*qpo&
zNn00T>E>i4rz}BC(l%^LU5-UbJFz)!1(LSMB06~&w(MAm<n%Z!+?I*0=?U1Jo`}V%
z`;e5e3DK#qV9N`ek-RGj3%9?DZJEi~oVg8))3Xts{w7lQZo`(nsff<VLGr#dEX=SY
za#t?4Wu+tKrA(ym--)!WJ&4(J9Lf7%#DdI|*m~e4MD8iTwu4znd3isg_BoLH$^pc@
z_#V<;J&5gxUPeULhuHesAw=yjLdxN6q-MW?B?nI<`oKqsICvImKYtV3bB<!cE9VjQ
z^6!!U##=}|l85<+E+XyCV~BX|61E>bj`c@A#18ujL>?|f`de=!D*JQHJN!pvymbnx
zx$k2B&;J7vIajg$*hwsSy$U<>-bebe4>9M63p<bh3iIBm#fH33ka6NP<{zm;%#m8e
z9Q_j_-uwa!j$X(1{4<EOHz4Y*Mx?)6gy>&1Au8_+>^%7qmgLnTqo5cu$Lq1{<nOTX
zL<1JR-G~)$H(-bJW30)qMY`itEdFH^b~;P3B>yj1$zR5M7qRr6udwXhzasA4udwTb
z%UFK08LLnJ6}vwy!<vF-?EK)5SmXE$Vo&`IYfrUc=jkh0=lDC4-@lHGUsoXB`88I)
z-;7<quEP5FZeaZf&Div-Mr5A(PbB>6Z`g49@7P=PCnWy*Yi#_@4ZQH%YuI$gjorny
z*j#uMnP=;eRCEhlK5E0B^VgC5+ji_b_a*jy+<>jc9oTmEAK3kI3wHgk2`T3~k@?Br
zkb3?$Qa)+No(q3R+Q&Nf{{CyEUFg8Rk{j6m`+wlYPu<v2(uv)rxA0PFE7Cu`jjW5e
zu(MRho=fe>xY&igmpkynrGH}IXaB&i%iVbK@;~un8OMC~UwG-WZe*7I3t9Z_`NO|3
z69F=l`CuxfPl!xqYcht5^qI`o1pHVg@;eR>%TM`z7!$~On61&2{+WzsYZP14WfWTv
zVwOC}Z#XGWiD=<$kHB+mjbLjy=E`t>??;4$@%tl0$&dKGkJ2$jy^rmCu|)3WHx!~R
zmr%CuCfAGUFD!Cr_N!@gLjy!iGSNI8+LSRv;j1`{c4zNhJy!E!J9vIZcGl)87Pc+n
z@q2eh`kRP+H*rGXB@!lQymdJ#!}^KL@zJ4OPY#4dBuL)z(&dVbu?RHp%x+k8`9fxK
z#5S`o*%k>Q!cc`UPTH-y+>-JBB5}UD+>~*gAyBUQ=<<zBW7{leC=q8CqUmzZONMgn
z5H&VXnoT-PU%hjz%B0H;3HBp~#+kHIX&~jcjL<}KG#%#doaOOVAdga{#i?=c$Hkqa
z)L71uN*Po8u~RwTq7IC~w3fHXMsnlCO!;Z@HOFRn@Dn&<oHQ%kV<N%b3U?-@EOJ`W
zl4;QfMcYi8CcD`>#S!oDJJ%+I4SXMwD)uvJt7rLb7R}b9dji+_oS}_bW|Q+d`(suA
zI<3uqyV!^oD7V=TBtB=9Fh2<<>L6G}tkgM-sAjpLbP1yd!7$$?L6lXtQTSn8y%r=}
zl#W{{t0c8xnWg$C+5eE=NgnJFe;GvVf%F=p2b0q+8f||@=`^0Z?!|BTci2-DwoNh>
zRt&K|SJ>eat@>H)zsm1(-^U(+z9Pd&zd@VRN-#|mNl>^mJ-A%4O)e`=sYoUzBZyS0
zkjF@*Lf*~3qDS^3_m=_G`dj4YUgYT>jmH?su$)@Fcx~1V<qeMs_e+;}B3)O=VT@t+
zkFkG@->1Hh90cx{(zzGeOyoN(O;5fp(Ht|AGN)*Bf9Y1JHW{W+zYsImWReE9NB1HJ
zNDy@n1ikDIWSOo!gAs5*0>9n)aJIOcFkj)UhF?ER%5<W&i?tUoPy&e;07llo;i<9b
z5)-qoDQz}VzrCbbzIZBRSUmNV7-B>#O8cVF&<OfIELkG+6aUPXDI+m)Vt)xBc7HJL
ze*jw&INsav%^B3oCRNn`vRFvf<b5mWZVnQy9V&MONdNy6iQ^|xBW1%NDdmV#31ZtS
zIo`y%HiBUX=87|c(vLX((EoqYh&bWIxyFoS)n?>eYj3}nGlNkMpRt)$x4vn3C&B`g
zK--e7Vi%@k+1ayuF#Va&e|VL|j3;K*@SZpf86^JH!H?PFheyD&cSQJ<on0LBV(*w>
z@iWE*{=gjcqIMZZNfnVpdn9cL`gh4#+V{FVGD2VunLTHmhQY$37JV7DL8JwiHh+}^
zuGPG{p}8td`EHn$nyX;Gd?s_IH&2<qhV)Cu*BAT6mwhV^iuI1K57%{&JLp525A6(V
z|Ea5Xy!>*?sz(Dx(T*0IE%>e=o6UmB(j!C98zd{Oc3CHbLj}H;(DBc$PJ88@(yAM<
z>F{l?I`{U0)YY>e39(?bcoWx~-VaTC<_P-Q<%m2nNZ_RfPg<OHt^vd7h1bvRju{^m
zZpeD6NU_Sges)<ZX6j=Op0VxREj&cOxN&;(V}ZC|yol+g)~m^?0K2RZt*^io5|ML#
z0{6J;z;i+OeJArwkX;_9l}z4K(yFGCe`U)!ODO#duqcc{a)c7EOMm)_$ucSH=1j`m
z%ARB%`kl<Gfp%D;M0;fKjb|9|4Qb)H%ix;17tC{ha)c7vTalMBkNna(77X(6Im4p^
z$jf(iA(Fi2je!^_X3lO_vo8&_OTM@kk<*?LNH0(v6ZeF?r2YnP8F@G3tq2recgSPb
zGmAzq-9sCdNN23_l34*BE~^03l&`D87?r#H?BbM`)y#Ji+|S@^JYnGzbW_(qCqNQx
zcDb}pozFA;zvWA!%ACyB3w`a9C$$MYBgO0|8fRDI<+9>uiabmo$d}ecp5NkcGx);$
z7bODC+^s)zACJJ>E(OxIiD#Y!^)+M&!hg)blPttxghYAS#UUL@j5!JRy%T3PCCtNU
z-@`E5<%F~)D;%q@sCmGjG20?m5M#OC$tJtx%9q=8c|$awYj?`TQ%2Pt^EA7-QgvDM
z9iR4GOztDxf3x<y-PsND+a;K%xz;laC7z{(I)Nuh({`SD-{Wx|5=h>}P#xCR>I;RA
z0%vjMmxI}>FE4f$I14Y;bOtjr+*gYW3mne#SKZx=6rQ<Z#4*;v8E7-^qeh&gA&iOo
z!otd?4(2R#YxSjqN(AZfZ!7!drP|gmUGHeDaGY;ZG{0(R@l|(6x8C7)opn|dHLVwu
z-z%&e_7c%Yz8OMWcNCv@`_h}P7Sy0Wzb;2LRKKzCg6f;x&ayV<aZ^XRqlsCn!KjxE
z{fM=hSTl$<o=94YqYm@}OIw}GRnx+j)=^vre}0QEbs3zd>Z{fDor>dfw84+x8mHUf
zwAQ*@wQj|6JJtLW#?^bQ0IyL?KDl`Dg9Wh6lQ-|8OiO`Von}|1z``iXD=~T(rHm{6
zNGfR`t+6;47Uk*Hs@LS~Kwll+HScxOP8IoT)QR#og;6Ng%&4<i_0lsq=hMtaF3w?b
zw(5FgzSRz|+%jG7=B<QQu~b&*dgpmxM!wUn>-E1O&8y8xRM&AR**ur7cX3TTr<M_o
zUQH`0%xdnurJUTFT$>%{BI@A)?P_s5*>sX-Io_h{CDaDyj~aEo5`L8XOxIhS3N2n~
zsA}_{rN8TN{K6|;{y;?YFLm9W3x7&d$x0U`Ii^<cE;48*Itgvi+=aSci++@=*7f2R
zbsonmM0$J-_mI`Q#L^qhHRWWZza6Glz4bRlGZpB19s6c7irgFrb49h@oo`^BAg@ee
z&GulOCRQ@BrVz_iQLA?b5UEnv3)Hwa>Oh|&Rz7vDQCOyrTJ<I+Q?GXv5+}T8mC84X
zbcIMZ=^jM63oW`^$(883Q(-l!1{6itt1A@}%~-AaS2-JRB+X*-V2xuW+K6;g;aqI$
z!J%CZoR;6|dZD3HF8A=Np%am66cRT}A?>vqmX}$?2_;Sham<x8<8i}IY#6KS;IJ|S
ziH(X{1F6`pw<@F-y|su);U1)DB8@il^n2)V3kIsyP>V9dqQ|@Rrt`**IXcwNdUlNd
zt5)rzDGLo6=Wtc3yVg<O<CKrBW&1I8T1_}&FH{;jI(0qY@PZn;RlR{($?@d|ja$)D
ztZ0@_Lb>zkYnEL4pR<h_r%Q%;P-BTYo>}xhd7U}3hPqm+FX(z}f%0Kmn!c%gxYN<5
z>lc*|t59&ZC|Wt$O?iDu%d6$qln`knPh_R*9F@VtSkCPOvvZ!f6>bsL?7X02D4*Wn
z!5Cr|sFOm*Xtf;oQCYm4?FuPlBwHNRwY5-5t2lHQbb@-H7PFech~sJM90?YAoLQhi
zItS{^1vShCrq(iNuBPIj5v_7VhqF%QU6&LoZkMYlk6cr(v$D;Y?L4a&t<~9L$TpP}
zP-C9kB~3=(?QpAkuSuXy&D)0&AF58d8zwOy0#C3)u1xDJDp5PtCau&-t9R5JInm{4
z;#hK9JB)9~*^36f)mcGlXl-p>2HizVaE=BU#?znqMEcNz*O)0yIU*xz7pGbsy|tjS
zQ~5}Dec{;-Pv$<~q$0Sj+))=m#ByeK?u=IL{H*7eKFpt5GXrEQw7EP7d3N`p`E^}&
zI4i2_>T9kR7nHaM=&&`i;i_q@bCo%np-J)Us3<6`q)c^XQ9*edSICpPpJ9J$ID*zR
zH&f;HV8xIxjm!w%9ko}>KdW@Pd0Kckxhl&lTy>qywcf4OmE~oX)ve3`N5#haj(f;h
zF~#d$)9HQb^dc>{vKwoueb;JDRsP1=z%xHwLU@AjV^vcqt*mNFC7jiR!KGA+zw(>P
zl^l0#u}Rg_y_{97qa0GN>ZtClAXZ=Ba-LxI<&;`geRXGtf<DwcX2<}=sf!}#_JLuz
z%fk_+Pl~Gbwy$n5YP~NKgD`~Lo{<Ls0aY#DBbHewyIC!oZXcay3b{jqw}@4&IG3ob
z;5+9uW>Kd5bY$Q?-<Pq<3#@H-h*j0D!E=w^RJCjKtFr@H4;iy*>IO5wr~-FM0HeWd
z9=q|}H<(Ddrq$uv{ol&bN;XNN-8P6-Rn(U7n4D`E!`N!8VTjmA7&Vthn?W;8*r!f6
zZU3VhYgkxpqvw3u)EP$Ejz-r-=W)xo($Z%DHM9J5<zdE&>9rLPvtouV$!^arC@iV0
zu5WT1zG>}ne_2;uSyEV#OYeA{_ntngk~Hx)1Cw>o04vu$Pvw~7CkhH2FgvvZIWBnv
z?ef}iPfh!%$P+)YOZpxCk?cp^(KpG<W9;(4{hrF2Bc_hFOUm%?`X<>hikLFEhh_m~
ztdjJgT@K0p!#%bB6k5Ri^kIxtx0?YYJXFzs#zf;gc}3E$LwnLqDYD<kAusr*z<bB8
zgNL@Rdh+g(T$Q>}c;RW*iaf)^CVOrm>`!AqVv^@3^pvpbW5s+&-y*je4c&6rL_@|0
zlsQeAstKMO7yB`+T+WGU9OqHDFe{!k-it{6N~S;JxzSN>H#4UB*2gc6)bJ2<h`Q<d
zD%l{pscM?WJiC3Jd6aPz?5pUJ%)I%`%#Z)rb6X@$lcSuyh86dI(H=1FoHiwEG2R6$
zm}UKXsD6rSlMi{`m5@3(+;i)t9u~=9mZ&7v+C%kMmYE{zO|ON>N#Vw=x*w^~EOV}?
z`s^&vog;GpNY9=BS=xNW@?%wJ?R$O_ZqWK;r}3^3fE~t5MIh3Q*N`Bj7_Te?u+{TI
zBwDi38i*~z{|rJfHW@Eo!ARu#)VrE`4NNfJ?S^2T@jf^dYm8UO5X2cTnS4{#Vnw}*
z-h-Z3*4}s5`>>EG>Ls@Kbv6tOjMv)U*V_?zUes%DIA)7_-|c<#<twn(^9szDVQq?x
wA@94_V)cG3+BniCF!%phCa^V`EuNoDjq0U&Do6FaK0m2mbu}=?pJWRCZ}IWH!~g&Q
--
2.39.5

View File

@ -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
@ -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

View File

@ -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
@ -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

View File

@ -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
@ -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