For barebox with a prebootloader, we can compress barebox proper as a whole and it makes no sense to compress the environment on its own again. The choice already defaulted to this, but the user could still override it. Ensure that this double compression can't happen. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- v1 -> v2: - no change --- common/Kconfig | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/common/Kconfig b/common/Kconfig index 2292e7bcea46..6278866006b1 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -860,29 +860,30 @@ choice default DEFAULT_COMPRESSION_LZ4 if LZ4_DECOMPRESS default DEFAULT_COMPRESSION_BZIP2 if BZLIB help - Select the default compression for in-barebox binary files. Files - compiled into barebox like for example the default environment will - be compressed with this compression type. + For barebox builds without a prebootloader, select here the default + compression for in-barebox binary files. barebox itself can't be + compressed without a prebootloader, but for example the default + environment will be compressed with this compression type. config DEFAULT_COMPRESSION_GZIP bool "gzip" - depends on ZLIB + depends on !PBL_IMAGE && ZLIB config DEFAULT_COMPRESSION_BZIP2 bool "bzip2" - depends on BZLIB + depends on !PBL_IMAGE && BZLIB config DEFAULT_COMPRESSION_LZO bool "lzo" - depends on LZO_DECOMPRESS + depends on !PBL_IMAGE && LZO_DECOMPRESS config DEFAULT_COMPRESSION_LZ4 bool "lz4" - depends on LZ4_DECOMPRESS + depends on !PBL_IMAGE && LZ4_DECOMPRESS config DEFAULT_COMPRESSION_XZ bool "xz" - depends on XZ_DECOMPRESS + depends on !PBL_IMAGE && XZ_DECOMPRESS config DEFAULT_COMPRESSION_NONE bool "no compression" -- 2.30.2
From: Ahmad Fatoum <ahmad@a3f.at> All in-tree boards that reference __dtb_z_ symbols are already multi-image capable and allow us to compress barebox proper by having the prebootloader decompress it using the algorithm specified by the CONFIG_IMAGE_COMPRESSION_* option. DTB on the other hand, is handled specially and the optional compression is always using LZO. It makes sense to use the same CONFIG_IMAGE_COMPRESSION_* options for the DT too to make build system integration easier. To avoid special casing non-PBL support which lacks this options, just drop USE_COMPRESSED_DTB there. If linking barebox for your downstream board is broken by this: - If not multi-image capable, consider porting it to use ENTRY_FUNCTION(_WITHSTACK) instead - If you are using __dtb_z_* in barebox proper, use normal __dtb_ and compress barebox as a whole instead with CONFIG_IMAGE_COMPRESSION_* Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- v1 -> v2: - new patch --- common/Kconfig | 6 ------ pbl/Kconfig | 6 ++++++ scripts/gen-dtb-s | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/common/Kconfig b/common/Kconfig index 6278866006b1..60f52a10e11d 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -41,12 +41,6 @@ config BLOCK config BLOCK_WRITE bool -config USE_COMPRESSED_DTB - bool - depends on ARM || RISCV - select UNCOMPRESS - select LZO_DECOMPRESS - config FILETYPE bool diff --git a/pbl/Kconfig b/pbl/Kconfig index ce0acbb646c7..ec1886073e42 100644 --- a/pbl/Kconfig +++ b/pbl/Kconfig @@ -28,6 +28,12 @@ config PBL_SINGLE_IMAGE if PBL_IMAGE +config USE_COMPRESSED_DTB + bool + depends on ARM || RISCV + select UNCOMPRESS + select LZO_DECOMPRESS + config PBL_RELOCATABLE depends on ARM || MIPS || RISCV bool "relocatable pbl image" diff --git a/scripts/gen-dtb-s b/scripts/gen-dtb-s index 1027db28044f..868d434664ec 100755 --- a/scripts/gen-dtb-s +++ b/scripts/gen-dtb-s @@ -58,7 +58,7 @@ fi compressed=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" $dtb.lzo) uncompressed=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" $dtb) -echo "#ifdef CONFIG_USE_COMPRESSED_DTB" +echo "#if defined(CONFIG_USE_COMPRESSED_DTB) && defined(__PBL__)" echo ".section .dtbz.rodata.${name},\"a\"" echo ".balign STRUCT_ALIGNMENT" echo ".global __dtb_z_${name}_start" -- 2.30.2
LZO_DECOMPRESS as well as all other decompress options already select UNCOMPRESS, so selecting it again is unnecessary. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- v1 -> v2: - new patch --- pbl/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/pbl/Kconfig b/pbl/Kconfig index ec1886073e42..4dfa9553f786 100644 --- a/pbl/Kconfig +++ b/pbl/Kconfig @@ -31,7 +31,6 @@ if PBL_IMAGE config USE_COMPRESSED_DTB bool depends on ARM || RISCV - select UNCOMPRESS select LZO_DECOMPRESS config PBL_RELOCATABLE -- 2.30.2
From: Ahmad Fatoum <ahmad@a3f.at> We call lzop in two places: in gen-dtb-s to generate a compressed device tree symbol and in Makefile.lib, which is used everywhere else. Replace the duplication in gen-dtb-s by compressing the DT outside with the existing cmd_lzo command. This will come in handy later when extending gen-dtb-s to support multiple compression formats. No functional change intended. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- v1 -> v2: - new patch --- arch/arm/dts/Makefile | 2 +- arch/mips/dts/Makefile | 2 +- scripts/Makefile.build | 4 ++-- scripts/Makefile.lib | 5 ++++- scripts/gen-dtb-s | 8 ++------ 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 34192641dd1f..4e935a763260 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -199,4 +199,4 @@ lwl-$(CONFIG_MACH_TQMLS1046A) += fsl-tqmls1046a-mbls10xxa.dtb.o lwl-$(CONFIG_MACH_ZEDBOARD) += zynq-zed.dtb.o lwl-$(CONFIG_MACH_MNT_REFORM) += imx8mq-mnt-reform2.dtb.o -clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.lzo +clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.z diff --git a/arch/mips/dts/Makefile b/arch/mips/dts/Makefile index e4cc3b44a53e..d99c4c63584d 100644 --- a/arch/mips/dts/Makefile +++ b/arch/mips/dts/Makefile @@ -18,4 +18,4 @@ pbl-$(CONFIG_BOARD_RZX50) += rzx50.dtb.o pbl-$(CONFIG_BOARD_TPLINK_MR3020) += ar9331_tl_mr3020.dtb.o pbl-$(CONFIG_BOARD_TPLINK_WDR4300) += ar9344-tl-wdr4300-v1.7.dtb.o -clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.lzo +clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.z diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 1614a1ac58f8..216f03677bd1 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -262,8 +262,8 @@ intermediate_targets = $(foreach sfx, $(2), \ # %.lex.o <- %.lex.c <- %.l # %.tab.o <- %.tab.[ch] <- %.y targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \ - $(call intermediate_targets, .dtb.o, .dtb.S .dtb) \ - $(call intermediate_targets, .dtb.pbl.o, .dtb.S .dtb) \ + $(call intermediate_targets, .dtb.o, .dtb.S .dtb.z .dtb) \ + $(call intermediate_targets, .dtb.pbl.o, .dtb.S .dtb.z .dtb) \ $(call intermediate_targets, .lex.o, .lex.c) \ $(call intermediate_targets, .tab.o, .tab.c .tab.h) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index a830364a8bab..c2301b5370da 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -333,9 +333,12 @@ endif # Generate an assembly file to wrap the output of the device tree compiler quiet_cmd_dt_S_dtb = DTB $@ cmd_dt_S_dtb = $(srctree)/scripts/gen-dtb-s $(subst -,_,$(*F)) $< $(CONFIG_IMD) > $@ -$(obj)/%.dtb.S: $(obj)/%.dtb $(srctree)/scripts/gen-dtb-s FORCE +$(obj)/%.dtb.S: $(obj)/%.dtb $(obj)/%.dtb.z $(srctree)/scripts/gen-dtb-s FORCE $(call if_changed,dt_S_dtb) +$(obj)/%.dtb.z: $(obj)/%.dtb FORCE + $(call if_changed,lzo) + dts-frags = $(subst $(quote),,$(CONFIG_EXTERNAL_DTS_FRAGMENTS)) quiet_cmd_dtc = DTC $@ # For compatibility between make 4.2 and 4.3 diff --git a/scripts/gen-dtb-s b/scripts/gen-dtb-s index 868d434664ec..eadf4d76f313 100755 --- a/scripts/gen-dtb-s +++ b/scripts/gen-dtb-s @@ -51,11 +51,7 @@ echo "__dtb_${name}_end:" echo ".global __dtb_${name}_end" echo ".balign STRUCT_ALIGNMENT" -lzop -f -9 $dtb -o $dtb.lzo -if [ $? != 0 ]; then - exit 1 -fi -compressed=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" $dtb.lzo) +compressed=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" $dtb.z) uncompressed=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" $dtb) echo "#if defined(CONFIG_USE_COMPRESSED_DTB) && defined(__PBL__)" @@ -66,7 +62,7 @@ echo "__dtb_z_${name}_start:" printf ".int 0x%08x\n" 0x7b66bcbd printf ".int 0x%08x\n" $compressed printf ".int 0x%08x\n" $uncompressed -echo ".incbin \"$dtb.lzo\"" +echo ".incbin \"$dtb.z\"" echo "__dtb_z_${name}_end:" echo ".global __dtb_z_${name}_end" echo ".balign STRUCT_ALIGNMENT" -- 2.30.2
While data = compressed_dtb + 1 has the equivalent effect of skipping over the struct barebox_boarddata_compressed_dtb header, using a flexible array member aids code readability, so use that instead. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- v1 -> v2: - new patch --- arch/arm/cpu/start.c | 7 ++----- arch/riscv/boot/start.c | 6 ++---- include/compressed-dtb.h | 1 + 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c index 14cc310312ab..755d48851956 100644 --- a/arch/arm/cpu/start.c +++ b/arch/arm/cpu/start.c @@ -52,7 +52,6 @@ u32 barebox_arm_machine(void) void *barebox_arm_boot_dtb(void) { void *dtb; - void *data; int ret; struct barebox_boarddata_compressed_dtb *compressed_dtb; static void *boot_dtb; @@ -76,10 +75,8 @@ void *barebox_arm_boot_dtb(void) if (!dtb) return NULL; - data = compressed_dtb + 1; - - ret = uncompress(data, compressed_dtb->datalen, NULL, NULL, - dtb, NULL, NULL); + ret = uncompress(compressed_dtb->data, compressed_dtb->datalen, + NULL, NULL, dtb, NULL, NULL); if (ret) { pr_err("uncompressing dtb failed\n"); free(dtb); diff --git a/arch/riscv/boot/start.c b/arch/riscv/boot/start.c index 72ab93cb7691..8b4c8bb2f019 100644 --- a/arch/riscv/boot/start.c +++ b/arch/riscv/boot/start.c @@ -32,7 +32,6 @@ unsigned barebox_riscv_pbl_flags; void *barebox_riscv_boot_dtb(void) { void *dtb; - void *data; int ret; struct barebox_boarddata_compressed_dtb *compressed_dtb; static void *boot_dtb; @@ -56,9 +55,8 @@ void *barebox_riscv_boot_dtb(void) if (!dtb) return NULL; - data = compressed_dtb + 1; - - ret = uncompress(data, compressed_dtb->datalen, NULL, NULL, dtb, NULL, NULL); + ret = uncompress(compressed_dtb->data, compressed_dtb->datalen, + NULL, NULL, dtb, NULL, NULL); if (ret) { pr_err("uncompressing dtb failed\n"); free(dtb); diff --git a/include/compressed-dtb.h b/include/compressed-dtb.h index 1ba98a7e2b92..3359d1ee115d 100644 --- a/include/compressed-dtb.h +++ b/include/compressed-dtb.h @@ -10,6 +10,7 @@ struct barebox_boarddata_compressed_dtb { u32 magic; u32 datalen; u32 datalen_uncompressed; + u8 data[]; }; static inline bool blob_is_compressed_fdt(const void *blob) -- 2.30.2
From: Ahmad Fatoum <ahmad@a3f.at> lzop hasn't seen any activity since 2017 and has been recently removed from OpenEmbedded, which is unfortunate as we unconditionally use LZO for compressing device trees that are referenced via __dtb_z_. To make barebox easier to integrate, use the same compression algorithm for both barebox and compressed DTB. Note that the decompressor code will be in the image twice: Once in PBL in uncompressed form to decompress barebox proper and once in compressed form to decompress the DTB. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- v1 -> v2: - drop LZO/LZ4 hardcoding with autodetection, instead use same algo for both --- arch/arm/cpu/start.c | 11 ++++++++--- images/Makefile | 6 ------ pbl/Kconfig | 5 ++++- scripts/Makefile.lib | 11 ++++++++++- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c index 755d48851956..5861c15d43df 100644 --- a/arch/arm/cpu/start.c +++ b/arch/arm/cpu/start.c @@ -52,7 +52,7 @@ u32 barebox_arm_machine(void) void *barebox_arm_boot_dtb(void) { void *dtb; - int ret; + int ret = 0; struct barebox_boarddata_compressed_dtb *compressed_dtb; static void *boot_dtb; @@ -75,8 +75,13 @@ void *barebox_arm_boot_dtb(void) if (!dtb) return NULL; - ret = uncompress(compressed_dtb->data, compressed_dtb->datalen, - NULL, NULL, dtb, NULL, NULL); + if (IS_ENABLED(CONFIG_IMAGE_COMPRESSION_NONE)) + memcpy(dtb, compressed_dtb->data, + compressed_dtb->datalen_uncompressed); + else + ret = uncompress(compressed_dtb->data, compressed_dtb->datalen, + NULL, NULL, dtb, NULL, NULL); + if (ret) { pr_err("uncompressing dtb failed\n"); free(dtb); diff --git a/images/Makefile b/images/Makefile index a148cf41766b..c79f1a272e9c 100644 --- a/images/Makefile +++ b/images/Makefile @@ -108,12 +108,6 @@ $(obj)/%.pblb: $(obj)/%.pbl FORCE $(obj)/%.s: $(obj)/% FORCE $(call if_changed,disasm) -suffix_$(CONFIG_IMAGE_COMPRESSION_GZIP) = gzip -suffix_$(CONFIG_IMAGE_COMPRESSION_LZO) = lzo -suffix_$(CONFIG_IMAGE_COMPRESSION_LZ4) = lz4 -suffix_$(CONFIG_IMAGE_COMPRESSION_XZKERN) = xzkern -suffix_$(CONFIG_IMAGE_COMPRESSION_NONE) = comp_copy - $(obj)/piggy.o: $(obj)/barebox.z FORCE $(obj)/sha_sum.o: $(obj)/barebox.sha.bin FORCE diff --git a/pbl/Kconfig b/pbl/Kconfig index 4dfa9553f786..ba809af2d5b9 100644 --- a/pbl/Kconfig +++ b/pbl/Kconfig @@ -31,7 +31,10 @@ if PBL_IMAGE config USE_COMPRESSED_DTB bool depends on ARM || RISCV - select LZO_DECOMPRESS + select LZ4_DECOMPRESS if IMAGE_COMPRESSION_LZ4 + select LZO_DECOMPRESS if IMAGE_COMPRESSION_LZO + select ZLIB if IMAGE_COMPRESSION_GZIP + select XZ_DECOMPRESS if IMAGE_COMPRESSION_XZKERN config PBL_RELOCATABLE depends on ARM || MIPS || RISCV diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index c2301b5370da..61617bd9dcba 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -272,6 +272,15 @@ cmd_ld = $(LD) $(KBUILD_LDFLAGS) $(EXTRA_LDFLAGS) $(LDFLAGS_$(@F)) \ quiet_cmd_objcopy = OBJCOPY $@ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@ +# Decompressor for barebox proper binary when using PBL +# --------------------------------------------------------------------------- + +suffix_$(CONFIG_IMAGE_COMPRESSION_GZIP) = gzip +suffix_$(CONFIG_IMAGE_COMPRESSION_LZO) = lzo +suffix_$(CONFIG_IMAGE_COMPRESSION_LZ4) = lz4 +suffix_$(CONFIG_IMAGE_COMPRESSION_XZKERN) = xzkern +suffix_$(CONFIG_IMAGE_COMPRESSION_NONE) = comp_copy + # Gzip # --------------------------------------------------------------------------- @@ -337,7 +346,7 @@ $(obj)/%.dtb.S: $(obj)/%.dtb $(obj)/%.dtb.z $(srctree)/scripts/gen-dtb-s FORCE $(call if_changed,dt_S_dtb) $(obj)/%.dtb.z: $(obj)/%.dtb FORCE - $(call if_changed,lzo) + $(call if_changed,$(suffix_y)) dts-frags = $(subst $(quote),,$(CONFIG_EXTERNAL_DTS_FRAGMENTS)) quiet_cmd_dtc = DTC $@ -- 2.30.2
On Wed, Jul 13, 2022 at 11:57:25AM +0200, Ahmad Fatoum wrote: > For barebox with a prebootloader, we can compress barebox proper as a > whole and it makes no sense to compress the environment on its own > again. The choice already defaulted to this, but the user could still > override it. Ensure that this double compression can't happen. > > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > --- > v1 -> v2: > - no change > --- > common/Kconfig | 17 +++++++++-------- > 1 file changed, 9 insertions(+), 8 deletions(-) Applied, thanks Sascha > > diff --git a/common/Kconfig b/common/Kconfig > index 2292e7bcea46..6278866006b1 100644 > --- a/common/Kconfig > +++ b/common/Kconfig > @@ -860,29 +860,30 @@ choice > default DEFAULT_COMPRESSION_LZ4 if LZ4_DECOMPRESS > default DEFAULT_COMPRESSION_BZIP2 if BZLIB > help > - Select the default compression for in-barebox binary files. Files > - compiled into barebox like for example the default environment will > - be compressed with this compression type. > + For barebox builds without a prebootloader, select here the default > + compression for in-barebox binary files. barebox itself can't be > + compressed without a prebootloader, but for example the default > + environment will be compressed with this compression type. > > config DEFAULT_COMPRESSION_GZIP > bool "gzip" > - depends on ZLIB > + depends on !PBL_IMAGE && ZLIB > > config DEFAULT_COMPRESSION_BZIP2 > bool "bzip2" > - depends on BZLIB > + depends on !PBL_IMAGE && BZLIB > > config DEFAULT_COMPRESSION_LZO > bool "lzo" > - depends on LZO_DECOMPRESS > + depends on !PBL_IMAGE && LZO_DECOMPRESS > > config DEFAULT_COMPRESSION_LZ4 > bool "lz4" > - depends on LZ4_DECOMPRESS > + depends on !PBL_IMAGE && LZ4_DECOMPRESS > > config DEFAULT_COMPRESSION_XZ > bool "xz" > - depends on XZ_DECOMPRESS > + depends on !PBL_IMAGE && XZ_DECOMPRESS > > config DEFAULT_COMPRESSION_NONE > bool "no compression" > -- > 2.30.2 > > > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Hi Ahmad, On Wed, Jul 13, 2022 at 11:57:30AM +0200, Ahmad Fatoum wrote: > From: Ahmad Fatoum <ahmad@a3f.at> > > lzop hasn't seen any activity since 2017 and has been recently removed > from OpenEmbedded, which is unfortunate as we unconditionally use LZO > for compressing device trees that are referenced via __dtb_z_. > > To make barebox easier to integrate, use the same compression algorithm > for both barebox and compressed DTB. > > Note that the decompressor code will be in the image twice: Once in PBL > in uncompressed form to decompress barebox proper and once in compressed > form to decompress the DTB. > > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > --- > v1 -> v2: > - drop LZO/LZ4 hardcoding with autodetection, instead use same algo for both > --- > arch/arm/cpu/start.c | 11 ++++++++--- > images/Makefile | 6 ------ > pbl/Kconfig | 5 ++++- > scripts/Makefile.lib | 11 ++++++++++- > 4 files changed, 22 insertions(+), 11 deletions(-) This patch breaks compilation of virt2real_defconfig: /bin/sh: 1: Syntax error: ";" unexpected make[1]: *** [scripts/Makefile.lib:349: arch/arm/dts/virt2real.dtb.z] Error 2 make: *** [Makefile:953: arch/arm/dts] Error 2 make: *** Waiting for unfinished jobs.... I haven't looked into it yet. Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
scripts: Makefile.lib: fix build for non-PBL DT-enabled boards CONFIG_IMAGE_COMPRESSION_NONE is unset for non-PBL builds, leading to a build failure for non-PBL boards that reference device trees. Fix this by having comp_copy as default. Reported-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- scripts/Makefile.lib | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index a648835b1bfb..9295f22e9fef 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -275,6 +275,7 @@ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@ # Decompressor for barebox proper binary when using PBL # --------------------------------------------------------------------------- +suffix_y = comp_copy suffix_$(CONFIG_IMAGE_COMPRESSION_GZIP) = gzip suffix_$(CONFIG_IMAGE_COMPRESSION_LZO) = lzo suffix_$(CONFIG_IMAGE_COMPRESSION_LZ4) = lz4 -- 2.30.2