From 3e02345729e6c661122a8eac4e344e341ff255ca Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Thu, 13 Mar 2025 22:37:16 +0000 Subject: [PATCH 01/65] 2025.04 RC4 --- ...identifiers-for-the-new-RPi-5-series.patch | 43 ----- rpi-fixes.patch | 156 ++++++++++++++++++ sources | 2 +- uboot-tools.spec | 14 +- 4 files changed, 165 insertions(+), 50 deletions(-) delete mode 100644 rpi-Add-identifiers-for-the-new-RPi-5-series.patch create mode 100644 rpi-fixes.patch diff --git a/rpi-Add-identifiers-for-the-new-RPi-5-series.patch b/rpi-Add-identifiers-for-the-new-RPi-5-series.patch deleted file mode 100644 index 66db2ca..0000000 --- a/rpi-Add-identifiers-for-the-new-RPi-5-series.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 49423505898eef1baefa2823408dad8321571353 Mon Sep 17 00:00:00 2001 -From: Peter Robinson -Date: Sun, 29 Dec 2024 14:43:33 +0000 -Subject: [PATCH] rpi: Add identifiers for the new RPi 5 series - -The Raspberry Pi foundation have released the Raspberry -Pi 500, CM5 an CM5 lite devices so add the assoicated -revision identifers so we can detect them. - -Signed-off-by: Peter Robinson ---- - board/raspberrypi/rpi/rpi.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c -index 18be244aa79..1e43c631898 100644 ---- a/board/raspberrypi/rpi/rpi.c -+++ b/board/raspberrypi/rpi/rpi.c -@@ -193,6 +193,21 @@ static const struct rpi_model rpi_models_new_scheme[] = { - DTB_DIR "bcm2712-rpi-5-b.dtb", - true, - }, -+ [0x18] = { -+ "Compute Module 5", -+ DTB_DIR "bcm2712-rpi-cm5-cm5io.dtb", -+ true, -+ }, -+ [0x19] = { -+ "500", -+ DTB_DIR "bcm2712-rpi-500.dtb", -+ true, -+ }, -+ [0x1A] = { -+ "Compute Module 5 Lite", -+ DTB_DIR "bcm2712-rpi-cm5l-cm5io.dtb", -+ true, -+ }, - }; - - static const struct rpi_model rpi_models_old_scheme[] = { --- -2.47.1 - diff --git a/rpi-fixes.patch b/rpi-fixes.patch new file mode 100644 index 0000000..352261b --- /dev/null +++ b/rpi-fixes.patch @@ -0,0 +1,156 @@ +From 27e0160320c13168ab5d703c5ec4bec87a6d2700 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Sun, 29 Dec 2024 14:46:05 +0000 +Subject: [PATCH 1/4] rpi: Add identifiers for the new RPi 5 series + +The Raspberry Pi foundation have released the Raspberry +Pi 500, CM5 an CM5 lite devices so add the assoicated +revision identifers so we can detect them. + +Signed-off-by: Peter Robinson +Acked-by: Matthias Brugger +--- + board/raspberrypi/rpi/rpi.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index aa39afa338a..4d546892842 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -193,6 +193,21 @@ static const struct rpi_model rpi_models_new_scheme[] = { + DTB_DIR "bcm2712-rpi-5-b.dtb", + true, + }, ++ [0x18] = { ++ "Compute Module 5", ++ DTB_DIR "bcm2712-rpi-cm5-cm5io.dtb", ++ true, ++ }, ++ [0x19] = { ++ "500", ++ DTB_DIR "bcm2712-rpi-500.dtb", ++ true, ++ }, ++ [0x1A] = { ++ "Compute Module 5 Lite", ++ DTB_DIR "bcm2712-rpi-cm5l-cm5io.dtb", ++ true, ++ }, + }; + + static const struct rpi_model rpi_models_old_scheme[] = { +-- +2.48.1 + +From 2d75c46be99c15fa186436c149b87ee97e0b8f44 Mon Sep 17 00:00:00 2001 +From: Martin Stolpe +Date: Wed, 23 Oct 2024 15:09:20 +0200 +Subject: [PATCH 2/4] rpi: Only add frame buffer node if CONFIG_FDT_SIMPLEFB is + set + +The functions fdt_simplefb_add_node and fdt_simplefb_enable_and_mem_rsv +are only available if CONFIG_FDT_SIMPLEFB is enabled. + +Signed-off-by: Martin Stolpe +Acked-by: Matthias Brugger +Signed-off-by: Peter Robinson +--- + board/raspberrypi/rpi/rpi.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index 4d546892842..fe6153b388b 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -604,11 +604,13 @@ int ft_board_setup(void *blob, struct bd_info *bd) + + update_fdt_from_fw(blob, (void *)fw_dtb_pointer); + +- node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); +- if (node < 0) +- fdt_simplefb_add_node(blob); +- else +- fdt_simplefb_enable_and_mem_rsv(blob); ++ if (CONFIG_IS_ENABLED(FDT_SIMPLEFB)) { ++ node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); ++ if (node < 0) ++ fdt_simplefb_add_node(blob); ++ else ++ fdt_simplefb_enable_and_mem_rsv(blob); ++ } + + #ifdef CONFIG_EFI_LOADER + /* Reserve the spin table */ +-- +2.48.1 + +From fc7a3110184a3ca4c227675b20d3a4887210e36c Mon Sep 17 00:00:00 2001 +From: Fiona Klute +Date: Wed, 12 Feb 2025 12:39:01 +0100 +Subject: [PATCH 3/4] Raspberry Pi: Keep warnings from firmware in DT, if any + +The /chosen/user-warnings property is created by the RPi firmware if +there are warnings to report, keep it to make debugging easier. + +For example, if the firmware config.txt contains +"dtoverlay=error-example" and that example references an undefined +symbol "&nosuchdev" the warning can be read after boot: + +$ cat /proc/device-tree/chosen/user-warnings +dterror: can't find symbol 'nosuchdev' +Failed to resolve overlay 'error-example' + +Signed-off-by: Fiona Klute +Reviewed-by: Matthias Brugger +Signed-off-by: Peter Robinson +--- + board/raspberrypi/rpi/rpi.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index fe6153b388b..43efb0dbc1d 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -594,6 +594,9 @@ void update_fdt_from_fw(void *fdt, void *fw_fdt) + /* kernel address randomisation seed as provided by the firmware */ + copy_property(fdt, fw_fdt, "/chosen", "kaslr-seed"); + ++ /* warnings from the firmware (if any) */ ++ copy_property(fdt, fw_fdt, "/chosen", "user-warnings"); ++ + /* address of the PHY device as provided by the firmware */ + copy_property(fdt, fw_fdt, "ethernet0/mdio@e14/ethernet-phy@1", "reg"); + } +-- +2.48.1 + +From e042d7593a0b7544259fd2d22240e78d18912746 Mon Sep 17 00:00:00 2001 +From: Fiona Klute +Date: Wed, 12 Feb 2025 12:39:02 +0100 +Subject: [PATCH 4/4] Raspberry Pi: Copy Bluetooth device address in DT + +The firmware sets local-bd-address, copy it when loading a new DT. + +Signed-off-by: Fiona Klute +Signed-off-by: Peter Robinson +--- + board/raspberrypi/rpi/rpi.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index 43efb0dbc1d..70d3c35499b 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -599,6 +599,9 @@ void update_fdt_from_fw(void *fdt, void *fw_fdt) + + /* address of the PHY device as provided by the firmware */ + copy_property(fdt, fw_fdt, "ethernet0/mdio@e14/ethernet-phy@1", "reg"); ++ ++ /* Bluetooth device address as provided by the firmware */ ++ copy_property(fdt, fw_fdt, "/soc/serial@7e201000/bluetooth", "local-bd-address"); + } + + int ft_board_setup(void *blob, struct bd_info *bd) +-- +2.48.1 + diff --git a/sources b/sources index 0c37e78..25593f8 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (u-boot-2025.04-rc3.tar.bz2) = 2e0b022cf0ffb0b8019375fb5087b1e05f3503ed2b33aed38a04a9286794a4ac81f36c2a9ab8adcfd85762454b636a21e1f7a8fee4c4206f37852664dd4b9e01 +SHA512 (u-boot-2025.04-rc4.tar.bz2) = aaf75661178b597b530628396f291fc9cd562f714c83b87f9bd6d00f26d5bbcc336523bc5446c5f9acce715a67b6508f63a7767408e01a875efea9b460c8ca38 diff --git a/uboot-tools.spec b/uboot-tools.spec index a8e5452..f124e4a 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -1,4 +1,4 @@ -%global candidate rc3 +%global candidate rc4 %if 0%{?rhel} %bcond_with toolsonly %else @@ -10,7 +10,7 @@ Name: uboot-tools Version: 2025.04 -Release: 0.5%{?candidate:.%{candidate}}%{?dist} +Release: 0.6%{?candidate:.%{candidate}}%{?dist} Epoch: 1 Summary: U-Boot utilities # Automatically converted from old format: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ - review is highly recommended. @@ -39,7 +39,7 @@ Patch8: USB-PD-TCPM-improvements.patch # Device improvments # RPi -Patch10: rpi-Add-identifiers-for-the-new-RPi-5-series.patch +Patch10: rpi-fixes.patch # Rockchips improvements Patch11: rockchip-Enable-preboot-start-for-pci-usb.patch #Patch12: rockchip-Modernise-Geekbox-config.patch @@ -54,7 +54,6 @@ BuildRequires: libuuid-devel BuildRequires: make BuildRequires: ncurses-devel BuildRequires: openssl-devel -BuildRequires: openssl-devel-engine BuildRequires: perl-interpreter BuildRequires: python3-devel BuildRequires: python3-setuptools @@ -68,11 +67,11 @@ BuildRequires: crust-firmware BuildRequires: python3-pyelftools BuildRequires: xxd %endif -%endif -Requires: dtc %ifarch riscv64 BuildRequires: %{opensbi} %endif +%endif +Requires: dtc %description This package contains a few U-Boot utilities - mkimage for creating boot images @@ -269,6 +268,9 @@ install -p -m 0755 builds/tools/env/fw_printenv %{buildroot}%{_bindir} %endif %changelog +* Wed Mar 12 2025 Peter Robinson - 1:2025.04-0.6.rc4 +- Update to 2025.04 RC4 + * Wed Feb 26 2025 Peter Robinson - 1:2025.04-0.5.rc3 - Update to 2025.04 RC3 From 9de9b912a1d8d90b67caaf2d58805b9c21ad6c37 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Thu, 13 Mar 2025 22:54:22 +0000 Subject: [PATCH 02/65] Add back openssl-devel-engine which was dropped by accident from an experiment --- uboot-tools.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/uboot-tools.spec b/uboot-tools.spec index f124e4a..6e78d72 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -54,6 +54,7 @@ BuildRequires: libuuid-devel BuildRequires: make BuildRequires: ncurses-devel BuildRequires: openssl-devel +BuildRequires: openssl-devel-engine BuildRequires: perl-interpreter BuildRequires: python3-devel BuildRequires: python3-setuptools From b8b36e696f677b3d822371cc2a2848711b54946f Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Wed, 19 Mar 2025 19:58:58 +0000 Subject: [PATCH 03/65] First copr for 2025.04 --- rk3566-boards | 14 ++ rk3566_ddr_1056MHz_v1.23.bin | Bin 0 -> 59392 bytes rk3568-boards | 11 + rk3568_ddr_1056MHz_v1.23.bin | Bin 0 -> 59392 bytes rk3588-boards | 26 +++ rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin | Bin 0 -> 75320 bytes ...identifiers-for-the-new-RPi-5-series.patch | 43 ---- rpi-fixes.patch | 156 +++++++++++++ sources | 2 +- uboot-tools.spec | 218 +++++------------- 10 files changed, 268 insertions(+), 202 deletions(-) create mode 100644 rk3566-boards create mode 100644 rk3566_ddr_1056MHz_v1.23.bin create mode 100644 rk3568-boards create mode 100644 rk3568_ddr_1056MHz_v1.23.bin create mode 100644 rk3588-boards create mode 100644 rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin delete mode 100644 rpi-Add-identifiers-for-the-new-RPi-5-series.patch create mode 100644 rpi-fixes.patch diff --git a/rk3566-boards b/rk3566-boards new file mode 100644 index 0000000..0ed9397 --- /dev/null +++ b/rk3566-boards @@ -0,0 +1,14 @@ +anbernic-rgxx3-rk3566 +nanopi-r3s-rk3566 +odroid-m1s-rk3566 +orangepi-3b-rk3566 +pinetab2-rk3566 +powkiddy-x55-rk3566 +quartz64-a-rk3566 +quartz64-b-rk3566 +radxa-cm3-io-rk3566 +radxa-zero-3-rk3566 +rock-3c-rk3566 +soquartz-blade-rk3566 +soquartz-cm4-rk3566 +soquartz-model-a-rk3566 diff --git a/rk3566_ddr_1056MHz_v1.23.bin b/rk3566_ddr_1056MHz_v1.23.bin new file mode 100644 index 0000000000000000000000000000000000000000..4da822e7a9cc442168bba4daff468aa80f168f15 GIT binary patch literal 59392 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 literal 0 HcmV?d00001 diff --git a/rk3568-boards b/rk3568-boards new file mode 100644 index 0000000..cedd01b --- /dev/null +++ b/rk3568-boards @@ -0,0 +1,11 @@ +bpi-r2-pro-rk3568 +evb-rk3568 +generic-rk3568 +lubancat-2-rk3568 +nanopi-r5c-rk3568 +nanopi-r5s-rk3568 +odroid-m1-rk3568 +qnap-ts433-rk3568 +radxa-e25-rk3568 +rock-3a-rk3568 +rock-3b-rk3568 diff --git a/rk3568_ddr_1056MHz_v1.23.bin b/rk3568_ddr_1056MHz_v1.23.bin new file mode 100644 index 0000000000000000000000000000000000000000..4da822e7a9cc442168bba4daff468aa80f168f15 GIT binary patch literal 59392 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 literal 0 HcmV?d00001 diff --git a/rk3588-boards b/rk3588-boards new file mode 100644 index 0000000..c5c072f --- /dev/null +++ b/rk3588-boards @@ -0,0 +1,26 @@ +cm3588-nas-rk3588 +coolpi-4b-rk3588s +coolpi-cm5-evb-rk3588 +coolpi-cm5-genbook-rk3588 +evb-rk3588 +generic-rk3588 +jaguar-rk3588 +khadas-edge2-rk3588s +nanopc-t6-rk3588 +nanopi-r6c-rk3588s +nanopi-r6s-rk3588s +neu6a-io-rk3588 +neu6b-io-rk3588 +nova-rk3588s +odroid-m2-rk3588s +orangepi-5-plus-rk3588 +orangepi-5-rk3588s +quartzpro64-rk3588 +rock5a-rk3588s +rock5b-rk3588 +rock-5c-rk3588s +rock-5-itx-rk3588 +sige7-rk3588 +tiger-rk3588 +toybrick-rk3588 +turing-rk1-rk3588 diff --git a/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin b/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin new file mode 100644 index 0000000000000000000000000000000000000000..0697ebd1e6fbcd2367000d68c4c7ee2c73af987c GIT binary patch literal 75320 zcmbTee|#IonLqyCU0ISPCy_Uf<*c1pavT#cDW$5NU{-^M0Ng0VtWAJvw}L+vxB{0oS^KKHSiGUnLx`3qb7b zw(*B2XOBNDQ9fz@$e6U@Xk!>9@WBLtmnBgxDAKcHiJm<$HhOa3*yzbofFJO|7+nTF z3i0)nX~wFcYlj8YwLtVX1r96Cfg{QWhNL9w*~p%rfek(+cR|-y26ibD^lUerulE2k zs_(cYs&AX7KMg!_ll#!XEBAz7e!DYTrzi*oUv)le{_+?2PIVMT!amk^cm0;{28_m8V zVdO0@ayS#87zFs84shKKt_ylLJvMr>`b=bE3cBV1ICD#Cfv-T-3+#Um=yCz|X)*Ye zIxLoV@ILdJnoGH~NsA1Y)zn_~WM8KPk;t z-}18D*=>g&ruNT z|M~x+?LB|D?R=Q{{8m&LeoGQY-nm{Jo{}8uyDif2+fsp=>u?O8mL&E4Ed|5xOBk7y zB=s)S?EeIG?UV%dC&8zbN$FDcvyG5vR+L4j!cd341Rk!0d^hmiuLMC2SNfuXIMmNg zl^GS7sm_J2y<-k)jV>e~b|6OmIzEVy@b>nJOC;1EZx3d^4b&fNPh^fsRqCU zJ1h87+Ta-NlE*^hu!zJbiRDOMMARgb3#d=Ibq&Jq>{MlXvqcl&!5@qg4@M$4KqeZ0rv8yU0AhB2-O5k0uF{QU z>YNz^_GH6?ZnbMlNN*N)f(z)=1pM1(K?i?5Ph(s{jNNkW1j!#NBd~ASeVH8HEL;Vi zIy#!2%IBQ|&A*T3Sq%PezFy+JE_{?97B8?TOMM}J2xa-Y-AE4Q>!yBxoR1&oA@OhM z=xBEIW9+=0&T_54^CE!y>N3(Z*tger=r}MAW_2DsEl&`DgFYEdUo$r7PFN|it`1k7C z`j>TmgvJf|y2}2tu8*|o3h>|yquJ=+t1Iw-)OAU|u8O~`>mzNt3OxM6X!er7SJ$Th zqprpIx&las#gDFskJPmrJn_P4c3!?N+K>NYJ;d{MReyYbe{4O*zy+4lgvp`J!aDHO z3!_=r-|NFY|3@FX>^_iuc;}qyhp1;UIeHRcoaV+Dt=-vsvO@aq^Xr@B)Oc%>V>vIrc|HIh-&Ptx;f@B8-!=&N+#Qu`AxZ{k}+1!7qYv^g7_^ou(-W zwk}uG)^gg}w%~M20LELU>3>PW2+5s=Z7rAFk+08^f4~X)S6#+#8>6yk`ZS_7cKYGX zjgUH4=i4ZDiP1aSS}uu{z)Nk7puh`=YltS5q5PKK1tf#ewczfN%?@AqHsYgjYET>h z>cP!`;H~_bm~6A;qRlVjlMd`bXQe^>(k@3|0J=8KE7IG9)2n{n=w>G@UBZjpGXlv~ z#<6vN6cBnV-R#6${e#N=K%GVFxk`gwj=qoURG)^fowoL*pMId1kWNDS$W$Socw2&c zN)kr?!!-Nfp}j^x-9b^8C#5;+hxh!m+n%!aBWmZMh-6^*$mX3gyA5u{-m2X4c*4ne zBhWGFL@a&|wQ1;D_c@_(kGvuXCnMaJ>=_KAdu-bM#_cY7f7jHO4+9yvgI z-)XZx?qvL4+RyXvgCaWO@0l_7o>@obw|LM?&-gjB{@+d0{|%Qe|JXGBbD+xyP1FBn zL6?6>G%L3}K0Oyi2jd$cbdVmh<3^qKc5OM$9a=LLkZJwDD#7N%x=JHJd;olb-GN@9 z@~Abgmn=7)U4|0tJ+|C9Ynp!RebaJ-bY<)P;^hX-N$dTp<<=ax-rJTNq$gSLJC|Gb ziuJyKxj}oo^**-Tcr~wcPtUctXbgO;;RWIi&C_&)F}w_Y)c+qZL*KN{ZvR_m>|2JC zV-D1dKI$)$$NYmz#DU@hAFGv$76rpSXZJK@&dY0CCL0&&PCOIwna7-!~dB@_x&pucqc^>e$ z^E&)HlBm);f43aDQ~p84>id(I8%v>U&BU9Tj0=LU1p;Hr7nh;W`v1f-<9hn%Wc=po zv|lbWuAwv!&5Omm7_gM`fJK(|C~%_(viCzxr}xDW%V6d`145xacowTtxpaVtm;&4L6d* zQl7?Dmm4*dUd4D_{+S5jaigu z3FB6ID)*hs4G*P>j8l2y72H@){VEh-mwW7TL!dnJ`7xNW41GI9#-~WXm1d7zYnuIU zOBjilGCnDwuFqN0+jlN9Vb$@Q%Z(G4p-(>-n=mg!AIUvRCwm8PUT(ZwPB!Y355IaD zO1^Qv)waskOA z>Jye5&tFEex>P-WS)M=D%Z=wQL*FrJj+&5RkZhy+sV!%>9e(&9P17IQy8S+yzugc& z*hj0|S~8Bd1(_BfEP1d3j33zKlUD%zMta{W%Qpgip@Z=U-Ls?Ce>he8Pid``r%Q?+ zaFj%!LV-$oSJGbQW}MbkaL+DfCE4!|tRHkBdE{b2T?z0jf!Izr))$m8p6W#LP+(jM z!l~}sgyMzJwF7}8N)QEV7~ogTLVd8aM5gxy(dsOg6NDjvacU3MGvyyth87D}eoCjd z6JB7YUm_3>xy!+L>XwRVO*M)am!bHTYOKGjvod<&92CD2IAXQ)6*$#Z055PeK3at2 z!T^e2b`2^=0#7MV!)5(j0bN^!0M?47nP+U`tVs~&{c^Hd4s{u}ZqIw>}1)iIzPZf+?bR3Y0 z-&Af0d7f1;-b{4rus-OHOauc*lrU_*T_K{LcuIUGSs;`#E(YwqNe5!qn4mahjS2m$ z{`fzi^$!kajUTG9KIm|S5cs(Q2x>f!XBE&~a$tS%7JJ}TIh`}wdhxl`1&7Ja9(0HFQlgydk{iN~@F z9N;T`y9OM{WETctv~+Esi1>C6kp8y-Qtv3F*By%)A9o{0{cY-UL`6Z@B7wt-bP3}q zW4S6HIN^uYMFq807lRjoH7u+HFL1Dig_nRA6tRYd>%d=fp}zac!sKcfVpYq)8yR@x zI`AD8Siix6s;fs@344k2O@qz~N>MfvarHuRD(9c+QON&zbcWAM~Q+ zl_Fx)U+ej>&wh@{_VYI-_Vd+J`-!>9mqcCrnQ8hLK-Ye1n*JW>8aGWp;Wwm{JOEuI zokS9JjdYS8LDzmj-=eO4pT0$1`ySyk)iy@5FOR7{VVeF20Zuwb<1+9n22OfX_hXLa z&8N*6rFF;L$ zHP4v+`xY=hC6$cCBQV}SWA;zWKGK)YZhK@{Txjc1(|XDeA0Rn7d*qK)R@Ad`8Abwl zGdNjcyne>)XI@<+EQ@qicGm2-^_J%?dSJ{D_N?Vo=ABE0d)D$Gd?Dc;FP~1c>-@Km z>O|`p2i&2!1|EQ(eVSyq#yC1%GNn!HMSrENx(}$Mc`_~#{wa93Y!{;4%aPoT{2q4C zCyeB!=$rZwCTi^!lM9WGOHuM^VC@Dsl3V1ILKxKoK)w;W{1VBsbtvBHmevXdVQ))U zL3s_yZ+MKS0#7P81yI~_F^aDUJgNLV@U(IOh3b*OVP#d|X=Nu|D&gfjS%KQZoa#-=0se->~P?$<+d4Dq)wmJIg!V<4RSRx4io-tn@VnDBds!$)IV*b~;czSb=2l zoN4O}nG20qXwA5vRU#19jza2a24WorSpTMJ`Yqdp`Hi-PzR;CHUufq>C0ezJH3Z#N zy`o#!#Ip3}g++{~RU!8?mi~Ct+#DU_ABwf43{jAdBeoDEg@K;KU`&Y`NLebh5%vd`pNF8fF zb%!$MLS5x)B%g61Hsjb%?JBG88Ra*2dCFTb!`ss3DL>%;h0@~wg>u0COQpsAOJxNL z*0w;j_<}xN5xYF)8{kgf48$a+YjO9p$~Rr8-%%>`9`6xCJ852BAxBvdYQ)WQO#naM zBZZnA;K$8TjrOx6kkl(2gc~^3CO0@M0-x+bi21<3St|4b`?Wc@>l$;|>+8>#qHoN@ za{%@W$>zvRv!Z$q7wduZA3l4S7 z<-U;B&p^JP)%kt~z^|wVZ(0QY3Q&g|%A&Z$sRACAEzbA%;*a&W+V1ZUr~7-!U+HfE zmRxrInPXv^n!q+9~Mw_48ErTbWe$ z+doNV2gFqNfu+bDSjut_R6jY;RTW(H7F@R*+M zIjv_Gw%wQ+1d*E2x*n`ZY6(0}?zd3p}%+1)4gY~dSv)?M5) zAcgd7ZE?@Qu5)^}C#PrsBo(UvE4kG>94U)Nk0+IF@$DLLLeEx7sCx*`-o~~IGB@R) zM|?0|)Nz93!T}$Cy+cA>ix0nUY+IP2c9N`EBS0G@{WoXENEXo?_*?#u-#MJU)Xtlv zT?3E6*}GS8^*$uHdM|6+mbt9$!b}I8y%)6Il)0eo!VKZ$wZ-_gyBNQwI&0c)&eXIm z%q(ncv-(T_9d4UPf{P@-T%nn8tC~c_4nH!;o19=M}4OF z>jRQ(3|uLHcc4S=Q`~~|3$lG(&^5Cf$;CoJ@5}x{ zEzUHy)ns0ApqPA}Ef>Qu7a8J9P?|)~1bD#?|dY83zWtO!q&J+n!@7IJG zy^GtvkXhVTlOb73{v(q4Jz^@`Smx%po2GxCY1S9~ub!2pRF=M}4~_phgFiL>kEgQI zPg7a?w(!ZWqK{x`k*;kML5RHp2g?Z=#)Dn+qbUjXf`jqkrW+=vB-D31kkrqavF;)y zTYQ5G*)ItvVnX#AK4s2YLeF4lr7To?xb?nOKL6gS*zd109$W@F;Xpn9MD{d0IVlZZ zNBs$IogWSQus-;vXb5eIOmNYf3CrK*Kyvbo84Dl0TN54yA6j!z6S_Q{+F{j$^3aFt zWEO6*L!-U81%fI~w+FED?R?LyKScT)c3D{7G(SI1|F6-0EsujXRv;;Yal%$N>=BZw zB3%myQi@)uYmIxH$>1JcX?)C)dsgY{9kS`nY>cIb_+Dhm>HKSWfM#sxDX` zagQlPll*ueZr9}Xy4Kj`P41&Idvs;N9$|gZeMpH@dAH#GE#bx$u=G#TlLY2B0&&(5 za0hy6YzU_(-`5BKbk;z1SeW~V)7w}BVa0^W#)0QhU2S2q|GN}@mnJ+pswEqLGj?Gw+7CB5VATQh;KiYV28 zr4zBy&w{`6p4q=8;y2*YwI?1BjVZ}*>8js&&+HfdwysM!z^C3b`{OEWI3|^hZ1Dto zTb8qi`++@)nN7JCK#qHwa(7&SKIS2Px5T2c^F6aaEi?YaVZk_j3Hn6Wd3y7Rp0g=O zHsR1$!D-D5Z6kX;Tszb=tCncMt81h;Z+_4051uvq2?IH=lO45mII^44E#Uh;3tn{t z;i|p^QqoY|G3-XCs zn90#m+mBgdf8&MGtmTs|v%do`jAluPqj^C2*$boDvJ9(uZ#p7(M5*s=*|&pa(b zCEU%%eS{IAd)oxuO*z_E38Sa|l=jm8$HRQKgXQ8sVf@QKVqEB&A3dl-4!ckvf1GRz z$b>D5m+9Im*PwD-DkHq(Ihv2bK!t(oTBCg_`UoEs*|)V9JxE5jJhVCDenE-2pI0L8 zqe{8}u@>ODmXcb7bWm$9-%xAZu++kro`XX*{&6Y#=0Ml<8M;>1o!(3MczP9bdV6Q4 z5_38Ti?+)BUNx>>ioRR(ZNRmvQ9@&V8FGOK8jSQ(DcXswMYKt{`hli zo)E4NAJ)Ss8S(ab1`uVk5v}&RYmMK~n31p7UYE~N`>D=P&>Fm4*Gk{ewf>X3HWzv} zy&dI1sgY=pXRNkvRgJ3nx`|)_a&Rg7MnxnM(zT=g7u8j4TJ(Ug` z?@M!41-d45-g?@i@k`Z^m!hu%y0%l$wfbVz4=zA5P>k4)Zby0QkggF;2T-!(tMj9& zle&gCNG}w<5eQ!D(|24bZf^<)gZ8T+ZnTe@B$?F z_cA_p#$~k zNMFWsQ&Nd~d`W(cFTT*2T!OwiJe4IM4Kk_hL0KR83h>;IWfUL1`aUnet`d+HSdWq((plhiBio2_kj9-g#TJv$q;idSR=JrJ9 zf!Rg1;p*Qi&F%5bNBLi2@xT0x+5f=ot7=;uDBgK7in|vfnK*04(o0#6#=*#sLF$Yd zOEZSuD)dz|cYhe~l?v`1Ovle6(|NR0fo$&>)Atwf*x_vOs~K@qRheouXv zPQN!_?x_ef%o-$dXSnu3L^#%=7!cO#HDd!o5wXNYMbUlR#b^+9#^LrvW{B_%u#^Ab zODUCbB!}IIMZCIJ33u`?7h;w0C5NqNAn5^0-kp#2rW46FH~n)YYhCB_7dq|yJ;k~< z?$spPIEeUqbDGz>URxv72yuf`}p*C3GjydI(%PNys79b|v zu4{x(Y`Lf?8tIx-zELhSD28cNFXEB!%qkvl-3wp5iFj@xx@ zyuBq8aX+a9Zz!YKJaw#nL1wIdO9nT%Ws!;Mq4rN_Xl!#_Sl0;Q6)wQD( zn>0(;n4)VFrs?0|(lzFzJz7-%gZ_2RDJQ#>LD&A%H2u?bsD0#bu*cqxC!?`{R}xfv zuffRVYuhGhpP@bGJxLs)eTMk?jrRCyT|{r{?yH7>7-2@4o7R+nB&??fPDzs5y`zZd zB!@b*6uG#(!irIh%LUweM|p_eC#5+f|3tou(iMEtbS>2-$orPE94;1$hv-?ced02p zR}j)#xGj(&EX=VKeT?Q>wY~RF_RI=F^6)s)T3iArJ*KbJ-+PRF9@1QON~%zAdY|G2 zS?;Ll3zb6R3~7zZO!mwOQ5kBh-A2V~BeiSk`F1V&a4gyfc>${r#7oLgdlJQ|)ml2< zM|ny7Bfs9U?b{}ZuOh?`_Uuy@Mk$SSKIb%|4wgFz)bA|PDNaBmAM^mVqiPKwkaVql z^6RuWX;$4;9$t=po0mb?$nOWt55=9}ad9Qb)&d!Dh2o-<$N#W~V{3(M{r`i9BcN*m zq&MTLIcoei50AI6;Xp|!-tMumMv{Y+HeLUey zx%2Tb-`QCi{Q|Yw`d486v)={loyPEfs)PP_l1}N&{}=7NGl?cb@tH((_6UE^>`#@3 zbEFr!FAMcQ4K;=6ZeA0@1yxJd*tEw^8V$? zxd!=ze5uO2B;dkV3{ig~QS3Br&XO(99X50dAD=e)`A z88g%Yc#3pn>T_qMJl*H6_so78d*c1{Tp<4Xr}?^7u=qy2WFPR-VWrXd{sJl0wv{dPK@ z^YAIxlK+wBst;5j8fZD?T1vk7*tS5XK@wH+AJ9G}Idx46q&G`CxU`4y<9VGrazk0v zvRifVzpqo@xdeTTQyhdX=N=s<8|6c`)pJ`8%{6TKhLM~kSTVG5CmT+?W)8=l;o-Dv z)^J>=@rIG^L5}o;^bf(u1YP^wkHb9uWAO9>he7L{JjeeiS0k*wVUJh!E$#<;c)eGh()-ZIfF zmKgg!NA^W?M(FZIq>%!@!^aO-ZKo?17 zXjSeA>4u>yx5(}H3XR@rebD-(I4)XyDWFc!BRtqi_N&MRH@#QNf;<0?3XR^WT(E1~ z#D*e@w-$PbM()pmpS7Wpk- zfkR3Jk}7@-m!dL%9Y-tq5RO)EzxS=+dTK~(1lp(ZGf_`zgacWaj2+AITw~0g#N<5V zW)ZPQy(notG1q>^g2|gH4sM-bP~T{MHZo@ttiqsJkjB2kB>9jUANE;KoPm{(@>)EM z+245BexBX-#0R!K=~g5sPQA8mVp`?^rM>_7M3|FqK>9Vw5Q^_0TmFnxpkCYYmD7{b zT=n|L!u){_@EhJY`$@*6m*R;jsa&OhKc|?qD9e3fceplK#&~cs_q z`?EAd4bOu-^oZ>%K0XifoBy+@}6$ZndU${Nz&w`ER1M4diE&rWW~ z-c)-$Lo$Hk3x)=1k0HAzr3eMOR+&c96-X(VuWKgI@yZ@uf%|F2qWyiw1Er`N`aa{7 zkJf6@e2Ssc6{<%s9J6HHbUh>&$d(DtL5#{ymY|N>HwM%_==z7+S~%CDODKo?=L*TP zLqHwn+xLBNp-U_W#I;rKF~vJy*HW^}*i`tO5-9OO zabSIm8*<PjoMv`dV9oVDz=Iffn^Q^MJ2RsS9`S>#t z?t`BF)O(TK^4m6bZV=~pxMw2v*fS!ZGYj>bo^9gNfPVo6O!2U>iS$ol{Fe*jiMCybYBU>@d$ZinS4|oJI zL@^vcApUGrq6fb+KN_r-)PpkC(>R4LDvCa)Nyhs2Vl{|jbpa$*xT+)?SZ3{UYP|j8 z%mbSxL(hhJqP->KBmH}$N5<7OF9bE-z992}xX3sdk_`RG-_Ap0C<-4N!}c#{&?(CC z_WH~>Ki+ow2g$obf~?IHw*JZhr5cS)V~%~MA!Oyl^vp<9qW>#$24&-P#z6m>uMP9 z@Yh_4V>zc3dnJXEuU9*x*Etnn$)ltK1){ClU_;RLg%W6 zV0>;!=yWwuJtVs+@7tQVS0|li(>&P)LDlbG)j+x;e30+l?rJD15mbHGs)l>+b~V6J z5z=?L8veSj`%6pLJ%Wl5;qU1V#t(J*qEB@dMEfbj1O@7op%Mcf8#7Xu zFG~Gw*)&h4{*ugLfV%JdjIRXL9W(Uo80LnkjXPvJ-uRGQVmPr&K@&5MR+Si)dJ#uQ za|X*G3rtXjj;ahgzG8iQnOF68EXhz^^xw&xsPYY$?oQ2)B zNR~bFzJE{&f^pJ28qbs^%bp1HsXGUi2?xt{OF}yXVgTCr{kHlCwXBd2pj!4y=Y6zuU>S{J3b)nE^j^jqqjCgI*MIVzk>|OK~fMB2K*O8dS#Mw$2#n60}N`wIFT6sf~)JjON2R+sqM{QEVT8brM66)(D9Q^$p z)KQGLz*E_~1wH#Z^!tiRQ`(HGls5A|Jv%F{XMOWh8lCwa6~&I#e#C5yrrgG8WWsCw zp}1_vV|+Gb#}uQpRHih-yx$d}5#~*C0aSL#!hHmlY-+OmBUHvtxA#86e#pnu>6WcA zAbkp`v+MO(^^zR9k?c~de#NT4`cY4TIXD=e#&?KDYKvSC7J_g^D%ONJvPB! zd-0kz9JkDs<24?8yigIMxXk9eS8@c>8UlwEnj?{|P79-I?Lh3F z8`n)dx)*$q=+ik_2kIXjwDF{ZQ)d4|k9?+f_^XUR?A2-?Esxe7`1-2h{i|5+6#;d% zg2x*{k@qg()*TMqO6P%g`s{Py6q^lHhA0LTo%3y8+`E$hE9nY?zde1^&#-EY1IJ%;{+H zOwZeSADXviAI#gKPfgETzpRm89kws1+NTc`{3MmdPg7a=?ilC>k~Q0!GaK7CX72cD zD!Z{gkkK=#>`tD_IdG^NL;oDyE?NR9a zMqzN^CCQ~8fV+368@(3pXVJJZb7OmTCUMS;MI12BoiqJJPtWPuKV$cRh+P9jdxitO zFA7M0PtXT^5PQET%<6>?Mx~AuUugeA<_ql?XXxDYpNsM9h!4M}yz%xgWxgcbGZ1gD z%2Ww=|No*xG^qR=BI@F;t9ZQB&A&!5-P>9+>7Y;kUJ&v{)sVyD>ZRWkW_o8~hDvzH zc`{+`xFhVP^RYB*ZgSn6{sI041ViBO*F1^Cjn^3?i^G|zfIE~=tMGbJz~U{gYuw4 z{yeq!@FJRR%R#=c_brMiw)rZ*oN0LSF$=CSXBAKC{_{1|%> zcHR;2G16(EgvM$-*1NdXCy!l5yxFZG@Vr94rs;pA!_d3`GP*xN*Pa1NHk>K5VhMxr zgx)=8`hzG6(Rt_~9JFrMhA0M;jjHI;CLy%(BxzJw#Zb`ixE{g`nl`?j{@ zhm5b>^3Z1TgWZ;O8dkizq-z_%PX1SW=jnh?R}xA%M`t#UNy-T6{YTv63ay_p_n6}R z(mh%Y(wl$h9#d%T>^N<&GjtYPYwM;)UsQK7-YU7&hxRJ9mZ17!Q zBDqpAl6}kUr}TXSodeJ{($VSvq%?QrGS>>etr2pIgwW4Unf*kQ^g4?c$*R1MlGZTk zv-f@yeU=Q^>Xu0cP}*IeL?5kf+ZU;fOv^6vF~&}t{Q>U^o+4VyAd~Ohl7}S!thV~C zw(4KC&N9n1KKfVlvLo-qoUZ#zRJYZpLQAGhm$C8_tjz-V!hF z{5trq`@z3PJdsv%;WvA~lpVXM_3k4z}z)tn5E$ z`YA4JztVJDoN#_6oO?;~tH-4|>M^NArL)|wcg%jmJzny#+s28k2z4BCcUMb z@xsML(NM6&s1-^LU6OkVJJhAZUc%q0&Df|!)BWJ|?m@Yi-C7wXUmg4Md<#>bq!|7e zz~i&9KD`Z`@EH9w*h_JBQ&O2q_z>$zWY9)FZ&76(!3_0MiLzTNqGdl^R7`da@q5UNSo$#IgauVXOcG8)dJ@Hi1UIf~7`h)k)s)B5nplox z9AS@yC(t+Ddqr#V$SJd*<|)O2?6A(~R*ZCbIke-NycC#?p6QSL-5r#EaEPGEvtS?$MP| zxH=x%bEguQTwVq&dBs6@47gO%QE9Hn>HPbnRfgvi=wlt78REl3G{!VGWiFL-iQ%RpI(^*Z^u!{*aA$>qIiTV-_HSLa8GU)yHispw72!l!5+VR2EEVj1u3h-Y5e z=#k%N#u3`9!JXdhbstiw zZ#N3?V)brqQb=z;&?S_o-D66+N2#TAg4ARU6_4(SfF=?)QmORGL-`e{#|G-oZLr={C;R>~jj!L&c; z_iDm2=zX;eYdz0#uw42lc1-NJ5B2GMJnYbq?6rRfu;+omVk5YS>=Qj()g?rC3FO;N zDTlgHURjM3JB#!zo%@W8xr}}7&6(!TfPKH!BKv-;w3G47p(QJm5orGQ`!lB zAh6hQ5w;{VPWt;FEiA_$O3UDrZ8utHs^eponOA%;;x~Xhsv(ojx)W|M;P&3_9#@?1 zapej_C|?siq>Sl8xlY*GSVbnj7(5U>q|n_{`?H_nI|0v5c+~yb8GQe5Kf@hx*x$dM z!Jj1mY7vS@j(&!3=tR;9kLL&+>VrpT@CX0!89FcJ0UT=j4>Nf9eTu)FGxA?2?D+1f z0@~k8WomOeKTfpYrb&0R;ynsv>T9}rfl(=eTk#1Sz$*_|WGX)iUMazfRT$0Au;Qym zkIvwuzn#HH|1g7(oiO{yUSrlio_3;s?2Ys1AEsrs{wp&^_T5y0J)V}WMmAZeTefVn zc-Zz$#|2KhKFtlf3uWkOM)**jW!J$IBD-!s^{GcPglo5E$R1pA+U&potm&uo^;W#= z5larpgxRN`W%fDM{l4U@@0pg)3<0qPbgx9<`2iYFTEFC1|M5v1*KL8GrLzm92U6S} z?RSLtk}o#>0MYi#Q@PJBZM1OQAAR5(Uiw7X!f5BjCF@?dQ_`Ffy4&rvTo5Jumf~p1 zMy8mr_auyrcFVO$O9uIaC~o98BIAS0ksO+ZSXonXh+;F2$}nCO@j9JBVl6CJwi~<* zx>kMQmq-NN$ zSmaMgeOA~TEFr8Ebv+IT;W51%&qO8)&O|0CUvvAdndy9VMm9+2---}p7|RX+Z{TTfGr3+Y01 zeuCP+_#LyKy=D82=|9C(2ngGDAOueIrfGa)KKc$?V>RdX@Y`mL?x>@=$kwu)bq>*Y z{%q@quotgxo48dJdRa&Obb?}Md%=UV86WDg^|yyl znf?2E7*B;zyecrR4D~WzRnGX!C{q_Xus*eUUKD|GWgF=!m5jTCzfsBrrz$wGz7e8z z-%P3s#i<43N|_|6aG-bt&=LNV8QUqNc;|vAl`_epexCM_S*xwF-#k6`dl?seA}3#v zP$F7BOS(@bh_UQWJvBgQ4i{o9`;t^J^3PUGrG2l^G*#cqnY!a$v%h6=QIzoKR1IQ7&2%4#m`sR_hZiDN+a*M&BuS+ht@mpfuj=wd!#9*gYvN8d@p;A*VL?3tLEY89Ak!L$ zk+{vehq5@;UXwX;it$7h<1bgE&KY@38!rm0ttc~IKi(tL|Aep1Xl-VE7uAc4jFm`h z^xhgMH4<-x=|0Q#LHI+Iw{=gck!o+v1mX2uh?EwDSG8!QOAR`U>hz>HQ`zy8j1M_b z*Gl)2K-avt>stGDjNh`7@$oL9{0PM(7lpm8HPp^uC@MVO8aTacF84)OCY);fMT}Eg z5Jlc#z+?3-;ahB2Z4`+Yg13ffxWnGo@~ENNN=|Cb~(#iVW$tN zjMr3P{fiDH-SZJk`05N%NNF$Anb-DUX6Pc~tq={moff7-eVWEqnr~yA;)^1IT}o@j z8o!QUV29FtDdUF%q8es`+U$doYOl%&b*$m0FWPrqw7nMQjc|3`{6?5x5V%triZI@K zGR&vSP(R)!M8z2>4x(^v5TZ8-m-kSY5N*Ahak^KiMsRv-=eeU1t8XwCh23f-AgB?z z)nEX{JKAe9g}3XPThO)UlVN_-)y$eVS9A%{BXD_lRHK;6z5+V8CaBGUI;(xnBIAjZ zVcs5Md}Wsqt?m+{DF=!pWv+5+ck63mD`uQ%+;l195%k2C6%pe7g$%HMn_%v*Ocp4cAd)AcpN*%1uvq8N3%+>!A4a_j7Ji5+3yd>fS! zIwFCTk{E*#S>}scG`|?;iGN|7zQb`rZTEGa?YzXh){s3{!VVNSzY*rdXBtDA4-w1^S^VB3*!&KZ8Hvqd9$e;&()V%=JBiZX@Pv& zbzvTF&!=6SPkSTG4KD62{@dFt} z_b$*{JbKRblWZbcb@Q~WIvKXs5b@=2$*W*kPz#}JB(o+6kLp6PGm_TEOTy}Z5zP_u zp9@i%D?%a7VZobtmSl;rHVnbLltB>Y?P3FN?#uLjU{N+m2w|XLc9D=u<*5z%CuM9g?J1>oOO-8tw zHPD$-x(|Tv_MMW1wWwna4>sGj3Z2P#5n^(D9%5pbFgrN^^b(Sp*4;uyN0eJgj(Z~f z3$KMaL($synGxPAc)cCMjI|F69&bkhoi}lMTQ$ZLg3u9MN9UB$@r!`2P&;2PM}2EH z%-0A--XrjMzjwJWdL-agA59dg_Xtk4H2~wD_L@xlz6d88FT&GtByhLV{$PX?og)EV z*&qlV;b2M$1}MMHgW&B#l;j?@Cs^PtciygRH-9mbpZ7-;x<{JsC89M)^56&xy*Dq9 z@GFHvuk{|X_og7Fzd`LQ^ae?0Qyt%BJjk4C>%}$?hgumAmZHA(S7Cnh%VBHnCu$gP z-vfhW-_0uH<8eW4bw+qi*s0R}O0CQ;>lAb?p+)%3+rymB;#%!l8R516R2H?$T>YUk z>+CX#O)y%oi&%RajW4Z(yV~0`)*f+bgknd$iAcnfAI`}^&3R^YbB*BiP`#;kHPgBz z!V_yEd|KwTj=`|kZjIF!!H4?9%m}}kWXRU}(bj)qybYyBO~R>?ENiu7N=>G95=Me# z31(RPXJUJVx84@vRcB@uhr2vc+S9H4n@CR7WWvz3;a0|5XGVCVfMolw2(J}VO5(LJ zr+t9tDa`@mbNd@KCLXUfS4Zrz9t-G7APkk_b`rW^ukXAr5kD2S`b|2LHQ$y;xWx}v zY6JpM6MO9Z@kzlL+L6*yLV9zmJ&+-}6%R!$*+q9TCjw;_-E=dv_)7LZ$ry@{4t7>X zY3>KEfGRLu6DIAr3%z|&CLu?7yeh(jm&}R=H$shH6ybqtsCs)%hGY@Rpv1iq9$aM0 zD3V2l7gcS*-uRL*XX{)I@k_&;#as;}581V@hWLA7&Teou#IFf+^7qHD5jbmeHN-z3 z=4`90A$~5*S(mFJ-WujicQs7T(q*>O)$sH=(@%3vBuuYMoSnkyCBZVRr#U~{zGqpJ z>3$7ogtuSK_%6Ze4bt~Y#@A6Cl{3Oqgpbp?c zr%QKM&^Z7*4p*?^ZnqH*@FnopCcn|tZR?YybLQxdPwQ@Nam3%&a{BNh)^NjPVg6Qx z8P}GCbBEmvdao%9=e}IR_ygOeD8yegA^y2 zQsSZ=D;~dFL;RaXe7uzLLo-Py{Jj!! z|6U24nN=)wd7|vhtYTVkVwWdMx)tr`32_D=Q|O+(-z&nIS;c`aPt;l;%Y4zea|Vy^ zXtHqVgCf)~?~wR3zvx_`^)Fs5!&erH?~r(WR};rAJ{gXZP<)rflJRt5Ac-$lKxI$P~r5so2eFdKquP`jS zN&%mAt|oj=Mv*Tx>2&je&oMd=u2&eixXO6>0`yT_>Bsew z58um9cWzPqKgIq}pR0LWlGJEPIQPzMSlAog6-o1p?%JfgAm_bp_G2|`NHjA}*euy& zbVqm)JCvXg>Yx+Jw1C*42gw~;Dywg&7?B+VL+t@uN19D{CE9m95zZ16bj`X`eS69} z>p#7=Y37Qg!PTW0^)X6V`%y1%zq z==eg0a3#G4u~|i|;m-o(p_>>F*PyPz#~Ka*GS%U`UDu`-BKCusx;747`&4&v`KLV3 zDT`JK?O#Qc!ol5$3+RKJ{Yw)Uj&BMm|6Odgno%tK-&Q(7^Ehe1}(%zz-FEzXRsRa<5^DdmcaM^YDJhZEKx_jxxrD*^HN37$#+bqUci`2F$jBhc& z=WNA(H|jO+HNUC!Yu$Ort=)NtQ{9)`x;STiZ{a`3=I(s=EoisB`&zd8jQR5i<-2yi=WiS_ zn@cPo=C2=^HXQ; zciO1OJYSJy?|m=CyTDsQebJO-k9*IXA&xPK{)eA$QY4riIb3SEbxSS<9ZF|uEY&VMePoHvJdg5HKVcmGn?l_4A~MVQ3GrhdC7OJi zaY-NBhWbd8|6eph8QcdXVur7A@@eA0diHG>omXw28+fhF61c61_)smykzU*Ga2~nc zz;$gqY2EKmt`Y*tBH~gd3kqHqlx-}Ss+O^Ra-&(kNR9w&&;8IoUV`j- zeRtl5>r35v#A#r>FIrR*>lR#Us5O~u>Dhqw(`gHZ0xdmu?pswEGt=P1Zwn-Q?7Z9e zY2L-F98TNUY))gI_t?3amz+XUF!Poc^6uVX;6I^kqnzD#UW|G;l;~W@yv90N>O_3G zcy>>;2eBSS&=D(9si`}EQtEb#*LUZ`)VmLBz>!%L?=1@REnAy&7;}AFBxmofQXsX} zpTiszWfn}yVywAS3`mYAqVR31bx5VnTWfQtBq6Znyr>q}v7oS!1@C_|#9P1MiixXO zFu7C+^oxw2S>uegY~7MOv#B`X1K#bem9cjg%?(%=V4lwnytdF104{G5evn(YSg2D7h>KaUui6$1 z%X1qrc10Tt_G}jea-}&JfP>n%(G}}qVqt!Z0TJ{2uIgBi*Ng{mUM#7}t^Qn+7OI5# zur-+@2O0ALw(rDNUoLzZmT8#g$9(OTPT)UDHWn1>SP<_+n))F2Lfwlh&<=YReS zoYY2)Z>LKIUaF~I7X!_hQ!U9{ZKorKc-B|m($k9QQsG0GBqjQ-tqCJ8<-kry?B{Rk z=>yl2GhFx&{^MiF?{}%q&>#Fo{#+qHuTJq77<^1yLSk*YCWgr+bT7@bYilgETt}qK!}wv`;V6=CEM+vTxe? zmY)8;lLgTRrXNCC0QuYT4cq2Bk&gNx?H)W|&VrY>$v2SZWW7Pypz0M3owvz2IMyhz2k6m3I;z}^1E zS;VvaY!tYuGkpQO=gfHGc;g^71XiFe&hd~xG5Fnd02)yhBu+UJ>HsGr%(ViRet*-3PUf0t& zA02W7^VgL{|KNVoLQ4%?|2k?D927sgQ;fY@G{5c0P9fI2EX;k2d)z(Og?Z0z;ypV< zyyrpUJzos-p6?RxiH3R4!^C?wg!%q`z{-|d_y0lQVQ;Uyr$^v^Sttf}PFM~V@1GJ3 zTSnM+%-!=1;uyE^nZ-Pr@!MLx5PHQPclQqjK8wh;-%D-ut{w+&G%yQs9tB>Wzs|tQ z`!5_}Gx#+(5}kN<*sB8L@$qGmdf?*?uVnSF9W7Fa0&D7fJH^6GiOm6m!>XHh*J5>yXa3?Jvr z=NX@TPT&}G3UDr85V(F+;FCWQ_-4or*Ro)n;lrs!lVRdRQ5H-_iJuf1$9d5EwjLk) z2Nq1;O#E)-hn%=2I+6S`arn>A#1e$g>+y&1+o43mz)5Q+9`^cG!g?kt`NZu8KTiHH z$4C7;I^s@LPo*jAbfAolEC{?4;Exz%hm7#^+s(+Z&X8@5=(On=De-klbJVwvxy54=qvh-+5cf z&snPE@hqOJJv2-8Ew&o(ocoTF50lWpcbSq`-%;|;6-vJ5ypn$;sN@IEEBUf(lzjQS zNoMZM zPQ6XqW&X|(w;VO={n&d-9(7w=M|@Wyt@`~!+Ct)%pBM7Yq%9)8>&3!1|EZ7Rjue89*5Wg*{8+A89^UMb}Jb0HriZuvijw4OrR8se5~3(xkNX}2j0 za=TU+^6e_5jW5VqLWO+03u$QIa3SBGLK>^dS=JQtJup*VO>WoPLcac)@@jIHb%lHn z&6MZK?OI>R_uZNDJUPpTLcW;IRi3494WB;*2+OCZP-&II6#``9LF9P;&ME+Oog&%ha zqaQ~|jg&;R4^#5!`!R9!eS`l*8ciJz@dFo#M{E&IYqgACxTk1zi;Zb1nQ4zwgr{i5>K7Il5ldf#@ zpTk=6^|1ER$9nqSIT1~?DS2hMSUovhtp5JAo)%>#e{#4)RfbE{e><(GmGY4G6=2OS zVqAGH#Pe_KX~R$J^CdBlL~X+2Ms+Ag8qR(`+V2K$r*LmgY^asE;Bcu#0d?q0q-E|Q z4d=)4A~EJ)_*?g|G^d{Kt%;FDfy^TX9@Z3TllF)vq~^!&u}3stWo009FKL+zjNj8N zsbhDOM%8q~Gn+{pg0Jx%#50?j<|5PAjNM4_%)Lx|Y-h&=Wa$(sQ8!ih!zb>mR;GCk zU-D|F*NXNL18<+z)5tRuiv-!{jk9|C!rNiZ`%}iJq)Nm08-D9v;4R$CwA3>po@)2R zJ~*SNC+9>o_;U~4&9vdWndWOr`;nn-j+np+j30~@5i&%EuGWM%Ct-e zY4C}?@A(i%+&2C@_h&tgGqkYE{02J9c;*^fivN0~HL7%Re^i&y<#QsWvtHr=$xK@-Hv*d2PWSR8(5i{R?=?qz{eMH)J56lA3^3U$_}?O4LXz4 zQdt1`QO_Gc($nyr+Y_XC=1WX_?acltWPYU;7^W6Ge9jT;4`1q9*cOd5Lv{A{H}!O; zgK6-eqrMHC3NaAKhcn?&2h+TLcK-U?VdI_X=hISo0DM$Wbdb@Gc>hgro9}<3gK00X z08XPj0Blrz+qW<3>5uFYH4mOhcV-ZS9=)E>`xT&weU1 z?N!7pEu}c{Xobz)dF2)(9&}#^4ji40$Q@FT^+Z zmT*?QmXBXOy&TuEXCQwG4XhY=hSk~nb9$P65AT@Uz`j?^G3HFJkMAwVxDzVZ^3Y;h zhO2?4RB18G{;}z^KL4Da&fLQ^^gX+Zmf?P=@EdheT7AGli~@HC-)7Y3{t(X~&hGv~ zeeV~Hx)hzmxyPOLx(qHW=L~N%lh$%09stiv7B0Bf^3}4(XfHv5KTNq(Py}w=Q&|J< z;cx#*IVC3lv+->%_=8nDS1V?k(AQ+t%ZPRBE9L?{5oP^NoMhRFSOLg$MxE!Gn2>Cq z*>1mo6Fe$w`Q(-D%Vye`+8xfBcAa=rPaEI;Jn_U&fhUc40{ChRfy7VEcz}fUizcR^ zb&k>Qn1cpJg9Em^ss^vaeAoD!dfNOR6L)f-NKTBqo0kZs(5u|+**P(cxzn;T*NyRR zk7%%ModnjT4gQ#Rex%6J5NcVO6C_82KoSp8CW>@mO0t%fxeUf~D>L5@Y}W0FK`IM) z5i5GZw1q)d^f?&M+;5Iu;4>TZwv}mKhdCa;|E8WsJEOjs4`hR#xVph>6S)`n?Nv_P z16Rb0?`(HFXTEbc)`#aA_X^ZFQ-;wVHnc}+gV$!ZM`z(3C?D$yxz_S=#NAuJ$k8qs z-)K|(_i205C+&IH%sPa;3dW$z=~V=C>|=a@le>i4GP)ig>Hv;}g=3r;)(vNW3V-mn|x<~v_m30Vl&`}iaC~&7BpP>hA|%U*y5UD7L>?GY`q zk!f2f!nasxS&AYY@#m@PH51J;-Eey~m3CEA+g)=a+VQJR#DreNb$3hB_RIY?7^Npn{$vylK-g3#Wy-8rdpb(!;GmLD8zsHGwU*3AN*Ox za$IeHCl7XAl-j_1wn3Wynj;p#11ZG~%P;R@R&^1BLGqP8{g(WU+SPI;6l_yS}a z&V$QIrpFE3b(s$4fq^g6j|^L^Oo#H|Jp_Li;=bWu4Nkk$*5uRRK}Kx$ls%$#W6iUD ztv-xBw%TD}7K<16N5x6g_F>G87}iE#&VNa-*bF?eU+Az&X^8KFze-r9LD;`B4j|{O z-M%g;ib{0ku4?B2GRMz>3F7IqdfJHFYGvHAz1oSfJwif&_Fx|+rzK$tAkDJJ&KDQn zb>t;IuB=q@-J%lh7Ka8g7LSn7|Mo|Edif>2Liu`k{+3I6g|Tl?O#}7~$T!;%m-a8j z+b)@0F~E-e7Seu9ycgG}h<^vy=ZXK~l3sE0?XU)aZeZn*EDoan_@1im>w=j_81J~d z+WF~Ra5ro@YtDtg@tJc0`C->L#=MQ%jJTv{7zeL5)&XN5vSI%rr%+e}I^HnX83Q9t zDKTRvutyJBY$YGJMYQ`!iQe?bur@F(sfHd0^H?zTaJ}z@HN=pE zx35T4qOSp4zH|N{bHFu!^qsH-@Bv(bhATw>~UedfW z#$#237kp3-+*dT1`>&Aw;b}cRbT9T}GY%N(s1r?_`w3z+y5GTkbq5|fqo?nmt>pK- z6V|$mBL?>AnVr@_#FRj$o|J6aCu`@7N_XCo+xwQD_I{QHy~W;s*~NI@nx=^@5;fwx zJdZmJ&e11pzc||0Sye@M-jRdscEn@E9YrM~7j(L?@8CU+QVf9h_6#0es6GCk+_!T9WHr2yu-C`2-x= zx1H6~j}}L?`S$MUSBOsh*4g!e3<<+a3koy_!Uby>0^cejDR`E^;0iSj)q! z$O(+cKJRh&flK?N(^6T$W^p?swqx!oe~oIh*c%QGSa^!8#a2a$raGw#T)ZjU&)u@U zJ1-W?gKLQP_OS)()=nYzfJ0O_$Ygwbm>9?225itX)Z_Nof_Izx6)&r2UaH@1V;pC) z>ud%-Z@jCR+DO>#2H$w5lH#vR6xclCXuGcU_S|(P#38%%!RMZlx>}Hpxq&)LcK9tR zPO(@Tlx#{=s?2O-IpUdtwfw+ELsNCu8#galq&!gxd$c&&r+ zh)v+Nkf$mckCX^Jp zoxs_;F!wGLIC}|x=K^Q1gt&K&z}dfqxOct4*+htYHwxSvv8bV#RZU3L|Gy{ov?k5V z_Jx(a+$9hCBy)XA$maSKE~fsq#nj(R)SoJr`oq5s^AT@TFkD?};I1{h1b(APOM8kV z8g#i~7xmL!mcg*hwCfHteyp=BCS?S^_AuiIaDRT*r}xasBZnDp?ktOmd)*vs;gnRK z#n^qki?qZ?diwD$rUmDbx>|Cb^Ig#6X!pn732UeQHL9gZ$xB_*;O^N<-ry=;MQuz% zy(u7+SO)2vMT6ZW^oy$)_wTiGkumNcuySz?*E!&Rlf66tp}$6j&Z)AC z24OeI{CaE~bWf98SLC2~g8u1p-IIwwt3=@|>s`2kW3CekPMPFD-9kHOCw1do4BN4d z$b~aL4Zp)-2i;JPg#z7jl=;6=sw zt}Bf1h0Gk^iwfg=abbKnGLE=BjPLb^jrQ43FoMbpagngm0{0U3TL0k?H~n|Zv%`;= z9IJ*u-#wPm#U(V57?#w`mq@!&VtnjcYD@Si-h7F1_~x2Aj(J(cQ-1vv^fP4v=-G^21Z13LgsjW zdrfR8N~O)$G0i96Sd2X2s3NLp0$1jTN99thkcld_-G3fFP{K0l#&f2;> zr%)z}=Q5<^N9N9{f2oEB&i2l3u(dAF9ej$6^rJO2khqR%*Hb1sB~=INCA*<_8SNlG z@06a#v%HW8GV_6Z8JF69Iix>RLjzAjF6*7!fcKq}ssnf*Y_f=5oM{)-?^hq{>5+S2 zUsR&W>zFo1)P`r_dobF;INtkM?YJ8<{K2OfM;(__Ci)?z-6OrkACoEqtJ=Lev{QR8 zQwJ`qQ$@Qk$BLBvy%DB@8gM*@bpHQSk z5!-&US8fnmuE_PqgJSD6tP+dJFD^M+p_+eCv0 zb{-gfOqBXXiqv;+P2~_T+4Ee8Pg?i8VHbow9GF8m>vUfUeiCYft==3%-ELr|%N8Y% zK7y=q+t%Bs!=3WrNX*o?UAf6R7y?ftbEz-Mjg9~(%Mq#fklZSJ``r82km1vY_)nh)I1IL!uSGKS6kZSU zkf=momxRC>2{^?xG6-Nl?9fgI*>(j&z6o)SJ;;1-!Q_(ZC**TdfZ zh}ln%7siv($B)22w=7_k)n4O7S?IIs5B2oS*nliI*@H2&pkcCyICQZ$8#w#!bHX2V z0}C3Mim(?Dt5Dy0Ur&E1m1ieK#<8b#S5q7^{bs4+TvFHLA4uidOyNHT9d8*y*taVt-d!h#1SH7;N5euw~W#=AIfTKOU$J>b#+W2cKAM#`a3T%{;jQv>15Bw(VvEy>RYVroB38?;X*HtwP*6A zo+gQ$Vv!QXT0xy+)zp4!0Op0i#haV*WTLn-@LnvSftfR~AmI#LmhBdW{?C1=rxTc; z?bXgiFY!dLi8-I>6^(fR7f#}T=&Q(yv}8p=FC-UqiO+?=(QpIg+=CX1C&Um>SZHa+ zzLo?3&EyLx%SJjKG5F0K7$pA0X+3S?*_!?=(l_TjQJ)NKFpJgW!Z<3=K$mI6~cKN7_lhtq0@!BLl0K?o(KQpd(f86m-a`S^|5Wji3s9# zoIV>h2qz>iyc|KSqur;>X%JqX`Ry_9|0!bdFCovcZa$Co82OQRxCz`_l>u<8V7vlX zr|fk-ZOS?o=X~e&_(#3P4HtS#8mdM3h8cJShM&hb?KJRPjK9^?HZD?N*sfZ&Cf0NWn@3{M5OLLCM7Ra>tb5ob}ik|PW`k8%e*=!nk4VWRF9TQ2B zfCV}2mzh?^m>M!LBizo=A>v~_C49&U9Yh_ppAGR^iIzqz zOw+5W?f7(9+md5E^~VTLx!A+U+EeY|FFr{WZ~ltGAHk2f;LB?GbVMQh>0W9(>QbWM znvj}+`9xeK;^1iLy;g|=CmbB9@R92km3&{FG}wFBx?svC6{q$Jr6|9rM2X@Va9si$ z=M7!27?JOqK%GVwyHx4U+j3i0T{n?(krT3GYI{wrkI0GVZ!1@#y(N~a%gX_mC$Jn} z#9oJdot7%gTqT;iNi3bod(>&Z6I`9(N`!wG_{Xxw3y{|pNc>UalaiD@FsY~S`6#RfF|0D^4 zFU#HO9?hSTLAJ1ICx+0QlbZ`#(AJq zirG$HQJV6KRR`q-u@RX{BX_29sk)clsY-IbN>c0b6TNPoq}DT;UiTO?d3ax!ikgau z_?9ASoa$1d4MeVy?KLs*j5Je?^Y%_D7M{GKG$k*H9kto2!gn_3B6Y{yj~7v63cQ3} zO0<#46_P0anq&*i)Tx-1=;s6_+A{0^7;$9MY+JGIZ>wV|L25!=F2>be*LVack)abCeD{cJBiR+SF_% zx{j<(R}yiFAa~Acf*)Hr)9c1u@e*)>X0^^b@qin;mihueE!qjshDmDjgL_<(nj|6) zJvPqyn6n>uyfC_!=+N%YjtPwS5nDuiznHWUD(ZhmW*YuGD_OEnG~NZn~O z%Q@IG@vN}4DtN$A6U6=Fi>rcXBq5NpQsb5)L-%oYA5}GMDS`|~@mE-t8ZK7y;O~Y% z{USk$en(KE=N5^Bb4YPYvuLU3Z>a4~iQ=JRC4Zb%sb@Nc!SR+W+XEsst|D@+vDL)j z-_%F`(om-q+ocGl3-79qJ?`k+_ga?{y@JS<*t#V*;(gie^SJh z6#LshzH0g_0y|6=YMkQVNwL1kD@tcs7Q|kgt3<<&*;QAgoXaq@@!XGJE#O)gFtpJh zn`OG1X?i?FHO@7iQp`7bMd>aheHO9dV1M+{J>q+ zF;Nhk!iudlyuBv2RuM{v9X&={z%Sosq0+mB@g3jX+MMgF`-QuYEcQN{+w@~E?&-60 z#jET?o7UX7Vd%SV@P7AY@P4`V@e_USKJPEwrv*8%Wvf5;Lt}j%8$Bse7P2Y)NlgE{ zh!*(|vpr|{g>}jDudt(H%+2`KWUiEhuv26{D+h7T%UmS~$88bqi7wLMYxBV^(kT3H zX8dc$YUNihrI~vkg$ja5jQU2ehUk(ZZu;6 zg+B8hV^6rtyvNxLd+m@wjY5J2lej7@=)<*z1yACL_Ga44f?ff>uXLUq zi`5^_rvc-hEmnUp-}D!qu##)S7SS$BMcIUi=a@<^#L}|&#tG{-ou^wDt540R0gNT@ zY#KoM?~@XB2}<-CNe<#&hpn;^4?#9xKWwGIl!6Wl*vR0O66FQ;uz?~@*WYsUgm|8~ z|E^mmeDt?@-^SR4*jH1JIK`o2IaqC@0n^sXIC5H!qTHijRij7O zXSN9mrq%W_-UZAZE5+eEBa*=Vdl(PnJr{{jc03ZD+&a9?+eaLGD>!V8Jm{p8dU^#(RKCWSl*LRi0p4`5wmqZD&;s^*c~28=R?iq(om6lqlkl z@JzUboCLnIF4Bg!rdB{^>GmFRuO@LT^u`tS)kV@Zj&i~%oU#aoQ?P$GL@d{6k@3rR9ag}+`5=b z7oiSUyyONCc&&r@OPxhAy?~d7x`FE!dH+RpEW5%*e7}v_kd8H=$U&ubR~&cOiL`8s zOgGe36R)dA93j4g_;Zk9KSOOtF6u@d{Fm3EkxGFhxY|V=oZLlTv#c#-lvRp2j@oMC ze?*>Y;;R>#`93`dRc62cbcn-7%Wj~hnJ%Wmmk+i-aPVdNiD$lSy8*sIunW%kwIw#1 zcA^g?S77MPjtSIHB%!}|Zp5&|Rkb9iPkNN-O)|y^@uW=gB15O>GUP5JzJZkJOK0`; zM-m0VlML>O%sJwlC2AWw$4s3M(bl1j6#t1xjnIvs6qG1izpNjeaj!b5P53PV>j2yp zZELF7eUs2pNELwxe-E24ornJxEn2E}R?@(qBzNE#kqh=m1J|_Qv{5ZAqIg`Q#?;)k zhX1|kBT{IC-rn{PDBG%Xoo#w=v^iy=t^7x!`>(;(HXtgq*RrC1fWgPaqJ z5}^eCIF;F3PU-2Shi(}9DH&_#!3K&C-^(<#X~+iOv+#r;_y)kST0y1wFH}i9IVYll zQ)Z}097ODcUp95seg|=}`nn0&q9F76D;ZzyAOnBOUunjgjxTmBGwLe}gV?*hF5=*z zLBB!&1D_lC6d=u`2t08pWMH`Nxr*Xr@a4RQ8Q%aqroSbz0^c}1VSdk*&=nsb4vbIe z8S$<7PTwg#J#>I^FVP0@B`Kdb{UQ-lfHv`z(7U0JAzPWxVBNxV&^-_R)U?+g{2axb z=R`Eb%MROxL9|V+Or^lUN85y|&32*c>n5Q0fo?EUM1$Q|Q(SPEW%xcvanuQO3FTjy z($n5Ww&n2m=>9@C&a)>dezp3u3S-|tLDN@*L*ALIpn=1`(i;yGHG<=O^;~+__p%;$ zozR!g?0LyAP^0pGSi`z2km>v6I}|c7p*H*TP~5WjJPZu;^B^kiu3^xTMs=iyuS z=ckL+$!}Oyqm6GN4RI>iYstIN@H0TZ804dSnRfUbunvWO-)~L3nfKci@0n}(Rb~;p z(rKpw_>93f82d9Yhco_K^`CyHr=Pu>w5hQ@(OaZNYN+;eYL7m)Eg@mw0iRh#Lt-7} zR#TOsbNv3?i1voQ$B^M4(8so6&n>>8EC#t=^C(e|Ky7R0v-^^>C?0BR;)%bp8~n8g z?*S&@Ec;UiHef|V7FdBqflyO1A3a8#eF-|)S;qSetl%#}f9lTu>wmy5NE~a<%sPR! z182NbQW;{djDFj7Mo%BS2mDb=^r>F>fGN>zKQn9&qsJJBT;6LV=lz{h?95%&F~ox5 z{Fh)wrKwGorQjuvw5D=m-Ais(N6zNDm)zkxaxPp84hAZQ{N*FD30LfIi0J{3hvDnt ztyM*t?Eo&>Fi~8PX$Sm=?J@-ydTYV^r6G?{!gc_2sD~(CR6;v!4hq^`6x?8;(#<|< z^Zi+mLuU8*s4esX_)#(TR;UXqXdsBbznf{N^*zwhoCv;pm0IboRa2+0Qprkc<&~s< zAW^nYAKM0BlM#^xq2nEXdh?2od88(fZO&y_X$^3TtlQ;I1PLSf-Fo$L0!rY@Wak z{Lyt-r(DKd$M~R@``Wi%(9=DFStq>T_B-$;My(;|~ht>H<#XKkLT60w4eXwy!i&>DEhn#mt@n*{Bo0;iv6^j*0k;uh7h# zoRX}DulIr1^>iYyH{w~W%NbD^^i&h~EFxY-=DU*<`u}^~ZluzO4L>$IL60}6UoWSD z%gX{+h{r(&UZzk@eCEHEkhw&`_+MB=2G=I`hV@n|eRd}eg3~xeW&P`0mga_^VO&%M z?yY3pyU>)&X5=BmhwEUbkU4O6I`FZ{8Jnpv&WJ_~qEJo)k3xojKEyxz zPd!~mjN=RfpMIP{p8Y&I<>x~jF$&nPHoU8+|0Gdh{1tua4{%mA^z)Tja4%dxZT>g; zOMU6M7~nx!DpD%E)on(U+gjBtxRKH zgX4M|WGv~{%2*;n0aizR3(kKylNZW~baqVqpd~fk?W8!`(o-l0@-6(4dl5VONo;R< z_6vV7eG5NRK?A=HGnEQ<9Wv}7<=OSW*V9H?J2{bt{bt{6CI4I()98R?$O<^~7`}Fp zvnPoEeg;?AM)41%DkGL-My`eojWL_q=^lg(jTmdhbij`h-x{XYhk;d57CT}q>-XnGE?nHeeVfV*d=25Eog>Zyd3-dtK{!m@xNo21 z#J!38Yt8=Tyq-q9$tO6?AL^!mTEV|8f$@O27Mx+B@38rRtIRW&-12W3F((y)VIvL* z^NVTEOv2~iz@R%p<4e_Vm(f7xqfdR+FdwnDzA&k$A(LXw*!+f`M*j~zr^ny;gPwlo zV`EO7r;Jy<<)X<2Eh@m+ENj5L6kWjBlUzboFjJe6r`_djRs`ORJTf^A zxmMTXx9NJteRCq(Qlb;NE~Y*EnX6RT;h_u25XBLvaO^(~AB^nvWi$S0<>zo_KCbH( z7*8vRPLyRNwQ_7Z^q|q@q(pxQKgre9mXRpFvSafE<}Ko;Px{B*aiYePk}nYIDB!d+ zGHe6$41c_Nfm8koBhM+RHn67Sp4@(tTFtu5H|Fk@Wi((R#d%K=sa;`u7kpj=MO2EI zm6PzTF5oqvyr9Ql{9k$_#;0ndfy4#9V(by(V+V+D|5&dWCn^R<33#uHR+00!9~)~7 zhdu#v(&e%faN{9A0jKNPA}U?}nw~C$Pw+qMjU84hg&*1j|E$L|6(K{0n%OT8YI+)b z7WN%r_zRsv?8s41?g%j1A7Ok_rlr8!Hu1-W0M5OMahh1>u=MkXbzS895CxHiOx zszRLY6>h+O*=whGrb^%$Pl$*13Z<)wS`XSOKI9R2rYgk2N6$SW4w=VIO7wm~$pkL>-sZEQzh3ES~=l8eJ67el{u z^yp^z3PmyIFy4%@RvA>+V5}Y8oSPZ%=&y6rdKzOp^QOM^^0Sk{^-z%MJAb36&*^)j zS@Cl!+NNJ0+cxWlvKVAx$ideL6%80G#<{49-RE6IakTa3T55w2$Bev>xxa$wP>|@* zPsK%Q<(aEg$oP2H3xAMAP_4rJNipq|z9*WL81F6MTUmg&bAI!R%jJ8>@Ho2}vb{uH zkbbz&D5o!|&T`SfW{-*gZlpaHROLe1s2k1;nPPcv0Qmlp zl|PW?XYc%-p58GhqTOeYXcs(66ywz+Nv)?oOY!!C42=IVmNBkR8nVg!YzzEuq{{4+ zG~ZZ{ELIwTKFN@w16Qe&^JoD3)`w3E>Tkk`^*8kb=m%2Bh`loS$~KXTvoZ2|9Q1DT zem!pJy-OHp^K;7}6S+vq<6Ql07t`P`gEa~J0`yACn;jF>@@)ez!^;LN z{VORRZudB$4@X=n#wK(m@qgFT14X3bjJ4ls>MG1Vv`Q6#J=fxG_t{8YU9h1EErLoX zM0Ir?K{hvRXvn{1PDI-+Dp6~N8uc_*1(CLt=+H8vLmo$s@q5>y5Px>VO4YNtD)@Y_ ztYT07P2ei%A@T-K#bL(j5QDDM32Z+j&I`EJom3UJ9dQfnhtbeIPj2(sUUUN+(`P&8 zmQLJn%*(`^VNKj)sTXNaRP++RqEm?VlrVmPq++p-xLo?M5ldV2Xi2@eg81Vk7mK!8 z^+ozXG-W&D7B>+erlR5zvKIH*j<`LY!l6Fd*9}X?w!J5gvf}!g`5ViK(s;kn;jFr zmc+DgoT-M7y^EYeHI;&Yio8em5lQ__CawKV_$Kd(cFci3#2vuAeEeQ;Jyd0>7J91r zS@&m&FDU|s3H<2GvTPn~HI-R!DGf~C*J#B5n*Ytu-du$L%CpN+|9hE+aR3fgjDsP~ zI3FJ(WuDl=gZ<>^P8y)@ z?!52${ZZw|W*UJ*{2pfLs6oVqA7+)6ic-Z;dkpWGJiym&;Z&GS#Um1BX{b?8H-dGu|gC zQS8a0w^q$w!?dK0oVRsKv5~u~W4=zg%FBvMeVZyvpV*qnJ-IcR8?SrO4bIAwbuYSo z;OPM-y3BSUP609sF#niLJJu5gZ5pOY*N=NLVH*cIB*#;#F;=#(LaXXM9k!0 z_?2lN_$19+qw-(r>0jT>>JfuwjQ7uz^LL*o=d)kmIPsgWZ=C418|U0Z)Od}$&WSlR zKX4iPYlLpLl_58rTcl0!TUOvfx_8RpXBY$P!`a=HYP8vX6fUES~cl7kHL~1lJ zUCG3BB|F7Y#;?WwZgak@QUgXAuD}YXaXvppm8;Y%jI^@Al0vyYr-5UHH6YObj-K{B z>1g}Ko4T>y0E6b9IT7s+_~B+G6|wgVAy0N8X4lla0@v}RBm|gC==XJ6fSsg)8%3(y zVA?<(d)%q@z>KtWU%Wgft>3^?Bm|`Ob}ron4o@i{++^n_pHPv(Cxr41y+jvj;F0OR zsK>8{T?6arH?L9ugf&Vk3y6hpIA2NwrhTL=unui$r#5iDnCtE}>RBUydEn2u4zE&A zm(l>_ok^)YaLqe<`hc!id?3vaJPq6+JJTk6r3P=Efm5X!*FfRA(!7@Idc~W+!+t(5 zd#wdLixExyj1raL$5dDgi1y@3%)Gbw-;8l{h#p#{9xpA}s2z+eSepn~YvEDEEBrT{ z49Q}|DgX!g`okf<`U+~Zv?Ql9jH!|h_QAU*l3r3XEyeCv=Lj zT1T%t9N#q2RYGkxi-{TMBdG~>fo%n{YIyJcZVwf;(%#+fg)%J-cM35wIC-g+?N!`} zZGTy!_-&*_M~Ipf*lEeq>htb$OPxZ@OJZ@-LB`qRWf5GUQWH4s;P-Q^p%tEr+jeIVN zCoL35A9*SzzIqn5rN~m8m`(Au7`uos1CJkB>}R~k+#_TSSY(M?WhJ_{gmI+dKO@~H zajQ*dIEa7Fl$xX6Xd z2tRU@$c1Y&QL2vc@mocn*uXUKR4KyVy!WZG_fAT{L?E8{BG%ss7b#-OmWo&PRj-){ zFIqqG&khBPN|1!AV9J!xMBdKH(wxU9W@~58Jz58COT)T3NVy3)jWw zRc6Ljpx!*rD1>Kh>|N-5jlIL=RlizjBbmqrUbENXFN1XyeFK@sQPMyTM?=U#yj$3t z_dPZC9(;n+;20()3T#m52jG)R1x$7LhMfm*0{mW#eNBnN-y%aw6#VWVcN`kEB_#DV zNyuV7LG0B9iL&0qAwJqGs^HM9hOOmG%;4-=QQ)!DfVUYF3@j&%51f}OC}MEnJzFcO zlOj2vU%@zVAIG}vqY``{yNXA_Uj~j&5={M}&rb2xJ8GxLF0CE~4?TQtg3k!*vtd%Z z9Q5vyOL}~?wrTVy4vWgGHjH`&TmONIqEWFz$uE_P`k$z^j*fnb487>HBK2dR{6=0+ zcR_cSX1uG2v;!5_jXqJkZgliZ@Rz5?OoVCr9BQkqUNiB=Y>J=s-2U{KD4Y}f*WI_r zPI2+UvAja#`DPk_Z%m|f^|L7ctVplmjGAD-Y@idT>l1-^xghV#?V!GVtr{3jJf21mfb zxzU)foT}WmC}Cq!-l`T5^XLLMuBBZ z+cWuulQgV{lb$=CMjKN9y89k*P+T}ZmJic--e|{W?jb6`4HRH&IR++IF%( z^>orMjG|AWzcMgfMPalV<*&%(&q97`Wd;TS@Lo_iVD0!w?4R=7{ECuzO-eJ|4zD@jY0lXd{VJD8TZmb8?cv}5?)#k5on zX{TsBf4iNu+a8oh6JgR)e$uYh^@^Ey;J=x7-1eY2n(UEA@eZ7Wa)xi868)B)H1x@0 zU9Ui$G5)<5x+cJJvO^R`iRSn3*e8zOIV_E0oP4G*)^^-(j|>X2UuV4iuX>Kx+9 zX69raaJ%L3bf|p;Dg;#gA!Z^p2NfNK-JZHtLq=31&m@%yVpdsiG=1ihExiy^v{{IY)qf9AX_bSQ7> z`}6PU`}3!y`PrQ4>L2Z6xgs)c?tkoJPs3OJvoxN6OaI6B=FkiIcV2zrJ;&q=d39_gS@0-e1Ru&{Va+nvWx?-8Q5Ew^H(OaGq}|!3_ohD zOQ?GpDfzsvSK#+6x?bTIii%}{Y0Y!Q{{2*PZk-I9zYqxjv2$WRiT!emfBIz$=7P2V zD>5~1rn%=n+Pin(N-JrbspQ;38S;PeIpFgfc$-xGO0ctY!cFu0i(7)zVJm6nA~nL- zW3^y!MZP|=_K%6OvA&2FrgefG7$;*Ngt&A|W)J{&LOz>|mYi**;9cNCq>|!2v#9htv#At%%kX(BZT^^o-lZ(q z{0+pUQmKc;R`T|^r@|(#!xUq|K`r&1&92h zV92px$*>*wLU8CapR{U>p482T%tUuOFKjyFTRc~02mvm|@5(eJ-4^!wE; z2yUyF32{yoC^GO+ikgUK7e9b?)<(`LNo<-K-xw!^b36RoE5T=|M5*McyX6~Uj{Zl# zdjx8=`4snLnDJTg@sgL98(-ix8wB}Lt+cf*_vw!W#UFj@<15(KzJ2>V z4N8^Aw!YN%QKI6!pYNR+SR%Il<*qb_a|d5>d`QCb(EKFZRJ=Pbd12rb7z2US2NZ z<$ZJO=GQuUdUsvXvi{r$MKt;W;xvC~_CFv|9{ei2Ax+xx?{%8-L6J6Edp9e>SVBH1 z4UB608o#x=aU^r)IkKL1YgE!OIIG&i?0x>`N@rnx_;Efq2IMC=Z2InJfZ@alkw z52nqpWRiDaTw;hD zwk5O3zm9y{uup>WE4LLAcRjfLP*m^TwW`H`6yFCLuy60Y84`2vtJ>(Phh3GVY6i%|@(?LFj)z!zm24Eq5E40-8iLEuC^Y~*Jr zVfV~v=p@UfQKk-^WGam^ZRjMML!;fthE6gUjSk|NPou|hoJOOkaIB(Hc4X)zbJM6l zS2I|leJr<+^J$a~51nK=H0pP22Ag6ZXV}MUQ17Ec|G;99oiu~B0QTTXhVNm^ZP+a| z+WqvX$#V-E=4OW-fH>n+CLDi}~A?=e0Q za3$nvxu#UY59Yv1cLK6Kz5$AM6;k3LuHny(Q5F0wP(Jx0H4MHv>hX=+X=CJF z#^Em!ZEZx`YY6dv1K6jFeGrJjG|-b{;dAh-l)$?-e2eU7R0Tg2zzh6LvS<)Vqd~Vz z4+3xaT_*OnBPKBPR|AK06HDc^c9&DaEmJ5W>p`iUd}R_<(F_YW=nA_N-~erb5Bjh= zyI#DfbZ6>8UDAV%?=v3$4)Is;9=EZ$9=>JJ=PTXhX)SanG%iT$Ra zw{#8pbktSDIQF=pF7T7+ms6JqzA`V?^(dZUQ|!6|S6*6|MhSfPIF_jgLBGb%sa8Fm zQ|pKAdQb<(Nz`*6`2-K-=t1;LORHxq>ap7@o{{C`8_Cjx8L*k^oLV2QVO+y_V@wdo zM!=x=(}Ng)L8tM0PzO%%)^~_Q&w(~!Ocsr>1ollY8kQ4-|AjrfS5}6vWqi0!<6V`E z>oQdh2Q^-NmJ+&)LT4C-hGC~QObN}NcN2wdIi*s>mULZN2|Xx$1ws$XGGNQW0+7dw z?YfGGW$}%%SYrwJZh>A$vi<9@Dy@2^RI-EJLFq%-om5SVVTQOPQ-ZQ~RfV*E(w!hsSydU3QaK1IO z$nSnhd1224-`nn&lqQcH*FM%8u8m_bZJLxGI3J1@W&bJMLHSS0b~BCfnRzz71xJvApRm^o#$kF!#8L=y2Vw5*gX-{-8r>B znv=gQ+{Snm*XX}{Sc$ra6|8Z7^nO|H_yqB=dstbFJ$bS&#vi&p zQnx8#X?z9xi!my74=e8MVWkf3SWUb%`(>qNJL4@6!KTXP?Ik@J+rYSJXB%d=v5Bt*)X>|Gi3dJMrE<6MW5^7;o-jJpKsdz3yS9 zc`xJ5&oUl=f$;&#iubDbDzUAMA7^@Sh;ril)d!WP2bjR~MWzRV1LX$FDbcImqhv5W z82c9E4U`d&eQRRH62?SK^g8t(1^m_cm{kwPCH8N`BY8?igbvzgxsRWLUdlp8y!sgNtFON&AA3SH6UJa+l$=ZN5+QnOr&s)=2!#Qa#u#@a_Hk z_|}an3%-Tlm~{RI-xlb>AiiT}jk(uM9Q?mHcMQCdc&Seheo^SG>8$#y*M9G`;&wx( zlggo2kPhJ;6h5rs3lQI*ur|Vv8vJg-=k;I)g*KhHd?Eb3_&nI7h1g?|2O&ekt^+on zN4I~m0zTXzBMyFsjMyN{@jFT{l@S|cDSk)kMHvxs+ppMMT+j0?-5Ye(`CY93HrT1O zXSGURlJX#J+ZozmomD5_LbXz<#k!k}EdWP(@T?73dG* zo(`_oct%XAAIycX4<`0X|9+)A@$)VU{r)?-i3*)Uh>vy%$Cds>MK^_h|6w3;2uG^iEO(a_v5&-CQ&|K$do(%!!wMs zlw|1L!pFc73TI;vA%}0M!w+e^_gvR&kbQP*U)X_tQJ_~OPvSebvU)ZRw2?R~*LXyc zIQ(x#rb@g!YwK%>NsZWxkPnZ|(RidpLQGd4`J9AUt~?TuI9sCe$SjEuZrpqnvJflO zIPClI4lsyw#Q*r#%@vTLQi$obvAAB%r9kcasrCNC3=uPOaJ!W+{2}AtZr1qIn>3F2 z@TZ_3yIT+T+%45#hkZ?Ttf(Ji8nP%95!}X^B}9h7T>Sx%1{m^{JFH^ zgrevD+_`SC>K@Ps^LiFv4iV zq08jeG7L)3JDh3UitnF+UV-=E@9a4So<5RcsBLL@N3x6?OtT=KLDl-*Qhhj6;^FZU zAE>27tqbuA^&ofyb_VQjJ*d}_STmr@gpSveIl6`K9N0sJua(4mFy2)e_JcP{9KHm= zJK<*QUIU{#V^_olahCLF8?}MJZ z<$8x_!LQ&|_RwJ4-$W4%j(hO@Pb}I~(vdzSZG9<^x;y2CpF= z0^TVc`MdVdm&)JZ!_zWV4c=kN`{C&na^rngws=vSj_>+)oLov}zIZn%s)YW);$ua; zW8mC*whP}DBP@Y3i1D6YH*`keX-oDmstijK?^?+?*3J8-QK35w$1>|U^zS=Lu_v|;_Br0}x4XrABG!P$I*H>M5W4|>=Z*yNJac5E zND1-m5(@Rqw&WYgLXck?8;L(#Fb394yv}A}3~ zdx9?T(N;KlNG0)Ju>xz-o(aB3w&qzfR}S+c#x#88ll!=`+mr9zJTSqxXRB0S=RU4H zMtU%@f$^Z{xKd2MIH`sb?r~LY_8wOn$QQ3u4W)4w@dk;-gO7A8wf6go)wkoyB2wah zb(fOd?y0E5ekx+##_d@ZwJtsQh@=O5HWk-{E@%(Rpe=s)aRv1`WxHfw9Pba2QbUPc z2fc?LOn#mCo+K;k97u#UpJIVN>#gt%EDb!UE$?|pX*`$J#&3COst2y^nwqz5-OYGUmMP3tJ%d)GXP-xZX&-+e+^ zM6UQWwO5Hf2K(t;FX#+8o7^XqUiS%QfF{R#)&HUNlH!dei9^2MG9o(J0$LVqxWRgePUO1wZsn=Q79@w zKlAu**?nS{{%1WHZIigZHMM)2lk;NO`0 zgc43lJS=$mgtG3p#6gGHvy&?jGo|rc5)c0y@$j#S>p!-56!b!#@Bki%r`aCBT*hcr2=n8Zyc(!&*jN|#*AW=M6 zqAPeGNqQL1o5oiVUBH)woJGDGEdFdurNFm4`wUa0mdAF8F->c;% z`Q-CYBcHHK&+Snn-ysfJ=wPAnkFX;0LlW}J;A9FRKg%bdWaqEV?N(6deT5W?e2@6^ zVhvL&Phk%_)-{@3iFofgXYkiZEbv?Gvu0O{wdZ$;l|tl29C(QiiZvx0`qt8m>w~k7 z^!W7PyCUDd3;F7lPv?^+=)uz>-(Haqd((QZ_;kKctwGJi(bl@$Pv`B)(u0UwgE=H! z@?3jX30F$|m!FsgSig?FX@c$5eN2g+Wc)nZ zQcDRYQRuU9qdf3l7ROD*|77>4_CL%J-g(pe2n|Z;Ls!q8|8iX~hcDEcp2!&FTw$ znnON+{un-$CJTKrb6I?fXPrCK=2PrXwDW^cZ#T^XFZ?|?d=Gqx(}evPHs9ZW-mI#% z+m7}yH?4rJ70aO&un|Lj4jjJh@lGJFb7;jp-akUU=~$Ho9nnl+1^r;y^XLbIjr$* zBzqT=ysQ!BgT(jVq48&lstyoU?|nq$jYQQ^H~FGL;*CL#M?H1Cj%05gWiM+yEb)7Z zssI=D2Z@gxM^!OT9e>b6Rgd4H@m9~R6{}y-c>K2-e=duvT;%fF_BLKWxx6vSZ7inj zWg5{k)CaqaSJ;GQe#&0pK~pC8D!sYCyclU-dD*ozYpm-wXIU67bYm_=pAHKNfxq6ZsF1g%4Zs zr){{vJv_sp)B@uQCoiti7Sx$qU~C%;N1dq!#(iVqs57;|_?NM8)R|gfJTevzokePa z(GPzL=znT~F_3nCAnlwe+j#e*i}^_P81JNCYhL56^y_er@kaW!KF;{h^y}1k$v&H{sR_Yya@10BlDVy<_&D8edxhJLC~b8$B&g6g~oi&)Yte zGifgD&W3Eicq-9q_#wmhnsaqzjP51)hZxluJ#$L3?1Zrg6FA|M!NGU!^Jf3AB?=Ul zBKAw+AF=-ucGRzFm5c;Ij7fUrLgj_f5v=**VUDE1b8nYnK`$K0L;vfEQAyKneV zo)X9=JqUf#QV&(>rR2MT=m&Z!t#}{4goqNSULQ~v(d5;&6DU;NrLATYDD;ybW8O@O z2RsyN$)>8o10v=k4^Y5w4SnW~Ymged=GnF3FlX2BWQ{<3j_ z;g8L#3+<%r)$q$fjDmhfVxKka=;5zv9HT0S6_b9vN-O3hO34Bac4Zbn6Eng)!WRUTH;k(x~3(&5yyssnnq&y{%VpP>7 zPl>OF|EZg`(W0|dVeO%-Jp@~qbUWDdn_sql;OlwN^Ma;`t$5znbzAe)CFUviD`TFH zLRVeS4uxH`0y=N#t481@=C@fc*kas&8gdHG{wFP?-^(s#V}Sc#}ut zZ@Gt+eb61ahm{xiP|-boRJ8a(Dk9-qq0BfgQ(w4Et2kCS&)9M^`S!?GTXpZSl4=+J z@=q4G_>Ur%N%62O{9^yQZXWh=2lp^5?o*dc@poX;=Yh|Xi~aiY8M7b$H8Cb569?|V z_kl~t=0!0!u-kwyT3yQYnnZ~{DRWt0p00#5!L#}CL+4DfUt>U`c=`Kg2+wiR*QI5~ z^QKvlUgwBh6!^j!v;S?G0(vH`I1ndJTeNS`mMOc3SBH-lQ0(QyO)u0515{K}<0`3*tl} ztaHM@tTfL+-^qnon7FURY2PjdG1x_$W98x-Q|cDFJ_6sjIb7_%0#Xv=PN0&!SLdf>pO+6A-c2StQsN#~YJ2VVZD+ahphSH?`G&^T&C?Ao%`@N+acDR3Vwn=4K}^v$ zQMT|6$B((Gs#u;9e-iJ8UX6FlY#Dt0{D~;kB~6LHoOKc2C9(L8*h?!@{1=%Nig-0X zAhY-#6??pv!3PZT-|&$cir%YL zKxbY;vUeKE%j$B57195r<;Lw2^$A}!SCP?BPqzIH9ij5s#tMo0Fn1loV_A>7;E@{#5kc{JILY_oZpD&?rst5$9m@6XZ3Ba zM15GtQ4Y`kJ?z}o=pW{7gErm|^)wpJq$=S%1K*il!f%a|`myDIW#~EL zsV~qdY4ePsRWzEqnnqKrv{CFw`{6G%9^Mo_S4;HFFr#N8(fM>D){%TLVSX$*50B5(B`3O#?h#3OvZO2eH_6T%}~-U4)UI2mc7ye`5Ae zQm9&jkCyTo252DKP(IW6KKhYW%VEm{8GmSqxT+2-7*FuHziNh&g3rRm_Bwp~=MCY{ z7k#>ArtvtVzC8sZ*1!=8R~o6?XtV%(ok-7vjezjMjCZ?mo`E^O;Nh7<{$LyLJST9x z955b18*bA^3lWQWH+U{T4!vv<(UI`yXB!VN>icm$jed|xhM7lyf!uT(d{Yl;e6jbJ z3VdT~T?IvZvdBm7Un(y5>q@U)U_ICRW*VCq{BF>Z0Wb7hvkd=-rkK~L-@j$HLFz06 z{-NNL$(eKL2YfXZk$w_%L0=}5p0`Tyi{00oY4k0*C@>%u#b3IDLf3nLsh~~33tuI@ z-q#iCoMpV_eqAZ?zOLMJwxH<6Jq1OJPZt#3YPShK&-`;{8;DDudQsyvnW_qjj{FUK z1g@Vgo{{?JUf-n?%{wI*2p@dcfnGn>_y?KfGbM`4ChYj=2z_<7u_%q7;V%s_{Z9SK z3?UXF)|smr^<9T}FaeE!4!#xSNr5-z$$>ZID}Pv9-N=Cv699fS7LgqHzq(CX?1DUE$wQGB2VLPDGT@&rD@7G})}9|nX1;XTi$s0! zH4I;w$BFt-Kk6L(KIRRJHxh*~=bjmYT`76Z@$?skb}9O%qCD&m!v0IaE2#y>Gems@ z*QUWbXBtnF@ZIDqyo!t~O|#%pnW}WApB%hd8x42SZW%Th?$?z&WZC<~W=mFk9R8R? zvy74l3yKDa`X1k=@h3K8TqcY5jLLH0i6P%LJZc^h{%} z9+Yy3OWLEs5=tep7ZvtagUpJt2A?|c>yQ1=>{0AXJ0_lG(!7U)jm*jq{X1+JV2g`< zu*HS%6rn@&(kS*fg(YnPd_7+h52)PI-KUry{HAI4hp*7)f5SBU@jdDM=ARydUu{PZ z_g9$$|2>gLe@+w%F+DiR{Y&NhujCiOXV8D6?6c(i?}^$dp1JDoPD^IXu;1j;hTUCW4ucS_U=dU4wwtS)-SWfu!}GBd}Gtv;lSj2RNe`vHHZHKQFoR_e3SI1_N@un;V-jF9A{s!vB z-Vw|@Sq{8tngxqhyhB>+BJyH>_dHv&Lmb(;tE1Oi?M9n3Ncbl^xvwQUUnP0R>G#d5 zX)UGm;oAasDGn~^$YORm)Ps6q_pU!%vIEzk>8&dHAVWQc7=t!#>d)T&2;y!a-%Ecd z&v)%SPYd6l`AI*eg3;V=gQ)P zDvA*k1F_VJ#p~dk8rR}E#^Oui2h}CktDT4$l`)45#2cBmN!Fe{HC?n-`ArBpC>ZEjw79vL08C=b4nAj3mX zxcBqKzo-r?Lo{(U=EJlcs=#{gSIH=zLkYiWhE%T=?^C_+aB}dNHRsOT@iZ50p$hQ1 zvzOC3j$OabnP$K4qH6degs(#3kMPt_lNd{q^pi9)^d80(^PpC&?NY+^=nWzk4P@Wq zg!@;&UnKu3ef@)e@&BAQ`^hw`>6qECBfgty_G?7d3Q^y~pTHKEcG8kks6%nfsA&7D7UL33n&)m2qYRZC$o^`!t9(0d6RC8tZI#_ ztsQDxd#Bp5e%-qEWT%HhkyU`TZ)i$3uW7&2L#vX_4bk?thK|-vP3rnKJ7ZJK@1c&) zWNWNx;hc?S8)vAoSQ7b~TUQByhgu>XEo!u-VQr)%K4<1!71_k!47D-R7PsM7U4&me zo1rEz3WeqE9m)BU# z(|KKeOeGUx>&Q_lnYhQ{pYHl`_EKeqppqIr8YLHVxj72UlVIef;5rFw)W)O$ePy9yF7Gb zq-}k3B-*(?*_2ejw8UmF_ zWG%6nPu6UUwYN2SXtB+Z7guG$)!@@rO=@SmdR=9WntnO=(#xwZy_|FDC9Ph+b{()_ z;qp-X`c4nsxO9_;)Wz*<7Lr;Q$KUk}N$_s4{mz9n8|QPab9Hfj<%P4WE}ShSbxCWJ zT6fz*QtMkcH7%qY>n=>Kuh7?2T7JutCBaJTaFunavJbag$7;IOdeW&&1gD6V1?x); z|B;QVN=cA_)-*MD3V2MVWb3MyPMW=@wQ=^E*vvJpZRy-Oj(!&fn5@DSW#PzopfJJMH|I z4L@VURU6Ns4R^1$+XDg+(YI}QZrp-9?I*|<4c4OBu!`&xTgq(iSl6%$%XkAOLBqO8 zGP1UVIz$oc!p_p%+7?;UkbdJ5ycV8yEq68GDc;Z-X|&|q=7z@g&CN~8G1ac3#`gBk zxu{~Tg$IvYh7iV9RNaP#azQ30* zy?vL`TY0|jan6gwd?i%-!OYRVb-@HNq5dBx5X*B6Id{ZyW@ zc}zXpn0hM9uepZkFK4!0@wXG#3;qxZeaa=eurQN$p=}rLW6{=JMEXSn>Y0qDH|v=T^zM=|su_&Eubz*>y^NYJl{O6>L48dvN7<;tTR*7Nl8 zn3B$V?UZ-cX=hz_)?sH|oMg)h=?VS(yz^X0OUSBaT6KQTey&Wl`**9`g3q$y7;;cK z?hzYpXigd&sP!BRKHr8jj!IiVfEkK@lgmQD-!)8W96u>*dtlP^e)bgm0sAR?fxW_h&Hj_U&HgX@fRW^tCQ3!pG--xZC0!#ek#3Z3mA)o5OKs8y zsatwLdPLeKJuZD)`o8pI2{f{J+)5z7GX&r-{G0@Sg>DZ#=jivG1m4cG#|8SteCI}5 z0*%u3jOhuh#uQt(I5yp4)7+Z1R>HY+{aJlLI~_fzlQ2i{1OJTepOer|^wV0KFHLCY z*uFan?L?gpEkFk+g>5}3=z_U^g>wTulLo^FRM5ytkeeNvLH7z8IccY@lXd8JaZx5p zrO^{`^w&u+tiW}NJufhqodkVn8N@*%p|gda*GbTMI{bkn_*(F`oviiIT7xk*>GzOO z#(KaNt88;K6;A#kEroIPpUt(H7)KK9mQq z;0HKxB9Ai{(EoHixCh+$A^*Rm(a)&^ZN_hGLVbWEUwXnd>OgYp!qLf#a!$heXW>B^ zXAE(~4`b!v2R>)KaGs7Q9j}82Fo%~MdIBf#Idldd=ZA6*PQY;O@EgVmKZl+UJ_ir- zrsHwWQ5Wh&e&9xV&>cU(ffGlJ7s}w=DGQuV-*KLf2j!i07HtGx9I<{lcu+R|+`-}0 zi}pC{7x)R~ffH?Y@ZdZhkAnkwoqB->Yanpo-4kVi7k$IJgz`8~$AdPYJn}kt&{mXp z)<%>8PV^0H7|J{JM_#85z=6ED23>H^!GX0EWq=p=u->5$ILC1;9^?f+&;j?HH5&5^ z_kb7o96UHr$K$jG_|x&AJl1lo(I|sHOp9T^v1& zqgQd>7ceJ~=9F0a2=ENjI=^)dS|hnt>l(O`{?$G@G;m}bhlWl9ZIE;uzrzc;AbQ%E zI^{ny&35aKm37pIVQIQkh! JAM;u1{{jDsJD>mn literal 0 HcmV?d00001 diff --git a/rpi-Add-identifiers-for-the-new-RPi-5-series.patch b/rpi-Add-identifiers-for-the-new-RPi-5-series.patch deleted file mode 100644 index 66db2ca..0000000 --- a/rpi-Add-identifiers-for-the-new-RPi-5-series.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 49423505898eef1baefa2823408dad8321571353 Mon Sep 17 00:00:00 2001 -From: Peter Robinson -Date: Sun, 29 Dec 2024 14:43:33 +0000 -Subject: [PATCH] rpi: Add identifiers for the new RPi 5 series - -The Raspberry Pi foundation have released the Raspberry -Pi 500, CM5 an CM5 lite devices so add the assoicated -revision identifers so we can detect them. - -Signed-off-by: Peter Robinson ---- - board/raspberrypi/rpi/rpi.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c -index 18be244aa79..1e43c631898 100644 ---- a/board/raspberrypi/rpi/rpi.c -+++ b/board/raspberrypi/rpi/rpi.c -@@ -193,6 +193,21 @@ static const struct rpi_model rpi_models_new_scheme[] = { - DTB_DIR "bcm2712-rpi-5-b.dtb", - true, - }, -+ [0x18] = { -+ "Compute Module 5", -+ DTB_DIR "bcm2712-rpi-cm5-cm5io.dtb", -+ true, -+ }, -+ [0x19] = { -+ "500", -+ DTB_DIR "bcm2712-rpi-500.dtb", -+ true, -+ }, -+ [0x1A] = { -+ "Compute Module 5 Lite", -+ DTB_DIR "bcm2712-rpi-cm5l-cm5io.dtb", -+ true, -+ }, - }; - - static const struct rpi_model rpi_models_old_scheme[] = { --- -2.47.1 - diff --git a/rpi-fixes.patch b/rpi-fixes.patch new file mode 100644 index 0000000..352261b --- /dev/null +++ b/rpi-fixes.patch @@ -0,0 +1,156 @@ +From 27e0160320c13168ab5d703c5ec4bec87a6d2700 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Sun, 29 Dec 2024 14:46:05 +0000 +Subject: [PATCH 1/4] rpi: Add identifiers for the new RPi 5 series + +The Raspberry Pi foundation have released the Raspberry +Pi 500, CM5 an CM5 lite devices so add the assoicated +revision identifers so we can detect them. + +Signed-off-by: Peter Robinson +Acked-by: Matthias Brugger +--- + board/raspberrypi/rpi/rpi.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index aa39afa338a..4d546892842 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -193,6 +193,21 @@ static const struct rpi_model rpi_models_new_scheme[] = { + DTB_DIR "bcm2712-rpi-5-b.dtb", + true, + }, ++ [0x18] = { ++ "Compute Module 5", ++ DTB_DIR "bcm2712-rpi-cm5-cm5io.dtb", ++ true, ++ }, ++ [0x19] = { ++ "500", ++ DTB_DIR "bcm2712-rpi-500.dtb", ++ true, ++ }, ++ [0x1A] = { ++ "Compute Module 5 Lite", ++ DTB_DIR "bcm2712-rpi-cm5l-cm5io.dtb", ++ true, ++ }, + }; + + static const struct rpi_model rpi_models_old_scheme[] = { +-- +2.48.1 + +From 2d75c46be99c15fa186436c149b87ee97e0b8f44 Mon Sep 17 00:00:00 2001 +From: Martin Stolpe +Date: Wed, 23 Oct 2024 15:09:20 +0200 +Subject: [PATCH 2/4] rpi: Only add frame buffer node if CONFIG_FDT_SIMPLEFB is + set + +The functions fdt_simplefb_add_node and fdt_simplefb_enable_and_mem_rsv +are only available if CONFIG_FDT_SIMPLEFB is enabled. + +Signed-off-by: Martin Stolpe +Acked-by: Matthias Brugger +Signed-off-by: Peter Robinson +--- + board/raspberrypi/rpi/rpi.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index 4d546892842..fe6153b388b 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -604,11 +604,13 @@ int ft_board_setup(void *blob, struct bd_info *bd) + + update_fdt_from_fw(blob, (void *)fw_dtb_pointer); + +- node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); +- if (node < 0) +- fdt_simplefb_add_node(blob); +- else +- fdt_simplefb_enable_and_mem_rsv(blob); ++ if (CONFIG_IS_ENABLED(FDT_SIMPLEFB)) { ++ node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); ++ if (node < 0) ++ fdt_simplefb_add_node(blob); ++ else ++ fdt_simplefb_enable_and_mem_rsv(blob); ++ } + + #ifdef CONFIG_EFI_LOADER + /* Reserve the spin table */ +-- +2.48.1 + +From fc7a3110184a3ca4c227675b20d3a4887210e36c Mon Sep 17 00:00:00 2001 +From: Fiona Klute +Date: Wed, 12 Feb 2025 12:39:01 +0100 +Subject: [PATCH 3/4] Raspberry Pi: Keep warnings from firmware in DT, if any + +The /chosen/user-warnings property is created by the RPi firmware if +there are warnings to report, keep it to make debugging easier. + +For example, if the firmware config.txt contains +"dtoverlay=error-example" and that example references an undefined +symbol "&nosuchdev" the warning can be read after boot: + +$ cat /proc/device-tree/chosen/user-warnings +dterror: can't find symbol 'nosuchdev' +Failed to resolve overlay 'error-example' + +Signed-off-by: Fiona Klute +Reviewed-by: Matthias Brugger +Signed-off-by: Peter Robinson +--- + board/raspberrypi/rpi/rpi.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index fe6153b388b..43efb0dbc1d 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -594,6 +594,9 @@ void update_fdt_from_fw(void *fdt, void *fw_fdt) + /* kernel address randomisation seed as provided by the firmware */ + copy_property(fdt, fw_fdt, "/chosen", "kaslr-seed"); + ++ /* warnings from the firmware (if any) */ ++ copy_property(fdt, fw_fdt, "/chosen", "user-warnings"); ++ + /* address of the PHY device as provided by the firmware */ + copy_property(fdt, fw_fdt, "ethernet0/mdio@e14/ethernet-phy@1", "reg"); + } +-- +2.48.1 + +From e042d7593a0b7544259fd2d22240e78d18912746 Mon Sep 17 00:00:00 2001 +From: Fiona Klute +Date: Wed, 12 Feb 2025 12:39:02 +0100 +Subject: [PATCH 4/4] Raspberry Pi: Copy Bluetooth device address in DT + +The firmware sets local-bd-address, copy it when loading a new DT. + +Signed-off-by: Fiona Klute +Signed-off-by: Peter Robinson +--- + board/raspberrypi/rpi/rpi.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index 43efb0dbc1d..70d3c35499b 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -599,6 +599,9 @@ void update_fdt_from_fw(void *fdt, void *fw_fdt) + + /* address of the PHY device as provided by the firmware */ + copy_property(fdt, fw_fdt, "ethernet0/mdio@e14/ethernet-phy@1", "reg"); ++ ++ /* Bluetooth device address as provided by the firmware */ ++ copy_property(fdt, fw_fdt, "/soc/serial@7e201000/bluetooth", "local-bd-address"); + } + + int ft_board_setup(void *blob, struct bd_info *bd) +-- +2.48.1 + diff --git a/sources b/sources index 0c37e78..25593f8 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (u-boot-2025.04-rc3.tar.bz2) = 2e0b022cf0ffb0b8019375fb5087b1e05f3503ed2b33aed38a04a9286794a4ac81f36c2a9ab8adcfd85762454b636a21e1f7a8fee4c4206f37852664dd4b9e01 +SHA512 (u-boot-2025.04-rc4.tar.bz2) = aaf75661178b597b530628396f291fc9cd562f714c83b87f9bd6d00f26d5bbcc336523bc5446c5f9acce715a67b6508f63a7767408e01a875efea9b460c8ca38 diff --git a/uboot-tools.spec b/uboot-tools.spec index a8e5452..de2e978 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -1,26 +1,36 @@ -%global candidate rc3 +%global candidate rc4 %if 0%{?rhel} %bcond_with toolsonly %else %bcond_without toolsonly %endif +%global debug_package %{nil} + # Set it to "opensbi" (stable) or "opensbi-unstable" (unstable, git) %global opensbi opensbi Name: uboot-tools Version: 2025.04 -Release: 0.5%{?candidate:.%{candidate}}%{?dist} +Release: 0.6%{?candidate:.%{candidate}}%{?dist} Epoch: 1 Summary: U-Boot utilities # Automatically converted from old format: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ - review is highly recommended. License: GPL-2.0-or-later AND LicenseRef-Callaway-BSD AND LGPL-2.1-or-later AND LGPL-2.0-or-later URL: http://www.denx.de/wiki/U-Boot -ExcludeArch: s390x + Source0: https://ftp.denx.de/pub/u-boot/u-boot-%{version}%{?candidate:-%{candidate}}.tar.bz2 Source1: aarch64-boards Source2: riscv64-boards +Source10: rk3588-boards +Source11: rk3568-boards +Source12: rk3566-boards + +Source20: rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin +Source21: rk3568_ddr_1056MHz_v1.23.bin +Source22: rk3566_ddr_1056MHz_v1.23.bin + # This is now legacy, most devices use bootflow, we keep this for the laggards Patch1: uefi-distro-load-FDT-from-any-partition-on-boot-device.patch # Identify VFAT partitions as ESP, allows EFI setvar on our images @@ -39,11 +49,12 @@ Patch8: USB-PD-TCPM-improvements.patch # Device improvments # RPi -Patch10: rpi-Add-identifiers-for-the-new-RPi-5-series.patch +Patch10: rpi-fixes.patch # Rockchips improvements Patch11: rockchip-Enable-preboot-start-for-pci-usb.patch #Patch12: rockchip-Modernise-Geekbox-config.patch +ExclusiveArch: aarch64 BuildRequires: bc BuildRequires: bison BuildRequires: dtc @@ -52,41 +63,31 @@ BuildRequires: gcc BuildRequires: gnutls-devel BuildRequires: libuuid-devel BuildRequires: make -BuildRequires: ncurses-devel -BuildRequires: openssl-devel BuildRequires: openssl-devel-engine BuildRequires: perl-interpreter BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-libfdt -BuildRequires: SDL2-devel BuildRequires: swig -%if %{with toolsonly} -%ifarch aarch64 BuildRequires: arm-trusted-firmware-armv8 -BuildRequires: crust-firmware BuildRequires: python3-pyelftools BuildRequires: xxd -%endif -%endif -Requires: dtc %ifarch riscv64 BuildRequires: %{opensbi} %endif +Requires: dtc +BuildRequires: uboot-tools %description This package contains a few U-Boot utilities - mkimage for creating boot images and fw_printenv/fw_setenv for manipulating the boot environment variables. -%if %{with toolsonly} -%ifarch aarch64 -%package -n uboot-images-armv8 +%package -n uboot-images-copr Summary: U-Boot firmware images for aarch64 boards BuildArch: noarch -%description -n uboot-images-armv8 +%description -n uboot-images-copr U-Boot firmware binaries for aarch64 boards -%endif %ifarch riscv64 %package -n uboot-images-riscv64 @@ -96,96 +97,64 @@ BuildArch: noarch %description -n uboot-images-riscv64 U-Boot firmware binaries for riscv64 boards %endif -%endif %prep %autosetup -p1 -n u-boot-%{version}%{?candidate:-%{candidate}} cp %SOURCE1 %SOURCE2 . +cp %SOURCE10 . +cp %SOURCE11 . +cp %SOURCE12 . +cp %SOURCE13 . + +cp %SOURCE20 . +cp %SOURCE21 . +cp %SOURCE22 . + %build mkdir builds -%make_build HOSTCC="gcc $RPM_OPT_FLAGS" CROSS_COMPILE="" tools-only_defconfig O=builds/ -%make_build HOSTCC="gcc $RPM_OPT_FLAGS" CROSS_COMPILE="" tools-all O=builds/ - -%if %{with toolsonly} -# OpenSBI firmware is distributed in U-Boot SPL images -%ifarch riscv64 -export OPENSBI=%{_datadir}/%{opensbi}/generic/firmware/fw_dynamic.bin -%endif - -%ifarch aarch64 riscv64 -for board in $(cat %{_arch}-boards) +for board in $(cat rk3588-boards) do - echo "Building board: $board" + echo "Board: $board using rk3588" mkdir builds/$(echo $board)/ - - # ATF selection, needs improving, suggestions of ATF SoC to Board matrix welcome - sun50i=(a64-olinuxino a64-olinuxino-emmc amarula_a64_relic bananapi_m64 nanopi_a64 oceanic_5205_5inmfd orangepi_win pine64-lts pine64_plus pine64_plus pinebook pinephone pinephone pinetab sopine_baseboard teres_i) - if [[ " ${sun50i[*]} " == *" $board "* ]]; then - echo "Board: $board using sun50i_a64" - cp /usr/share/arm-trusted-firmware/sun50i_a64/bl31.bin builds/$(echo $board)/atf-bl31 - cp /usr/share/crust-firmware/a64/scp.bin builds/$(echo $board)/ - fi - sun50h5=(bananapi_m2_plus_h5 emlid_neutis_n5_devboard libretech_all_h3_cc_h5 libretech_all_h3_it_h5 libretech_all_h5_cc_h5 nanopi_neo2 nanopi_neo_plus2 nanopi_r1s_h5 orangepi_pc2 orangepi_prime orangepi_zero_plus2 orangepi_zero_plus) - if [[ " ${sun50h5[*]} " == *" $board "* ]]; then - echo "Board: $board using sun50i_h6" - cp /usr/share/arm-trusted-firmware/sun50i_a64/bl31.bin builds/$(echo $board)/atf-bl31 - cp /usr/share/crust-firmware/h5/scp.bin builds/$(echo $board)/ - fi - sun50h6=(beelink_gs1 emlid_neutis_n5_devboard orangepi_3 orangepi_lite2 orangepi_one_plus pine_h64 tanix_tx6) - if [[ " ${sun50h6[*]} " == *" $board "* ]]; then - echo "Board: $board using sun50i_h6" - cp /usr/share/arm-trusted-firmware/sun50i_h6/bl31.bin builds/$(echo $board)/atf-bl31 - cp /usr/share/crust-firmware/h6/scp.bin builds/$(echo $board)/ - fi - sun50i_h616=(anbernic_rg35xx_h700 orangepi_zero2 orangepi_zero2w orangepi_zero3 transpeed-8k618-t x96_mate) - if [[ " ${sun50i_h616[*]} " == *" $board "* ]]; then - echo "Board: $board using sun50i_h616" - cp /usr/share/arm-trusted-firmware/sun50i_h616/bl31.bin builds/$(echo $board)/atf-bl31 - fi - rk3328=(evb-rk3328 nanopi-r2c-plus-rk3328 nanopi-r2c-rk3328 nanopi-r2s-rk3328 nanopi-r2s-plus-rk3328 orangepi-r1-plus-lts-rk3328 orangepi-r1-plus-rk3328 roc-cc-rk3328 rock64-rk3328 rock-pi-e-rk3328 rock-pi-e-v3-rk3328) - if [[ " ${rk3328[*]} " == *" $board "* ]]; then - echo "Board: $board using rk3328" - cp /usr/share/arm-trusted-firmware/rk3328/bl31.elf builds/$(echo $board)/atf-bl31 - fi - rk3368=(evb-px5 geekbox) - if [[ " ${rk3368[*]} " == *" $board "* ]]; then - echo "Board: $board using rk3368" - cp /usr/share/arm-trusted-firmware/rk3368/bl31.elf builds/$(echo $board)/atf-bl31 - fi - rk3399=(eaidk-610-rk3399 evb-rk3399 ficus-rk3399 firefly-rk3399 khadas-edge-captain-rk3399 khadas-edge-rk3399 khadas-edge-v-rk3399 leez-rk3399 nanopc-t4-rk3399 nanopi-m4-2gb-rk3399 nanopi-m4b-rk3399 nanopi-m4-rk3399 nanopi-neo4-rk3399 nanopi-r4s-rk3399 orangepi-rk3399 pinebook-pro-rk3399 pinephone-pro-rk3399 puma-rk3399 rock-4c-plus-rk3399 rock-4se-rk3399 rock960-rk3399 rock-pi-4c-rk3399 rock-pi-4-rk3399 rock-pi-n10-rk3399pro rockpro64-rk3399 roc-pc-mezzanine-rk3399 roc-pc-rk3399) - if [[ " ${rk3399[*]} " == *" $board "* ]]; then - echo "Board: $board using rk3399" - cp /usr/share/arm-trusted-firmware/rk3399/* builds/$(echo $board)/ - cp builds/$(echo $board)/bl31.elf builds/$(echo $board)/atf-bl31 - fi - zynqmp=(xilinx_zynqmp_kria xilinx_zynqmp_virt) - if [[ " ${zynqmp[*]} " == *" $board "* ]]; then - echo "Board: $board using zynqmp" - cp /usr/share/arm-trusted-firmware/zynqmp/bl31.bin builds/$(echo $board)/atf-bl31 - fi - # End ATF - make $(echo $board)_defconfig O=builds/$(echo $board)/ - BL31=builds/$(echo $board)/atf-bl31 %make_build HOSTCC="gcc $RPM_OPT_FLAGS" CROSS_COMPILE="" O=builds/$(echo $board)/ + BL31=/usr/share/arm-trusted-firmware/rk3588/bl31.elf \ + ROCKCHIP_TPL=rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin \ + %make_build HOSTCC="gcc $RPM_OPT_FLAGS" CROSS_COMPILE="" O=builds/$(echo $board)/ +done + +for board in $(cat rk3568-boards) +do + echo "Board: $board using rk3568" + mkdir builds/$(echo $board)/ + make $(echo $board)_defconfig O=builds/$(echo $board)/ + + BL31=/usr/share/arm-trusted-firmware/rk3568/bl31.elf \ + ROCKCHIP_TPL=rk3568_ddr_1056MHz_v1.23.bin \ + %make_build HOSTCC="gcc $RPM_OPT_FLAGS" CROSS_COMPILE="" O=builds/$(echo $board)/ +done + +for board in $(cat rk3566-boards) +do + echo "Board: $board using rk3566" + mkdir builds/$(echo $board)/ + make $(echo $board)_defconfig O=builds/$(echo $board)/ + + BL31=/usr/share/arm-trusted-firmware/rk3568/bl31.elf \ + ROCKCHIP_TPL=rk3566_ddr_1056MHz_v1.23.bin \ + %make_build HOSTCC="gcc $RPM_OPT_FLAGS" CROSS_COMPILE="" O=builds/$(echo $board)/ done -%endif -%endif %install -mkdir -p %{buildroot}%{_bindir} -mkdir -p %{buildroot}%{_mandir}/man1 mkdir -p %{buildroot}%{_datadir}/uboot/ -%if %{with toolsonly} -%ifarch aarch64 for board in $(ls builds) do - for file in u-boot.bin u-boot.img u-boot-dtb.img u-boot-sunxi-with-spl.bin u-boot-rockchip-spi.bin u-boot-rockchip.bin + for file in u-boot-rockchip-spi.bin u-boot-rockchip.bin do if [ -f builds/$(echo $board)/$(echo $file) ]; then install -pD -m 0644 builds/$(echo $board)/$(echo $file) %{buildroot}%{_datadir}/uboot/$(echo $board)/$(echo $file) @@ -193,82 +162,15 @@ do done done -# Just for xilinx_zynqmp -for board in "xilinx_zynqmp_kria xilinx_zynqmp_virt" -do - for file in u-boot.itb spl/boot.bin - do - if [ -f builds/$(echo $board)/$(echo $file) ]; then - install -pD -m 0644 builds/$(echo $board)/$(echo $file) %{buildroot}%{_datadir}/uboot/$(echo $board)/$(echo $file) - fi - done -done - -# For Apple M-series we also need the nodtb variant -install -pD -m 0644 builds/apple_m1/u-boot-nodtb.bin %{buildroot}%{_datadir}/uboot/apple_m1/u-boot-nodtb.bin -%endif - -%ifarch riscv64 -for board in $(ls builds) -do - for file in u-boot.itb spl/u-boot-spl.bin spl/u-boot-spl.bin.normal.out - do - if [ -f builds/$(echo $board)/$(echo $file) ]; then - install -pD -m 0644 builds/$(echo $board)/$(echo $file) %{buildroot}%{_datadir}/uboot/$(echo $board)/$(echo $file) - fi - done -done -%endif - -# Bit of a hack to remove binaries we don't use as they're large -for board in $(ls builds) -do - rm -f %{buildroot}%{_datadir}/uboot/$(echo $board)/u-boot.dtb - if [ -f %{buildroot}%{_datadir}/uboot/$(echo $board)/u-boot-sunxi-with-spl.bin ]; then - rm -f %{buildroot}%{_datadir}/uboot/$(echo $board)/u-boot{,-dtb}.* - fi -done -%endif - -for tool in dumpimage env/fw_printenv fdt_add_pubkey fit_check_sign fit_info gdb/gdbcont gdb/gdbsend gen_eth_addr gen_ethaddr_crc ifwitool img2srec kwboot mkeficapsule mkenvimage mkimage mksunxiboot ncb proftool sunxi-spl-image-builder -do -install -p -m 0755 builds/tools/$tool %{buildroot}%{_bindir} -done -for tool in dumpimage kwboot mkeficapsule mkimage -do -install -p -m 0644 doc/$tool.1 %{buildroot}%{_mandir}/man1 -done - -install -p -m 0755 builds/tools/env/fw_printenv %{buildroot}%{_bindir} -( cd %{buildroot}%{_bindir}; ln -sf fw_printenv fw_setenv ) - -%files -%license Licenses/* -%doc README doc/develop/distro.rst doc/README.gpt -%doc doc/develop/uefi doc/usage doc/arch/arm64.rst -%{_bindir}/* -%{_mandir}/man1/dumpimage.1* -%{_mandir}/man1/kwboot.1* -%{_mandir}/man1/mkeficapsule.1* -%{_mandir}/man1/mkimage.1* - -%if %{with toolsonly} -%ifarch aarch64 -%files -n uboot-images-armv8 +%files -n uboot-images-copr %license Licenses/* %dir %{_datadir}/uboot/ %{_datadir}/uboot/* -%endif - -%ifarch riscv64 -%files -n uboot-images-riscv64 -%license Licenses/* -%dir %{_datadir}/uboot/ -%{_datadir}/uboot/* -%endif -%endif %changelog +* Wed Mar 12 2025 Peter Robinson - 1:2025.04-0.6.rc4 +- Update to 2025.04 RC4 + * Wed Feb 26 2025 Peter Robinson - 1:2025.04-0.5.rc3 - Update to 2025.04 RC3 From d9937827d954f4346d9b7cd614715ea00416f9a7 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Thu, 20 Mar 2025 13:52:55 +0000 Subject: [PATCH 04/65] no source 13 --- uboot-tools.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/uboot-tools.spec b/uboot-tools.spec index de2e978..0fd1bd4 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -106,7 +106,6 @@ cp %SOURCE1 %SOURCE2 . cp %SOURCE10 . cp %SOURCE11 . cp %SOURCE12 . -cp %SOURCE13 . cp %SOURCE20 . cp %SOURCE21 . From a2fea382f502c04d47724e2b7f436a14f22d25a3 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Sun, 30 Mar 2025 11:28:07 +0100 Subject: [PATCH 05/65] Update to 2025.04 RC5 --- rockchip-Modernise-Geekbox-config.patch | 189 ------------------ rpi-fixes.patch | 156 --------------- sources | 2 +- uboot-tools.spec | 38 ++-- ...-SetVariableRT-with-volotile-storage.patch | 33 +++ 5 files changed, 54 insertions(+), 364 deletions(-) delete mode 100644 rockchip-Modernise-Geekbox-config.patch delete mode 100644 rpi-fixes.patch create mode 100644 uefi-enable-SetVariableRT-with-volotile-storage.patch diff --git a/rockchip-Modernise-Geekbox-config.patch b/rockchip-Modernise-Geekbox-config.patch deleted file mode 100644 index ee49fcf..0000000 --- a/rockchip-Modernise-Geekbox-config.patch +++ /dev/null @@ -1,189 +0,0 @@ -From 45d8808e95ddf0702ed78acde7678291ae52abdb Mon Sep 17 00:00:00 2001 -From: Peter Robinson -Date: Fri, 11 Oct 2024 17:14:26 +0100 -Subject: [PATCH] configs: rockchip: Modernise Geekbox config - -Modernise and move the Geekbox config to use SPL/TPL with -upstream TF-A, enable MMC/USB/Eth to make the device more -useful and work like other Rockchip devices. Update the -readme to reflect the changes to the build process. - -Signed-off-by: Peter Robinson ---- - arch/arm/dts/rk3368-geekbox-u-boot.dtsi | 10 ++++ - board/geekbuying/geekbox/README | 40 +++++++++++++- - configs/geekbox_defconfig | 71 ++++++++++++++++++++++++- - 3 files changed, 118 insertions(+), 3 deletions(-) - -diff --git a/arch/arm/dts/rk3368-geekbox-u-boot.dtsi b/arch/arm/dts/rk3368-geekbox-u-boot.dtsi -index cfc8b9340a8..55d007f7ab8 100644 ---- a/arch/arm/dts/rk3368-geekbox-u-boot.dtsi -+++ b/arch/arm/dts/rk3368-geekbox-u-boot.dtsi -@@ -26,6 +26,16 @@ - bootph-all; - }; - -+&dmc { -+ bootph-all; -+ -+ rockchip,memory-schedule = ; -+ rockchip,ddr-frequency = <800000000>; -+ rockchip,ddr-speed-bin = ; -+ -+ status = "okay"; -+}; -+ - &grf { - bootph-all; - }; -diff --git a/board/geekbuying/geekbox/README b/board/geekbuying/geekbox/README -index de980f2f233..bd4d8cdd084 100644 ---- a/board/geekbuying/geekbox/README -+++ b/board/geekbuying/geekbox/README -@@ -1 +1,39 @@ --see board/rockchip/sheep_rk3368/README -+Here is the step-by-step to boot to U-Boot on the Geekbox -+ -+Get the Source and build ATF -+============================ -+ -+ > git clone https://github.com/TrustedFirmware-A/trusted-firmware-a.git -+ > cd arm-trusted-firmware -+ > make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3368 bl31 -+ -+Configure U-Boot -+================ -+ -+ > cd ../u-boot -+ > export BL31=../arm-trusted-firmware/build/rk3368/release/bl31.bin -+ > make geekbox_defconfig -+ -+Build the full U-Boot/ATF firmware stack -+======================================== -+ -+ > make CROSS_COMPILE=aarch64-unknown-elf- -+ -+Flash the image -+=============== -+ -+Copy the SPL to offset 32k and the FIT image containing the payloads -+(U-Boot proper, ATF, devicetree) to offset 256k card. -+ -+eMMC -+---- -+ -+rkdeveloptool allows to flash the on-board eMMC via the USB OTG interface with -+help of the Rockchip loader binary. -+ -+ > git clone https://github.com/rockchip-linux/rkdeveloptool -+ > cd rkdeveloptool -+ > autoreconf -i && && ./configure && make -+ > git clone https://github.com/rockchip-linux/rkbin.git -+ > ./rkdeveloptool db rkbin/rk33/rk3368_loader_v2.00.256.bin -+ > ./rkdeveloptool wl 64 ../u-boot-rockchip.bin -diff --git a/configs/geekbox_defconfig b/configs/geekbox_defconfig -index 8f4be79831a..1b116fa8602 100644 ---- a/configs/geekbox_defconfig -+++ b/configs/geekbox_defconfig -@@ -3,29 +3,96 @@ CONFIG_SKIP_LOWLEVEL_INIT=y - CONFIG_COUNTER_FREQUENCY=24000000 - CONFIG_ARCH_ROCKCHIP=y - CONFIG_TEXT_BASE=0x00200000 --CONFIG_SYS_MALLOC_F_LEN=0x1000 - CONFIG_NR_DRAM_BANKS=1 - CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y - CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x300000 - CONFIG_DEFAULT_DEVICE_TREE="rk3368-geekbox" -+CONFIG_SPL_TEXT_BASE=0x00000000 - CONFIG_ROCKCHIP_RK3368=y -+CONFIG_TPL_LIBCOMMON_SUPPORT=y -+CONFIG_TPL_LIBGENERIC_SUPPORT=y -+CONFIG_SPL_DRIVERS_MISC=y -+CONFIG_SPL_STACK=0x188000 -+CONFIG_SPL_HAS_BSS_LINKER_SECTION=y -+CONFIG_SPL_BSS_START_ADDR=0x400000 -+CONFIG_SPL_BSS_MAX_SIZE=0x20000 -+CONFIG_SPL_STACK_R=y -+CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x4000 -+CONFIG_SPL=y - CONFIG_TARGET_GEEKBOX=y - CONFIG_DEBUG_UART_BASE=0xFF690000 - CONFIG_DEBUG_UART_CLOCK=24000000 - CONFIG_SYS_LOAD_ADDR=0x800800 - CONFIG_DEBUG_UART=y -+CONFIG_FIT=y -+CONFIG_FIT_VERBOSE=y -+CONFIG_SPL_LOAD_FIT=y - CONFIG_DEFAULT_FDT_FILE="rockchip/rk3368-geekbox.dtb" - # CONFIG_DISPLAY_CPUINFO is not set - CONFIG_DISPLAY_BOARDINFO_LATE=y -+CONFIG_SPL_MAX_SIZE=0x40000 -+CONFIG_SPL_PAD_TO=0x7f8000 -+CONFIG_SPL_BOOTROM_SUPPORT=y -+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set -+# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set -+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x200 -+CONFIG_SPL_ATF=y -+CONFIG_TPL=y -+CONFIG_TPL_SYS_MALLOC_SIMPLE=y -+CONFIG_TPL_DRIVERS_MISC=y -+CONFIG_CMD_GPIO=y -+CONFIG_CMD_MMC=y -+CONFIG_CMD_REGULATOR=y -+CONFIG_CMD_USB=y -+CONFIG_SPL_OF_CONTROL=y -+CONFIG_TPL_OF_CONTROL=y -+CONFIG_OF_LIVE=y -+CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names interrupt-parent" -+CONFIG_TPL_OF_PLATDATA=y -+CONFIG_ENV_IS_IN_MMC=y - CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+CONFIG_NET_RANDOM_ETHADDR=y -+CONFIG_TPL_DM=y - CONFIG_REGMAP=y -+CONFIG_SPL_REGMAP=y -+CONFIG_TPL_REGMAP=y - CONFIG_SYSCON=y --CONFIG_BOUNCE_BUFFER=y -+CONFIG_SPL_SYSCON=y -+CONFIG_TPL_SYSCON=y - CONFIG_CLK=y -+CONFIG_SPL_CLK=y -+CONFIG_TPL_CLK=y -+CONFIG_ROCKCHIP_GPIO=y -+CONFIG_SYS_I2C_ROCKCHIP=y -+CONFIG_MMC_DW=y -+CONFIG_MMC_DW_ROCKCHIP=y - CONFIG_PINCTRL=y -+CONFIG_PHY_REALTEK=y -+CONFIG_DM_ETH_PHY=y -+CONFIG_ETH_DESIGNWARE=y -+CONFIG_RGMII=y -+CONFIG_GMAC_ROCKCHIP=y -+CONFIG_PINCTRL=y -+CONFIG_SPL_PINCTRL=y -+CONFIG_DM_PMIC=y -+CONFIG_PMIC_RK8XX=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_REGULATOR_RK8XX=y - CONFIG_RAM=y -+CONFIG_SPL_RAM=y -+CONFIG_TPL_RAM=y - CONFIG_DEBUG_UART_SHIFT=2 - CONFIG_DEBUG_UART_ANNOUNCE=y - CONFIG_SYS_NS16550_MEM32=y -+CONFIG_SYSINFO=y -+CONFIG_SYSINFO_SMBIOS=y - CONFIG_SYSRESET=y -+CONFIG_USB=y -+CONFIG_USB_EHCI_HCD=y -+CONFIG_USB_EHCI_GENERIC=y -+CONFIG_USB_DWC2=y -+CONFIG_USB_GADGET=y -+CONFIG_USB_GADGET_DWC2_OTG=y -+CONFIG_SPL_TINY_MEMSET=y -+CONFIG_LZO=y - CONFIG_ERRNO_STR=y --- -2.47.0 - diff --git a/rpi-fixes.patch b/rpi-fixes.patch deleted file mode 100644 index 352261b..0000000 --- a/rpi-fixes.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 27e0160320c13168ab5d703c5ec4bec87a6d2700 Mon Sep 17 00:00:00 2001 -From: Peter Robinson -Date: Sun, 29 Dec 2024 14:46:05 +0000 -Subject: [PATCH 1/4] rpi: Add identifiers for the new RPi 5 series - -The Raspberry Pi foundation have released the Raspberry -Pi 500, CM5 an CM5 lite devices so add the assoicated -revision identifers so we can detect them. - -Signed-off-by: Peter Robinson -Acked-by: Matthias Brugger ---- - board/raspberrypi/rpi/rpi.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c -index aa39afa338a..4d546892842 100644 ---- a/board/raspberrypi/rpi/rpi.c -+++ b/board/raspberrypi/rpi/rpi.c -@@ -193,6 +193,21 @@ static const struct rpi_model rpi_models_new_scheme[] = { - DTB_DIR "bcm2712-rpi-5-b.dtb", - true, - }, -+ [0x18] = { -+ "Compute Module 5", -+ DTB_DIR "bcm2712-rpi-cm5-cm5io.dtb", -+ true, -+ }, -+ [0x19] = { -+ "500", -+ DTB_DIR "bcm2712-rpi-500.dtb", -+ true, -+ }, -+ [0x1A] = { -+ "Compute Module 5 Lite", -+ DTB_DIR "bcm2712-rpi-cm5l-cm5io.dtb", -+ true, -+ }, - }; - - static const struct rpi_model rpi_models_old_scheme[] = { --- -2.48.1 - -From 2d75c46be99c15fa186436c149b87ee97e0b8f44 Mon Sep 17 00:00:00 2001 -From: Martin Stolpe -Date: Wed, 23 Oct 2024 15:09:20 +0200 -Subject: [PATCH 2/4] rpi: Only add frame buffer node if CONFIG_FDT_SIMPLEFB is - set - -The functions fdt_simplefb_add_node and fdt_simplefb_enable_and_mem_rsv -are only available if CONFIG_FDT_SIMPLEFB is enabled. - -Signed-off-by: Martin Stolpe -Acked-by: Matthias Brugger -Signed-off-by: Peter Robinson ---- - board/raspberrypi/rpi/rpi.c | 12 +++++++----- - 1 file changed, 7 insertions(+), 5 deletions(-) - -diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c -index 4d546892842..fe6153b388b 100644 ---- a/board/raspberrypi/rpi/rpi.c -+++ b/board/raspberrypi/rpi/rpi.c -@@ -604,11 +604,13 @@ int ft_board_setup(void *blob, struct bd_info *bd) - - update_fdt_from_fw(blob, (void *)fw_dtb_pointer); - -- node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); -- if (node < 0) -- fdt_simplefb_add_node(blob); -- else -- fdt_simplefb_enable_and_mem_rsv(blob); -+ if (CONFIG_IS_ENABLED(FDT_SIMPLEFB)) { -+ node = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); -+ if (node < 0) -+ fdt_simplefb_add_node(blob); -+ else -+ fdt_simplefb_enable_and_mem_rsv(blob); -+ } - - #ifdef CONFIG_EFI_LOADER - /* Reserve the spin table */ --- -2.48.1 - -From fc7a3110184a3ca4c227675b20d3a4887210e36c Mon Sep 17 00:00:00 2001 -From: Fiona Klute -Date: Wed, 12 Feb 2025 12:39:01 +0100 -Subject: [PATCH 3/4] Raspberry Pi: Keep warnings from firmware in DT, if any - -The /chosen/user-warnings property is created by the RPi firmware if -there are warnings to report, keep it to make debugging easier. - -For example, if the firmware config.txt contains -"dtoverlay=error-example" and that example references an undefined -symbol "&nosuchdev" the warning can be read after boot: - -$ cat /proc/device-tree/chosen/user-warnings -dterror: can't find symbol 'nosuchdev' -Failed to resolve overlay 'error-example' - -Signed-off-by: Fiona Klute -Reviewed-by: Matthias Brugger -Signed-off-by: Peter Robinson ---- - board/raspberrypi/rpi/rpi.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c -index fe6153b388b..43efb0dbc1d 100644 ---- a/board/raspberrypi/rpi/rpi.c -+++ b/board/raspberrypi/rpi/rpi.c -@@ -594,6 +594,9 @@ void update_fdt_from_fw(void *fdt, void *fw_fdt) - /* kernel address randomisation seed as provided by the firmware */ - copy_property(fdt, fw_fdt, "/chosen", "kaslr-seed"); - -+ /* warnings from the firmware (if any) */ -+ copy_property(fdt, fw_fdt, "/chosen", "user-warnings"); -+ - /* address of the PHY device as provided by the firmware */ - copy_property(fdt, fw_fdt, "ethernet0/mdio@e14/ethernet-phy@1", "reg"); - } --- -2.48.1 - -From e042d7593a0b7544259fd2d22240e78d18912746 Mon Sep 17 00:00:00 2001 -From: Fiona Klute -Date: Wed, 12 Feb 2025 12:39:02 +0100 -Subject: [PATCH 4/4] Raspberry Pi: Copy Bluetooth device address in DT - -The firmware sets local-bd-address, copy it when loading a new DT. - -Signed-off-by: Fiona Klute -Signed-off-by: Peter Robinson ---- - board/raspberrypi/rpi/rpi.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c -index 43efb0dbc1d..70d3c35499b 100644 ---- a/board/raspberrypi/rpi/rpi.c -+++ b/board/raspberrypi/rpi/rpi.c -@@ -599,6 +599,9 @@ void update_fdt_from_fw(void *fdt, void *fw_fdt) - - /* address of the PHY device as provided by the firmware */ - copy_property(fdt, fw_fdt, "ethernet0/mdio@e14/ethernet-phy@1", "reg"); -+ -+ /* Bluetooth device address as provided by the firmware */ -+ copy_property(fdt, fw_fdt, "/soc/serial@7e201000/bluetooth", "local-bd-address"); - } - - int ft_board_setup(void *blob, struct bd_info *bd) --- -2.48.1 - diff --git a/sources b/sources index 25593f8..5b48481 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (u-boot-2025.04-rc4.tar.bz2) = aaf75661178b597b530628396f291fc9cd562f714c83b87f9bd6d00f26d5bbcc336523bc5446c5f9acce715a67b6508f63a7767408e01a875efea9b460c8ca38 +SHA512 (u-boot-2025.04-rc5.tar.bz2) = bed5e3282f23ba235a2652903a41c178767b48ca49a57b8a4d0f6d911f7a2f24f4b15c11366a6b888d93ebb6bfa35c8af8465c6d24fdc7699423ee7e2ffa2c50 diff --git a/uboot-tools.spec b/uboot-tools.spec index 6e78d72..4eac11e 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -1,4 +1,4 @@ -%global candidate rc4 +%global candidate rc5 %if 0%{?rhel} %bcond_with toolsonly %else @@ -10,7 +10,7 @@ Name: uboot-tools Version: 2025.04 -Release: 0.6%{?candidate:.%{candidate}}%{?dist} +Release: 0.7%{?candidate:.%{candidate}}%{?dist} Epoch: 1 Summary: U-Boot utilities # Automatically converted from old format: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ - review is highly recommended. @@ -21,28 +21,27 @@ Source0: https://ftp.denx.de/pub/u-boot/u-boot-%{version}%{?candidate:-%{candid Source1: aarch64-boards Source2: riscv64-boards -# This is now legacy, most devices use bootflow, we keep this for the laggards -Patch1: uefi-distro-load-FDT-from-any-partition-on-boot-device.patch -# Identify VFAT partitions as ESP, allows EFI setvar on our images -Patch2: uefi-Add-all-options-for-EFI-System-Partitions.patch -# New function to find fdt for loading from disk -Patch3: uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch # Fedora patches to enable/disable features -Patch4: disable-VBE-by-default.patch -Patch5: enable-bootmenu-by-default.patch +Patch1: disable-VBE-by-default.patch +Patch2: enable-bootmenu-by-default.patch +# This is now legacy, most devices use bootflow, we keep this for the laggards +Patch3: uefi-distro-load-FDT-from-any-partition-on-boot-device.patch +# Identify VFAT partitions as ESP, allows EFI setvar on our images +Patch4: uefi-Add-all-options-for-EFI-System-Partitions.patch +# New function to find fdt for loading from disk +Patch6: uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch +# Enable UEFI SetVariable for devices without backed storage +Patch7: uefi-enable-SetVariableRT-with-volotile-storage.patch # Should be upstream but it's taking time -Patch6: Add-video-damage-tracking.patch +Patch8: Add-video-damage-tracking.patch # For HTTP boot installs -Patch7: Add-pmem-node-for-preserving-distro-ISO-s.patch -# USB-PD improvements -Patch8: USB-PD-TCPM-improvements.patch +Patch9: Add-pmem-node-for-preserving-distro-ISO-s.patch # Device improvments -# RPi -Patch10: rpi-fixes.patch # Rockchips improvements -Patch11: rockchip-Enable-preboot-start-for-pci-usb.patch -#Patch12: rockchip-Modernise-Geekbox-config.patch +Patch10: rockchip-Enable-preboot-start-for-pci-usb.patch +# USB-PD improvements +Patch11: USB-PD-TCPM-improvements.patch BuildRequires: bc BuildRequires: bison @@ -269,6 +268,9 @@ install -p -m 0755 builds/tools/env/fw_printenv %{buildroot}%{_bindir} %endif %changelog +* Tue Mar 25 2025 Peter Robinson - 1:2025.04-0.7.rc5 +- Update to 2025.04 RC5 + * Wed Mar 12 2025 Peter Robinson - 1:2025.04-0.6.rc4 - Update to 2025.04 RC4 diff --git a/uefi-enable-SetVariableRT-with-volotile-storage.patch b/uefi-enable-SetVariableRT-with-volotile-storage.patch new file mode 100644 index 0000000..ee9bcf4 --- /dev/null +++ b/uefi-enable-SetVariableRT-with-volotile-storage.patch @@ -0,0 +1,33 @@ +From fd736dd720b29fa69a4bb87492f3f94dc6076996 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Tue, 25 Mar 2025 17:13:44 +0000 +Subject: [PATCH] efi: enable SetVariableRT with volotile storage + +Signed-off-by: Peter Robinson +--- + lib/efi_loader/Kconfig | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig +index d4f6b56afaa..3e522131b01 100644 +--- a/lib/efi_loader/Kconfig ++++ b/lib/efi_loader/Kconfig +@@ -108,6 +108,7 @@ choice + config EFI_VARIABLE_FILE_STORE + bool "Store non-volatile UEFI variables as file" + depends on FAT_WRITE ++ default y + help + Select this option if you want non-volatile UEFI variables to be + stored as file /ubootefi.var on the EFI system partition. +@@ -115,6 +116,7 @@ config EFI_VARIABLE_FILE_STORE + config EFI_RT_VOLATILE_STORE + bool "Allow variable runtime services in volatile storage (e.g RAM)" + depends on EFI_VARIABLE_FILE_STORE ++ default y + help + When EFI variables are stored on file we don't allow SetVariableRT, + since the OS doesn't know how to write that file. At the same time +-- +2.49.0 + From fb4c39b1e607e5fd0941525af3d2a236a713bb20 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Tue, 8 Apr 2025 14:18:38 +0100 Subject: [PATCH 06/65] 2025.04 GA --- sources | 2 +- uboot-tools.spec | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/sources b/sources index 5b48481..732b969 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (u-boot-2025.04-rc5.tar.bz2) = bed5e3282f23ba235a2652903a41c178767b48ca49a57b8a4d0f6d911f7a2f24f4b15c11366a6b888d93ebb6bfa35c8af8465c6d24fdc7699423ee7e2ffa2c50 +SHA512 (u-boot-2025.04.tar.bz2) = f2ce2d34880e347165656060ac2956050112ed4cd14cbca2ca736d2ad26f660bb09a17fe79b988f2702f0f65cf43d5263f9ff4d41338e3865962b7f9f01a0f0d diff --git a/uboot-tools.spec b/uboot-tools.spec index 4eac11e..2ee6a64 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -1,4 +1,4 @@ -%global candidate rc5 +#global candidate rc0 %if 0%{?rhel} %bcond_with toolsonly %else @@ -10,7 +10,7 @@ Name: uboot-tools Version: 2025.04 -Release: 0.7%{?candidate:.%{candidate}}%{?dist} +Release: 1%{?candidate:.%{candidate}}%{?dist} Epoch: 1 Summary: U-Boot utilities # Automatically converted from old format: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ - review is highly recommended. @@ -268,6 +268,9 @@ install -p -m 0755 builds/tools/env/fw_printenv %{buildroot}%{_bindir} %endif %changelog +* Tue Apr 08 2025 Peter Robinson - 1:2025.04-1 +- Update to 2025.04 GA + * Tue Mar 25 2025 Peter Robinson - 1:2025.04-0.7.rc5 - Update to 2025.04 RC5 From 510d8fcf30c8944aa8ab1b03a981116e0c4ddadd Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Sun, 20 Apr 2025 21:00:17 +0100 Subject: [PATCH 07/65] Fix for RPi5 serial console --- ...when-loading-kernel-with-non-boot-DT.patch | 161 ++++++++++++++++++ uboot-tools.spec | 9 +- 2 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 rpi-uart-clock-when-loading-kernel-with-non-boot-DT.patch diff --git a/rpi-uart-clock-when-loading-kernel-with-non-boot-DT.patch b/rpi-uart-clock-when-loading-kernel-with-non-boot-DT.patch new file mode 100644 index 0000000..ade9652 --- /dev/null +++ b/rpi-uart-clock-when-loading-kernel-with-non-boot-DT.patch @@ -0,0 +1,161 @@ +From patchwork Tue Apr 15 08:30:14 2025 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Bruno Leite +X-Patchwork-Id: 2072903 +X-Patchwork-Delegate: pbrobinson@gmail.com +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + dkim=pass (2048-bit key; + unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 + header.s=20230601 header.b=NLOXFHyi; + dkim-atps=neutral +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=85.214.62.61; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (secp384r1)) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZcPCY0L1rz1yHt + for ; Tue, 15 Apr 2025 22:50:49 +1000 (AEST) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id 308EB82AFB; + Tue, 15 Apr 2025 14:50:29 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=gmail.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Authentication-Results: phobos.denx.de; + dkim=pass (2048-bit key; + unprotected) header.d=gmail.com header.i=@gmail.com header.b="NLOXFHyi"; + dkim-atps=neutral +Received: by phobos.denx.de (Postfix, from userid 109) + id 349F98056A; Tue, 15 Apr 2025 10:30:28 +0200 (CEST) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, + DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, + RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham + autolearn_force=no version=3.4.2 +Received: from mail-lj1-x22b.google.com (mail-lj1-x22b.google.com + [IPv6:2a00:1450:4864:20::22b]) + (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id 3962A82047 + for ; Tue, 15 Apr 2025 10:30:26 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=gmail.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=brunosampaioleite@gmail.com +Received: by mail-lj1-x22b.google.com with SMTP id + 38308e7fff4ca-30bfc8faef9so49423241fa.1 + for ; Tue, 15 Apr 2025 01:30:26 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20230601; t=1744705825; x=1745310625; darn=lists.denx.de; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:from:to:cc:subject:date + :message-id:reply-to; + bh=G/bK1K44Dr1qFbZickUlvWkto/6r+BtRySFxyVDIYKY=; + b=NLOXFHyi7dXqHhrg8fkx5lISJ9rd6xXpixrCEDfKShdvqjvn2vMkVHivrB/UmT5q/m + Rcn0ad8zpPX+B1FfTwwkq4froYJpiBB3hfDhWs7VhphrtvcoOdo1odSLFDY+94ycwMrH + SByxwk76lvnn/WPl/K20jk3AacL4eitsWe6coH11QAw1Ff7ub3lukIMOHwph9KvyBBCO + rDC59cJIVrN7JGycd5bVjEbPQL20S8ElhQFxzpA/Oay5mRcuWOz9kPtXDepqVY3OTeRD + xVYZBQmbfdH+ddX0djm3HK4NeFgarV9FrclE37evniLeATkMGoB6vWwtfQHQzGnZi9XM + 1yZQ== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20230601; t=1744705825; x=1745310625; + h=content-transfer-encoding:mime-version:references:in-reply-to + :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc + :subject:date:message-id:reply-to; + bh=G/bK1K44Dr1qFbZickUlvWkto/6r+BtRySFxyVDIYKY=; + b=aJrgDOltnMKa4/yUhPGvvzqv8fUsRjhtiQXqF20Ymo2bHr0kbVeb5jFe/TzFShZYoD + bmirjua4chjbqAuDu0hPub/QpZdCyKrlFKWI/+yp82mTlCakauWD+2ouH+uTR3LgV9/T + p2etUHhRr/1cdNUumKjbHK5ePRPZ1fj4kTq3Tr7PFfE2F1HctVcGt+5Eg0eGdDxB/CNY + fzT82UD+QbEtpyLp3b1DL5m2kvMNPjVtsUMnaldTfwrA3UicBAXnx5/aNwK8mi3ZbF1p + zd+QdEDjuLtdboBfffvanhpOnx7DFBWHxiQYy3nIx9kGV9apFJZZw6g2w46mIHxJ9qpK + vs4A== +X-Gm-Message-State: AOJu0YwFtor9kanZ4bPXgxW0Caq1SXAjjr1eoMtteqd6a/rCRGtBSoCz + 2nTZsmUy7rN+RuLT0b0YkYdB4Nap8ZheIEJjBpYYy86I0HBvDOCEorH+8zHIOu0Q2A== +X-Gm-Gg: ASbGncuvhE42LjbCtWsarbjkyrOyVA/mrkKOUPBAgzW/qnUKh7MwX9QNl5kSLSTzn2x + NVqmx7hNTBoFrwXVi4qN6/9oQbYDvg5w3q4qaRjK1FSsBvwHor7Qrqso4bleSYBBbp89rvTNKGN + cQxKrjEuhwK1IGGp5Si31mh/uHdkNoNlXvJGgUhNC5jjedj0tGwWLzKuau775LircGiFhFkXlmg + vvKDSS9iaFj9jLuUnbu7i3HGC98ZSaO1UWogeOvncthddQXzEPMwtiiR4+HzAFh27h9pihboSgQ + bf41IZ0AmlDUKSrxJRPRtfUlOJ1TRA5TMFL2vAPYxty+pgqFrriC8oOsemfm5DvdxQNjoM2NG7/ + ZxkxfMxEZ +X-Google-Smtp-Source: + AGHT+IHMd8cQWJx/NJpA+NT/8JfqwmGZg8ekGgpeyeFGMd3DfCJ5kuQYxSAip7G9Y3zA2jvJMPH6xw== +X-Received: by 2002:a2e:b8c4:0:b0:309:1fee:378d with SMTP id + 38308e7fff4ca-31049a1cf35mr46597761fa.19.1744705825108; + Tue, 15 Apr 2025 01:30:25 -0700 (PDT) +Received: from brule-Precision-3590.prevas.se ([81.216.59.226]) + by smtp.gmail.com with ESMTPSA id + 38308e7fff4ca-30f464cc0a2sm19679971fa.31.2025.04.15.01.30.23 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Tue, 15 Apr 2025 01:30:24 -0700 (PDT) +From: Bruno Leite +To: u-boot@lists.denx.de +Cc: pbrobinson@gmail.com, Matthias Brugger , + clast@prevas.dk, ravi@prevas.dk, Bruno Leite , + Fiona Klute , Francois Berder , + Ilias Apalodimas , + Martin Stolpe , + Patrice Chotard , + Rasmus Villemoes , + Simon Glass , Tom Rini +Subject: [PATCH 1/1] rpi: copy over uart clock-frequency in DT +Date: Tue, 15 Apr 2025 10:30:14 +0200 +Message-ID: <20250415083017.3523317-2-brunosampaioleite@gmail.com> +X-Mailer: git-send-email 2.45.2 +In-Reply-To: <20250415083017.3523317-1-brunosampaioleite@gmail.com> +References: <20250415083017.3523317-1-brunosampaioleite@gmail.com> +MIME-Version: 1.0 +X-Mailman-Approved-At: Tue, 15 Apr 2025 14:50:26 +0200 +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +From: Bruno Leite + +rpi5 firmware sets uart_clk clock-frequency in +the firmware and patches it to the DT, copy it +over when loading a new DT. + +Signed-off-by: Bruno Leite +Reviewed-by: Peter Robinson +Tested-by: Peter Robinson +--- + + board/raspberrypi/rpi/rpi.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index 70d3c35499b..5c84c324c71 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -602,6 +602,9 @@ void update_fdt_from_fw(void *fdt, void *fw_fdt) + + /* Bluetooth device address as provided by the firmware */ + copy_property(fdt, fw_fdt, "/soc/serial@7e201000/bluetooth", "local-bd-address"); ++ ++ /* copy uart clk as provided by the firmware */ ++ copy_property(fdt, fw_fdt, "/clocks/clk-uart", "clock-frequency"); + } + + int ft_board_setup(void *blob, struct bd_info *bd) diff --git a/uboot-tools.spec b/uboot-tools.spec index 2ee6a64..a41fa66 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -10,7 +10,7 @@ Name: uboot-tools Version: 2025.04 -Release: 1%{?candidate:.%{candidate}}%{?dist} +Release: 2%{?candidate:.%{candidate}}%{?dist} Epoch: 1 Summary: U-Boot utilities # Automatically converted from old format: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ - review is highly recommended. @@ -41,7 +41,9 @@ Patch9: Add-pmem-node-for-preserving-distro-ISO-s.patch # Rockchips improvements Patch10: rockchip-Enable-preboot-start-for-pci-usb.patch # USB-PD improvements -Patch11: USB-PD-TCPM-improvements.patch +Patch11: USB-PD-TCPM-improvements.patch +# RPi fixes +Patch12: rpi-uart-clock-when-loading-kernel-with-non-boot-DT.patch BuildRequires: bc BuildRequires: bison @@ -268,6 +270,9 @@ install -p -m 0755 builds/tools/env/fw_printenv %{buildroot}%{_bindir} %endif %changelog +* Sun Apr 20 2025 Peter Robinson - 1:2025.04-2 +- Fix for RPi5 serial console + * Tue Apr 08 2025 Peter Robinson - 1:2025.04-1 - Update to 2025.04 GA From 34f4eaaa3a2172304f48c5e8bbea8fb60b2ed4a3 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Sun, 20 Apr 2025 22:22:36 +0100 Subject: [PATCH 08/65] Copr 2025.04 GA --- sources | 2 +- uboot-tools.spec | 35 +++++++++++++++++------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/sources b/sources index 25593f8..732b969 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (u-boot-2025.04-rc4.tar.bz2) = aaf75661178b597b530628396f291fc9cd562f714c83b87f9bd6d00f26d5bbcc336523bc5446c5f9acce715a67b6508f63a7767408e01a875efea9b460c8ca38 +SHA512 (u-boot-2025.04.tar.bz2) = f2ce2d34880e347165656060ac2956050112ed4cd14cbca2ca736d2ad26f660bb09a17fe79b988f2702f0f65cf43d5263f9ff4d41338e3865962b7f9f01a0f0d diff --git a/uboot-tools.spec b/uboot-tools.spec index 0fd1bd4..f7e80cb 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -1,4 +1,4 @@ -%global candidate rc4 +#global candidate rc0 %if 0%{?rhel} %bcond_with toolsonly %else @@ -12,7 +12,7 @@ Name: uboot-tools Version: 2025.04 -Release: 0.6%{?candidate:.%{candidate}}%{?dist} +Release: 1%{?candidate:.%{candidate}}%{?dist} Epoch: 1 Summary: U-Boot utilities # Automatically converted from old format: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ - review is highly recommended. @@ -31,28 +31,27 @@ Source20: rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.18.bin Source21: rk3568_ddr_1056MHz_v1.23.bin Source22: rk3566_ddr_1056MHz_v1.23.bin -# This is now legacy, most devices use bootflow, we keep this for the laggards -Patch1: uefi-distro-load-FDT-from-any-partition-on-boot-device.patch -# Identify VFAT partitions as ESP, allows EFI setvar on our images -Patch2: uefi-Add-all-options-for-EFI-System-Partitions.patch -# New function to find fdt for loading from disk -Patch3: uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch # Fedora patches to enable/disable features -Patch4: disable-VBE-by-default.patch -Patch5: enable-bootmenu-by-default.patch +Patch1: disable-VBE-by-default.patch +Patch2: enable-bootmenu-by-default.patch +# This is now legacy, most devices use bootflow, we keep this for the laggards +Patch3: uefi-distro-load-FDT-from-any-partition-on-boot-device.patch +# Identify VFAT partitions as ESP, allows EFI setvar on our images +Patch4: uefi-Add-all-options-for-EFI-System-Partitions.patch +# New function to find fdt for loading from disk +Patch6: uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch +# Enable UEFI SetVariable for devices without backed storage +Patch7: uefi-enable-SetVariableRT-with-volotile-storage.patch # Should be upstream but it's taking time -Patch6: Add-video-damage-tracking.patch +Patch8: Add-video-damage-tracking.patch # For HTTP boot installs -Patch7: Add-pmem-node-for-preserving-distro-ISO-s.patch -# USB-PD improvements -Patch8: USB-PD-TCPM-improvements.patch +Patch9: Add-pmem-node-for-preserving-distro-ISO-s.patch # Device improvments -# RPi -Patch10: rpi-fixes.patch # Rockchips improvements -Patch11: rockchip-Enable-preboot-start-for-pci-usb.patch -#Patch12: rockchip-Modernise-Geekbox-config.patch +Patch10: rockchip-Enable-preboot-start-for-pci-usb.patch +# USB-PD improvements +Patch11: USB-PD-TCPM-improvements.patch ExclusiveArch: aarch64 BuildRequires: bc From d0a36bf9ac20628c2c13016ebc8612c0c7d854ea Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Mon, 16 Jun 2025 11:43:10 +0100 Subject: [PATCH 09/65] 2025.07 RC4 --- ...mem-node-for-preserving-distro-ISO-s.patch | 1288 ----------------- disable-VBE-by-default.patch | 16 +- sources | 2 +- uboot-tools.spec | 21 +- ..._location-for-finding-the-DT-on-disk.patch | 38 +- 5 files changed, 43 insertions(+), 1322 deletions(-) delete mode 100644 Add-pmem-node-for-preserving-distro-ISO-s.patch diff --git a/Add-pmem-node-for-preserving-distro-ISO-s.patch b/Add-pmem-node-for-preserving-distro-ISO-s.patch deleted file mode 100644 index bc8620b..0000000 --- a/Add-pmem-node-for-preserving-distro-ISO-s.patch +++ /dev/null @@ -1,1288 +0,0 @@ -From patchwork Fri Feb 28 08:45:24 2025 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Sughosh Ganu -X-Patchwork-Id: 2053441 -X-Patchwork-Delegate: xypron.glpk@gmx.de -Return-Path: -X-Original-To: incoming@patchwork.ozlabs.org -Delivered-To: patchwork-incoming@legolas.ozlabs.org -Authentication-Results: legolas.ozlabs.org; - spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de - (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; - envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) -Received: from phobos.denx.de (phobos.denx.de - [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) - (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) - key-exchange X25519 server-signature ECDSA (secp384r1)) - (No client certificate requested) - by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z41yQ5Fkdz1yKH - for ; Fri, 28 Feb 2025 19:46:06 +1100 (AEDT) -Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) - by phobos.denx.de (Postfix) with ESMTP id 2504E81100; - Fri, 28 Feb 2025 09:46:02 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de -Received: by phobos.denx.de (Postfix, from userid 109) - id B0BC2807D7; Fri, 28 Feb 2025 09:46:00 +0100 (CET) -X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de -X-Spam-Level: -X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00, - RCVD_IN_DNSWL_BLOCKED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, - RCVD_IN_VALIDITY_RPBL_BLOCKED,SPF_HELO_NONE,SPF_SOFTFAIL autolearn=no - autolearn_force=no version=3.4.2 -Received: from foss.arm.com (foss.arm.com [217.140.110.172]) - by phobos.denx.de (Postfix) with ESMTP id E55D680BA4 - for ; Fri, 28 Feb 2025 09:45:57 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=fail smtp.mailfrom=sughosh.ganu@linaro.org -Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) - by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 99830150C; - Fri, 28 Feb 2025 00:46:12 -0800 (PST) -Received: from a079122.blr.arm.com (a079122.arm.com [10.162.17.48]) - by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2C1F13F673; - Fri, 28 Feb 2025 00:45:53 -0800 (PST) -From: Sughosh Ganu -To: u-boot@lists.denx.de -Cc: Ilias Apalodimas , - Simon Glass , Tom Rini , - Heinrich Schuchardt , - Anton Antonov , - Tobias Waldekranz , Bin Meng , - Masahisa Kojima , - Sughosh Ganu -Subject: [PATCH v6 1/6] fdt: add support for adding pmem nodes -Date: Fri, 28 Feb 2025 14:15:24 +0530 -Message-Id: <20250228084529.127823-2-sughosh.ganu@linaro.org> -X-Mailer: git-send-email 2.34.1 -In-Reply-To: <20250228084529.127823-1-sughosh.ganu@linaro.org> -References: <20250228084529.127823-1-sughosh.ganu@linaro.org> -MIME-Version: 1.0 -X-BeenThere: u-boot@lists.denx.de -X-Mailman-Version: 2.1.39 -Precedence: list -List-Id: U-Boot discussion -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Errors-To: u-boot-bounces@lists.denx.de -Sender: "U-Boot" -X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de -X-Virus-Status: Clean - -From: Masahisa Kojima - -One of the problems OS installers face, when running in EFI, is that -the mounted ISO after calling ExitBootServices goes away. For some -distros this is a problem since they rely on finding some core packages -before continuing the installation. Distros have works around this -- -e.g Fedora has a special kernel command line parameter called -inst.stage2 [0]. - -ACPI has NFIT and NVDIMM support to provide ramdisks to the OS, but we -don't have anything in place for DTs. Linux and device trees have support -for persistent memory devices. So add a function that can inject a pmem -node in a DT, so we can use it when launhing OS installers with EFI. - -[0] -https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/installation_guide/chap-anaconda-boot-options#sect-boot-options-installer - -Signed-off-by: Masahisa Kojima -Signed-off-by: Sughosh Ganu ---- -Changes since V5: None - - boot/fdt_support.c | 41 ++++++++++++++++++++++++++++++++++++++++- - include/fdt_support.h | 14 ++++++++++++++ - 2 files changed, 54 insertions(+), 1 deletion(-) - -diff --git a/boot/fdt_support.c b/boot/fdt_support.c -index 49efeec3681..e20b9759138 100644 ---- a/boot/fdt_support.c -+++ b/boot/fdt_support.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -464,7 +465,6 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat, - do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create); - } - --#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY - /* - * fdt_pack_reg - pack address and size array into the "reg"-suitable stream - */ -@@ -493,6 +493,7 @@ static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size, - return p - (char *)buf; - } - -+#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY - #if CONFIG_NR_DRAM_BANKS > 4 - #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS - #else -@@ -2222,3 +2223,41 @@ int fdt_valid(struct fdt_header **blobp) - } - return 1; - } -+ -+int fdt_fixup_pmem_region(void *blob, ulong addr, u32 size) -+{ -+ u64 pmem_start[2] = { 0 }; -+ u64 pmem_size[2] = { 0 }; -+ char pmem_node[32] = {0}; -+ int nodeoffset, len; -+ int err; -+ u8 tmp[4 * 16]; /* Up to 64-bit address + 64-bit size */ -+ -+ if (!IS_ALIGNED(addr, SZ_2M) || !IS_ALIGNED(addr + size, SZ_2M)) { -+ printf("Start and end address must be 2MiB aligned\n"); -+ return -1; -+ } -+ -+ snprintf(pmem_node, sizeof(pmem_node), "pmem@%lx", addr); -+ nodeoffset = fdt_find_or_add_subnode(blob, 0, pmem_node); -+ if (nodeoffset < 0) -+ return nodeoffset; -+ -+ err = fdt_setprop_string(blob, nodeoffset, "compatible", "pmem-region"); -+ if (err) -+ return err; -+ err = fdt_setprop_empty(blob, nodeoffset, "volatile"); -+ if (err) -+ return err; -+ pmem_start[0] = addr; -+ pmem_size[0] = size; -+ len = fdt_pack_reg(blob, tmp, pmem_start, pmem_size, 1); -+ err = fdt_setprop(blob, nodeoffset, "reg", tmp, len); -+ if (err < 0) { -+ printf("WARNING: could not set pmem %s %s.\n", "reg", -+ fdt_strerror(err)); -+ return err; -+ } -+ -+ return 0; -+} -diff --git a/include/fdt_support.h b/include/fdt_support.h -index f0ad2e6b365..b72cd2920de 100644 ---- a/include/fdt_support.h -+++ b/include/fdt_support.h -@@ -507,4 +507,18 @@ void fdt_fixup_pstore(void *blob); - */ - int fdt_kaslrseed(void *blob, bool overwrite); - -+/** -+ * fdt_fixup_pmem_region() - add a pmem node on the device tree -+ * -+ * This functions adds/updates a pmem node to the device tree. -+ * Usually used with EFI installers to preserve installer -+ * images -+ * -+ * @blob: device tree provided by caller -+ * @addr: start address of the pmem node -+ * @size: size of the memory of the pmem node -+ * Return: 0 on success or < 0 on failure -+ */ -+int fdt_fixup_pmem_region(void *blob, ulong addr, u32 size); -+ - #endif /* ifndef __FDT_SUPPORT_H */ - -From patchwork Fri Feb 28 08:45:25 2025 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Sughosh Ganu -X-Patchwork-Id: 2053442 -X-Patchwork-Delegate: xypron.glpk@gmx.de -Return-Path: -X-Original-To: incoming@patchwork.ozlabs.org -Delivered-To: patchwork-incoming@legolas.ozlabs.org -Authentication-Results: legolas.ozlabs.org; - spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de - (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; - envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) -Received: from phobos.denx.de (phobos.denx.de - [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) - (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) - key-exchange X25519 server-signature ECDSA (secp384r1)) - (No client certificate requested) - by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z41yc0t0Hz1yKH - for ; Fri, 28 Feb 2025 19:46:16 +1100 (AEDT) -Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) - by phobos.denx.de (Postfix) with ESMTP id 70EA880BA4; - Fri, 28 Feb 2025 09:46:06 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de -Received: by phobos.denx.de (Postfix, from userid 109) - id 7E3C9810ED; Fri, 28 Feb 2025 09:46:05 +0100 (CET) -X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de -X-Spam-Level: -X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00, - RCVD_IN_DNSWL_BLOCKED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, - RCVD_IN_VALIDITY_RPBL_BLOCKED,SPF_HELO_NONE,SPF_SOFTFAIL autolearn=no - autolearn_force=no version=3.4.2 -Received: from foss.arm.com (foss.arm.com [217.140.110.172]) - by phobos.denx.de (Postfix) with ESMTP id A11D3810EB - for ; Fri, 28 Feb 2025 09:46:01 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=fail smtp.mailfrom=sughosh.ganu@linaro.org -Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) - by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 58EBF113E; - Fri, 28 Feb 2025 00:46:16 -0800 (PST) -Received: from a079122.blr.arm.com (a079122.arm.com [10.162.17.48]) - by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E0A503F673; - Fri, 28 Feb 2025 00:45:57 -0800 (PST) -From: Sughosh Ganu -To: u-boot@lists.denx.de -Cc: Ilias Apalodimas , - Simon Glass , Tom Rini , - Heinrich Schuchardt , - Anton Antonov , - Tobias Waldekranz , Bin Meng , - Sughosh Ganu , - Heinrich Schuchardt -Subject: [PATCH v6 2/6] efi_loader: add a function to remove memory from the - EFI map -Date: Fri, 28 Feb 2025 14:15:25 +0530 -Message-Id: <20250228084529.127823-3-sughosh.ganu@linaro.org> -X-Mailer: git-send-email 2.34.1 -In-Reply-To: <20250228084529.127823-1-sughosh.ganu@linaro.org> -References: <20250228084529.127823-1-sughosh.ganu@linaro.org> -MIME-Version: 1.0 -X-BeenThere: u-boot@lists.denx.de -X-Mailman-Version: 2.1.39 -Precedence: list -List-Id: U-Boot discussion -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Errors-To: u-boot-bounces@lists.denx.de -Sender: "U-Boot" -X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de -X-Virus-Status: Clean - -From: Ilias Apalodimas - -With upcoming changes supporting pmem nodes, we need to remove the -pmem area from the EFI memory map. Add a function to do that. - -Signed-off-by: Ilias Apalodimas -Signed-off-by: Sughosh Ganu -Reviewed-by: Heinrich Schuchardt ---- -Changes since V5: None - - include/efi_loader.h | 18 ++++++++++++ - lib/efi_loader/efi_memory.c | 56 ++++++++++++++++++++++++++----------- - 2 files changed, 58 insertions(+), 16 deletions(-) - -diff --git a/include/efi_loader.h b/include/efi_loader.h -index 1d75d97ebbc..0ac00911598 100644 ---- a/include/efi_loader.h -+++ b/include/efi_loader.h -@@ -852,6 +852,24 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size, - /* Adds a range into the EFI memory map */ - efi_status_t efi_add_memory_map(u64 start, u64 size, int memory_type); - -+/** -+ * efi_update_memory_map() - update the memory map by adding/removing pages -+ * -+ * @start: start address, must be a multiple of -+ * EFI_PAGE_SIZE -+ * @pages: number of pages to add -+ * @memory_type: type of memory added -+ * @overlap_conventional: region may only overlap free(conventional) -+ * memory -+ * @remove: remove memory map -+ * Return: status code -+ */ -+efi_status_t efi_update_memory_map(u64 start, u64 pages, int memory_type, -+ bool overlap_conventional, bool remove); -+ -+/* Remove memory from the EFI memory map */ -+efi_status_t efi_remove_memory_map(u64 start, u64 size, int memory_type); -+ - /* Called by board init to initialize the EFI drivers */ - efi_status_t efi_driver_init(void); - /* Called when a block device is added */ -diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c -index 6d00b186250..3fec40b6de5 100644 ---- a/lib/efi_loader/efi_memory.c -+++ b/lib/efi_loader/efi_memory.c -@@ -258,7 +258,7 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map, - } - - /** -- * efi_add_memory_map_pg() - add pages to the memory map -+ * efi_update_memory_map() - update the memory map by adding/removing pages - * - * @start: start address, must be a multiple of - * EFI_PAGE_SIZE -@@ -266,12 +266,11 @@ static s64 efi_mem_carve_out(struct efi_mem_list *map, - * @memory_type: type of memory added - * @overlap_conventional: region may only overlap free(conventional) - * memory -+ * @remove: remove memory map - * Return: status code - */ --static --efi_status_t efi_add_memory_map_pg(u64 start, u64 pages, -- int memory_type, -- bool overlap_conventional) -+efi_status_t efi_update_memory_map(u64 start, u64 pages, int memory_type, -+ bool overlap_conventional, bool remove) - { - struct efi_mem_list *lmem; - struct efi_mem_list *newlist; -@@ -279,9 +278,9 @@ efi_status_t efi_add_memory_map_pg(u64 start, u64 pages, - uint64_t carved_pages = 0; - struct efi_event *evt; - -- EFI_PRINT("%s: 0x%llx 0x%llx %d %s\n", __func__, -+ EFI_PRINT("%s: 0x%llx 0x%llx %d %s %s\n", __func__, - start, pages, memory_type, overlap_conventional ? -- "yes" : "no"); -+ "yes" : "no", remove ? "remove" : "add"); - - if (memory_type >= EFI_MAX_MEMORY_TYPE) - return EFI_INVALID_PARAMETER; -@@ -364,7 +363,10 @@ efi_status_t efi_add_memory_map_pg(u64 start, u64 pages, - } - - /* Add our new map */ -- list_add_tail(&newlist->link, &efi_mem); -+ if (!remove) -+ list_add_tail(&newlist->link, &efi_mem); -+ else -+ free(newlist); - - /* And make sure memory is listed in descending order */ - efi_mem_sort(); -@@ -401,7 +403,29 @@ efi_status_t efi_add_memory_map(u64 start, u64 size, int memory_type) - pages = efi_size_in_pages(size + (start & EFI_PAGE_MASK)); - start &= ~EFI_PAGE_MASK; - -- return efi_add_memory_map_pg(start, pages, memory_type, false); -+ return efi_update_memory_map(start, pages, memory_type, false, false); -+} -+ -+/** -+ * efi_remove_memory_map() - remove memory area to the memory map -+ * -+ * @start: start address of the memory area -+ * @size: length in bytes of the memory area -+ * @memory_type: type of memory removed -+ * -+ * Return: status code -+ * -+ * This function automatically aligns the start and size of the memory area -+ * to EFI_PAGE_SIZE. -+ */ -+efi_status_t efi_remove_memory_map(u64 start, u64 size, int memory_type) -+{ -+ u64 pages; -+ -+ pages = efi_size_in_pages(size + (start & EFI_PAGE_MASK)); -+ start &= ~EFI_PAGE_MASK; -+ -+ return efi_update_memory_map(start, pages, memory_type, false, true); - } - - /** -@@ -502,7 +526,7 @@ efi_status_t efi_allocate_pages(enum efi_allocate_type type, - - efi_addr = (u64)(uintptr_t)map_sysmem(addr, 0); - /* Reserve that map in our memory maps */ -- ret = efi_add_memory_map_pg(efi_addr, pages, memory_type, true); -+ ret = efi_update_memory_map(efi_addr, pages, memory_type, true, false); - if (ret != EFI_SUCCESS) { - /* Map would overlap, bail out */ - lmb_free_flags(addr, (u64)pages << EFI_PAGE_SHIFT, flags); -@@ -823,8 +847,8 @@ static void add_u_boot_and_runtime(void) - uboot_stack_size) & ~EFI_PAGE_MASK; - uboot_pages = ((uintptr_t)map_sysmem(gd->ram_top - 1, 0) - - uboot_start + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT; -- efi_add_memory_map_pg(uboot_start, uboot_pages, EFI_BOOT_SERVICES_CODE, -- false); -+ efi_update_memory_map(uboot_start, uboot_pages, EFI_BOOT_SERVICES_CODE, -+ false, false); - #if defined(__aarch64__) - /* - * Runtime Services must be 64KiB aligned according to the -@@ -842,8 +866,8 @@ static void add_u_boot_and_runtime(void) - runtime_end = (uintptr_t)__efi_runtime_stop; - runtime_end = (runtime_end + runtime_mask) & ~runtime_mask; - runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT; -- efi_add_memory_map_pg(runtime_start, runtime_pages, -- EFI_RUNTIME_SERVICES_CODE, false); -+ efi_update_memory_map(runtime_start, runtime_pages, -+ EFI_RUNTIME_SERVICES_CODE, false, false); - } - - int efi_memory_init(void) -@@ -878,11 +902,11 @@ int efi_map_update_notify(phys_addr_t addr, phys_size_t size, - pages = efi_size_in_pages(size + (efi_addr & EFI_PAGE_MASK)); - efi_addr &= ~EFI_PAGE_MASK; - -- status = efi_add_memory_map_pg(efi_addr, pages, -+ status = efi_update_memory_map(efi_addr, pages, - op == LMB_MAP_OP_RESERVE ? - EFI_BOOT_SERVICES_DATA : - EFI_CONVENTIONAL_MEMORY, -- false); -+ false, false); - if (status != EFI_SUCCESS) { - log_err("LMB Map notify failure %lu\n", - status & ~EFI_ERROR_MASK); - -From patchwork Fri Feb 28 08:45:26 2025 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Sughosh Ganu -X-Patchwork-Id: 2053443 -X-Patchwork-Delegate: xypron.glpk@gmx.de -Return-Path: -X-Original-To: incoming@patchwork.ozlabs.org -Delivered-To: patchwork-incoming@legolas.ozlabs.org -Authentication-Results: legolas.ozlabs.org; - spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de - (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; - envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) -Received: from phobos.denx.de (phobos.denx.de - [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) - (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) - key-exchange X25519 server-signature ECDSA (secp384r1)) - (No client certificate requested) - by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z41ym1cNCz1yKH - for ; Fri, 28 Feb 2025 19:46:24 +1100 (AEDT) -Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) - by phobos.denx.de (Postfix) with ESMTP id BD37E810F1; - Fri, 28 Feb 2025 09:46:08 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de -Received: by phobos.denx.de (Postfix, from userid 109) - id 4D257810F1; Fri, 28 Feb 2025 09:46:07 +0100 (CET) -X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de -X-Spam-Level: -X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00, - RCVD_IN_DNSWL_BLOCKED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, - RCVD_IN_VALIDITY_RPBL_BLOCKED,SPF_HELO_NONE,SPF_SOFTFAIL autolearn=no - autolearn_force=no version=3.4.2 -Received: from foss.arm.com (foss.arm.com [217.140.110.172]) - by phobos.denx.de (Postfix) with ESMTP id 23B3B80FE1 - for ; Fri, 28 Feb 2025 09:46:05 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=fail smtp.mailfrom=sughosh.ganu@linaro.org -Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) - by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id CB084113E; - Fri, 28 Feb 2025 00:46:19 -0800 (PST) -Received: from a079122.blr.arm.com (a079122.arm.com [10.162.17.48]) - by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id A01053F673; - Fri, 28 Feb 2025 00:46:01 -0800 (PST) -From: Sughosh Ganu -To: u-boot@lists.denx.de -Cc: Ilias Apalodimas , - Simon Glass , Tom Rini , - Heinrich Schuchardt , - Anton Antonov , - Tobias Waldekranz , Bin Meng , - Sughosh Ganu -Subject: [PATCH v6 3/6] efi_loader: preserve installer images in pmem -Date: Fri, 28 Feb 2025 14:15:26 +0530 -Message-Id: <20250228084529.127823-4-sughosh.ganu@linaro.org> -X-Mailer: git-send-email 2.34.1 -In-Reply-To: <20250228084529.127823-1-sughosh.ganu@linaro.org> -References: <20250228084529.127823-1-sughosh.ganu@linaro.org> -MIME-Version: 1.0 -X-BeenThere: u-boot@lists.denx.de -X-Mailman-Version: 2.1.39 -Precedence: list -List-Id: U-Boot discussion -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Errors-To: u-boot-bounces@lists.denx.de -Sender: "U-Boot" -X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de -X-Virus-Status: Clean - -From: Ilias Apalodimas - -One of the problems OS installers face, when running in EFI, is that -the mounted ISO after calling ExitBootServices goes away. For some -distros this is a problem since they rely on finding some core packages -before continuing the installation. Distros have works around this -- -e.g Fedora has a special kernel command line parameter called -inst.stage2 [0]. - -ACPI has NFIT and NVDIMM support to provide ramdisks to the OS, but we -don't have anything in place for DTs. Linux and device trees have support -for persistent memory devices. - -It's worth noting that for linux to instantiate the /dev/pmemX device, -the memory described in the pmem node has to be omitted from the EFI -memory map we hand over to the OS if ZONE_DEVICES and SPARSEMEM is -enabled. With those enabled the pmem driver ends up calling -devm_memremap_pages() instead of devm_memremap(). The latter works -whether the memory is omitted or marked as reserved, but mapping pages -only works if the memory is omitted. - -On top of that, depending on how the kernel is configured, that memory -area must be page aligned or 2MB aligned. PowerPC is an exception here -and requires 16MB alignment, but since we don't have EFI support for -it, limit the alignment to 2MB. - -Ensure that the ISO image is 2MB aligned and remove the region -occupied by the image from the EFI memory map. - -Signed-off-by: Ilias Apalodimas -Signed-off-by: Sughosh Ganu ---- -Changes since V5: None - - lib/efi_loader/efi_bootmgr.c | 22 +++++++++++++++++----- - 1 file changed, 17 insertions(+), 5 deletions(-) - -diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c -index c6124c590d9..081eff057f4 100644 ---- a/lib/efi_loader/efi_bootmgr.c -+++ b/lib/efi_loader/efi_bootmgr.c -@@ -18,6 +18,8 @@ - #include - #include - #include -+#include -+#include - - static const struct efi_boot_services *bs; - static const struct efi_runtime_services *rs; -@@ -362,13 +364,16 @@ static efi_status_t prepare_loaded_image(u16 *label, ulong addr, ulong size, - } - - /* -- * TODO: expose the ramdisk to OS. -- * Need to pass the ramdisk information by the architecture-specific -- * methods such as 'pmem' device-tree node. -+ * Linux supports 'pmem' which allows OS installers to find, reclaim -+ * the mounted images and continue the installation since the contents -+ * of the pmem region are treated as local media. -+ * -+ * The memory regions used for it needs to be carved out of the EFI -+ * memory map. - */ -- ret = efi_add_memory_map(addr, size, EFI_RESERVED_MEMORY_TYPE); -+ ret = efi_remove_memory_map(addr, size, EFI_CONVENTIONAL_MEMORY); - if (ret != EFI_SUCCESS) { -- log_err("Memory reservation failed\n"); -+ log_err("Failed to reserve memory\n"); - goto err; - } - -@@ -490,6 +495,13 @@ static efi_status_t try_load_from_uri_path(struct efi_device_path_uri *uridp, - ret = EFI_INVALID_PARAMETER; - goto err; - } -+ /* -+ * Depending on the kernel configuration, pmem memory area must be page -+ * aligned or 2MB aligned. PowerPC is an exception here and requires -+ * 16MB alignment, but since we don't have EFI support for it, limit -+ * the alignment to 2MB. -+ */ -+ image_size = ALIGN(image_size, SZ_2M); - - /* - * If the file extension is ".iso" or ".img", mount it and try to load - -From patchwork Fri Feb 28 08:45:27 2025 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Sughosh Ganu -X-Patchwork-Id: 2053444 -X-Patchwork-Delegate: xypron.glpk@gmx.de -Return-Path: -X-Original-To: incoming@patchwork.ozlabs.org -Delivered-To: patchwork-incoming@legolas.ozlabs.org -Authentication-Results: legolas.ozlabs.org; - spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de - (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; - envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) -Received: from phobos.denx.de (phobos.denx.de - [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) - (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) - key-exchange X25519 server-signature ECDSA (secp384r1)) - (No client certificate requested) - by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z41z21cqkz1yKH - for ; Fri, 28 Feb 2025 19:46:38 +1100 (AEDT) -Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) - by phobos.denx.de (Postfix) with ESMTP id B7A2B810FE; - Fri, 28 Feb 2025 09:46:11 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de -Received: by phobos.denx.de (Postfix, from userid 109) - id 9A8D9811C5; Fri, 28 Feb 2025 09:46:10 +0100 (CET) -X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de -X-Spam-Level: -X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00, - RCVD_IN_DNSWL_BLOCKED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, - RCVD_IN_VALIDITY_RPBL_BLOCKED,SPF_HELO_NONE,SPF_SOFTFAIL autolearn=no - autolearn_force=no version=3.4.2 -Received: from foss.arm.com (foss.arm.com [217.140.110.172]) - by phobos.denx.de (Postfix) with ESMTP id A52C180FE1 - for ; Fri, 28 Feb 2025 09:46:08 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=fail smtp.mailfrom=sughosh.ganu@linaro.org -Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) - by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 48F081688; - Fri, 28 Feb 2025 00:46:23 -0800 (PST) -Received: from a079122.blr.arm.com (a079122.arm.com [10.162.17.48]) - by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1E23D3F673; - Fri, 28 Feb 2025 00:46:04 -0800 (PST) -From: Sughosh Ganu -To: u-boot@lists.denx.de -Cc: Ilias Apalodimas , - Simon Glass , Tom Rini , - Heinrich Schuchardt , - Anton Antonov , - Tobias Waldekranz , Bin Meng , - Sughosh Ganu -Subject: [PATCH v6 4/6] blkmap: store type of blkmap slice in corresponding - structure -Date: Fri, 28 Feb 2025 14:15:27 +0530 -Message-Id: <20250228084529.127823-5-sughosh.ganu@linaro.org> -X-Mailer: git-send-email 2.34.1 -In-Reply-To: <20250228084529.127823-1-sughosh.ganu@linaro.org> -References: <20250228084529.127823-1-sughosh.ganu@linaro.org> -MIME-Version: 1.0 -X-BeenThere: u-boot@lists.denx.de -X-Mailman-Version: 2.1.39 -Precedence: list -List-Id: U-Boot discussion -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Errors-To: u-boot-bounces@lists.denx.de -Sender: "U-Boot" -X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de -X-Virus-Status: Clean - -Add information about the type of blkmap slice as an attribute in the -corresponding slice structure. Put information in the blkmap slice -structure to identify if it is associated with a memory or linear -mapped device. Which can then be used to take specific action based on -the type of the blkmap slice. - -Signed-off-by: Sughosh Ganu -Reviewed-by: Tobias Waldekranz -Reviewed-by: Ilias Apalodimas ---- -Changes since V5: None - - drivers/block/blkmap.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/drivers/block/blkmap.c b/drivers/block/blkmap.c -index 34eed1380dc..453510cca62 100644 ---- a/drivers/block/blkmap.c -+++ b/drivers/block/blkmap.c -@@ -16,6 +16,10 @@ - - struct blkmap; - -+/* Attributes of blkmap slice */ -+#define BLKMAP_SLICE_LINEAR BIT(0) -+#define BLKMAP_SLICE_MEM BIT(1) -+ - /** - * struct blkmap_slice - Region mapped to a blkmap - * -@@ -25,12 +29,14 @@ struct blkmap; - * @node: List node used to associate this slice with a blkmap - * @blknr: Start block number of the mapping - * @blkcnt: Number of blocks covered by this mapping -+ * @attr: Attributes of blkmap slice - */ - struct blkmap_slice { - struct list_head node; - - lbaint_t blknr; - lbaint_t blkcnt; -+ uint attr; - - /** - * @read: - Read from slice -@@ -169,6 +175,7 @@ int blkmap_map_linear(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, - .slice = { - .blknr = blknr, - .blkcnt = blkcnt, -+ .attr = BLKMAP_SLICE_LINEAR, - - .read = blkmap_linear_read, - .write = blkmap_linear_write, -@@ -248,6 +255,7 @@ int __blkmap_map_mem(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, - .slice = { - .blknr = blknr, - .blkcnt = blkcnt, -+ .attr = BLKMAP_SLICE_MEM, - - .read = blkmap_mem_read, - .write = blkmap_mem_write, - -From patchwork Fri Feb 28 08:45:28 2025 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Sughosh Ganu -X-Patchwork-Id: 2053445 -X-Patchwork-Delegate: xypron.glpk@gmx.de -Return-Path: -X-Original-To: incoming@patchwork.ozlabs.org -Delivered-To: patchwork-incoming@legolas.ozlabs.org -Authentication-Results: legolas.ozlabs.org; - spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de - (client-ip=85.214.62.61; helo=phobos.denx.de; - envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) -Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) - (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) - key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) - (No client certificate requested) - by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z41zB6lfpz1yKH - for ; Fri, 28 Feb 2025 19:46:46 +1100 (AEDT) -Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) - by phobos.denx.de (Postfix) with ESMTP id 1822281111; - Fri, 28 Feb 2025 09:46:15 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de -Received: by phobos.denx.de (Postfix, from userid 109) - id A6651807D7; Fri, 28 Feb 2025 09:46:14 +0100 (CET) -X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de -X-Spam-Level: -X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00, - RCVD_IN_DNSWL_BLOCKED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, - RCVD_IN_VALIDITY_RPBL_BLOCKED,SPF_HELO_NONE,SPF_SOFTFAIL autolearn=no - autolearn_force=no version=3.4.2 -Received: from foss.arm.com (foss.arm.com [217.140.110.172]) - by phobos.denx.de (Postfix) with ESMTP id 7B487811C5 - for ; Fri, 28 Feb 2025 09:46:12 +0100 (CET) -Authentication-Results: phobos.denx.de; - dmarc=fail (p=none dis=none) header.from=linaro.org -Authentication-Results: phobos.denx.de; - spf=fail smtp.mailfrom=sughosh.ganu@linaro.org -Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) - by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3B092113E; - Fri, 28 Feb 2025 00:46:27 -0800 (PST) -Received: from a079122.blr.arm.com (a079122.arm.com [10.162.17.48]) - by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 103233F673; - Fri, 28 Feb 2025 00:46:08 -0800 (PST) -From: Sughosh Ganu -To: u-boot@lists.denx.de -Cc: Ilias Apalodimas , - Simon Glass , Tom Rini , - Heinrich Schuchardt , - Anton Antonov , - Tobias Waldekranz , Bin Meng , - Sughosh Ganu -Subject: [PATCH v6 5/6] blkmap: add an attribute to preserve the mem mapping -Date: Fri, 28 Feb 2025 14:15:28 +0530 -Message-Id: <20250228084529.127823-6-sughosh.ganu@linaro.org> -X-Mailer: git-send-email 2.34.1 -In-Reply-To: <20250228084529.127823-1-sughosh.ganu@linaro.org> -References: <20250228084529.127823-1-sughosh.ganu@linaro.org> -MIME-Version: 1.0 -X-BeenThere: u-boot@lists.denx.de -X-Mailman-Version: 2.1.39 -Precedence: list -List-Id: U-Boot discussion -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Errors-To: u-boot-bounces@lists.denx.de -Sender: "U-Boot" -X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de -X-Virus-Status: Clean - -Some blkmap memory mapped devices might have to be be relevant even -after U-Boot passes control to the next image as part of the platform -boot. An example of such a mapping would be an OS installer ISO image, -information for which has to be provided to the OS kernel. Use the -'preserve' attribute for such mappings. The code for adding a pmem -node to the device-tree then checks if this attribute is set, and adds -a node only for mappings which have this attribute. - -Signed-off-by: Sughosh Ganu -Reviewed-by: Tobias Waldekranz -Reviewed-by: Ilias Apalodimas ---- -Changes since V5: None - - cmd/blkmap.c | 9 +++++++-- - drivers/block/blkmap.c | 12 ++++++++---- - drivers/block/blkmap_helper.c | 2 +- - include/blkmap.h | 4 +++- - 4 files changed, 19 insertions(+), 8 deletions(-) - -diff --git a/cmd/blkmap.c b/cmd/blkmap.c -index 164f80f1387..86a123b1cd3 100644 ---- a/cmd/blkmap.c -+++ b/cmd/blkmap.c -@@ -62,13 +62,18 @@ static int do_blkmap_map_mem(struct map_ctx *ctx, int argc, char *const argv[]) - { - phys_addr_t addr; - int err; -+ bool preserve = false; - - if (argc < 2) - return CMD_RET_USAGE; - - addr = hextoul(argv[1], NULL); - -- err = blkmap_map_pmem(ctx->dev, ctx->blknr, ctx->blkcnt, addr); -+ if (argc == 3 && !strcmp(argv[2], "preserve")) -+ preserve = true; -+ -+ err = blkmap_map_pmem(ctx->dev, ctx->blknr, ctx->blkcnt, addr, -+ preserve); - if (err) { - printf("Unable to map %#llx at block 0x" LBAF ": %d\n", - (unsigned long long)addr, ctx->blknr, err); -@@ -221,7 +226,7 @@ U_BOOT_CMD_WITH_SUBCMDS( - "blkmap create