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 <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>
This commit is contained in:
Marek Vasut 2019-03-08 16:06:55 +01:00 committed by Marek Vasut
parent 1fd303543a
commit 95f4bbd581
5 changed files with 86 additions and 5 deletions

View File

@ -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

View 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"

View File

@ -16,7 +16,4 @@
#define CONFIG_BOOTM_RTEMS 1
#define CONFIG_BOOTM_VXWORKS 1
#define CONFIG_GZIP 1
#define CONFIG_ZLIB 1
#endif

View 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

View 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;