From 95f4bbd581cfde45d4bd1fa5e56c2d880dae7ced Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Fri, 8 Mar 2019 16:06:55 +0100 Subject: [PATCH] lib: fdt: Allow LZO and GZIP DT compression in U-Boot 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 Cc: Nobuhiro Iwamatsu Cc: Simon Glass Cc: Tom Rini Signed-off-by: Marek Vasut --- Makefile | 16 ++++++++++- dts/Kconfig | 57 +++++++++++++++++++++++++++++++++++++++ include/config_defaults.h | 3 --- lib/Kconfig | 13 +++++++++ lib/fdtdec.c | 2 +- 5 files changed, 86 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index aedc2ea4d9..4e4a33d99b 100644 --- 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 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 . +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;