lib: fdt: Allow LZO and GZIP DT compression in U-Boot
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Fri, 8 Mar 2019 15:06:55 +0000 (16:06 +0100)
committerMarek Vasut <marex@denx.de>
Tue, 9 Apr 2019 16:19:10 +0000 (18:19 +0200)
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@gmail.com>
Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Cc: Simon Glass <sjg@chromium.org>
Cc: Tom Rini <trini@konsulko.com>
Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Makefile
dts/Kconfig
include/config_defaults.h
lib/Kconfig
lib/fdtdec.c

index aedc2ea4d93b9277be66e97d3197f4b732dbe106..4e4a33d99b008a3abaadf1e8102b830d35534f40 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1020,6 +1020,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)
 
@@ -1027,7 +1041,7 @@ 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
index 3e85914d115399927379abd1ee4fd579a1c6f302..a5f30c8fd03b53559a55190e909b35f0c5cf0527 100644 (file)
@@ -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"
index 7ef928bbe14ae07b8e474e317ae9aa4616bc0199..4ed09683b650a08468600dfc3dae3659dd22e100 100644 (file)
@@ -16,7 +16,4 @@
 #define CONFIG_BOOTM_RTEMS 1
 #define CONFIG_BOOTM_VXWORKS 1
 
-#define CONFIG_GZIP 1
-#define CONFIG_ZLIB 1
-
 #endif
index 366d164cd76064cebd29f507d7b037d2ac2a0379..8fe5d85a050643c512963402ac566d2ad9801848 100644 (file)
@@ -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
index d5e8b5a4200b15690ec8be333d7ab2a1644bf2e4..a51dc5e98670ccf02883ef5ee03633c05db9cdf0 100644 (file)
@@ -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;