From patchwork Sat Apr 25 17:37:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Robert Marko X-Patchwork-Id: 1276847 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.a=rsa-sha256 header.s=20150623 header.b=XR6IUz6Z; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 498dY23qfTz9sSG for ; Sun, 26 Apr 2020 03:37:55 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 9EEE081CC1; Sat, 25 Apr 2020 19:37:39 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=sartura-hr.20150623.gappssmtp.com header.i=@sartura-hr.20150623.gappssmtp.com header.b="XR6IUz6Z"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 51CDA81CCC; Sat, 25 Apr 2020 19:37:37 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-wm1-x343.google.com (mail-wm1-x343.google.com [IPv6:2a00:1450:4864:20::343]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id C359381CB4 for ; Sat, 25 Apr 2020 19:37:32 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sartura.hr Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=robert.marko@sartura.hr Received: by mail-wm1-x343.google.com with SMTP id v8so12502198wma.0 for ; Sat, 25 Apr 2020 10:37:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sartura-hr.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=2szh+K8NZmKHtsi3PCCD+zZaDO/ZrHLqhbkt+hSyMJg=; b=XR6IUz6ZBb5hpX3nyfa0J/6iTTM70N2tBSfqrV/j/sIRBASDy4fB+Q9YzfEcvMquxa 1T9brGdeZX4bo1QBVrSAXLs+DONyzIM50m4zZ8O48uv1ug9CzUoPoCwVyDPd3uaMAlfk 379AQzzNdmaQP9r1HCYpFUYr1n8mE03m0VBB0swfodcQbuQuy+5NrDZcSH0WUzNtzlS/ lNCL6vE7Es0ASB0tIUrjqu/8swBn+f9BogxUxXuWeZV537cr1pJpxTBemNeQV1TDBPIq bJ4vS9tYsH77nEkjmnbURX2w49DOU1L8nlCdfm3fcvQ7gOMEZhZNVR79mQkFPph/trTm 5RTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=2szh+K8NZmKHtsi3PCCD+zZaDO/ZrHLqhbkt+hSyMJg=; b=jZzpUmPePmo1CGcFwX0Owm8gFtmw0uZY1cSJ+IqPiehdYMYrVErzt+g12dsiwhVS35 evOT6qQa6PmmXko4GBXQ24t4QYv6Y59GArTM0kTJKUGTSZQJHJgdRe38vpfiC3kvhSom WVt9noF7Sz7SXN8j7Ostbi1eoFFrBRmumDiZkFv5jRIa6WJt79JwxYSahf8VFLaEsdbH SQ3Pevdo20lZBVthtu2VTOCC4yHF3jmemSTAjOrs4La3hmw/LnIlUD97x9dOeB1RYoWM bC7yXYKpf270m243YPXHl++ofcks3nCkD9j46QyaxHFlgrCALovcsBchFvGMGL4rZY+F GavA== X-Gm-Message-State: AGi0Pua0V40/QyqnRld26YQpgmK/k+LngdaBJf6CcDodVr/GJB3gkKqg XXBRCn12p00RLJkMF99UolJeFSJhNrgB+KDe4/WKHACdAPaPH5E5oHH5Nf2pFq5Em0pUTCgfP85 tYtZ3FYtbgHGTTo95Z4hE1KC5QVoK7L99ggTqtpC0D9AUlD7w7SLMDQcfjU16HuWV+gZfdnmq X-Google-Smtp-Source: APiQypK8NEwKamMhYbDvVOjdwRkvleAR2Tz/PO/RLaGRrHLfHhPMsN/V/ctJ1yPViuTnyP/OYylpJA== X-Received: by 2002:a1c:7905:: with SMTP id l5mr17803225wme.5.1587836251727; Sat, 25 Apr 2020 10:37:31 -0700 (PDT) Received: from localhost.localdomain ([2a0e:b107:830:0:47e5:c676:4796:5818]) by smtp.googlemail.com with ESMTPSA id o18sm13121677wrp.23.2020.04.25.10.37.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Apr 2020 10:37:31 -0700 (PDT) From: Robert Marko To: u-boot@lists.denx.de Cc: Robert Marko , Luka Perkov Subject: [PATCH] image: Add support for ZSTD decompression Date: Sat, 25 Apr 2020 19:37:21 +0200 Message-Id: <20200425173721.2759955-1-robert.marko@sartura.hr> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean This patch adds support for ZSTD decompression of FIT images. Signed-off-by: Robert Marko Cc: Luka Perkov --- common/image.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ include/image.h | 1 + 2 files changed, 53 insertions(+) diff --git a/common/image.c b/common/image.c index 94873cb6ed..70ba0f4328 100644 --- a/common/image.c +++ b/common/image.c @@ -42,6 +42,7 @@ #include #include #include +#include #ifdef CONFIG_CMD_BDI extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); @@ -193,6 +194,7 @@ static const table_entry_t uimage_comp[] = { { IH_COMP_LZMA, "lzma", "lzma compressed", }, { IH_COMP_LZO, "lzo", "lzo compressed", }, { IH_COMP_LZ4, "lz4", "lz4 compressed", }, + { IH_COMP_ZSTD, "zstd", "zstd compressed", }, { -1, "", "", }, }; @@ -480,6 +482,56 @@ int image_decomp(int comp, ulong load, ulong image_start, int type, break; } #endif /* CONFIG_LZ4 */ +#ifdef CONFIG_ZSTD + case IH_COMP_ZSTD: { + size_t size = unc_len; + ZSTD_DStream *dstream; + ZSTD_inBuffer in_buf; + ZSTD_outBuffer out_buf; + void *workspace; + size_t wsize; + + wsize = ZSTD_DStreamWorkspaceBound(image_len); + workspace = malloc(wsize); + if (!workspace) { + debug("%s: cannot allocate workspace of size %zu\n", __func__, + wsize); + return -1; + } + + dstream = ZSTD_initDStream(image_len, workspace, wsize); + if (!dstream) { + printf("%s: ZSTD_initDStream failed\n", __func__); + return ZSTD_getErrorCode(ret); + } + + in_buf.src = image_buf; + in_buf.pos = 0; + in_buf.size = image_len; + + out_buf.dst = load_buf; + out_buf.pos = 0; + out_buf.size = size; + + while (1) { + size_t ret; + + ret = ZSTD_decompressStream(dstream, &out_buf, &in_buf); + if (ZSTD_isError(ret)) { + printf("%s: ZSTD_decompressStream error %d\n", __func__, + ZSTD_getErrorCode(ret)); + return ZSTD_getErrorCode(ret); + } + + if (in_buf.pos >= image_len || !ret) + break; + } + + image_len = out_buf.pos; + + break; + } +#endif /* CONFIG_ZSTD */ default: printf("Unimplemented compression type %d\n", comp); return -ENOSYS; diff --git a/include/image.h b/include/image.h index 3ffc0fdd68..8c79f6df9e 100644 --- a/include/image.h +++ b/include/image.h @@ -308,6 +308,7 @@ enum { IH_COMP_LZMA, /* lzma Compression Used */ IH_COMP_LZO, /* lzo Compression Used */ IH_COMP_LZ4, /* lz4 Compression Used */ + IH_COMP_ZSTD, /* zstd Compression Used */ IH_COMP_COUNT, };