[U-Boot] [PATCH 2/2] lib: fdt: Allow LZO and GZIP DT compression in U-Boot

Marek Vasut marek.vasut at gmail.com
Wed Mar 13 21:08:20 UTC 2019


Add required Kconfig symbols, Makefile bits and macro fixes in a
few places to support LZO and DT compression in U-Boot. This can
save a lot of space with multi-DTB fitImages.

Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
Cc: Nobuhiro Iwamatsu <iwamatsu at nigauri.org>
Cc: Simon Glass <sjg at chromium.org>
Cc: Tom Rini <trini at konsulko.com>

Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
---
 Makefile                  | 18 +++++++++++--
 dts/Kconfig               | 57 +++++++++++++++++++++++++++++++++++++++
 include/config_defaults.h |  3 ---
 lib/Kconfig               | 13 +++++++++
 lib/fdtdec.c              |  2 +-
 5 files changed, 87 insertions(+), 6 deletions(-)

diff --git a/Makefile b/Makefile
index 26db4e7b59..ba7a9eb4f7 100644
--- a/Makefile
+++ b/Makefile
@@ -1013,6 +1013,20 @@ quiet_cmd_copy = COPY    $@
 
 ifeq ($(CONFIG_MULTI_DTB_FIT),y)
 
+ifeq ($(CONFIG_MULTI_DTB_FIT_LZO),y)
+FINAL_DTB_CONTAINER = fit-dtb.blob.lzo
+else ifeq ($(CONFIG_MULTI_DTB_FIT_GZIP),y)
+FINAL_DTB_CONTAINER = fit-dtb.blob.gz
+else
+FINAL_DTB_CONTAINER = fit-dtb.blob
+endif
+
+fit-dtb.blob.gz: fit-dtb.blob
+	@gzip -kf9 $< > $@
+
+fit-dtb.blob.lzo: fit-dtb.blob
+	@lzop -f9 $< > $@
+
 fit-dtb.blob: dts/dt.dtb FORCE
 	$(call if_changed,mkimage)
 
@@ -1020,13 +1034,13 @@ MKIMAGEFLAGS_fit-dtb.blob = -f auto -A $(ARCH) -T firmware -C none -O u-boot \
 	-a 0 -e 0 -E \
 	$(patsubst %,-b arch/$(ARCH)/dts/%.dtb,$(subst ",,$(CONFIG_OF_LIST))) -d /dev/null
 
-u-boot-fit-dtb.bin: u-boot-nodtb.bin fit-dtb.blob
+u-boot-fit-dtb.bin: u-boot-nodtb.bin $(FINAL_DTB_CONTAINER)
 	$(call if_changed,cat)
 
 u-boot.bin: u-boot-fit-dtb.bin FORCE
 	$(call if_changed,copy)
 else ifeq ($(CONFIG_OF_SEPARATE),y)
-u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
+u-boot-dtb.bin: u-boot-nodtb.bin $(FINAL_DTB_CONTAINER) FORCE
 	$(call if_changed,cat)
 
 u-boot.bin: u-boot-dtb.bin FORCE
diff --git a/dts/Kconfig b/dts/Kconfig
index 3e85914d11..a5f30c8fd0 100644
--- a/dts/Kconfig
+++ b/dts/Kconfig
@@ -130,6 +130,63 @@ config OF_LIST
 	  device tree files (without the directory or .dtb suffix)
 	  separated by <space>.
 
+choice
+	prompt "SPL OF LIST compression"
+	depends on MULTI_DTB_FIT
+	default MULTI_DTB_FIT_NO_COMPRESSION
+
+config MULTI_DTB_FIT_LZO
+	bool "LZO"
+	depends on SYS_MALLOC_F
+	select LZO
+	help
+	  Compress the FIT image containing the DTBs available for the SPL
+	  using LZO compression. (requires lzop on host).
+
+config MULTI_DTB_FIT_GZIP
+	bool "GZIP"
+	depends on SYS_MALLOC_F
+	select GZIP
+	help
+	  Compress the FIT image containing the DTBs available for the SPL
+	  using GZIP compression. (requires gzip on host)
+
+config MULTI_DTB_FIT_NO_COMPRESSION
+	bool "No compression"
+	help
+	  Do not compress the FIT image containing the DTBs available for the SPL.
+	  Use this options only if LZO is not available and the DTBs are very small.
+endchoice
+
+choice
+	prompt "Location of uncompressed DTBs"
+	depends on (MULTI_DTB_FIT_GZIP || MULTI_DTB_FIT_LZO)
+	default MULTI_DTB_FIT_DYN_ALLOC if SYS_MALLOC_F
+
+config MULTI_DTB_FIT_DYN_ALLOC
+	bool "Dynamically allocate the memory"
+	depends on SYS_MALLOC_F
+
+config MULTI_DTB_FIT_USER_DEFINED_AREA
+	bool "User-defined location"
+endchoice
+
+config MULTI_DTB_FIT_UNCOMPRESS_SZ
+	hex "Size of memory reserved to uncompress the DTBs"
+	depends on (MULTI_DTB_FIT_GZIP || MULTI_DTB_FIT_LZO)
+	default 0x8000
+	help
+	   This is the size of this area where the DTBs are uncompressed.
+	   If this area is dynamically allocated, make sure that
+	   SYS_MALLOC_F_LEN is big enough to contain it.
+
+config MULTI_DTB_FIT_USER_DEF_ADDR
+	hex "Address of memory where dtbs are uncompressed"
+	depends on MULTI_DTB_FIT_USER_DEFINED_AREA
+	help
+	   the FIT image containing the DTBs is uncompressed in an area defined
+	   at compilation time. This is the address of this area. It must be
+	   aligned on 2-byte boundary.
 
 config DTB_RESELECT
 	bool "Support swapping dtbs at a later point in boot"
diff --git a/include/config_defaults.h b/include/config_defaults.h
index 7ef928bbe1..4ed09683b6 100644
--- a/include/config_defaults.h
+++ b/include/config_defaults.h
@@ -16,7 +16,4 @@
 #define CONFIG_BOOTM_RTEMS 1
 #define CONFIG_BOOTM_VXWORKS 1
 
-#define CONFIG_GZIP 1
-#define CONFIG_ZLIB 1
-
 #endif
diff --git a/lib/Kconfig b/lib/Kconfig
index 366d164cd7..8fe5d85a05 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -301,6 +301,19 @@ config LZO
 	help
 	  This enables support for LZO compression algorithm.r
 
+config GZIP
+	bool "Enable gzip decompression support for SPL build"
+	select ZLIB
+	default y
+	help
+	  This enables support for GZIP compression algorithm.
+
+config ZLIB
+	bool
+	default y
+	help
+	  This enables ZLIB compression lib.
+
 config SPL_LZ4
 	bool "Enable LZ4 decompression support in SPL"
 	help
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index d5e8b5a420..a51dc5e986 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -1182,7 +1182,7 @@ int fdtdec_setup_memory_banksize(void)
 	CONFIG_IS_ENABLED(MULTI_DTB_FIT_LZO)
 static int uncompress_blob(const void *src, ulong sz_src, void **dstp)
 {
-	size_t sz_out = CONFIG_SPL_MULTI_DTB_FIT_UNCOMPRESS_SZ;
+	size_t sz_out = CONFIG_VAL(MULTI_DTB_FIT_UNCOMPRESS_SZ);
 	bool gzip = 0, lzo = 0;
 	ulong sz_in = sz_src;
 	void *dst;
-- 
2.20.1



More information about the U-Boot mailing list