From patchwork Wed Apr 8 08:09:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roese X-Patchwork-Id: 237380 List-Id: U-Boot discussion From: sr at denx.de (Stefan Roese) Date: Wed, 8 Apr 2020 10:09:37 +0200 Subject: [PATCH 21/26 v6] spl: spl_legacy: Add lzma decompression support for legacy image In-Reply-To: <20200408080942.7694-1-sr@denx.de> References: <20200408080942.7694-1-sr@denx.de> Message-ID: <20200408080942.7694-22-sr@denx.de> From: Weijie Gao This patch adds support for decompressing LZMA compressed u-boot payload in legacy uImage format. Using this patch together with u-boot-lzma.img may be useful for some platforms as they can reduce the size and load time of u-boot payload. Signed-off-by: Weijie Gao Signed-off-by: Stefan Roese Cc: Weijie Gao Cc: Simon Goldschmidt --- Changes in v6: - New patch common/spl/spl_legacy.c | 48 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/common/spl/spl_legacy.c b/common/spl/spl_legacy.c index d0fc4b111e..2cd2a74a4c 100644 --- a/common/spl/spl_legacy.c +++ b/common/spl/spl_legacy.c @@ -4,8 +4,15 @@ */ #include +#include #include +#include +#include +#include + +#define LZMA_LEN (1 << 20) + int spl_parse_legacy_header(struct spl_image_info *spl_image, const struct image_header *header) { @@ -56,15 +63,50 @@ int spl_load_legacy_img(struct spl_image_info *spl_image, const struct image_header *header, uintptr_t dataptr, struct spl_load_info *info) { + __maybe_unused SizeT lzma_len; + __maybe_unused void *src; int ret; ret = spl_parse_image_header(spl_image, header); if (ret) return ret; - dataptr = (uintptr_t)header + sizeof(struct image_header); - info->read(info, dataptr, spl_image->size, - (void *)(unsigned long)spl_image->load_addr); + switch (image_get_comp(header)) { + case IH_COMP_NONE: + info->read(info, dataptr, spl_image->size, + (void *)(unsigned long)spl_image->load_addr); + break; + +#if IS_ENABLED(CONFIG_SPL_LZMA) + case IH_COMP_LZMA: + lzma_len = LZMA_LEN; + + debug("LZMA: Decompressing %08lx to %08lx\n", + dataptr, spl_image->load_addr); + src = malloc(spl_image->size); + if (!src) { + printf("Unable to allocate %d bytes for LZMA\n", + spl_image->size); + return -ENOMEM; + } + + info->read(info, dataptr, spl_image->size, src); + ret = lzmaBuffToBuffDecompress((void *)spl_image->load_addr, + &lzma_len, src, spl_image->size); + if (ret) { + printf("LZMA decompression error: %d\n", ret); + return ret; + } + + spl_image->size = lzma_len; + break; +#endif + + default: + debug("Compression method %s is not supported\n", + genimg_get_comp_short_name(image_get_comp(header))); + return -EINVAL; + } return 0; }