Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp6471319pxb; Wed, 17 Feb 2021 05:35:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJzwnwgHJRiTALH9+bYTZQZJRXjcl7e71PAjddGYj9za+BC/D+MXb3COVslkk1d23miM0P1T X-Received: by 2002:aa7:c5d3:: with SMTP id h19mr2430228eds.69.1613568922935; Wed, 17 Feb 2021 05:35:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613568922; cv=none; d=google.com; s=arc-20160816; b=S+QKPKUMHHjV96Y69pA+xweF3dc+XWe/fCYWZ1SshXpO4fS1nxw/MO6dECQbh+qWUk BldIRJCDMSnrWB/9WtDW+Bimg1nmePh1p2b6fB4jIVZWczyX9R8tFCs6J9OsDJaIbQX2 x+j9Inilejgr4+8q7mgJRSUzAMigJtGvIKrtJA8uyxa8gSsVfSdz4YXHl+zp0EvPy9mK IG76IK+jThhtZXTJaoBwNaTWAiuIkywcWHc6t0jpR4uY7o88zUlsFVoyAt2JTibiVwbA Ng22/42DsKHih8KFVFKb2dyYG9eURwpBb1QAlnVBH+I9ZnO1nP6hHvDoiUz+xOBCjBP7 ihsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=O2PKz8My+lG/iMJmOwhapEP9spuH0INH7P9d43jR2lc=; b=CHJjKGAFi4aHqtbqjszy+4vazIa9gNv0d+3qAjK15zmLF90w4Z5Bid0V1eyuBfhX/R 5qmZOFW62K+muEKs+2Jr1EDLSzG6mfyDnVbfSbjjjAnptLC9PzrRUkCcMYgy9pqntr9g FPPQBmHwFaVXnzfRDPGpB+JCPdbv1SpSrx83v8snFKyXA0Hai0EHtTfL629K7Yh8ba3Y JhJySK4WIlCOy4Umv7zHhvcEc+ZEOHXwUqNMwlvCh2aj262r1ZvySYhqJT+kkJ/T8tHO pBrZ+TpibCFPVRG8g4zjbWwR+iR5+aXGzXqtf5EzRXkq6dHEbG7M1scy9wT5zlv/CxpI 2OSQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o4si1469110ejx.315.2021.02.17.05.34.59; Wed, 17 Feb 2021 05:35:22 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232069AbhBQNR3 (ORCPT + 99 others); Wed, 17 Feb 2021 08:17:29 -0500 Received: from mail-pf1-f170.google.com ([209.85.210.170]:37322 "EHLO mail-pf1-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230426AbhBQNR2 (ORCPT ); Wed, 17 Feb 2021 08:17:28 -0500 Received: by mail-pf1-f170.google.com with SMTP id b145so8399762pfb.4 for ; Wed, 17 Feb 2021 05:17:12 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=O2PKz8My+lG/iMJmOwhapEP9spuH0INH7P9d43jR2lc=; b=XDQcBmuH7Y3H6Fst5/AnEu3Dl3yd+YG4rt1GaQP/GR9LlrtprwGzIrnodQVk+PIfhN lVQ6DtvqNsxHVIdVk2R1maVArHxpKMHt0hi500aNMXIilSkWlcLB19rWGSV+IziSqpDs jkzHrsW0h1bLRPweVfcmIFfed/aZZYY0/zBC8ARcDZJC+gwdy0cFPpSG5I9ZWWSt7xMR abd1aUTXzgrYP6ROCHa2xa0GMvFTnKA/rFiNPaqF4SdYhwoRkPFshWPNC+6310KLRPPl SqCxLq/dfvEYTxvZEJKj2d0oGdRyCBc+Co49ulAJSmai0QLvkZfIRUeaetQxrqOpwF81 nXOA== X-Gm-Message-State: AOAM530kvKzzLLXOplrvSZtiQ3dODALNfBtv3u3jhbHjm4OIpIFNR7fd YAZbcLhtDdYG8TwBmW2IhJU= X-Received: by 2002:a62:4d46:0:b029:1b4:af1d:d3ff with SMTP id a67-20020a624d460000b02901b4af1dd3ffmr24180814pfb.66.1613567806495; Wed, 17 Feb 2021 05:16:46 -0800 (PST) Received: from 42.do-not-panic.com (42.do-not-panic.com. [157.230.128.187]) by smtp.gmail.com with ESMTPSA id t6sm2616169pgp.57.2021.02.17.05.16.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Feb 2021 05:16:45 -0800 (PST) Received: by 42.do-not-panic.com (Postfix, from userid 1000) id 8AA1240277; Wed, 17 Feb 2021 13:16:44 +0000 (UTC) Date: Wed, 17 Feb 2021 13:16:44 +0000 From: Luis Chamberlain To: Takashi Iwai Cc: Greg Kroah-Hartman , "Rafael J . Wysocki" , linux-kernel@vger.kernel.org Subject: Re: [PATCH RFC 1/4] firmware: Add the support for ZSTD-compressed firmware files Message-ID: <20210217131644.GM4332@42.do-not-panic.com> References: <20210127154939.13288-1-tiwai@suse.de> <20210127154939.13288-2-tiwai@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210127154939.13288-2-tiwai@suse.de> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 27, 2021 at 04:49:36PM +0100, Takashi Iwai wrote: > Due to the popular demands on ZSTD, here is a patch to add a support > of ZSTD-compressed firmware files via the direct firmware loader. > It's just like XZ-compressed file support, providing a decompressor > with ZSTD. Since ZSTD API can give the decompression size beforehand, > the code is even simpler than XZ. > > Signed-off-by: Takashi Iwai > --- > drivers/base/firmware_loader/Kconfig | 21 ++++++-- > drivers/base/firmware_loader/main.c | 74 ++++++++++++++++++++++++++-- > 2 files changed, 87 insertions(+), 8 deletions(-) > > diff --git a/drivers/base/firmware_loader/Kconfig b/drivers/base/firmware_loader/Kconfig > index 5b24f3959255..f5307978927c 100644 > --- a/drivers/base/firmware_loader/Kconfig > +++ b/drivers/base/firmware_loader/Kconfig > @@ -157,17 +157,28 @@ config FW_LOADER_USER_HELPER_FALLBACK > > config FW_LOADER_COMPRESS > bool "Enable compressed firmware support" > - select FW_LOADER_PAGED_BUF > - select XZ_DEC > help > This option enables the support for loading compressed firmware > files. The caller of firmware API receives the decompressed file > content. The compressed file is loaded as a fallback, only after > loading the raw file failed at first. > > - Currently only XZ-compressed files are supported, and they have to > - be compressed with either none or crc32 integrity check type (pass > - "-C crc32" option to xz command). > +if FW_LOADER_COMPRESS > +config FW_LOADER_COMPRESS_XZ > + bool "Enable XZ-compressed firmware support" > + select FW_LOADER_PAGED_BUF > + select XZ_DEC > + help > + This option adds the support for XZ-compressed files. > + The files have to be compressed with either none or crc32 > + integrity check type (pass "-C crc32" option to xz command). > + > +config FW_LOADER_COMPRESS_ZSTD > + bool "Enable ZSTD-compressed firmware support" > + select ZSTD_DECOMPRESS > + help > + This option adds the support for ZSTD-compressed files. > +endif # FW_LOADER_COMPRESS > > config FW_CACHE > bool "Enable firmware caching during suspend" > diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c > index 78355095e00d..71332ed4959d 100644 > --- a/drivers/base/firmware_loader/main.c > +++ b/drivers/base/firmware_loader/main.c > @@ -34,6 +34,7 @@ > #include > #include > #include > +#include > #include > > #include > @@ -362,10 +363,72 @@ int fw_map_paged_buf(struct fw_priv *fw_priv) > } > #endif > > +/* > + * ZSTD-compressed firmware support > + */ > +#ifdef CONFIG_FW_LOADER_COMPRESS_ZSTD > +static int fw_decompress_zstd(struct device *dev, struct fw_priv *fw_priv, > + size_t in_size, const void *in_buffer) > +{ > + size_t len, out_size, workspace_size; > + void *workspace, *out_buf; > + ZSTD_DCtx *ctx; > + int err; > + > + if (fw_priv->data) { > + out_size = fw_priv->allocated_size; > + out_buf = fw_priv->data; > + } else { > + out_size = ZSTD_findDecompressedSize(in_buffer, in_size); > + if (out_size == ZSTD_CONTENTSIZE_UNKNOWN || > + out_size == ZSTD_CONTENTSIZE_ERROR) { > + dev_dbg(dev, "%s: invalid decompression size\n", __func__); > + return -EINVAL; > + } > + out_buf = vzalloc(out_size); > + if (!out_buf) > + return -ENOMEM; > + } > + > + workspace_size = ZSTD_DCtxWorkspaceBound(); > + workspace = kvzalloc(workspace_size, GFP_KERNEL); > + if (!workspace) { > + err = -ENOMEM; > + goto error; > + } > + > + ctx = ZSTD_initDCtx(workspace, workspace_size); > + if (!ctx) { > + dev_dbg(dev, "%s: failed to initialize context\n", __func__); > + err = -EINVAL; > + goto error; > + } > + > + len = ZSTD_decompressDCtx(ctx, out_buf, out_size, in_buffer, in_size); > + if (ZSTD_isError(len)) { > + dev_dbg(dev, "%s: failed to decompress: %d\n", __func__, > + ZSTD_getErrorCode(len)); > + err = -EINVAL; > + goto error; > + } > + > + fw_priv->size = len; > + if (!fw_priv->data) > + fw_priv->data = out_buf; > + err = 0; > + > + error: > + kvfree(workspace); > + if (!fw_priv->data) > + vfree(out_buf); > + return err; > +} > +#endif /* CONFIG_FW_LOADER_COMPRESS_ZSTD */ > + > /* > * XZ-compressed firmware support > */ > -#ifdef CONFIG_FW_LOADER_COMPRESS > +#ifdef CONFIG_FW_LOADER_COMPRESS_XZ > /* show an error and return the standard error code */ > static int fw_decompress_xz_error(struct device *dev, enum xz_ret xz_ret) > { > @@ -459,7 +522,7 @@ static int fw_decompress_xz(struct device *dev, struct fw_priv *fw_priv, > else > return fw_decompress_xz_pages(dev, fw_priv, in_size, in_buffer); > } > -#endif /* CONFIG_FW_LOADER_COMPRESS */ > +#endif /* CONFIG_FW_LOADER_COMPRESS_XZ */ > > /* direct firmware loading support */ > static char fw_path_para[256]; > @@ -814,7 +877,12 @@ _request_firmware(const struct firmware **firmware_p, const char *name, > if (!(opt_flags & FW_OPT_PARTIAL)) > nondirect = true; > > -#ifdef CONFIG_FW_LOADER_COMPRESS > +#ifdef CONFIG_FW_LOADER_COMPRESS_ZSTD > + if (ret == -ENOENT && nondirect) > + ret = fw_get_filesystem_firmware(device, fw->priv, ".zst", > + fw_decompress_zstd); > +#endif > +#ifdef CONFIG_FW_LOADER_COMPRESS_XZ > if (ret == -ENOENT && nondirect) > ret = fw_get_filesystem_firmware(device, fw->priv, ".xz", > fw_decompress_xz); Since this is growing, it would be nicer if we avoid the #ifdef mess and simply have code iterate over supported compressions, and this is observed here in one line. Luis