From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 89035C4332F for ; Mon, 2 May 2022 20:19:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387294AbiEBUXO (ORCPT ); Mon, 2 May 2022 16:23:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49400 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387279AbiEBUXM (ORCPT ); Mon, 2 May 2022 16:23:12 -0400 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 47A21DF24 for ; Mon, 2 May 2022 13:19:42 -0700 (PDT) Received: by mail-wr1-x436.google.com with SMTP id d5so20877900wrb.6 for ; Mon, 02 May 2022 13:19:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JyBeaEisTTfuBdyCjdFWz6rU+RcrjfHX51t6baBS7eg=; b=SjEekoWNBPcf3lpiJQWJK3I3LHwV7RSSCc40VX8rmYY5qQh3xHAqc84yg8k4jN4Vyg sTWx1WUExcrE5U7JOuRfjunQYhS6S07xId9kB7NxwcImPY51YARBPZlD4ZFFgTLoBxJE Ge4M0uCN/GjxWAfFORKX59Il0yVAbSn6xDNI4Ui+6Eogcz62RKIWQ9CXKpm/CMm9J41L /7qetdF9qs2lKq+gGmFqKJzO3otm1KJKm1WfoNLyrKgIAd/kG8vgVVyWRmIm7S9qAqHg RHIpGZ57JJIz7SEo18J8nKu73LNk3SkvSrylt5sXGnHdOHO5Ytl/qPoEzSOk944jJeLS RkCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JyBeaEisTTfuBdyCjdFWz6rU+RcrjfHX51t6baBS7eg=; b=WJVL/KtKXEzan2IvrlVfrkhKzX290owARWXrUttVtTo+2LnAleIkuHxTN6u+dkhsz3 QTpVEZXuqVX+ATcdyoYR98AZaNBGUEsoCEc+OGV9+W/p7d+wCTHLc4NTVUQo08kYIWp/ X0oXFJWCegLodgDi+qy9hnlxeB/klphTRf4GVoTN70oqqeJXZxIAZe2EwWuIhpDaoCNR mqWzp9nsStz6e5Rg8XMU7eMNkqkxpv4SGyRSIEZU17p5i5ASoYr7hc2HqMLoGRkYLj46 iMiYa7v92Zsv9022bSnGNvOeXNLN82D9snb6Er5T+E7J9i7T2U0X4Am6lN36755hK+XD LjVw== X-Gm-Message-State: AOAM530dNCQ2O3KIqQ+VrNMdICWBFcBlhh84m1BCIM8h0nWC+PNkKLEm QgJfJmDKsj57/f25ZMe5VDbY5w== X-Google-Smtp-Source: ABdhPJzU1nZZ771o9FZhdjnbZOE84F+KnOeDrsRL6QyXPle5+aSlX4Tdq0QRmYpQPEcfMtu/UKdpow== X-Received: by 2002:a05:6000:2ae:b0:20c:57b6:32e1 with SMTP id l14-20020a05600002ae00b0020c57b632e1mr8763861wry.285.1651522780863; Mon, 02 May 2022 13:19:40 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:40 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 01/19] crypto: sun8i-ce: Fix minor style issue Date: Mon, 2 May 2022 20:19:11 +0000 Message-Id: <20220502201929.843194-2-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch remove a double blank line. Signed-off-by: Corentin Labbe --- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c b/drivers/= crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c index 35e3cadccac2..01d032e08825 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c @@ -398,7 +398,6 @@ int sun8i_ce_cipher_init(struct crypto_tfm *tfm) sktfm->reqsize =3D sizeof(struct sun8i_cipher_req_ctx) + crypto_skcipher_reqsize(op->fallback_tfm); =20 - dev_info(op->ce->dev, "Fallback for %s is %s\n", crypto_tfm_alg_driver_name(&sktfm->base), crypto_tfm_alg_driver_name(crypto_skcipher_tfm(op->fallback_tfm))); --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D7AD1C433F5 for ; Mon, 2 May 2022 20:19:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387300AbiEBUXZ (ORCPT ); Mon, 2 May 2022 16:23:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49420 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387289AbiEBUXN (ORCPT ); Mon, 2 May 2022 16:23:13 -0400 Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6475EDF2C for ; Mon, 2 May 2022 13:19:43 -0700 (PDT) Received: by mail-wr1-x432.google.com with SMTP id j15so20918449wrb.2 for ; Mon, 02 May 2022 13:19:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=iftm/xI9kjeXJZ8tzRtFxN8q5aP521PJh04tHDEPczk=; b=OLZn8wzs0SlfRU2PIzVeps0bRFz+wb+TGtOfLraEFXJFFGA3kIyDJUg8dcHMJOIGZ3 0T1FNYkhv+JvfAAvvLRs85Lykfa4N3MCf8p8jbRh4Z4/3p+FOvg0KDST4OMckcEeMywq SXfJia350VVa8y+bQIDyKCiWfm4G2ncaxLwrvmWbkRQMqGE24S2LSEz9ooNsVXCOhqve gsvX2DU1cp1cDDtpm9PyXnO6NP/YRGyrH75M4JLvWSNy1DZxu6LKyr++lXyYyj2SDDbN x78Mn+RCZXdBKSzXlVRbyS5js58uH95FpkrXRuruhtjj8LnLK29m51ROwOvTDhkmodMR os/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=iftm/xI9kjeXJZ8tzRtFxN8q5aP521PJh04tHDEPczk=; b=tc6K8ZrTGwNJ5y//If8DJDpVJCCc7G+cR1mvy1io1QMXyow4AP/ly2X4EezFH1+VUg RvwbY4bQ8rvcWG5F7ARij9IWFcN9yKvu0PMKPzcKpL24hG0Lc29I6Q37u00ffynfHeuy Vokhm655+fWB5cxk917rfXFB9k+03EApItslVMFgbjawXEAYURIV5wIM6HkYko5kihHO THiHebFoHaqrBVWYg2kkbwPhwRmzKg8t1H+bE/L6zerw3VBaGHP4W1in1q8oZPpmeiDQ 2B/LBJZAn2AU6wB+pfi933bK6xD9vBbz92BmImcYo590Dxa1bfAC0/NeIappyqnOJifL CFmQ== X-Gm-Message-State: AOAM532te+wsCDmuVpTGVTbHrqbEQbIuXyEHNxydq9FI14uwqESZ0w59 Kq6LpTgaew59wA0zUiDhSw9Hdg== X-Google-Smtp-Source: ABdhPJzBRUXtiwQ8U2lS/OaOJ883x4sxzqJC8uGEldMd2VYPU4VjUCeKbJeBUiCkCytoCUYs3LwcTw== X-Received: by 2002:adf:ec89:0:b0:20a:c0a4:e4a3 with SMTP id z9-20020adfec89000000b0020ac0a4e4a3mr10218312wrn.98.1651522781952; Mon, 02 May 2022 13:19:41 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:41 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 02/19] crypto: sun8i-ce: do not allocate memory when handling requests Date: Mon, 2 May 2022 20:19:12 +0000 Message-Id: <20220502201929.843194-3-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Instead of allocate memory on each requests, it is easier to pre-allocate buffer for IV. This made error path easier. Signed-off-by: Corentin Labbe --- .../allwinner/sun8i-ce/sun8i-ce-cipher.c | 29 ++++++------------- .../crypto/allwinner/sun8i-ce/sun8i-ce-core.c | 20 ++++++++++--- drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h | 8 ++--- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c b/drivers/= crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c index 01d032e08825..0b1ce58bdeb9 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c @@ -152,23 +152,13 @@ static int sun8i_ce_cipher_prepare(struct crypto_engi= ne *engine, void *async_req ivsize =3D crypto_skcipher_ivsize(tfm); if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) { rctx->ivlen =3D ivsize; - rctx->bounce_iv =3D kzalloc(ivsize, GFP_KERNEL | GFP_DMA); - if (!rctx->bounce_iv) { - err =3D -ENOMEM; - goto theend_key; - } if (rctx->op_dir & CE_DECRYPTION) { - rctx->backup_iv =3D kzalloc(ivsize, GFP_KERNEL); - if (!rctx->backup_iv) { - err =3D -ENOMEM; - goto theend_key; - } offset =3D areq->cryptlen - ivsize; - scatterwalk_map_and_copy(rctx->backup_iv, areq->src, + scatterwalk_map_and_copy(chan->backup_iv, areq->src, offset, ivsize, 0); } - memcpy(rctx->bounce_iv, areq->iv, ivsize); - rctx->addr_iv =3D dma_map_single(ce->dev, rctx->bounce_iv, rctx->ivlen, + memcpy(chan->bounce_iv, areq->iv, ivsize); + rctx->addr_iv =3D dma_map_single(ce->dev, chan->bounce_iv, rctx->ivlen, DMA_TO_DEVICE); if (dma_mapping_error(ce->dev, rctx->addr_iv)) { dev_err(ce->dev, "Cannot DMA MAP IV\n"); @@ -257,16 +247,15 @@ static int sun8i_ce_cipher_prepare(struct crypto_engi= ne *engine, void *async_req dma_unmap_single(ce->dev, rctx->addr_iv, rctx->ivlen, DMA_TO_DEVICE); offset =3D areq->cryptlen - ivsize; if (rctx->op_dir & CE_DECRYPTION) { - memcpy(areq->iv, rctx->backup_iv, ivsize); - kfree_sensitive(rctx->backup_iv); + memcpy(areq->iv, chan->backup_iv, ivsize); + memzero_explicit(chan->backup_iv, ivsize); } else { scatterwalk_map_and_copy(areq->iv, areq->dst, offset, ivsize, 0); } - kfree(rctx->bounce_iv); + memzero_explicit(chan->bounce_iv, ivsize); } =20 -theend_key: dma_unmap_single(ce->dev, rctx->addr_key, op->keylen, DMA_TO_DEVICE); =20 theend: @@ -322,13 +311,13 @@ static int sun8i_ce_cipher_unprepare(struct crypto_en= gine *engine, void *async_r dma_unmap_single(ce->dev, rctx->addr_iv, rctx->ivlen, DMA_TO_DEVICE); offset =3D areq->cryptlen - ivsize; if (rctx->op_dir & CE_DECRYPTION) { - memcpy(areq->iv, rctx->backup_iv, ivsize); - kfree_sensitive(rctx->backup_iv); + memcpy(areq->iv, chan->backup_iv, ivsize); + memzero_explicit(chan->backup_iv, ivsize); } else { scatterwalk_map_and_copy(areq->iv, areq->dst, offset, ivsize, 0); } - kfree(rctx->bounce_iv); + memzero_explicit(chan->bounce_iv, ivsize); } =20 dma_unmap_single(ce->dev, rctx->addr_key, op->keylen, DMA_TO_DEVICE); diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c b/drivers/cr= ypto/allwinner/sun8i-ce/sun8i-ce-core.c index 8be27a462784..8f902607af68 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c @@ -305,7 +305,7 @@ static struct sun8i_ce_alg_template ce_algs[] =3D { .cra_priority =3D 400, .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_TYPE_SKCIPHER | - CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, .cra_ctxsize =3D sizeof(struct sun8i_cipher_tfm_ctx), .cra_module =3D THIS_MODULE, @@ -332,7 +332,7 @@ static struct sun8i_ce_alg_template ce_algs[] =3D { .cra_priority =3D 400, .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_TYPE_SKCIPHER | - CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, .cra_ctxsize =3D sizeof(struct sun8i_cipher_tfm_ctx), .cra_module =3D THIS_MODULE, @@ -358,7 +358,7 @@ static struct sun8i_ce_alg_template ce_algs[] =3D { .cra_priority =3D 400, .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_TYPE_SKCIPHER | - CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, .cra_ctxsize =3D sizeof(struct sun8i_cipher_tfm_ctx), .cra_module =3D THIS_MODULE, @@ -385,7 +385,7 @@ static struct sun8i_ce_alg_template ce_algs[] =3D { .cra_priority =3D 400, .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_TYPE_SKCIPHER | - CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, .cra_ctxsize =3D sizeof(struct sun8i_cipher_tfm_ctx), .cra_module =3D THIS_MODULE, @@ -728,6 +728,18 @@ static int sun8i_ce_allocate_chanlist(struct sun8i_ce_= dev *ce) err =3D -ENOMEM; goto error_engine; } + ce->chanlist[i].bounce_iv =3D devm_kmalloc(ce->dev, AES_BLOCK_SIZE, + GFP_KERNEL | GFP_DMA); + if (!ce->chanlist[i].bounce_iv) { + err =3D -ENOMEM; + goto error_engine; + } + ce->chanlist[i].backup_iv =3D devm_kmalloc(ce->dev, AES_BLOCK_SIZE, + GFP_KERNEL); + if (!ce->chanlist[i].backup_iv) { + err =3D -ENOMEM; + goto error_engine; + } } return 0; error_engine: diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h b/drivers/crypto/= allwinner/sun8i-ce/sun8i-ce.h index 719f9a730857..229b696d5a2c 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h @@ -213,6 +213,8 @@ struct ce_task { * @status: set to 1 by interrupt if task is done * @t_phy: Physical address of task * @tl: pointer to the current ce_task for this flow + * @backup_iv: buffer which contain the next IV to store + * @bounce_iv: buffer which contain the IV * @stat_req: number of request done by this flow */ struct sun8i_ce_flow { @@ -222,6 +224,8 @@ struct sun8i_ce_flow { dma_addr_t t_phy; int timeout; struct ce_task *tl; + void *backup_iv; + void *bounce_iv; #ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_DEBUG unsigned long stat_req; #endif @@ -268,8 +272,6 @@ struct sun8i_ce_dev { * struct sun8i_cipher_req_ctx - context for a skcipher request * @op_dir: direction (encrypt vs decrypt) for this request * @flow: the flow to use for this request - * @backup_iv: buffer which contain the next IV to store - * @bounce_iv: buffer which contain the IV * @ivlen: size of bounce_iv * @nr_sgs: The number of source SG (as given by dma_map_sg()) * @nr_sgd: The number of destination SG (as given by dma_map_sg()) @@ -280,8 +282,6 @@ struct sun8i_ce_dev { struct sun8i_cipher_req_ctx { u32 op_dir; int flow; - void *backup_iv; - void *bounce_iv; unsigned int ivlen; int nr_sgs; int nr_sgd; --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 174DEC433EF for ; Mon, 2 May 2022 20:20:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387345AbiEBUX3 (ORCPT ); Mon, 2 May 2022 16:23:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49456 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352110AbiEBUXP (ORCPT ); Mon, 2 May 2022 16:23:15 -0400 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1925DF21 for ; Mon, 2 May 2022 13:19:44 -0700 (PDT) Received: by mail-wr1-x433.google.com with SMTP id w4so20845756wrg.12 for ; Mon, 02 May 2022 13:19:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+bzBSnYxnno3ubCsu2RX/z6PxzsqdZYUM+vjWEuZhKY=; b=GxlhQp5w8ZuJqgjBx6Zl1aym3RLt7VZe8OBwmdaGKDWWTDH6AegMB+WV64l0mZrWC+ eZauRXWf+sSFmjWkXytfcD3iAlaiXJMP4lVmmlcOl5t6N0kILe7fUkBEY031QSeR4U/b jshsTBKf9Crf7ictWjp4M0RXZVDYVqd5ecsJS3kS1TdBNvJU01WXuaL/4vZX4q17DIX9 r0nqPN2UbN3d925lXp9WV7VTShNitOE+wFsYjpO7iwbJGpgm5batKtjiKSTrmpji/j81 eMtD+9fDWSBaHd2kRQH0YsLS29S80QhJwmrYJzt8utV3P2fvhLkx/RVWKWJHbq3UekkQ TVBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+bzBSnYxnno3ubCsu2RX/z6PxzsqdZYUM+vjWEuZhKY=; b=TIstRoiWfDipRsR/CjkIhtl9ha8ZSabLq4xnLp/lC4nIJ8KSiwUq1zM1N8+Xgzlq1r j0f6dkRE9U36M8xURwFVb1ouyH4bHe7wMxcbQmt4RnqJ+7AtjjnuKe7pJmPS8EixgEL4 E5M5e7sdzSmkZR1Li6NhtqKPtkaZZ7R454HBiyZQtO+6pBx19faf6uEHJ3kS9lhlps3C 4stPCX/V+swdEQarmtXONVXguwAsBQeDE803qyPAihsMx13dUdNyevpdzC89tv6X/PJw URG1WgrnVkMPdyherN5/lIwjuy3b1ny6w+5/Xf7OzSW6x7pZgLeJlzp8n01Iy1kCWXJd XRCw== X-Gm-Message-State: AOAM530Y9Fc46/B7frSAVCOLoJb+aXRSfgtM5oUEW14JTBziPTOTAnNN kWAcUkBb5vUclaPDm0I+ZlSvpg== X-Google-Smtp-Source: ABdhPJwFrgBjSnqhajyzAIXw5oe4LmQJf7erSZFSRVx/6BCzkZ5YZlAaQoIpNBQ8MyvzwU7lvhdbhQ== X-Received: by 2002:a5d:47af:0:b0:20c:6701:50be with SMTP id 15-20020a5d47af000000b0020c670150bemr3602958wrb.148.1651522783039; Mon, 02 May 2022 13:19:43 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:42 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 03/19] crypto: sun4i-ss: do not allocate backup IV on requests Date: Mon, 2 May 2022 20:19:13 +0000 Message-Id: <20220502201929.843194-4-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Instead of allocate memory on each requests, it is easier to pre-allocate buffer for backup IV. This made error path easier. Signed-off-by: Corentin Labbe --- .../allwinner/sun4i-ss/sun4i-ss-cipher.c | 22 +++++++------------ drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h | 1 + 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c b/drivers/= crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c index 8dc2a475c601..a8c784acce13 100644 --- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c @@ -20,7 +20,6 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct s= kcipher_request *areq) unsigned int ivsize =3D crypto_skcipher_ivsize(tfm); struct sun4i_cipher_req_ctx *ctx =3D skcipher_request_ctx(areq); u32 mode =3D ctx->mode; - void *backup_iv =3D NULL; /* when activating SS, the default FIFO space is SS_RX_DEFAULT(32) */ u32 rx_cnt =3D SS_RX_DEFAULT; u32 tx_cnt =3D 0; @@ -47,10 +46,8 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct = skcipher_request *areq) } =20 if (areq->iv && ivsize > 0 && mode & SS_DECRYPTION) { - backup_iv =3D kzalloc(ivsize, GFP_KERNEL); - if (!backup_iv) - return -ENOMEM; - scatterwalk_map_and_copy(backup_iv, areq->src, areq->cryptlen - ivsize, = ivsize, 0); + scatterwalk_map_and_copy(ctx->backup_iv, areq->src, + areq->cryptlen - ivsize, ivsize, 0); } =20 if (IS_ENABLED(CONFIG_CRYPTO_DEV_SUN4I_SS_DEBUG)) { @@ -133,8 +130,8 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct= skcipher_request *areq) =20 if (areq->iv) { if (mode & SS_DECRYPTION) { - memcpy(areq->iv, backup_iv, ivsize); - kfree_sensitive(backup_iv); + memcpy(areq->iv, ctx->backup_iv, ivsize); + memzero_explicit(ctx->backup_iv, ivsize); } else { scatterwalk_map_and_copy(areq->iv, areq->dst, areq->cryptlen - ivsize, ivsize, 0); @@ -198,7 +195,6 @@ static int sun4i_ss_cipher_poll(struct skcipher_request= *areq) unsigned int ileft =3D areq->cryptlen; unsigned int oleft =3D areq->cryptlen; unsigned int todo; - void *backup_iv =3D NULL; struct sg_mapping_iter mi, mo; unsigned long pi =3D 0, po =3D 0; /* progress for in and out */ bool miter_err; @@ -242,10 +238,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_reques= t *areq) return sun4i_ss_cipher_poll_fallback(areq); =20 if (areq->iv && ivsize > 0 && mode & SS_DECRYPTION) { - backup_iv =3D kzalloc(ivsize, GFP_KERNEL); - if (!backup_iv) - return -ENOMEM; - scatterwalk_map_and_copy(backup_iv, areq->src, areq->cryptlen - ivsize, = ivsize, 0); + scatterwalk_map_and_copy(ctx->backup_iv, areq->src, + areq->cryptlen - ivsize, ivsize, 0); } =20 if (IS_ENABLED(CONFIG_CRYPTO_DEV_SUN4I_SS_DEBUG)) { @@ -382,8 +376,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request= *areq) } if (areq->iv) { if (mode & SS_DECRYPTION) { - memcpy(areq->iv, backup_iv, ivsize); - kfree_sensitive(backup_iv); + memcpy(areq->iv, ctx->backup_iv, ivsize); + memzero_explicit(ctx->backup_iv, ivsize); } else { scatterwalk_map_and_copy(areq->iv, areq->dst, areq->cryptlen - ivsize, ivsize, 0); diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h b/drivers/crypto/= allwinner/sun4i-ss/sun4i-ss.h index 0fee6f4e2d90..ba59c7a48825 100644 --- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h +++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h @@ -183,6 +183,7 @@ struct sun4i_tfm_ctx { =20 struct sun4i_cipher_req_ctx { u32 mode; + u8 backup_iv[AES_BLOCK_SIZE]; struct skcipher_request fallback_req; // keep at the end }; =20 --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A5ABBC433EF for ; Mon, 2 May 2022 20:20:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387356AbiEBUXf (ORCPT ); Mon, 2 May 2022 16:23:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49468 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387298AbiEBUXP (ORCPT ); Mon, 2 May 2022 16:23:15 -0400 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 938A0DF2E for ; Mon, 2 May 2022 13:19:45 -0700 (PDT) Received: by mail-wr1-x435.google.com with SMTP id u3so20899109wrg.3 for ; Mon, 02 May 2022 13:19:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JELRq3WIzD/2Al+0unO0twKegBQk0dtbra5g2DiHmA8=; b=jZ9zEjpnNJpUrkFNzIF8fHW544R2fsU5GZOGzjVgtTiNXEK/50GEAIkpPkfEHA7D6x 7sVLMbDUasymGIMNVLvHxC8w5otgxDVtOh9Qf5GOFJ+/zm60EMla8BkJkhXTIJ24kUll Y/HWy1J5w7yWa/iMIbXa1a6gVfLHNqsW47XWGM+sUt7Cmwrir1joZa+VLOarTYfcnMMN 6w69Idrbu8et2GGrHbVgqfEKgfV6Ch+I5l3CzN8vUGH8ossVWijIOZ4H+2svdcysXNq1 4O4tO7KTaolG/HAQV7cSb/pKgIgLMgXCC98ujz0+JqABt/wpEZHHI8TzLq46nYTGzvfT 7Y1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JELRq3WIzD/2Al+0unO0twKegBQk0dtbra5g2DiHmA8=; b=Ow+yLDGSTJ0QJwI1xC0Zy+k/mNzK40YSl4bwi5FSxyJO61ZHa52mYYGLD/l1estL06 1IlRbgOd7zPeJET66FRaV3Fj/tvvW+tHw3uJog7sd2VJ3uTgELKslRK1igShuC65BYB0 aNg3CypS2AJTtDkUUXjvl+X+wE5UeMo+X/2hbARVAP2elgOFXZtETiOuSkBcNpER3ynd mJtAr8XQqStuTUgAHn9Ad7/Fr2nIT+hYBw4fTg8FxM2RMdCpc6biMxA7sOaH5os10sHo 0fzrPmDu2fogz+/8pxb1cQp3IdW5eROIU+y5eUULL7WiA9RmeHUYbniMT954M3GZOlDi IBNA== X-Gm-Message-State: AOAM532M+ilAi0hLimX7/cBEQuSqJa5Nh+wDneMtEuOhwlRAG6pk92gB 7WOHeyLl+wgDk+xf6j9AnZYaPw== X-Google-Smtp-Source: ABdhPJxUF4tt0QPpo0SzqYKZgfMV8xnAc5qgyddGFC9frGOUuzZSvi0ykBBkYbHfOrFzgJO+69kw8w== X-Received: by 2002:a5d:4008:0:b0:20a:ea86:e101 with SMTP id n8-20020a5d4008000000b0020aea86e101mr10809038wrp.141.1651522784101; Mon, 02 May 2022 13:19:44 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:43 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 04/19] crypto: sun8i-ss: rework handling of IV Date: Mon, 2 May 2022 20:19:14 +0000 Message-Id: <20220502201929.843194-5-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" sun8i-ss fail handling IVs when doing decryption of multiple SGs in-place. It should backup the last block of each SG source for using it later as IVs. In the same time remove allocation on requests path for storing all IVs. Fixes: f08fcced6d00 ("crypto: allwinner - Add sun8i-ss cryptographic offloa= der") Signed-off-by: Corentin Labbe --- .../allwinner/sun8i-ss/sun8i-ss-cipher.c | 115 ++++++++++++------ .../crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 30 +++-- drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 14 ++- 3 files changed, 107 insertions(+), 52 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/= crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c index 554e400d41ca..70e2e6e37389 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c @@ -93,6 +93,68 @@ static int sun8i_ss_cipher_fallback(struct skcipher_requ= est *areq) return err; } =20 +static int sun8i_ss_setup_ivs(struct skcipher_request *areq) +{ + struct crypto_skcipher *tfm =3D crypto_skcipher_reqtfm(areq); + struct sun8i_cipher_tfm_ctx *op =3D crypto_skcipher_ctx(tfm); + struct sun8i_ss_dev *ss =3D op->ss; + struct sun8i_cipher_req_ctx *rctx =3D skcipher_request_ctx(areq); + struct scatterlist *sg =3D areq->src; + unsigned int todo, offset; + unsigned int len =3D areq->cryptlen; + unsigned int ivsize =3D crypto_skcipher_ivsize(tfm); + struct sun8i_ss_flow *sf =3D &ss->flows[rctx->flow]; + int i =3D 0; + u32 a; + int err; + + rctx->ivlen =3D ivsize; + if (rctx->op_dir & SS_DECRYPTION) { + offset =3D areq->cryptlen - ivsize; + scatterwalk_map_and_copy(sf->biv, areq->src, offset, + ivsize, 0); + } + + /* we need to copy all IVs from source in case DMA is bi-directionnal */ + while (sg && len) { + if (sg_dma_len(sg) =3D=3D 0) { + sg =3D sg_next(sg); + continue; + } + if (i =3D=3D 0) + memcpy(sf->iv[0], areq->iv, ivsize); + a =3D dma_map_single(ss->dev, sf->iv[i], ivsize, DMA_TO_DEVICE); + if (dma_mapping_error(ss->dev, a)) { + memzero_explicit(sf->iv[i], ivsize); + dev_err(ss->dev, "Cannot DMA MAP IV\n"); + err =3D -EFAULT; + goto dma_iv_error; + } + rctx->p_iv[i] =3D a; + /* we need to setup all others IVs only in the decrypt way */ + if (rctx->op_dir & SS_ENCRYPTION) + return 0; + todo =3D min(len, sg_dma_len(sg)); + len -=3D todo; + i++; + if (i < MAX_SG) { + offset =3D sg->length - ivsize; + scatterwalk_map_and_copy(sf->iv[i], sg, offset, ivsize, 0); + } + rctx->niv =3D i; + sg =3D sg_next(sg); + } + + return 0; +dma_iv_error: + i--; + while (i >=3D 0) { + dma_unmap_single(ss->dev, rctx->p_iv[i], ivsize, DMA_TO_DEVICE); + memzero_explicit(sf->iv[i], ivsize); + } + return err; +} + static int sun8i_ss_cipher(struct skcipher_request *areq) { struct crypto_skcipher *tfm =3D crypto_skcipher_reqtfm(areq); @@ -101,9 +163,9 @@ static int sun8i_ss_cipher(struct skcipher_request *are= q) struct sun8i_cipher_req_ctx *rctx =3D skcipher_request_ctx(areq); struct skcipher_alg *alg =3D crypto_skcipher_alg(tfm); struct sun8i_ss_alg_template *algt; + struct sun8i_ss_flow *sf =3D &ss->flows[rctx->flow]; struct scatterlist *sg; unsigned int todo, len, offset, ivsize; - void *backup_iv =3D NULL; int nr_sgs =3D 0; int nr_sgd =3D 0; int err =3D 0; @@ -134,30 +196,9 @@ static int sun8i_ss_cipher(struct skcipher_request *ar= eq) =20 ivsize =3D crypto_skcipher_ivsize(tfm); if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) { - rctx->ivlen =3D ivsize; - rctx->biv =3D kzalloc(ivsize, GFP_KERNEL | GFP_DMA); - if (!rctx->biv) { - err =3D -ENOMEM; + err =3D sun8i_ss_setup_ivs(areq); + if (err) goto theend_key; - } - if (rctx->op_dir & SS_DECRYPTION) { - backup_iv =3D kzalloc(ivsize, GFP_KERNEL); - if (!backup_iv) { - err =3D -ENOMEM; - goto theend_key; - } - offset =3D areq->cryptlen - ivsize; - scatterwalk_map_and_copy(backup_iv, areq->src, offset, - ivsize, 0); - } - memcpy(rctx->biv, areq->iv, ivsize); - rctx->p_iv =3D dma_map_single(ss->dev, rctx->biv, rctx->ivlen, - DMA_TO_DEVICE); - if (dma_mapping_error(ss->dev, rctx->p_iv)) { - dev_err(ss->dev, "Cannot DMA MAP IV\n"); - err =3D -ENOMEM; - goto theend_iv; - } } if (areq->src =3D=3D areq->dst) { nr_sgs =3D dma_map_sg(ss->dev, areq->src, sg_nents(areq->src), @@ -243,21 +284,19 @@ static int sun8i_ss_cipher(struct skcipher_request *a= req) } =20 theend_iv: - if (rctx->p_iv) - dma_unmap_single(ss->dev, rctx->p_iv, rctx->ivlen, - DMA_TO_DEVICE); - if (areq->iv && ivsize > 0) { - if (rctx->biv) { - offset =3D areq->cryptlen - ivsize; - if (rctx->op_dir & SS_DECRYPTION) { - memcpy(areq->iv, backup_iv, ivsize); - kfree_sensitive(backup_iv); - } else { - scatterwalk_map_and_copy(areq->iv, areq->dst, offset, - ivsize, 0); - } - kfree(rctx->biv); + for (i =3D 0; i < rctx->niv; i++) { + dma_unmap_single(ss->dev, rctx->p_iv[i], ivsize, DMA_TO_DEVICE); + memzero_explicit(sf->iv[i], ivsize); + } + + offset =3D areq->cryptlen - ivsize; + if (rctx->op_dir & SS_DECRYPTION) { + memcpy(areq->iv, sf->biv, ivsize); + memzero_explicit(sf->biv, ivsize); + } else { + scatterwalk_map_and_copy(areq->iv, areq->dst, offset, + ivsize, 0); } } =20 diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-core.c index 319fe3279a71..657530578643 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c @@ -66,6 +66,7 @@ int sun8i_ss_run_task(struct sun8i_ss_dev *ss, struct sun= 8i_cipher_req_ctx *rctx const char *name) { int flow =3D rctx->flow; + unsigned int ivlen =3D rctx->ivlen; u32 v =3D SS_START; int i; =20 @@ -104,15 +105,14 @@ int sun8i_ss_run_task(struct sun8i_ss_dev *ss, struct= sun8i_cipher_req_ctx *rctx mutex_lock(&ss->mlock); writel(rctx->p_key, ss->base + SS_KEY_ADR_REG); =20 - if (i =3D=3D 0) { - if (rctx->p_iv) - writel(rctx->p_iv, ss->base + SS_IV_ADR_REG); - } else { - if (rctx->biv) { - if (rctx->op_dir =3D=3D SS_ENCRYPTION) - writel(rctx->t_dst[i - 1].addr + rctx->t_dst[i - 1].len * 4 - rctx->i= vlen, ss->base + SS_IV_ADR_REG); + if (ivlen) { + if (rctx->op_dir =3D=3D SS_ENCRYPTION) { + if (i =3D=3D 0) + writel(rctx->p_iv[0], ss->base + SS_IV_ADR_REG); else - writel(rctx->t_src[i - 1].addr + rctx->t_src[i - 1].len * 4 - rctx->i= vlen, ss->base + SS_IV_ADR_REG); + writel(rctx->t_dst[i - 1].addr + rctx->t_dst[i - 1].len * 4 - ivlen, = ss->base + SS_IV_ADR_REG); + } else { + writel(rctx->p_iv[i], ss->base + SS_IV_ADR_REG); } } =20 @@ -464,7 +464,7 @@ static void sun8i_ss_free_flows(struct sun8i_ss_dev *ss= , int i) */ static int allocate_flows(struct sun8i_ss_dev *ss) { - int i, err; + int i, j, err; =20 ss->flows =3D devm_kcalloc(ss->dev, MAXFLOW, sizeof(struct sun8i_ss_flow), GFP_KERNEL); @@ -474,6 +474,18 @@ static int allocate_flows(struct sun8i_ss_dev *ss) for (i =3D 0; i < MAXFLOW; i++) { init_completion(&ss->flows[i].complete); =20 + ss->flows[i].biv =3D devm_kmalloc(ss->dev, AES_BLOCK_SIZE, + GFP_KERNEL | GFP_DMA); + if (!ss->flows[i].biv) + goto error_engine; + + for (j =3D 0; j < MAX_SG; j++) { + ss->flows[i].iv[j] =3D devm_kmalloc(ss->dev, AES_BLOCK_SIZE, + GFP_KERNEL | GFP_DMA); + if (!ss->flows[i].iv[j]) + goto error_engine; + } + ss->flows[i].engine =3D crypto_engine_alloc_init(ss->dev, true); if (!ss->flows[i].engine) { dev_err(ss->dev, "Cannot allocate engine\n"); diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/= allwinner/sun8i-ss/sun8i-ss.h index 28188685b910..57ada8653855 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h @@ -121,11 +121,15 @@ struct sginfo { * @complete: completion for the current task on this flow * @status: set to 1 by interrupt if task is done * @stat_req: number of request done by this flow + * @iv: list of IV to use for each step + * @biv: buffer which contain the backuped IV */ struct sun8i_ss_flow { struct crypto_engine *engine; struct completion complete; int status; + u8 *iv[MAX_SG]; + u8 *biv; #ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG unsigned long stat_req; #endif @@ -164,28 +168,28 @@ struct sun8i_ss_dev { * @t_src: list of mapped SGs with their size * @t_dst: list of mapped SGs with their size * @p_key: DMA address of the key - * @p_iv: DMA address of the IV + * @p_iv: DMA address of the IVs + * @niv: Number of IVs DMA mapped * @method: current algorithm for this request * @op_mode: op_mode for this request * @op_dir: direction (encrypt vs decrypt) for this request * @flow: the flow to use for this request - * @ivlen: size of biv + * @ivlen: size of IVs * @keylen: keylen for this request - * @biv: buffer which contain the IV * @fallback_req: request struct for invoking the fallback skcipher TFM */ struct sun8i_cipher_req_ctx { struct sginfo t_src[MAX_SG]; struct sginfo t_dst[MAX_SG]; u32 p_key; - u32 p_iv; + u32 p_iv[MAX_SG]; + int niv; u32 method; u32 op_mode; u32 op_dir; int flow; unsigned int ivlen; unsigned int keylen; - void *biv; struct skcipher_request fallback_req; // keep at the end }; =20 --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C341AC433EF for ; Mon, 2 May 2022 20:20:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387351AbiEBUXc (ORCPT ); Mon, 2 May 2022 16:23:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387309AbiEBUXV (ORCPT ); Mon, 2 May 2022 16:23:21 -0400 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 88A0CDF34 for ; Mon, 2 May 2022 13:19:46 -0700 (PDT) Received: by mail-wr1-x434.google.com with SMTP id q23so20901986wra.1 for ; Mon, 02 May 2022 13:19:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bhu4eLQiIRL8RKU2XjxwIhN+TQjOmHOSbzeiE02npHs=; b=6mXw8hwrlWl+Lkou1IHnPcR77Qj8SjR1rk5xX35wNVTGHj6WtCPHn99tOmMe+TGTN1 4VgSQgDOlo5/JSZMWl3vs9FdGpgMGgmtkJ9bJahqqI5vps2zSM0H5oVgz/wpO566AzdU eprVi0pxD24DKfdZG860cuQbtiA+xHxIaVkbs8ZhFhUoGDl6xOf23Zrri7VG6K10+KPb j4TcN8DKkI6RbHnyVc3PD5aHXBx0F+Nm+xJ03cm8+6aLcduNrCeoejmoLfpu92wZ+wdU m6rr+1WrTrsF+sE2tq88t9RK7t09r207MGczHOurB27e99Ru0DFBDOjKEbdda7IdROwV zofw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bhu4eLQiIRL8RKU2XjxwIhN+TQjOmHOSbzeiE02npHs=; b=3z4ihhncDbVLL50uGulnLzNy73w6L43yICzVvLoHNvv+5kx81rYSGs3IT01/NlU/BN h9QE87/jlT1161OwXYR6yGx0+h8zdIIk9YfyWOHR/A2aDAxYnBf/8n6R+kooknJ+dHaT sAO2jNhQ+PM27i7ust9kBwIJYlaZ+P+6Cg1nJGREYKQV+AqIJkRmaAvkcjBUEu5mwWU2 9OkDInLXi50timvO9BzB1/lsELQn4ya3rt8zZzuc9zWCLoaVABsYB/E4f7C8E5JHeVad Gy/isxz9jxn9xzBOT/OzQG4LFy2byw/2buhZEcU1sqFh9E+YaucfM069BGNyh7gJYDg0 Xcyw== X-Gm-Message-State: AOAM533OrVth/Ac/1HBX3hR5e6HgAdYsGCIdaAR8ETt3mbykZoJC+Ws6 9i3VIqEGMDarQLY4MqCWKQF/Q8kZQgFhAg== X-Google-Smtp-Source: ABdhPJwjus7/meUmZC5qIxb4pLGm0uyVjK5FJyqHsJSI5/SMEAf5aF9tfKyoJD0JHpFnkshjg7ehxg== X-Received: by 2002:a05:6000:1d83:b0:203:ed96:fa4c with SMTP id bk3-20020a0560001d8300b00203ed96fa4cmr10487646wrb.400.1651522785102; Mon, 02 May 2022 13:19:45 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:44 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 05/19] crypto: sun8i-ss: handle zero sized sg Date: Mon, 2 May 2022 20:19:15 +0000 Message-Id: <20220502201929.843194-6-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" sun8i-ss does not handle well the possible zero sized sg. Fixes: d9b45418a917 ("crypto: sun8i-ss - support hash algorithms") Signed-off-by: Corentin Labbe --- drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index 1a71ed49d233..ca4f280af35d 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -380,13 +380,21 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, v= oid *breq) } =20 len =3D areq->nbytes; - for_each_sg(areq->src, sg, nr_sgs, i) { + sg =3D areq->src; + i =3D 0; + while (len > 0 && sg) { + if (sg_dma_len(sg) =3D=3D 0) { + sg =3D sg_next(sg); + continue; + } rctx->t_src[i].addr =3D sg_dma_address(sg); todo =3D min(len, sg_dma_len(sg)); rctx->t_src[i].len =3D todo / 4; len -=3D todo; rctx->t_dst[i].addr =3D addr_res; rctx->t_dst[i].len =3D digestsize / 4; + sg =3D sg_next(sg); + i++; } if (len > 0) { dev_err(ss->dev, "remaining len %d\n", len); --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 062C3C433F5 for ; Mon, 2 May 2022 20:20:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387361AbiEBUXh (ORCPT ); Mon, 2 May 2022 16:23:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387318AbiEBUXV (ORCPT ); Mon, 2 May 2022 16:23:21 -0400 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A0032DF41 for ; Mon, 2 May 2022 13:19:47 -0700 (PDT) Received: by mail-wm1-x32a.google.com with SMTP id ay11-20020a05600c1e0b00b0038eb92fa965so197462wmb.4 for ; Mon, 02 May 2022 13:19:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=J7Xtal5iImj+Z51acJrJe79yB1r8z7s4am9aOqW5Wb8=; b=TYO8UR3UezMgzO0rfp1BJKTfy2y89Vk6AjNPv0Dgo6jr/ccEobuzl/+QmY6SXe8N8z +89fsh+aUNOxZaIxqQWH0+dMhPdbIQfKpdq2U7/NHmCXbhuHhTr85rP1+IWvRfzmWiov 4k/0cRveDPbLjHsqJNy/7DjDCidELdxWLljS+VasJkl3RLjUbIUtttKe+lYi0kw2Nd2B 69KsRwbgqvhx6/U9DS+AYkCllLuxPh4amIESu45mT5iMrwOlr3QGBYKXWVl2ddV9cD+3 771NBhzu0f3NqbefCed6v7WRLPBAfizOZR8/N104ggNY/4gbRezYvV48VsbLeQ9vqHwH unoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=J7Xtal5iImj+Z51acJrJe79yB1r8z7s4am9aOqW5Wb8=; b=zVmBan+kjG0hTQfmW0FAOJED71vRBRrJet0EwSCxgTcKyRQh4u7s3lNtXjW5Toctx9 t+tmdPfG3DgVf3Cnwjwzw+PsRkBcvoPDmow+DiTQwhbFzmMZBQ33eDnx6ou8gzaRV5VA bfpcJU6q3Kl7XxLaBVaqteRHFDFEv9RjC/bhmW9ibHCs22c5m7/PHVO/nI+tn1kpP/EW uqLBVhkZTMo48VBczYMScEpDZy7av8bQLsvBfYNPonKOqLBHApb2gXc/nGobpzjJzDJw vCvtXss/jm5b9IF2wQnCkdnN7m22r2TdcsLMqw/X7MMBqNI5zSHJGX02L3FEvzZfNcmZ ZBSA== X-Gm-Message-State: AOAM5322vTWVdz9dj1mEIy2n4J84nSEZ64DxLHOOcTFw5VBL4GgmsMPM NS5z2LuPsgPk4Q50mxpGyynsUw== X-Google-Smtp-Source: ABdhPJwPj7ya0ul9Pb7RjiDxC4/249zRQPxN5ij1KoY2SJztutO6o887eeZLU0sjR6MRJTI0eI7p8Q== X-Received: by 2002:a05:600c:601d:b0:393:fbe9:3596 with SMTP id az29-20020a05600c601d00b00393fbe93596mr577879wmb.141.1651522786075; Mon, 02 May 2022 13:19:46 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:45 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 06/19] crypto: sun8i-ss: remove redundant test Date: Mon, 2 May 2022 20:19:16 +0000 Message-Id: <20220502201929.843194-7-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Some fallback tests were redundant with what sun8i_ss_hash_need_fallback() = already do. Signed-off-by: Corentin Labbe --- drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index ca4f280af35d..eaa0bbaf5581 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -288,21 +288,11 @@ int sun8i_ss_hash_digest(struct ahash_request *areq) struct sun8i_ss_alg_template *algt; struct sun8i_ss_dev *ss; struct crypto_engine *engine; - struct scatterlist *sg; - int nr_sgs, e, i; + int e; =20 if (sun8i_ss_hash_need_fallback(areq)) return sun8i_ss_hash_digest_fb(areq); =20 - nr_sgs =3D sg_nents(areq->src); - if (nr_sgs > MAX_SG - 1) - return sun8i_ss_hash_digest_fb(areq); - - for_each_sg(areq->src, sg, nr_sgs, i) { - if (sg->length % 4 || !IS_ALIGNED(sg->offset, sizeof(u32))) - return sun8i_ss_hash_digest_fb(areq); - } - algt =3D container_of(alg, struct sun8i_ss_alg_template, alg.hash); ss =3D algt->ss; =20 --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 29747C433EF for ; Mon, 2 May 2022 20:22:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387368AbiEBUXm (ORCPT ); Mon, 2 May 2022 16:23:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49644 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387317AbiEBUXV (ORCPT ); Mon, 2 May 2022 16:23:21 -0400 Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3BC4DF45 for ; Mon, 2 May 2022 13:19:48 -0700 (PDT) Received: by mail-wm1-x329.google.com with SMTP id p189so8824044wmp.3 for ; Mon, 02 May 2022 13:19:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DxgERR4MmEJr2YW3s3P/BTJupqeCTylb9pEXfQax4lw=; b=y9aRNEd7zfN2JS9mk38MoQlzNlf7DQYJ5H03RA2P1GjLrY+bMQrVDZkhNC383mN+zT 80rh7dcGxxGIUB++LJRqL0jb+jY4nZff7/fY02nRyfO5oB8OSMr+o4ykZXRjekjyAF8+ T1U2FjDRoLxZ1z+75wjzDI5T3KAzMRBmB2x/m4Us6cjx0Tvf5eCZ4IqtXxWVF9b5RSqD rCM9CRC9eqasS4CpdR66cpm9oLNQImV7bauGRudAuN/wcs+jN9cFVqf7yIakgx3eH5V6 YoEGFx6iDE5OvN+zdNhTIYLS9ByTLIMlg9ntHejUhIEuZOkK1Z1qT8oQ8N/BzQ1lzR+6 Aj+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DxgERR4MmEJr2YW3s3P/BTJupqeCTylb9pEXfQax4lw=; b=D3RdO0CwyNtQ7JgI603MmJdCygZZa1txTO3XiQNa14DB0tDyzMaSN+KUfef/0lOtzL A+XR/TZu9RRO0z/W6Uvpu+BypXmKWpnXNE7rURswsX6+qS34m1JWdWgScLl4iK5EaDYY fH7IqiG3K5QttBE5p/DdmvYxY7w5wVobfT5tYbxGQweMo3zAw3LN+NgizYuCYcaPSomg kF+NhtnUsPoWC/fB62GYjQfyOIenMJqVmDiBrD4y03BqxoC/Z7qAgIPfUq3S3g7yYqF0 0fcgYZ4DJ7xtVHQwwVt5QeB1OngqeROLBO1GdIm6yWLPtj9VpCTaUkNsQ1CYXx8sFRth IcXg== X-Gm-Message-State: AOAM532NtP8bjrSkphiOgEQUU9Q/Ia2Oo9ikKh5SO3P5Eb1RLioNCCQ3 ltGxXCb9b/b8frypJ7OqJq4TXA== X-Google-Smtp-Source: ABdhPJwMx9QV+PjMyJ+evDOGZaUh+NusKzcSVINsVKDEeNYscfPWigPgNhrv8jmZYMZdbX1V2lUw2Q== X-Received: by 2002:a05:600c:1e1d:b0:394:2183:e75c with SMTP id ay29-20020a05600c1e1d00b003942183e75cmr554373wmb.203.1651522787180; Mon, 02 May 2022 13:19:47 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:46 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 07/19] crypto: sun8i-ss: test error before assigning Date: Mon, 2 May 2022 20:19:17 +0000 Message-Id: <20220502201929.843194-8-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The first thing we should do after dma_map_single() is to test the result. Signed-off-by: Corentin Labbe --- drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index eaa0bbaf5581..49e2e947b36b 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -420,15 +420,15 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, v= oid *breq) } =20 addr_pad =3D dma_map_single(ss->dev, pad, j * 4, DMA_TO_DEVICE); - rctx->t_src[i].addr =3D addr_pad; - rctx->t_src[i].len =3D j; - rctx->t_dst[i].addr =3D addr_res; - rctx->t_dst[i].len =3D digestsize / 4; if (dma_mapping_error(ss->dev, addr_pad)) { dev_err(ss->dev, "DMA error on padding SG\n"); err =3D -EINVAL; goto theend; } + rctx->t_src[i].addr =3D addr_pad; + rctx->t_src[i].len =3D j; + rctx->t_dst[i].addr =3D addr_res; + rctx->t_dst[i].len =3D digestsize / 4; =20 err =3D sun8i_ss_run_hash_task(ss, rctx, crypto_tfm_alg_name(areq->base.t= fm)); =20 --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17DC0C433EF for ; Mon, 2 May 2022 20:22:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235554AbiEBUZp (ORCPT ); Mon, 2 May 2022 16:25:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387328AbiEBUXW (ORCPT ); Mon, 2 May 2022 16:23:22 -0400 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2F9DDF50 for ; Mon, 2 May 2022 13:19:49 -0700 (PDT) Received: by mail-wr1-x42f.google.com with SMTP id x18so20927790wrc.0 for ; Mon, 02 May 2022 13:19:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=RnRXNVBrNu0gZUzja3H8hBQ5GxF3sLHXexVXlrLV7kM=; b=X8fSwKk9SZRgne6mCFt08RJn+hmq7rBZ6PS0Lif5QPtJZlQ/cHfzz0fePdMJeVoEV2 zyvL1shPlDOhP7u5PUB1+DqnDigLCOfPrleRC1jrVgqFeGA6JfZbpihnOZS8qZ6jX59O yQRR3Ef/YOfAgiNOZmbbrm+EHUyXvO0wzB1x/k8lhJSruOvHLpeHyXixqlXvVQKDXCpM wAgMek3HRzP8pJX7hZzDEm5FnfCZxCzAXqVgnHT7IgLGxlhiRGCHc21Zbmg74RrYBhgy AP6MMmfMlFxTPqfQP+stHDF0r/sBv5lgDW1pewuNM7NazO3Hk/sxtq0oT/FGVKoxNudU /VbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=RnRXNVBrNu0gZUzja3H8hBQ5GxF3sLHXexVXlrLV7kM=; b=LsovQ5UXEy2x7aFu6+a87GuyqTBHNyAZl+pm76/w5SnO/OcAwBmKJ8QhaPveFCEAXR Lsx9iPZUB0++xeTrz/UIS6nsVbdX5q61u05eHIBRLxJslM4WkaGgu0IMKu569BXh1QW1 fsGci0D4bBrcK+2oasmHvBNzOlY12ItVAei1cgyevV1Uiastph0X4BrhYTjLZWIwJbWc e2C3lZRJRRUE2911alXX+gQoxcLpfiMwukLDLZN9zJTXbgsXmr0AOCg8yKRv4DsZN4S6 0Wk0/UqtVkPHn1VU4U99pMdVXrI0Ic2BgHkseNzpunsJFq8DlDPJaF/5uPAUDD7OZpSA Ph1A== X-Gm-Message-State: AOAM532gL9F8XLsyDhByrz1cVd1mcF3QK2NUR1cMYQ7ZM93uRzfrlJfy N3rQiio7b5VDXyQir9sRLp/yjg== X-Google-Smtp-Source: ABdhPJzbkAkG2vpxk0wI5E7kifV7WOkLd0rKSFIEP5owheSFK+XfGcbbQ7pSR6xmwCbFCTwOuNafGw== X-Received: by 2002:a05:6000:188c:b0:20c:563a:aa86 with SMTP id a12-20020a056000188c00b0020c563aaa86mr8982895wri.360.1651522788240; Mon, 02 May 2022 13:19:48 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:47 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 08/19] crypto: sun8i-ss: use sg_nents_for_len Date: Mon, 2 May 2022 20:19:18 +0000 Message-Id: <20220502201929.843194-9-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" When testing with some large SG list, the sun8i-ss drivers always fallback even if it can handle it. So use sg_nents_for_len() which permits to see less SGs than needed. Signed-off-by: Corentin Labbe --- .../allwinner/sun8i-ss/sun8i-ss-cipher.c | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/= crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c index 70e2e6e37389..c4cb1ab1eeaa 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c @@ -29,7 +29,8 @@ static bool sun8i_ss_need_fallback(struct skcipher_reques= t *areq) if (areq->cryptlen =3D=3D 0 || areq->cryptlen % 16) return true; =20 - if (sg_nents(areq->src) > 8 || sg_nents(areq->dst) > 8) + if (sg_nents_for_len(areq->src, areq->cryptlen) > 8 || + sg_nents_for_len(areq->dst, areq->cryptlen) > 8) return true; =20 sg =3D areq->src; @@ -169,6 +170,8 @@ static int sun8i_ss_cipher(struct skcipher_request *are= q) int nr_sgs =3D 0; int nr_sgd =3D 0; int err =3D 0; + int nsgs =3D sg_nents_for_len(areq->src, areq->cryptlen); + int nsgd =3D sg_nents_for_len(areq->dst, areq->cryptlen); int i; =20 algt =3D container_of(alg, struct sun8i_ss_alg_template, alg.skcipher); @@ -201,8 +204,7 @@ static int sun8i_ss_cipher(struct skcipher_request *are= q) goto theend_key; } if (areq->src =3D=3D areq->dst) { - nr_sgs =3D dma_map_sg(ss->dev, areq->src, sg_nents(areq->src), - DMA_BIDIRECTIONAL); + nr_sgs =3D dma_map_sg(ss->dev, areq->src, nsgs, DMA_BIDIRECTIONAL); if (nr_sgs <=3D 0 || nr_sgs > 8) { dev_err(ss->dev, "Invalid sg number %d\n", nr_sgs); err =3D -EINVAL; @@ -210,15 +212,13 @@ static int sun8i_ss_cipher(struct skcipher_request *a= req) } nr_sgd =3D nr_sgs; } else { - nr_sgs =3D dma_map_sg(ss->dev, areq->src, sg_nents(areq->src), - DMA_TO_DEVICE); + nr_sgs =3D dma_map_sg(ss->dev, areq->src, nsgs, DMA_TO_DEVICE); if (nr_sgs <=3D 0 || nr_sgs > 8) { dev_err(ss->dev, "Invalid sg number %d\n", nr_sgs); err =3D -EINVAL; goto theend_iv; } - nr_sgd =3D dma_map_sg(ss->dev, areq->dst, sg_nents(areq->dst), - DMA_FROM_DEVICE); + nr_sgd =3D dma_map_sg(ss->dev, areq->dst, nsgd, DMA_FROM_DEVICE); if (nr_sgd <=3D 0 || nr_sgd > 8) { dev_err(ss->dev, "Invalid sg number %d\n", nr_sgd); err =3D -EINVAL; @@ -274,13 +274,10 @@ static int sun8i_ss_cipher(struct skcipher_request *a= req) =20 theend_sgs: if (areq->src =3D=3D areq->dst) { - dma_unmap_sg(ss->dev, areq->src, sg_nents(areq->src), - DMA_BIDIRECTIONAL); + dma_unmap_sg(ss->dev, areq->src, nsgs, DMA_BIDIRECTIONAL); } else { - dma_unmap_sg(ss->dev, areq->src, sg_nents(areq->src), - DMA_TO_DEVICE); - dma_unmap_sg(ss->dev, areq->dst, sg_nents(areq->dst), - DMA_FROM_DEVICE); + dma_unmap_sg(ss->dev, areq->src, nsgs, DMA_TO_DEVICE); + dma_unmap_sg(ss->dev, areq->dst, nsgd, DMA_FROM_DEVICE); } =20 theend_iv: --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4A4ABC433F5 for ; Mon, 2 May 2022 20:22:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387655AbiEBUYZ (ORCPT ); Mon, 2 May 2022 16:24:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387295AbiEBUXW (ORCPT ); Mon, 2 May 2022 16:23:22 -0400 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B88D6DF71 for ; Mon, 2 May 2022 13:19:50 -0700 (PDT) Received: by mail-wr1-x42b.google.com with SMTP id c11so11053366wrn.8 for ; Mon, 02 May 2022 13:19:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=L6ojxrJ3JCDmwxgYcuW8Z/fCHj7C/NmFL+u5RXlbqHM=; b=2FMw48hoq0iT1baIfYW3+6fIqjJC8ILqaei+4p/aWkOmUC6pxdgGS/UxezQKrGwpu5 JwVxOFwImw3lTFUamfirSvwyvKtxdNr41V5jV8SijHt24Kxd113u5eRrL1i4z+dKu5+l YCXOJkIVtSjnO4/b9OH+kWMVcG2s5W1vU8YOQvSDPk2OZiRGR4MykMYQV9yIbT1KrAfY Mth6Wcucdp/DrhUyd6QVl9HrbIHKvymqvJ7ubgyScll5XzcOCDR1mExqEijO99DjJyue Z0/KExvA/HUj6OzgeHznlHDsYBr2Si9JUFxqXy1l1rZg+TDMKRhdoNddMiN/tAla9W1w 43IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=L6ojxrJ3JCDmwxgYcuW8Z/fCHj7C/NmFL+u5RXlbqHM=; b=lasz6a8qmPkDpQqhctgdDwNLkZJvUGr8y5ow0ZyS2fMXLTH0svPn1f+lo6H4DVye6s TVtZg3MKIFdWwLITcUTEAx4UExhMlRh60EB437cPYcWf7jFSbjzuy+UaonpTKrbzvmxd In0m/doPSTTJvfwxXkhOvpWCz4YEzsX74w4bI91qKqUECQaeBXYdsgq+z1wOYzpiUTav 8Y4cFDku71L0EtL3ATRZjlwm7KlrfRqV5YqMHyASX9LnmvO1vdTg9HqNOMFMOP8LkYoo E4UWf6/d5A38TkOfvE0LaA5LKzwGaItr1HKkiPeaqtOyLuhsumfeZkbFHVTOiA86aDqt 5GPw== X-Gm-Message-State: AOAM532I1JUBy5zaj7E8vQnDkTuiLy2whr3vLScDlDzNuzCA4jKN8XsH Ov7h2JWBUWfCvU7iAehjyz6Dig== X-Google-Smtp-Source: ABdhPJxbumqnLOpEvOC4qOx+9lGvPoJ59aLRGJaRDccVXsB9zQ/0pYEU5eQJGSeVtgZ3fUVJ7fonIg== X-Received: by 2002:adf:e112:0:b0:206:d12:9c3a with SMTP id t18-20020adfe112000000b002060d129c3amr10160404wrz.391.1651522789323; Mon, 02 May 2022 13:19:49 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:48 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 09/19] crypto: sun8i-ss: do not allocate memory when handling hash requests Date: Mon, 2 May 2022 20:19:19 +0000 Message-Id: <20220502201929.843194-10-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Instead of allocate memory on each requests, it is easier to pre-allocate buffers. This made error path easier. Signed-off-by: Corentin Labbe --- drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 10 ++++++++++ drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 15 +++------------ drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 4 ++++ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-core.c index 657530578643..786b6f5cf300 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c @@ -486,6 +486,16 @@ static int allocate_flows(struct sun8i_ss_dev *ss) goto error_engine; } =20 + /* the padding could be up to two block. */ + ss->flows[i].pad =3D devm_kmalloc(ss->dev, SHA256_BLOCK_SIZE * 2, + GFP_KERNEL | GFP_DMA); + if (!ss->flows[i].pad) + goto error_engine; + ss->flows[i].result =3D devm_kmalloc(ss->dev, SHA256_DIGEST_SIZE, + GFP_KERNEL | GFP_DMA); + if (!ss->flows[i].result) + goto error_engine; + ss->flows[i].engine =3D crypto_engine_alloc_init(ss->dev, true); if (!ss->flows[i].engine) { dev_err(ss->dev, "Cannot allocate engine\n"); diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index 49e2e947b36b..9582ac450d08 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -332,18 +332,11 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, v= oid *breq) if (digestsize =3D=3D SHA224_DIGEST_SIZE) digestsize =3D SHA256_DIGEST_SIZE; =20 - /* the padding could be up to two block. */ - pad =3D kzalloc(algt->alg.hash.halg.base.cra_blocksize * 2, GFP_KERNEL | = GFP_DMA); - if (!pad) - return -ENOMEM; + result =3D ss->flows[rctx->flow].result; + pad =3D ss->flows[rctx->flow].pad; + memset(pad, 0, algt->alg.hash.halg.base.cra_blocksize * 2); bf =3D (__le32 *)pad; =20 - result =3D kzalloc(digestsize, GFP_KERNEL | GFP_DMA); - if (!result) { - kfree(pad); - return -ENOMEM; - } - for (i =3D 0; i < MAX_SG; i++) { rctx->t_dst[i].addr =3D 0; rctx->t_dst[i].len =3D 0; @@ -439,8 +432,6 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, voi= d *breq) =20 memcpy(areq->result, result, algt->alg.hash.halg.digestsize); theend: - kfree(pad); - kfree(result); local_bh_disable(); crypto_finalize_hash_request(engine, breq, err); local_bh_enable(); diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/= allwinner/sun8i-ss/sun8i-ss.h index 57ada8653855..eb82ee5345ae 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h @@ -123,6 +123,8 @@ struct sginfo { * @stat_req: number of request done by this flow * @iv: list of IV to use for each step * @biv: buffer which contain the backuped IV + * @pad: padding buffer for hash operations + * @result: buffer for storing the result of hash operations */ struct sun8i_ss_flow { struct crypto_engine *engine; @@ -130,6 +132,8 @@ struct sun8i_ss_flow { int status; u8 *iv[MAX_SG]; u8 *biv; + void *pad; + void *result; #ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG unsigned long stat_req; #endif --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42C84C433F5 for ; Mon, 2 May 2022 20:22:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1386612AbiEBUZu (ORCPT ); Mon, 2 May 2022 16:25:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387338AbiEBUXW (ORCPT ); Mon, 2 May 2022 16:23:22 -0400 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C9CD0DF7D for ; Mon, 2 May 2022 13:19:51 -0700 (PDT) Received: by mail-wr1-x436.google.com with SMTP id t6so20906191wra.4 for ; Mon, 02 May 2022 13:19:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Mg7+JDCCGco+e4GPVsYAzBNoWm3/Kgnpe9n7FdTc3i4=; b=TLBu1j5ncN/Jn6oml7fVC6B8xeoInjCp0ETOpxy5+1E5f9S460WfLpJCCUFoOENHHi LJoJDlr52k4al2Y1IkF4FjvOgZ72Atw7nAH14noV21l2xdejCujFxKMVP+TFCkNHINyz D0pMkc5DPJ2QVi7jbUoaqZxo6MaqpI+67fWS5ITLwVmTBrVrs+Qf63P6nmAKg4JuYXIx xlEuUSZlQr/OtSRCuSUAug5vCUNzBHPdvXwfLBzii1//qa6peQv3AM82k4V+Unq1QB00 X37XC2aVKmRfs3T43YgoiH7dZYKN8exWoC9Na9qFdN5aNfp3nznDaKhZoipr/q2qxGD+ HO0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Mg7+JDCCGco+e4GPVsYAzBNoWm3/Kgnpe9n7FdTc3i4=; b=t2heJgtrgnmNEQLdcj3Xjzyj0YQVDGGoXnIv4UG2t12PTdlSukDHTDMOB9uCb9WeU+ zzx6h98oqLcK0uqJJ+Eqd/HHA4rsgimAjqGO9MIQsZP5aw8jrfGAwFesQxbrQek1mvsW oHCeeKzj9k7CJH4EKa1Yr42lOa/N1kGH1Io9mcAq/D/Bc2AozPYBg2iP0aVP7Si/a30d fVZ3XzBtaCRl3AsFW6Wu0j8M/k/qVx6sfxpD7/Jr8W70+tksY6Lmsox9wNIIFf3q1kWY NsVL26zJorJz4QmEw+PdT65JEUUz0Oczcp21flzp4mEhiO9hLNwzvyXplONMFrYroyK8 eXBQ== X-Gm-Message-State: AOAM532oGkiuoJ86o2pXNNgWoPV5xx2PbXTKc02l0aRSGRGhAMjvXCq1 TPfHEMffym7GNYBoQnPyRsYkxQ== X-Google-Smtp-Source: ABdhPJwKdiIeYcermo7ePCeyaCT8ZpEZzu4r0d8ohBUa7YMuJ53K+SikREyLUqDCe/Abymt4Bmb9Zw== X-Received: by 2002:a05:6000:10a:b0:20a:e2aa:6848 with SMTP id o10-20020a056000010a00b0020ae2aa6848mr10234337wrx.464.1651522790383; Mon, 02 May 2022 13:19:50 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:49 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 10/19] crypto: sun8i-ss: do not zeroize all pad Date: Mon, 2 May 2022 20:19:20 +0000 Message-Id: <20220502201929.843194-11-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Instead of memset all pad buffer, it is faster to only put 0 where needed. Signed-off-by: Corentin Labbe --- drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index 9582ac450d08..53e5bfb99c93 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -319,7 +319,7 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, voi= d *breq) unsigned int len; u64 fill, min_fill, byte_count; void *pad, *result; - int j, i, todo; + int j, i, k, todo; __be64 *bebits; __le64 *lebits; dma_addr_t addr_res, addr_pad; @@ -334,7 +334,6 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, voi= d *breq) =20 result =3D ss->flows[rctx->flow].result; pad =3D ss->flows[rctx->flow].pad; - memset(pad, 0, algt->alg.hash.halg.base.cra_blocksize * 2); bf =3D (__le32 *)pad; =20 for (i =3D 0; i < MAX_SG; i++) { @@ -395,7 +394,10 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, vo= id *breq) if (fill < min_fill) fill +=3D 64; =20 + k =3D j; j +=3D (fill - min_fill) / sizeof(u32); + for (; k < j; k++) + bf[k] =3D 0; =20 switch (algt->ss_algo_id) { case SS_ID_HASH_MD5: --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AD0D2C433F5 for ; Mon, 2 May 2022 20:20:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387636AbiEBUYU (ORCPT ); Mon, 2 May 2022 16:24:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49712 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387376AbiEBUXn (ORCPT ); Mon, 2 May 2022 16:23:43 -0400 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 74069DF9A for ; Mon, 2 May 2022 13:19:53 -0700 (PDT) Received: by mail-wm1-x32a.google.com with SMTP id k126-20020a1ca184000000b003943fd07180so198089wme.3 for ; Mon, 02 May 2022 13:19:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ijgUOsTW0s4AimXboKSLya/yd0H2TC88bTv30krid0k=; b=OMt6oz/Q9zXzb/TLNBc1XCNB6y1D2Z5nhI2EkVjLXPfKgNvIu5yHgxtQqSVYexk49s 5LH/nDaVXXpe68xtkRD7K6KAazWXgzcu3mdSIUc0lm6vCWeTPlwHfELRjXXs2UV95oor TJ3EH4X7mTzKBOnCeyU4lHiZCRbf+j2KA6BEXDgTl/95UXMXVVEbVSX9IruUEmgGjgCM yHuoDigYYHBdUN4P7R3EQmxMMLr48Iidop+9w09ybchoVfLUWKJLxCNYH7R+0GLIYYhc +2jcgRdWlsGgLI1adQdHLpA3RDBq+DRsHT3ZyGxiHvGW9eotA+NKrR9I0B7UVA6cCilh 4p1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ijgUOsTW0s4AimXboKSLya/yd0H2TC88bTv30krid0k=; b=rxn6YP6zYeHNZ4D5xum4Gl0Z6wndkPfKgW8eHn26tHmL8vCr11AZMiqhSoU/qSVCYK mRJMzbtk5Gwu6K+OzoV7VEJlIOvvpn29hPdd4XCUe6ZGSU0GYyDoFlm+eFwO/7SbCvYv NUdh/ogutzq7J1JRRGEc5NNPj4EtgBv+1pC5tI+gBy/0I+LgAnCj7CMPzMR0cg5SD8VM wkDvAgQOaS/wO32DsFwbjoQ4FxtDSZCtrVGQNDkv+a9YMXTrgRMpsDetq8wpYyJj8Bq7 n3NIjAye1mGoIxChYOeCKqknfbqpqfO9Uc7Op22B17gK6eeEGD8Br70X3WpZqZkvQTrY fRfw== X-Gm-Message-State: AOAM530k16L2296BxpxPwu0zAWoeLYTKQ6ax/SIQUcIYlHH/OsM/umfc tdPnPpdKScF5QYecWPaih/VDiQ== X-Google-Smtp-Source: ABdhPJxbJjvtJgIr2BWspoH0aQt3fQ7ddxqD2av4BznbG6r6q2cF3FcC3Eazvk+CmLW3vu1yaSVE0w== X-Received: by 2002:a05:600c:4fd6:b0:394:3e64:2081 with SMTP id o22-20020a05600c4fd600b003943e642081mr548232wmq.153.1651522791421; Mon, 02 May 2022 13:19:51 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:51 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 11/19] crypto: sun8i-ss: handle requests if last block is not modulo 64 Date: Mon, 2 May 2022 20:19:21 +0000 Message-Id: <20220502201929.843194-12-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The current sun8i-ss handle only requests with all SG length being modulo 64. But the last SG could be always handled by copying it on the pad buffer. Signed-off-by: Corentin Labbe --- .../crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 2 +- .../crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 35 ++++++++++++++----- drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 2 ++ 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-core.c index 786b6f5cf300..8d31fd4968f3 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c @@ -487,7 +487,7 @@ static int allocate_flows(struct sun8i_ss_dev *ss) } =20 /* the padding could be up to two block. */ - ss->flows[i].pad =3D devm_kmalloc(ss->dev, SHA256_BLOCK_SIZE * 2, + ss->flows[i].pad =3D devm_kmalloc(ss->dev, MAX_PAD_SIZE, GFP_KERNEL | GFP_DMA); if (!ss->flows[i].pad) goto error_engine; diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index 53e5bfb99c93..1b44c1a115d6 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -262,6 +263,9 @@ static bool sun8i_ss_hash_need_fallback(struct ahash_re= quest *areq) =20 if (areq->nbytes =3D=3D 0) return true; + if (areq->nbytes >=3D MAX_PAD_SIZE - 64) + return true; + /* we need to reserve one SG for the padding one */ if (sg_nents(areq->src) > MAX_SG - 1) return true; @@ -270,10 +274,13 @@ static bool sun8i_ss_hash_need_fallback(struct ahash_= request *areq) /* SS can operate hash only on full block size * since SS support only MD5,sha1,sha224 and sha256, blocksize * is always 64 - * TODO: handle request if last SG is not len%64 - * but this will need to copy data on a new SG of size=3D64 */ - if (sg->length % 64 || !IS_ALIGNED(sg->offset, sizeof(u32))) + /* Only the last block could be bounced to the pad buffer */ + if (sg->length % 64 && sg_next(sg)) + return true; + if (!IS_ALIGNED(sg->offset, sizeof(u32))) + return true; + if (sg->length % 4) return true; sg =3D sg_next(sg); } @@ -361,6 +368,7 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, voi= d *breq) goto theend; } =20 + j =3D 0; len =3D areq->nbytes; sg =3D areq->src; i =3D 0; @@ -369,12 +377,19 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, v= oid *breq) sg =3D sg_next(sg); continue; } - rctx->t_src[i].addr =3D sg_dma_address(sg); todo =3D min(len, sg_dma_len(sg)); - rctx->t_src[i].len =3D todo / 4; - len -=3D todo; - rctx->t_dst[i].addr =3D addr_res; - rctx->t_dst[i].len =3D digestsize / 4; + /* only the last SG could be with a size not modulo64 */ + if (todo % 64 =3D=3D 0) { + rctx->t_src[i].addr =3D sg_dma_address(sg); + rctx->t_src[i].len =3D todo / 4; + rctx->t_dst[i].addr =3D addr_res; + rctx->t_dst[i].len =3D digestsize / 4; + len -=3D todo; + } else { + scatterwalk_map_and_copy(bf, sg, 0, todo, 0); + j +=3D todo / 4; + len -=3D todo; + } sg =3D sg_next(sg); i++; } @@ -384,8 +399,10 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, vo= id *breq) goto theend; } =20 + if (j > 0) + i--; + byte_count =3D areq->nbytes; - j =3D 0; bf[j++] =3D cpu_to_le32(0x80); =20 fill =3D 64 - (byte_count % 64); diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/= allwinner/sun8i-ss/sun8i-ss.h index eb82ee5345ae..2e3524654aca 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h @@ -82,6 +82,8 @@ #define PRNG_DATA_SIZE (160 / 8) #define PRNG_SEED_SIZE DIV_ROUND_UP(175, 8) =20 +#define MAX_PAD_SIZE 4096 + /* * struct ss_clock - Describe clocks used by sun8i-ss * @name: Name of clock needed by this variant --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 32C82C433EF for ; Mon, 2 May 2022 20:22:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242089AbiEBUZy (ORCPT ); Mon, 2 May 2022 16:25:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387379AbiEBUXo (ORCPT ); Mon, 2 May 2022 16:23:44 -0400 Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2BB31DF35 for ; Mon, 2 May 2022 13:19:54 -0700 (PDT) Received: by mail-wm1-x335.google.com with SMTP id m2-20020a1ca302000000b003943bc63f98so197523wme.4 for ; Mon, 02 May 2022 13:19:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=t1rWH8EkKjzUi0sXb9Nmfb9EEjMe/oHCHN553F8hg/c=; b=geTCmE966V0DrhuP8tTXMustJYvfUWc3czrOC+YV/4Ssk0f1y8xCaqSnOhkZ3Yh69Z e1fKIN45m5P517yxphjZ1YQap0K3pc4cr6YXMXJw9j+KAJ9v96LHOW378FQwwZKyl2/4 kp2A3bAPYE8D5Jd4m6Z5aoyuSE4nMsaL7g95ZHJO8qnbUlRaYf/E4RacHV+m4l1rcRcw bQ7AMc/f41wp7FEhAsbck6gIhaF/cSZN1omsgVkXe80EpyiAn8FrIoOe5t+4guGeaFRt BAYAXltjxVVVZi20abbw+0sdwzd5bRUbCKzkx8SuNDPkZvYoMVx0cbhqsHB8XXs3itj8 5qdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=t1rWH8EkKjzUi0sXb9Nmfb9EEjMe/oHCHN553F8hg/c=; b=RRvmjvXTe1FAHFZeXNxndseezCjAPQcwbmTIcWT2lKF42O1VRmZ29YA/DWxy4ywvNo OMfwNn1lekOzrX+htS/dCNwoYX8oPiH/rpZyCGWHIVwjh+1glKhyFl+nQs+FcJ09CuQ2 Ww4PMIaI5VsJD/eM96wE0OBbTcKItwOgL0jiG+GWpnuNdalFYnI7zNOnXkL5JJyRvwh6 tfhsa4AN7BaqE21ONE5dZ/OvbwF8XdgkkKIZ2KYbXb2G0x3BRzILS+/FJdSQeYdaMmVY 9e0IOdekNN1b1FDnnZFJ3V/PvSh1iPQTOjemqckKO6HxL0xcZqLWKTLMxKcWaBjoUr3/ /88g== X-Gm-Message-State: AOAM5339gljJwacg40QgQ6C5/4OgFz+kMYz+wOSNn+7vboZx4n2JSujX pjaRYGv1QTuSt6NAulZi4Sn6Rw== X-Google-Smtp-Source: ABdhPJwK6U8fhYmWssHvBV6f3I3j+KBkxOhVy/4UJ2KDacD8HYPRTMRA0THUVJWZyJaVnck4yboDXQ== X-Received: by 2002:a7b:c74f:0:b0:394:1ce3:cc42 with SMTP id w15-20020a7bc74f000000b003941ce3cc42mr546136wmk.153.1651522792494; Mon, 02 May 2022 13:19:52 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:52 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 12/19] crypto: sun8i-ss: rework debugging Date: Mon, 2 May 2022 20:19:22 +0000 Message-Id: <20220502201929.843194-13-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The "Fallback for xxx" message is annoying, remove it and store the information in the debugfs. In the same time, reports more fallback statistics. Signed-off-by: Corentin Labbe --- .../allwinner/sun8i-ss/sun8i-ss-cipher.c | 41 ++++++++++++++----- .../crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 21 ++++++++++ .../crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 36 ++++++++++++---- drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 7 +++- 4 files changed, 83 insertions(+), 22 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/= crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c index c4cb1ab1eeaa..7f1940c6cc41 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c @@ -22,35 +22,54 @@ =20 static bool sun8i_ss_need_fallback(struct skcipher_request *areq) { + struct crypto_skcipher *tfm =3D crypto_skcipher_reqtfm(areq); + struct skcipher_alg *alg =3D crypto_skcipher_alg(tfm); + struct sun8i_ss_alg_template *algt =3D container_of(alg, struct sun8i_ss_= alg_template, alg.skcipher); struct scatterlist *in_sg =3D areq->src; struct scatterlist *out_sg =3D areq->dst; struct scatterlist *sg; =20 - if (areq->cryptlen =3D=3D 0 || areq->cryptlen % 16) + if (areq->cryptlen =3D=3D 0 || areq->cryptlen % 16) { + algt->stat_fb_len++; return true; + } =20 if (sg_nents_for_len(areq->src, areq->cryptlen) > 8 || - sg_nents_for_len(areq->dst, areq->cryptlen) > 8) + sg_nents_for_len(areq->dst, areq->cryptlen) > 8) { + algt->stat_fb_sgnum++; return true; + } =20 sg =3D areq->src; while (sg) { - if ((sg->length % 16) !=3D 0) + if ((sg->length % 16) !=3D 0) { + algt->stat_fb_sglen++; return true; - if ((sg_dma_len(sg) % 16) !=3D 0) + } + if ((sg_dma_len(sg) % 16) !=3D 0) { + algt->stat_fb_sglen++; return true; - if (!IS_ALIGNED(sg->offset, 16)) + } + if (!IS_ALIGNED(sg->offset, 16)) { + algt->stat_fb_align++; return true; + } sg =3D sg_next(sg); } sg =3D areq->dst; while (sg) { - if ((sg->length % 16) !=3D 0) + if ((sg->length % 16) !=3D 0) { + algt->stat_fb_sglen++; return true; - if ((sg_dma_len(sg) % 16) !=3D 0) + } + if ((sg_dma_len(sg) % 16) !=3D 0) { + algt->stat_fb_sglen++; return true; - if (!IS_ALIGNED(sg->offset, 16)) + } + if (!IS_ALIGNED(sg->offset, 16)) { + algt->stat_fb_align++; return true; + } sg =3D sg_next(sg); } =20 @@ -385,9 +404,9 @@ int sun8i_ss_cipher_init(struct crypto_tfm *tfm) crypto_skcipher_reqsize(op->fallback_tfm); =20 =20 - dev_info(op->ss->dev, "Fallback for %s is %s\n", - crypto_tfm_alg_driver_name(&sktfm->base), - crypto_tfm_alg_driver_name(crypto_skcipher_tfm(op->fallback_tfm))); + memcpy(algt->fbname, + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(op->fallback_tfm)), + CRYPTO_MAX_ALG_NAME); =20 op->enginectx.op.do_one_request =3D sun8i_ss_handle_cipher_request; op->enginectx.op.prepare_request =3D NULL; diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-core.c index 8d31fd4968f3..f09de5737e8b 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c @@ -430,6 +430,17 @@ static int sun8i_ss_debugfs_show(struct seq_file *seq,= void *v) ss_algs[i].alg.skcipher.base.cra_driver_name, ss_algs[i].alg.skcipher.base.cra_name, ss_algs[i].stat_req, ss_algs[i].stat_fb); + + seq_printf(seq, "\tLast fallback is: %s\n", + ss_algs[i].fbname); + seq_printf(seq, "\tFallback due to length: %lu\n", + ss_algs[i].stat_fb_len); + seq_printf(seq, "\tFallback due to SG length: %lu\n", + ss_algs[i].stat_fb_sglen); + seq_printf(seq, "\tFallback due to alignment: %lu\n", + ss_algs[i].stat_fb_align); + seq_printf(seq, "\tFallback due to SG numbers: %lu\n", + ss_algs[i].stat_fb_sgnum); break; case CRYPTO_ALG_TYPE_RNG: seq_printf(seq, "%s %s reqs=3D%lu tsize=3D%lu\n", @@ -442,6 +453,16 @@ static int sun8i_ss_debugfs_show(struct seq_file *seq,= void *v) ss_algs[i].alg.hash.halg.base.cra_driver_name, ss_algs[i].alg.hash.halg.base.cra_name, ss_algs[i].stat_req, ss_algs[i].stat_fb); + seq_printf(seq, "\tLast fallback is: %s\n", + ss_algs[i].fbname); + seq_printf(seq, "\tFallback due to length: %lu\n", + ss_algs[i].stat_fb_len); + seq_printf(seq, "\tFallback due to SG length: %lu\n", + ss_algs[i].stat_fb_sglen); + seq_printf(seq, "\tFallback due to alignment: %lu\n", + ss_algs[i].stat_fb_align); + seq_printf(seq, "\tFallback due to SG numbers: %lu\n", + ss_algs[i].stat_fb_sgnum); break; } } diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index 1b44c1a115d6..cb510ec21ec4 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -51,9 +51,8 @@ int sun8i_ss_hash_crainit(struct crypto_tfm *tfm) sizeof(struct sun8i_ss_hash_reqctx) + crypto_ahash_reqsize(op->fallback_tfm)); =20 - dev_info(op->ss->dev, "Fallback for %s is %s\n", - crypto_tfm_alg_driver_name(tfm), - crypto_tfm_alg_driver_name(&op->fallback_tfm->base)); + memcpy(algt->fbname, crypto_tfm_alg_driver_name(&op->fallback_tfm->base),= CRYPTO_MAX_ALG_NAME); + err =3D pm_runtime_get_sync(op->ss->dev); if (err < 0) goto error_pm; @@ -259,16 +258,29 @@ static int sun8i_ss_run_hash_task(struct sun8i_ss_dev= *ss, =20 static bool sun8i_ss_hash_need_fallback(struct ahash_request *areq) { + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct ahash_alg *alg =3D __crypto_ahash_alg(tfm->base.__crt_alg); + struct sun8i_ss_alg_template *algt; struct scatterlist *sg; =20 - if (areq->nbytes =3D=3D 0) + algt =3D container_of(alg, struct sun8i_ss_alg_template, alg.hash); + + if (areq->nbytes =3D=3D 0) { + algt->stat_fb_len++; return true; - if (areq->nbytes >=3D MAX_PAD_SIZE - 64) + } + + if (areq->nbytes >=3D MAX_PAD_SIZE - 64) { + algt->stat_fb_len++; return true; + } =20 /* we need to reserve one SG for the padding one */ - if (sg_nents(areq->src) > MAX_SG - 1) + if (sg_nents(areq->src) > MAX_SG - 1) { + algt->stat_fb_sgnum++; return true; + } + sg =3D areq->src; while (sg) { /* SS can operate hash only on full block size @@ -276,12 +288,18 @@ static bool sun8i_ss_hash_need_fallback(struct ahash_= request *areq) * is always 64 */ /* Only the last block could be bounced to the pad buffer */ - if (sg->length % 64 && sg_next(sg)) + if (sg->length % 64 && sg_next(sg)) { + algt->stat_fb_sglen++; return true; - if (!IS_ALIGNED(sg->offset, sizeof(u32))) + } + if (!IS_ALIGNED(sg->offset, sizeof(u32))) { + algt->stat_fb_align++; return true; - if (sg->length % 4) + } + if (sg->length % 4) { + algt->stat_fb_sglen++; return true; + } sg =3D sg_next(sg); } return false; diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/= allwinner/sun8i-ss/sun8i-ss.h index 2e3524654aca..b56038de333b 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h @@ -279,11 +279,14 @@ struct sun8i_ss_alg_template { struct rng_alg rng; struct ahash_alg hash; } alg; -#ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG unsigned long stat_req; unsigned long stat_fb; unsigned long stat_bytes; -#endif + unsigned long stat_fb_len; + unsigned long stat_fb_sglen; + unsigned long stat_fb_align; + unsigned long stat_fb_sgnum; + char fbname[CRYPTO_MAX_ALG_NAME]; }; =20 int sun8i_ss_enqueue(struct crypto_async_request *areq, u32 type); --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6BBE2C433EF for ; Mon, 2 May 2022 20:22:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387377AbiEBU0B (ORCPT ); Mon, 2 May 2022 16:26:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387383AbiEBUXo (ORCPT ); Mon, 2 May 2022 16:23:44 -0400 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2BBA7DF2B for ; Mon, 2 May 2022 13:19:55 -0700 (PDT) Received: by mail-wr1-x42f.google.com with SMTP id w4so20846222wrg.12 for ; Mon, 02 May 2022 13:19:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ev6VkzNd8mWajKtgoY5TumXP3duJOCaOdR600zP4Pxg=; b=Z/Lw+lnGWpcXrOZnRWxKzRVo+wFU5ra06ZgxPTSqzBJpOHO4n17m7KTCr4Sx3BrL+d tJ57TKr6ykabxjkBF0k95jGnlLgO1av4r8iBkp3STLbzb9iT+UfIrgGyrgUPtghKuxeM cBVI9as/TkxdOWs8UzlsbA1XGJ/NcA1zOvtFS3pqwr3aEE+UL251CJj0EsOKuLrMBWG4 gH7ALbq1LlnlN0yVou8nVSpuXgc1U7JbrSdO9UHSVqQMN9aVtp3cw9NLqnrhafg2xsfa 81Vz0of/NRXBdhbmufz0cZGNGHSvp+3MwmlYtsTq3GibiaRiMBRMcJKp/Uu2HUf5dDl1 UjVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Ev6VkzNd8mWajKtgoY5TumXP3duJOCaOdR600zP4Pxg=; b=VOBRSn7l7IT16pHyFha0r57BhrY3CXWzzD9Kd0XYp4Wxop4/+2D5ytF2XBPsBc9CI6 tZWK9vLufhNcRgEF37+8RYPTQ83Pn5cVdVIUpZL/+0XL/seFLc7EtgUT3u5SfnOu7mQd ZiVfILrhdSFDC1Q3zmNFL3wacjJcPq48G1WK5EIcwSz9gunKVvpedHWxETgkfUOq+NJO 2Bj+8TTURsblzArQGyQNNDQk20xRByCEDAX0vfkbOD0XUP+gIhwCqIF5Yy9Hoz9bviMs ljqWJbXv6ykLla3pClm6E6haCSqIX2CXXe+ooMIQB3scnTDim9ezW7YFysBNDIEvcoQ1 x2XQ== X-Gm-Message-State: AOAM530vVAL9tUvew+1si0mP/Nhur97UNh52F1FjDaiETG3vSCLRvnp4 f5oA529RaJAwE4pK1G2M/m7Mzg== X-Google-Smtp-Source: ABdhPJyemTLSgoak6z+//F8uVgKbFZkCNOJ7AMgwijmSMkhH9eOY/9nZNrRffO5kHMaJB0L+fasVjA== X-Received: by 2002:adf:d1c9:0:b0:203:c4f8:dd17 with SMTP id b9-20020adfd1c9000000b00203c4f8dd17mr10465301wrd.633.1651522793740; Mon, 02 May 2022 13:19:53 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:53 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 13/19] crypto: sun8i-ss: Add function for handling hash padding Date: Mon, 2 May 2022 20:19:23 +0000 Message-Id: <20220502201929.843194-14-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Move all padding work to a dedicated function. Signed-off-by: Corentin Labbe --- .../crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 87 ++++++++++++++----- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index cb510ec21ec4..0db1e8253667 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -328,6 +328,64 @@ int sun8i_ss_hash_digest(struct ahash_request *areq) return crypto_transfer_hash_request_to_engine(engine, areq); } =20 +static u64 hash_pad(__le32 *buf, unsigned int bufsize, u64 padi, u64 byte_= count, bool le, int bs) +{ + u64 fill, min_fill, j, k; + __be64 *bebits; + __le64 *lebits; + + j =3D padi; + buf[j++] =3D cpu_to_le32(0x80); + + if (bs =3D=3D 64) { + fill =3D 64 - (byte_count % 64); + min_fill =3D 2 * sizeof(u32) + sizeof(u32); + } else { + fill =3D 128 - (byte_count % 128); + min_fill =3D 4 * sizeof(u32) + sizeof(u32); + } + + if (fill < min_fill) + fill +=3D bs; + + k =3D j; + j +=3D (fill - min_fill) / sizeof(u32); + if (j * 4 > bufsize) { + pr_err("%s OVERFLOW %llu\n", __func__, j); + return 0; + } + for (; k < j; k++) + buf[k] =3D 0; + + if (le) { + /* MD5 */ + lebits =3D (__le64 *)&buf[j]; + *lebits =3D cpu_to_le64(byte_count << 3); + j +=3D 2; + } else { + if (bs =3D=3D 64) { + /* sha1 sha224 sha256 */ + bebits =3D (__be64 *)&buf[j]; + *bebits =3D cpu_to_be64(byte_count << 3); + j +=3D 2; + } else { + /* sha384 sha512*/ + bebits =3D (__be64 *)&buf[j]; + *bebits =3D cpu_to_be64(byte_count >> 61); + j +=3D 2; + bebits =3D (__be64 *)&buf[j]; + *bebits =3D cpu_to_be64(byte_count << 3); + j +=3D 2; + } + } + if (j * 4 > bufsize) { + pr_err("%s OVERFLOW %llu\n", __func__, j); + return 0; + } + + return j; +} + /* sun8i_ss_hash_run - run an ahash request * Send the data of the request to the SS along with an extra SG with padd= ing */ @@ -342,11 +400,9 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, vo= id *breq) struct scatterlist *sg; int nr_sgs, err, digestsize; unsigned int len; - u64 fill, min_fill, byte_count; + u64 byte_count; void *pad, *result; int j, i, k, todo; - __be64 *bebits; - __le64 *lebits; dma_addr_t addr_res, addr_pad; __le32 *bf; =20 @@ -421,33 +477,20 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, v= oid *breq) i--; =20 byte_count =3D areq->nbytes; - bf[j++] =3D cpu_to_le32(0x80); - - fill =3D 64 - (byte_count % 64); - min_fill =3D 3 * sizeof(u32); - - if (fill < min_fill) - fill +=3D 64; - - k =3D j; - j +=3D (fill - min_fill) / sizeof(u32); - for (; k < j; k++) - bf[k] =3D 0; - switch (algt->ss_algo_id) { case SS_ID_HASH_MD5: - lebits =3D (__le64 *)&bf[j]; - *lebits =3D cpu_to_le64(byte_count << 3); - j +=3D 2; + j =3D hash_pad(bf, 4096, j, byte_count, true, bs); break; case SS_ID_HASH_SHA1: case SS_ID_HASH_SHA224: case SS_ID_HASH_SHA256: - bebits =3D (__be64 *)&bf[j]; - *bebits =3D cpu_to_be64(byte_count << 3); - j +=3D 2; + j =3D hash_pad(bf, 4096, j, byte_count, false, bs); break; } + if (!j) { + err =3D -EINVAL; + goto theend; + } =20 addr_pad =3D dma_map_single(ss->dev, pad, j * 4, DMA_TO_DEVICE); if (dma_mapping_error(ss->dev, addr_pad)) { --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DF17CC433F5 for ; Mon, 2 May 2022 20:22:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387332AbiEBU0J (ORCPT ); Mon, 2 May 2022 16:26:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50572 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387388AbiEBUXo (ORCPT ); Mon, 2 May 2022 16:23:44 -0400 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 52ADFDF53 for ; Mon, 2 May 2022 13:19:56 -0700 (PDT) Received: by mail-wm1-x330.google.com with SMTP id 1-20020a05600c248100b00393fbf11a05so199618wms.3 for ; Mon, 02 May 2022 13:19:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=fAlxpxtKQhhpisN+Py9FmMy6YuYBERKDhwqtKZhDyAo=; b=7CxxjDPMlkrl47HfZLfw+apLCpYM7mixUq10gF5lhfeVCZf15cvn3IeV8QRyP1PCNI 7FQ/x9VR9CP27aGcvrFWNYWIRZZ0tJDx33/fCzhxZacBHsF7TGu52mxPKKyC6O5yPUcH T63N6eowyYpxt/O9gUU9I6YBNHQSO84vLlaAEWvwXi+QDgM09ETsFhiRfjVBegVuGCBc iU796qGpodTLwv4wBv+YVCLKGDZDBXcw9ChnCL09nMpItDya7obq0XaM5SdZgEiqyUEr paAP2RiaKK3hh8ZlJQTX7VrZ2Qd8LdrMHUVZfUd46WJA/jqBoxJdJKua2BefO5d+jDDm 9paw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fAlxpxtKQhhpisN+Py9FmMy6YuYBERKDhwqtKZhDyAo=; b=2gQqiIYcnJAqR5HD/TzXoScyProCv16tx7Y8pjDS67fmPvajruJcrxZh1oDaX7cqeU PV/veZ/wQM4LrGclx/fanUIr1nHm6LZXoJqlRhlQ/ylvDO3BTiquPuhrXEDdXtNn+RUs Uq6TP4HjHeNbthaFJ96XqdDYCFFQZwDISsnVU00qxVXfkMKB+HQ4rER4T2nmYWm15wZK E4C/fOx6GkynaoMOBIwTbrAKj+pm1kd9KGuQNlYptjhrYm6ExawOjtKMpbgTM0VwI06a j1iJhoQ0cpaRQp1EnR1eyS//62LO+xyi8G7XsrtarG+kktsMY3jvDvF0nAapsuzvUrw1 zIkw== X-Gm-Message-State: AOAM530bP3mtrvf1zowgyjqDSnAF+F8+Ytu/u6i/GFKHNwYZ1lSsK02k gqvBqw7Ui3E/jMMU/JmrwdXrmQ== X-Google-Smtp-Source: ABdhPJx/dcGNqbDujavfd8x+wU3TmwxeTY3wHMU8vzvobp3llcvksQL8P3JWf8YejFfl8OahCSnDOg== X-Received: by 2002:a1c:f413:0:b0:37b:d1de:5762 with SMTP id z19-20020a1cf413000000b0037bd1de5762mr599919wma.108.1651522794849; Mon, 02 May 2022 13:19:54 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:54 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 14/19] crypto: sun8i-ss: add hmac(sha1) Date: Mon, 2 May 2022 20:19:24 +0000 Message-Id: <20220502201929.843194-15-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Even if sun8i-ss does not handle hmac(sha1) directly, we can provide one which use the already supported acceleration of sha1. Signed-off-by: Corentin Labbe --- .../crypto/allwinner/sun8i-ss/sun8i-ss-core.c | 31 +++ .../crypto/allwinner/sun8i-ss/sun8i-ss-hash.c | 200 +++++++++++++++++- drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h | 6 + 3 files changed, 231 insertions(+), 6 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-core.c index f09de5737e8b..98593a0cff69 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c @@ -409,6 +409,37 @@ static struct sun8i_ss_alg_template ss_algs[] =3D { } } }, +{ .type =3D CRYPTO_ALG_TYPE_AHASH, + .ss_algo_id =3D SS_ID_HASH_SHA1, + .alg.hash =3D { + .init =3D sun8i_ss_hash_init, + .update =3D sun8i_ss_hash_update, + .final =3D sun8i_ss_hash_final, + .finup =3D sun8i_ss_hash_finup, + .digest =3D sun8i_ss_hash_digest, + .export =3D sun8i_ss_hash_export, + .import =3D sun8i_ss_hash_import, + .setkey =3D sun8i_ss_hmac_setkey, + .halg =3D { + .digestsize =3D SHA1_DIGEST_SIZE, + .statesize =3D sizeof(struct sha1_state), + .base =3D { + .cra_name =3D "hmac(sha1)", + .cra_driver_name =3D "hmac-sha1-sun8i-ss", + .cra_priority =3D 300, + .cra_alignmask =3D 3, + .cra_flags =3D CRYPTO_ALG_TYPE_AHASH | + CRYPTO_ALG_ASYNC | + CRYPTO_ALG_NEED_FALLBACK, + .cra_blocksize =3D SHA1_BLOCK_SIZE, + .cra_ctxsize =3D sizeof(struct sun8i_ss_hash_tfm_ctx), + .cra_module =3D THIS_MODULE, + .cra_init =3D sun8i_ss_hash_crainit, + .cra_exit =3D sun8i_ss_hash_craexit, + } + } + } +}, #endif }; =20 diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/cr= ypto/allwinner/sun8i-ss/sun8i-ss-hash.c index 0db1e8253667..ac417a6b39e5 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c @@ -14,12 +14,99 @@ #include #include #include +#include #include #include #include #include #include "sun8i-ss.h" =20 +static int sun8i_ss_hashkey(struct sun8i_ss_hash_tfm_ctx *tfmctx, const u8= *key, + unsigned int keylen) +{ + struct crypto_shash *xtfm; + struct shash_desc *sdesc; + size_t len; + int ret =3D 0; + + xtfm =3D crypto_alloc_shash("sha1", 0, CRYPTO_ALG_NEED_FALLBACK); + if (!xtfm) + return -ENOMEM; + + len =3D sizeof(*sdesc) + crypto_shash_descsize(xtfm); + sdesc =3D kmalloc(len, GFP_KERNEL); + if (!sdesc) { + ret =3D -ENOMEM; + goto err_hashkey_sdesc; + } + sdesc->tfm =3D xtfm; + + ret =3D crypto_shash_init(sdesc); + if (ret) { + dev_err(tfmctx->ss->dev, "shash init error ret=3D%d\n", ret); + goto err_hashkey; + } + ret =3D crypto_shash_finup(sdesc, key, keylen, tfmctx->key); + if (ret) + dev_err(tfmctx->ss->dev, "shash finup error\n"); +err_hashkey: + kfree(sdesc); +err_hashkey_sdesc: + crypto_free_shash(xtfm); + return ret; +} + +int sun8i_ss_hmac_setkey(struct crypto_ahash *ahash, const u8 *key, + unsigned int keylen) +{ + struct sun8i_ss_hash_tfm_ctx *tfmctx =3D crypto_ahash_ctx(ahash); + struct ahash_alg *alg =3D __crypto_ahash_alg(ahash->base.__crt_alg); + struct sun8i_ss_alg_template *algt; + int digestsize, i; + int bs =3D crypto_ahash_blocksize(ahash); + int ret; + + algt =3D container_of(alg, struct sun8i_ss_alg_template, alg.hash); + digestsize =3D algt->alg.hash.halg.digestsize; + + if (keylen > bs) { + ret =3D sun8i_ss_hashkey(tfmctx, key, keylen); + if (ret) + return ret; + tfmctx->keylen =3D digestsize; + } else { + tfmctx->keylen =3D keylen; + memcpy(tfmctx->key, key, keylen); + } + + tfmctx->ipad =3D kzalloc(bs, GFP_KERNEL | GFP_DMA); + if (!tfmctx->ipad) + return -ENOMEM; + tfmctx->opad =3D kzalloc(bs, GFP_KERNEL | GFP_DMA); + if (!tfmctx->opad) { + ret =3D -ENOMEM; + goto err_opad; + } + + memset(tfmctx->key + tfmctx->keylen, 0, bs - tfmctx->keylen); + memcpy(tfmctx->ipad, tfmctx->key, tfmctx->keylen); + memcpy(tfmctx->opad, tfmctx->key, tfmctx->keylen); + for (i =3D 0; i < bs; i++) { + tfmctx->ipad[i] ^=3D HMAC_IPAD_VALUE; + tfmctx->opad[i] ^=3D HMAC_OPAD_VALUE; + } + + ret =3D crypto_ahash_setkey(tfmctx->fallback_tfm, key, keylen); + if (!ret) + return 0; + + memzero_explicit(tfmctx->key, keylen); + kfree_sensitive(tfmctx->opad); +err_opad: + kfree_sensitive(tfmctx->ipad); + return ret; +} + int sun8i_ss_hash_crainit(struct crypto_tfm *tfm) { struct sun8i_ss_hash_tfm_ctx *op =3D crypto_tfm_ctx(tfm); @@ -67,6 +154,9 @@ void sun8i_ss_hash_craexit(struct crypto_tfm *tfm) { struct sun8i_ss_hash_tfm_ctx *tfmctx =3D crypto_tfm_ctx(tfm); =20 + kfree_sensitive(tfmctx->ipad); + kfree_sensitive(tfmctx->opad); + crypto_free_ahash(tfmctx->fallback_tfm); pm_runtime_put_sync_suspend(tfmctx->ss->dev); } @@ -393,18 +483,26 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, v= oid *breq) { struct ahash_request *areq =3D container_of(breq, struct ahash_request, b= ase); struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct sun8i_ss_hash_tfm_ctx *tfmctx =3D crypto_ahash_ctx(tfm); struct ahash_alg *alg =3D __crypto_ahash_alg(tfm->base.__crt_alg); struct sun8i_ss_hash_reqctx *rctx =3D ahash_request_ctx(areq); struct sun8i_ss_alg_template *algt; struct sun8i_ss_dev *ss; struct scatterlist *sg; + int bs =3D crypto_ahash_blocksize(tfm); int nr_sgs, err, digestsize; unsigned int len; u64 byte_count; void *pad, *result; int j, i, k, todo; - dma_addr_t addr_res, addr_pad; + dma_addr_t addr_res, addr_pad, addr_xpad; __le32 *bf; + /* HMAC step: + * 0: normal hashing + * 1: IPAD + * 2: OPAD + */ + int hmac =3D 0; =20 algt =3D container_of(alg, struct sun8i_ss_alg_template, alg.hash); ss =3D algt->ss; @@ -439,7 +537,7 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, voi= d *breq) if (dma_mapping_error(ss->dev, addr_res)) { dev_err(ss->dev, "DMA map dest\n"); err =3D -EINVAL; - goto theend; + goto err_dma_result; } =20 j =3D 0; @@ -476,7 +574,60 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, vo= id *breq) if (j > 0) i--; =20 +retry: byte_count =3D areq->nbytes; + if (tfmctx->keylen && hmac =3D=3D 0) { + hmac =3D 1; + /* shift all SG one slot up, to free slot 0 for IPAD */ + for (k =3D 6; k >=3D 0; k--) { + rctx->t_src[k + 1].addr =3D rctx->t_src[k].addr; + rctx->t_src[k + 1].len =3D rctx->t_src[k].len; + rctx->t_dst[k + 1].addr =3D rctx->t_dst[k].addr; + rctx->t_dst[k + 1].len =3D rctx->t_dst[k].len; + } + addr_xpad =3D dma_map_single(ss->dev, tfmctx->ipad, bs, DMA_TO_DEVICE); + if (dma_mapping_error(ss->dev, addr_xpad)) { + dev_err(ss->dev, "Fail to create DMA mapping of ipad\n"); + goto err_dma_xpad; + } + rctx->t_src[0].addr =3D addr_xpad; + rctx->t_src[0].len =3D bs / 4; + rctx->t_dst[0].addr =3D addr_res; + rctx->t_dst[0].len =3D digestsize / 4; + i++; + byte_count =3D areq->nbytes + bs; + } + if (tfmctx->keylen && hmac =3D=3D 2) { + for (i =3D 0; i < MAX_SG; i++) { + rctx->t_src[i].addr =3D 0; + rctx->t_src[i].len =3D 0; + rctx->t_dst[i].addr =3D 0; + rctx->t_dst[i].len =3D 0; + } + + addr_res =3D dma_map_single(ss->dev, result, digestsize, DMA_FROM_DEVICE= ); + if (dma_mapping_error(ss->dev, addr_res)) { + dev_err(ss->dev, "Fail to create DMA mapping of result\n"); + err =3D -EINVAL; + goto err_dma_result; + } + addr_xpad =3D dma_map_single(ss->dev, tfmctx->opad, bs, DMA_TO_DEVICE); + if (dma_mapping_error(ss->dev, addr_xpad)) { + dev_err(ss->dev, "Fail to create DMA mapping of opad\n"); + goto err_dma_xpad; + } + rctx->t_src[0].addr =3D addr_xpad; + rctx->t_src[0].len =3D bs / 4; + + memcpy(bf, result, digestsize); + j =3D digestsize / 4; + i =3D 1; + byte_count =3D digestsize + bs; + + rctx->t_dst[0].addr =3D addr_res; + rctx->t_dst[0].len =3D digestsize / 4; + } + switch (algt->ss_algo_id) { case SS_ID_HASH_MD5: j =3D hash_pad(bf, 4096, j, byte_count, true, bs); @@ -496,7 +647,7 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, voi= d *breq) if (dma_mapping_error(ss->dev, addr_pad)) { dev_err(ss->dev, "DMA error on padding SG\n"); err =3D -EINVAL; - goto theend; + goto err_dma_pad; } rctx->t_src[i].addr =3D addr_pad; rctx->t_src[i].len =3D j; @@ -505,12 +656,49 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, v= oid *breq) =20 err =3D sun8i_ss_run_hash_task(ss, rctx, crypto_tfm_alg_name(areq->base.t= fm)); =20 + /* + * mini helper for checking dma map/unmap + * flow start for hmac =3D 0 (and HMAC =3D 1) + * HMAC =3D 0 + * MAP src + * MAP res + * + * retry: + * if hmac then hmac =3D 1 + * MAP xpad (ipad) + * if hmac =3D=3D 2 + * MAP res + * MAP xpad (opad) + * MAP pad + * ACTION! + * UNMAP pad + * if hmac + * UNMAP xpad + * UNMAP res + * if hmac < 2 + * UNMAP SRC + * + * if hmac =3D 1 then hmac =3D 2 goto retry + */ + dma_unmap_single(ss->dev, addr_pad, j * 4, DMA_TO_DEVICE); - dma_unmap_sg(ss->dev, areq->src, sg_nents(areq->src), - DMA_TO_DEVICE); + +err_dma_pad: + if (hmac > 0) + dma_unmap_single(ss->dev, addr_xpad, bs, DMA_TO_DEVICE); +err_dma_xpad: dma_unmap_single(ss->dev, addr_res, digestsize, DMA_FROM_DEVICE); +err_dma_result: + if (hmac < 2) + dma_unmap_sg(ss->dev, areq->src, sg_nents(areq->src), + DMA_TO_DEVICE); + if (hmac =3D=3D 1 && !err) { + hmac =3D 2; + goto retry; + } =20 - memcpy(areq->result, result, algt->alg.hash.halg.digestsize); + if (!err) + memcpy(areq->result, result, algt->alg.hash.halg.digestsize); theend: local_bh_disable(); crypto_finalize_hash_request(engine, breq, err); diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/= allwinner/sun8i-ss/sun8i-ss.h index b56038de333b..df6f08f6092f 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h @@ -239,6 +239,10 @@ struct sun8i_ss_hash_tfm_ctx { struct crypto_engine_ctx enginectx; struct crypto_ahash *fallback_tfm; struct sun8i_ss_dev *ss; + u8 *ipad; + u8 *opad; + u8 key[SHA256_BLOCK_SIZE]; + int keylen; }; =20 /* @@ -319,3 +323,5 @@ int sun8i_ss_hash_update(struct ahash_request *areq); int sun8i_ss_hash_finup(struct ahash_request *areq); int sun8i_ss_hash_digest(struct ahash_request *areq); int sun8i_ss_hash_run(struct crypto_engine *engine, void *breq); +int sun8i_ss_hmac_setkey(struct crypto_ahash *ahash, const u8 *key, + unsigned int keylen); --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B21C7C433FE for ; Mon, 2 May 2022 20:22:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387384AbiEBU0F (ORCPT ); Mon, 2 May 2022 16:26:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387396AbiEBUXo (ORCPT ); Mon, 2 May 2022 16:23:44 -0400 Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6ED67DFA2 for ; Mon, 2 May 2022 13:19:57 -0700 (PDT) Received: by mail-wm1-x335.google.com with SMTP id 125-20020a1c1983000000b003941f354c62so217442wmz.0 for ; Mon, 02 May 2022 13:19:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oIeqhKRxF0U5tRj3NnGKzyz6xK4sM71zOrP1ZT9hTbY=; b=yvV6JIXPcOiaU2VTjW9zgzCvbarMzyhovA3J1IuLDT2IK5eyTD5UzGBCyc1mI9WcSZ /mtXCmy9KKa09MqJv1z8LFluLsUy7nlpVjts9/swVbgAV5BWxE4HZxnlTeBwoUjP90PV ZsEbyzJCwn91d99oL5k/uSWNuKGca3J81nJUb4o9/tKBbrb8oMAEV2ZL0sBwOjfj0lVa rAGHSAX1pdd/C8Q94q427LmmkPPBNwoe/jEiM7sh32JkojixN9VLb1KzmfnaOHFbMbgn 9KiAWwAHOvMCn5bM+AageKYsNM/JGHty4SUUSqrB1eoF5206muMHWB3ROgpTzxRm6iu7 5Hlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oIeqhKRxF0U5tRj3NnGKzyz6xK4sM71zOrP1ZT9hTbY=; b=aXxKTFXIgEe0wjpB9V1QHBWttjEcDdF64xFt1EEi683GZ8YUCmKy0bOdbZdQXJrrwM nCTh0kOiWzafS9WgSZDz+nI2aBjOt9LetR17tAb5IJbajEkBfPW4aR36ti5cdNPFvcJR kuSB+896vNtGxJOV0rwd06/whheQVDmRbu7+AeWZ+/CW5fHrqXkkOmgDPOtCVhCKNu09 x8I9CIUB9O3bn+wVRzX+wGAXfvr7npUze01x+0ALlzsqho28EbxFQGqXusq5Glxb6NEa xK9GZaFH7jUxSEWbYUYP48l8S4tEvq9NMre4g/NOZPbfZv01XNtPZxhspUlmMRc1Fj+1 oMBg== X-Gm-Message-State: AOAM530zjdL757s+nV6L7oMA7QG73Bv0mZiN6rNOHPkzZlYboj8V1s79 tmNje/UQAtC8RLzRRO8tt8YtFg== X-Google-Smtp-Source: ABdhPJzKNGeALqIKJ177u6e7uPs+Fezgg1LY8eg9s30A9Ei0ycHJlgHW13RpuwO//tLsJDHW3V2dUQ== X-Received: by 2002:a05:600c:35c5:b0:390:9982:73ec with SMTP id r5-20020a05600c35c500b00390998273ecmr583242wmq.196.1651522795957; Mon, 02 May 2022 13:19:55 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:55 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 15/19] crypto: sun8i-ss: do not fallback if cryptlen is less than sg length Date: Mon, 2 May 2022 20:19:25 +0000 Message-Id: <20220502201929.843194-16-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The sg length could be more than remaining data on it. So check the length requirement against the minimum between those two values. Signed-off-by: Corentin Labbe --- .../allwinner/sun8i-ss/sun8i-ss-cipher.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/= crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c index 7f1940c6cc41..5bb950182026 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c @@ -28,6 +28,7 @@ static bool sun8i_ss_need_fallback(struct skcipher_reques= t *areq) struct scatterlist *in_sg =3D areq->src; struct scatterlist *out_sg =3D areq->dst; struct scatterlist *sg; + unsigned int todo, len; =20 if (areq->cryptlen =3D=3D 0 || areq->cryptlen % 16) { algt->stat_fb_len++; @@ -40,13 +41,11 @@ static bool sun8i_ss_need_fallback(struct skcipher_requ= est *areq) return true; } =20 + len =3D areq->cryptlen; sg =3D areq->src; while (sg) { - if ((sg->length % 16) !=3D 0) { - algt->stat_fb_sglen++; - return true; - } - if ((sg_dma_len(sg) % 16) !=3D 0) { + todo =3D min(len, sg->length); + if ((todo % 16) !=3D 0) { algt->stat_fb_sglen++; return true; } @@ -54,15 +53,14 @@ static bool sun8i_ss_need_fallback(struct skcipher_requ= est *areq) algt->stat_fb_align++; return true; } + len -=3D todo; sg =3D sg_next(sg); } + len =3D areq->cryptlen; sg =3D areq->dst; while (sg) { - if ((sg->length % 16) !=3D 0) { - algt->stat_fb_sglen++; - return true; - } - if ((sg_dma_len(sg) % 16) !=3D 0) { + todo =3D min(len, sg->length); + if ((todo % 16) !=3D 0) { algt->stat_fb_sglen++; return true; } @@ -70,6 +68,7 @@ static bool sun8i_ss_need_fallback(struct skcipher_reques= t *areq) algt->stat_fb_align++; return true; } + len -=3D todo; sg =3D sg_next(sg); } =20 --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8304DC433F5 for ; Mon, 2 May 2022 20:21:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387678AbiEBUY1 (ORCPT ); Mon, 2 May 2022 16:24:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50594 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387398AbiEBUXp (ORCPT ); Mon, 2 May 2022 16:23:45 -0400 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8392DDFAF for ; Mon, 2 May 2022 13:19:57 -0700 (PDT) Received: by mail-wm1-x330.google.com with SMTP id o12-20020a1c4d0c000000b00393fbe2973dso208529wmh.2 for ; Mon, 02 May 2022 13:19:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=THm4In0PmhA5rhHf5Q0NS/J0EmQtdGVSharMkvmTBW0=; b=xskEsfiHASuyyqofp4j29niKlceKKoiyI4dacxua7VfCiY2Z6Y70rDAAPE5p45i8uH Q56JyfQFrHg7SuqDPAzcYlz6g5uQjyViUhZHGOmG/noWWa1M8N/TBfjiXmq8YZ1jJski 0rykjq0mMF7Or1pyf+kfHkp3JiV+Y/LVWYzyeuOHqdlf3roYmzQtiU6fXLkR6CAmeDuk gXFjmfcXg04kqNmdX7KLFyEscMLxKkAcQRuGTpHMbThtCj0OXhoQqoao6QJkrQL4BUoa +0//i9cnWttrzUflWQoL8jJV0Tn9rWjv2tlTa5wOa7WG2BeYZjM/dnAXIBPAHz4kSZxg n+Ew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=THm4In0PmhA5rhHf5Q0NS/J0EmQtdGVSharMkvmTBW0=; b=Nv/0MfMTAujLErhw1alx81E7O3RMNUcRUCf40ETWKut3vcFHkrhqybBUpbBx3KgOJI 10dofjUfkclkwve9iwnkhBckq61+gu7I7JweGJPNpUu33PG9/ZSEHzZdM+u6t9zZkKKs 26IV07kV0scgSpD8sUNLhuAhH6rfvCN4TpA3jICfMc1LFr9cUnIerVT7Ry+BaqYE+T/0 Pp9K83JM9USj9Kz5hlt6kNr12ja/BZmbSp6i5svv80hh8XKiqef/fpoBtZPnmfOCvQwU oRxKy982PNbwZopxduJYorvSq1dQM95xqa3KZ8QhZqn0yncZthDkmH4bCcsFpS5Ug9U9 cCgA== X-Gm-Message-State: AOAM531z+rwr7Em5HKT+DEn1RV1HOkkPckzRUekMz/XoJqPuC2wWI1ZY mGEcIISu7aP1XERrQzkYtyDX9Q== X-Google-Smtp-Source: ABdhPJwd9m59vPwTJ58V1tlzxTY9PpNzpJrV2MMvHOj99lJbegjAi4e8Z+B35ixmspHBkE2kBNTecQ== X-Received: by 2002:a05:600c:3b84:b0:394:32c6:489 with SMTP id n4-20020a05600c3b8400b0039432c60489mr537215wms.185.1651522797046; Mon, 02 May 2022 13:19:57 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:56 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 16/19] crypto: sun8i-ce: Add function for handling hash padding Date: Mon, 2 May 2022 20:19:26 +0000 Message-Id: <20220502201929.843194-17-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Move all padding work to a dedicated function. Signed-off-by: Corentin Labbe --- .../crypto/allwinner/sun8i-ce/sun8i-ce-hash.c | 95 +++++++++++++------ 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c b/drivers/cr= ypto/allwinner/sun8i-ce/sun8i-ce-hash.c index 859b7522faaa..1c82cd510c75 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c @@ -248,6 +248,64 @@ int sun8i_ce_hash_digest(struct ahash_request *areq) return crypto_transfer_hash_request_to_engine(engine, areq); } =20 +static u64 hash_pad(__le32 *buf, unsigned int bufsize, u64 padi, u64 byte_= count, bool le, int bs) +{ + u64 fill, min_fill, j, k; + __be64 *bebits; + __le64 *lebits; + + j =3D padi; + buf[j++] =3D cpu_to_le32(0x80); + + if (bs =3D=3D 64) { + fill =3D 64 - (byte_count % 64); + min_fill =3D 2 * sizeof(u32) + sizeof(u32); + } else { + fill =3D 128 - (byte_count % 128); + min_fill =3D 4 * sizeof(u32) + sizeof(u32); + } + + if (fill < min_fill) + fill +=3D bs; + + k =3D j; + j +=3D (fill - min_fill) / sizeof(u32); + if (j * 4 > bufsize) { + pr_err("%s OVERFLOW %llu\n", __func__, j); + return 0; + } + for (; k < j; k++) + buf[k] =3D 0; + + if (le) { + /* MD5 */ + lebits =3D (__le64 *)&buf[j]; + *lebits =3D cpu_to_le64(byte_count << 3); + j +=3D 2; + } else { + if (bs =3D=3D 64) { + /* sha1 sha224 sha256 */ + bebits =3D (__be64 *)&buf[j]; + *bebits =3D cpu_to_be64(byte_count << 3); + j +=3D 2; + } else { + /* sha384 sha512*/ + bebits =3D (__be64 *)&buf[j]; + *bebits =3D cpu_to_be64(byte_count >> 61); + j +=3D 2; + bebits =3D (__be64 *)&buf[j]; + *bebits =3D cpu_to_be64(byte_count << 3); + j +=3D 2; + } + } + if (j * 4 > bufsize) { + pr_err("%s OVERFLOW %llu\n", __func__, j); + return 0; + } + + return j; +} + int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) { struct ahash_request *areq =3D container_of(breq, struct ahash_request, b= ase); @@ -266,10 +324,6 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, vo= id *breq) __le32 *bf; void *buf =3D NULL; int j, i, todo; - int nbw =3D 0; - u64 fill, min_fill; - __be64 *bebits; - __le64 *lebits; void *result =3D NULL; u64 bs; int digestsize; @@ -348,44 +402,25 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, v= oid *breq) =20 byte_count =3D areq->nbytes; j =3D 0; - bf[j++] =3D cpu_to_le32(0x80); - - if (bs =3D=3D 64) { - fill =3D 64 - (byte_count % 64); - min_fill =3D 2 * sizeof(u32) + (nbw ? 0 : sizeof(u32)); - } else { - fill =3D 128 - (byte_count % 128); - min_fill =3D 4 * sizeof(u32) + (nbw ? 0 : sizeof(u32)); - } - - if (fill < min_fill) - fill +=3D bs; - - j +=3D (fill - min_fill) / sizeof(u32); =20 switch (algt->ce_algo_id) { case CE_ID_HASH_MD5: - lebits =3D (__le64 *)&bf[j]; - *lebits =3D cpu_to_le64(byte_count << 3); - j +=3D 2; + j =3D hash_pad(bf, 2 * bs, j, byte_count, true, bs); break; case CE_ID_HASH_SHA1: case CE_ID_HASH_SHA224: case CE_ID_HASH_SHA256: - bebits =3D (__be64 *)&bf[j]; - *bebits =3D cpu_to_be64(byte_count << 3); - j +=3D 2; + j =3D hash_pad(bf, 2 * bs, j, byte_count, false, bs); break; case CE_ID_HASH_SHA384: case CE_ID_HASH_SHA512: - bebits =3D (__be64 *)&bf[j]; - *bebits =3D cpu_to_be64(byte_count >> 61); - j +=3D 2; - bebits =3D (__be64 *)&bf[j]; - *bebits =3D cpu_to_be64(byte_count << 3); - j +=3D 2; + j =3D hash_pad(bf, 2 * bs, j, byte_count, false, bs); break; } + if (!j) { + err =3D -EINVAL; + goto theend; + } =20 addr_pad =3D dma_map_single(ce->dev, buf, j * 4, DMA_TO_DEVICE); cet->t_src[i].addr =3D cpu_to_le32(addr_pad); --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 873B5C433F5 for ; Mon, 2 May 2022 20:22:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387390AbiEBU0W (ORCPT ); Mon, 2 May 2022 16:26:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50662 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387430AbiEBUXq (ORCPT ); Mon, 2 May 2022 16:23:46 -0400 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 43027DFDE for ; Mon, 2 May 2022 13:19:59 -0700 (PDT) Received: by mail-wm1-x32b.google.com with SMTP id r1-20020a1c2b01000000b00394398c5d51so203154wmr.2 for ; Mon, 02 May 2022 13:19:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=T/PemtLL/+ON/eMGCnalVatEQc1XzYBkrl+H+ahkgok=; b=qn6nCzRQqIvyYOh9x8vLnhJDGIf8saLbZVRgueIApHsi5QjL/K902P4lJG3+UTxwL9 0f4I1Ujd4sQDv4reaJ04Duu3vayoLhS14GAvRITl2r/unFG9tREAkSnCSTjaRGfrhRT8 jxXWaBWPJ0MMK1dbXCRyJjVlsZJ/2J9A9mskB7ckS1pG44iNoWyeBCDQltgjD11V6crK slu3Bjmse8iZs8hIqq3dwr0xEpZRfQsvPHTb/uejrDzjxoREDHdGs6mYtwVjwl8titlX hOdnvDjmRpmFVX7xhZnd0giRAoTAfaBLjNdOO7G9B7yGQISN6tkr0agFtuyMghGJ0VIy gfAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=T/PemtLL/+ON/eMGCnalVatEQc1XzYBkrl+H+ahkgok=; b=kc6hZfi0EcLvEEnNRLWfNfR2QHIelYh6wB0Coc9jJNOiU3aAAh6zotONMsfNT1Louc 3F4EgCxuYX+Nzej+eO2RP7x0AGlXEVpYw2AeSxZOqtBr4pXZZz2aoXFQWTQh+dcfA7ye VatrmREPN4aL18KCq4urodGDc2+VgBd/AtlffbeDP/f/TuCyx6ia22JrigDZajm3qOfD i84MV4yY9VMXT9au05I/CWiO1q0FslIty58yRWXg+7KVOSnPoFs38G4XwsJdprRm+57/ s500bpUTs3hcqZKKhmbNDXpFQZB9rHiXHi+JE7OspsuALss13cs2EV/uxPA77M1bWN8y R1Fg== X-Gm-Message-State: AOAM530G0Ef2cihZgebs4u3x8pCfz/2gt4Yg3BxksO/mEeyPQMz1r1Yo GHp8IPLwM34M9xMnsMoNdSbbKA== X-Google-Smtp-Source: ABdhPJzblfA6nN9Ir/zKzCjq9kBWsGKTgKRhl21RRwI6zcBPGY6TFL43tb3xBoPbZ0CtoY/gPedx5A== X-Received: by 2002:a05:600c:1f17:b0:393:d821:eee4 with SMTP id bd23-20020a05600c1f1700b00393d821eee4mr552714wmb.163.1651522798163; Mon, 02 May 2022 13:19:58 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:57 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 17/19] crypto: sun8i-ce: use sg_nents_for_len Date: Mon, 2 May 2022 20:19:27 +0000 Message-Id: <20220502201929.843194-18-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" When testing with some large SG list, the sun8i-ce drivers always fallback even if it can handle it. So use sg_nents_for_len() which permits to see less SGs than needed. Signed-off-by: Corentin Labbe --- .../allwinner/sun8i-ce/sun8i-ce-cipher.c | 23 ++++++++----------- .../crypto/allwinner/sun8i-ce/sun8i-ce-hash.c | 10 ++++---- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c b/drivers/= crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c index 0b1ce58bdeb9..35ab71d3a82d 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c @@ -26,7 +26,8 @@ static int sun8i_ce_cipher_need_fallback(struct skcipher_= request *areq) struct crypto_skcipher *tfm =3D crypto_skcipher_reqtfm(areq); struct scatterlist *sg; =20 - if (sg_nents(areq->src) > MAX_SG || sg_nents(areq->dst) > MAX_SG) + if (sg_nents_for_len(areq->src, areq->cryptlen) > MAX_SG || + sg_nents_for_len(areq->dst, areq->cryptlen) > MAX_SG) return true; =20 if (areq->cryptlen < crypto_skcipher_ivsize(tfm)) @@ -94,6 +95,8 @@ static int sun8i_ce_cipher_prepare(struct crypto_engine *= engine, void *async_req int nr_sgs =3D 0; int nr_sgd =3D 0; int err =3D 0; + int ns =3D sg_nents_for_len(areq->src, areq->cryptlen); + int nd =3D sg_nents_for_len(areq->dst, areq->cryptlen); =20 algt =3D container_of(alg, struct sun8i_ce_alg_template, alg.skcipher); =20 @@ -169,8 +172,7 @@ static int sun8i_ce_cipher_prepare(struct crypto_engine= *engine, void *async_req } =20 if (areq->src =3D=3D areq->dst) { - nr_sgs =3D dma_map_sg(ce->dev, areq->src, sg_nents(areq->src), - DMA_BIDIRECTIONAL); + nr_sgs =3D dma_map_sg(ce->dev, areq->src, ns, DMA_BIDIRECTIONAL); if (nr_sgs <=3D 0 || nr_sgs > MAX_SG) { dev_err(ce->dev, "Invalid sg number %d\n", nr_sgs); err =3D -EINVAL; @@ -178,15 +180,13 @@ static int sun8i_ce_cipher_prepare(struct crypto_engi= ne *engine, void *async_req } nr_sgd =3D nr_sgs; } else { - nr_sgs =3D dma_map_sg(ce->dev, areq->src, sg_nents(areq->src), - DMA_TO_DEVICE); + nr_sgs =3D dma_map_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); if (nr_sgs <=3D 0 || nr_sgs > MAX_SG) { dev_err(ce->dev, "Invalid sg number %d\n", nr_sgs); err =3D -EINVAL; goto theend_iv; } - nr_sgd =3D dma_map_sg(ce->dev, areq->dst, sg_nents(areq->dst), - DMA_FROM_DEVICE); + nr_sgd =3D dma_map_sg(ce->dev, areq->dst, nd, DMA_FROM_DEVICE); if (nr_sgd <=3D 0 || nr_sgd > MAX_SG) { dev_err(ce->dev, "Invalid sg number %d\n", nr_sgd); err =3D -EINVAL; @@ -231,14 +231,11 @@ static int sun8i_ce_cipher_prepare(struct crypto_engi= ne *engine, void *async_req =20 theend_sgs: if (areq->src =3D=3D areq->dst) { - dma_unmap_sg(ce->dev, areq->src, sg_nents(areq->src), - DMA_BIDIRECTIONAL); + dma_unmap_sg(ce->dev, areq->src, ns, DMA_BIDIRECTIONAL); } else { if (nr_sgs > 0) - dma_unmap_sg(ce->dev, areq->src, sg_nents(areq->src), - DMA_TO_DEVICE); - dma_unmap_sg(ce->dev, areq->dst, sg_nents(areq->dst), - DMA_FROM_DEVICE); + dma_unmap_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); + dma_unmap_sg(ce->dev, areq->dst, nd, DMA_FROM_DEVICE); } =20 theend_iv: diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c b/drivers/cr= ypto/allwinner/sun8i-ce/sun8i-ce-hash.c index 1c82cd510c75..59e07eb5f058 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c @@ -204,7 +204,7 @@ static bool sun8i_ce_hash_need_fallback(struct ahash_re= quest *areq) if (areq->nbytes =3D=3D 0) return true; /* we need to reserve one SG for padding one */ - if (sg_nents(areq->src) > MAX_SG - 1) + if (sg_nents_for_len(areq->src, areq->nbytes) > MAX_SG - 1) return true; sg =3D areq->src; while (sg) { @@ -229,7 +229,7 @@ int sun8i_ce_hash_digest(struct ahash_request *areq) if (sun8i_ce_hash_need_fallback(areq)) return sun8i_ce_hash_digest_fb(areq); =20 - nr_sgs =3D sg_nents(areq->src); + nr_sgs =3D sg_nents_for_len(areq->src, areq->nbytes); if (nr_sgs > MAX_SG - 1) return sun8i_ce_hash_digest_fb(areq); =20 @@ -328,6 +328,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, voi= d *breq) u64 bs; int digestsize; dma_addr_t addr_res, addr_pad; + int ns =3D sg_nents_for_len(areq->src, areq->nbytes); =20 algt =3D container_of(alg, struct sun8i_ce_alg_template, alg.hash); ce =3D algt->ce; @@ -372,7 +373,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, voi= d *breq) cet->t_sym_ctl =3D 0; cet->t_asym_ctl =3D 0; =20 - nr_sgs =3D dma_map_sg(ce->dev, areq->src, sg_nents(areq->src), DMA_TO_DEV= ICE); + nr_sgs =3D dma_map_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); if (nr_sgs <=3D 0 || nr_sgs > MAX_SG) { dev_err(ce->dev, "Invalid sg number %d\n", nr_sgs); err =3D -EINVAL; @@ -441,8 +442,7 @@ int sun8i_ce_hash_run(struct crypto_engine *engine, voi= d *breq) err =3D sun8i_ce_run_task(ce, flow, crypto_tfm_alg_name(areq->base.tfm)); =20 dma_unmap_single(ce->dev, addr_pad, j * 4, DMA_TO_DEVICE); - dma_unmap_sg(ce->dev, areq->src, sg_nents(areq->src), - DMA_TO_DEVICE); + dma_unmap_sg(ce->dev, areq->src, ns, DMA_TO_DEVICE); dma_unmap_single(ce->dev, addr_res, digestsize, DMA_FROM_DEVICE); =20 =20 --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92FA5C43217 for ; Mon, 2 May 2022 20:21:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387371AbiEBUYe (ORCPT ); Mon, 2 May 2022 16:24:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387428AbiEBUXq (ORCPT ); Mon, 2 May 2022 16:23:46 -0400 Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D4336DF8D for ; Mon, 2 May 2022 13:20:00 -0700 (PDT) Received: by mail-wm1-x336.google.com with SMTP id n126-20020a1c2784000000b0038e8af3e788so203582wmn.1 for ; Mon, 02 May 2022 13:20:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hnLf6ANTLXHz5g8yhdCYklAPeG3EJL9SIZ6fc2YpRWI=; b=DKp2KbM39QMvNXnqZ3EXGT7jJ7H8w7steQrt1bk/OPISgycRunSgieduAuwUD7WIsv 4NA9MbthKp8v4CiEWmwTUuuaJ8OXJnl9qgVgMg5OUnl8hkyfBt4eQrf784S25g7VqDSg 9Kh+qT3y6JNf9MRF1XyRC2pw6rapvo3EDQNaLpm8w9KTE1kR8BCH6Y/YcxGss1pDuH8L jD1dDCZIRtH4j6nX62T5LPU39ugBpO0VnhNrBzuDtopUtByOnNqQTebgX3ogxip4f4b7 mPOs62GI23QDSmK22huBptJfligJwskiYnARNobNTNwtEuCcKfwEwRJLfAGOMGVlIs0J Ohpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hnLf6ANTLXHz5g8yhdCYklAPeG3EJL9SIZ6fc2YpRWI=; b=17MzRKQ9TCfOJRMcR4FqSPADCWoD+aEPAbcf/muyzws0ga0/uPabsw6MpTycfOVXmx jE1BuW8gGVN9EmyH/n/xBaPIZFPow7+vyr1NSeWSJY8zAE4Sz2wztBp9ikhoAShIdZOU 4QyYAPyS3yp1UsulWJEY87GIug4hGzaHeP+gCpmpS5Hbn1X901Yexr1XF875QS+tjpZn OC4a5MStnz9AMbfl3nRyAIkJQ6OdzYAY6N+c5GSUCkJMev3q+lIWZJQYo2mDb7XsUFOg 5UL9SeYcZ+wd2O0VSBN+Bj9lFWQiCQh3N/nnUy++HYSv0xRTTCkc1h446w/Kcz9iRuph PZIw== X-Gm-Message-State: AOAM533inz0mjNAFZIwUchB1e/Q1pbb6V8raSTcAMFKd33b79IVRSKxF 9uB2G/CeYpk2W60gtezcllUX+A== X-Google-Smtp-Source: ABdhPJxmb/JGlcoytmPL4qI1E4edM4eoAg0E9wAOZ45V7R2hhGyKm5HKAPaJ8l3Mt8muAdVLc0z2dA== X-Received: by 2002:a05:600c:502a:b0:394:4d62:f0d3 with SMTP id n42-20020a05600c502a00b003944d62f0d3mr196004wmr.102.1651522799190; Mon, 02 May 2022 13:19:59 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:58 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 18/19] crypto: sun8i-ce: rework debugging Date: Mon, 2 May 2022 20:19:28 +0000 Message-Id: <20220502201929.843194-19-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The "Fallback for xxx" message is annoying, remove it and store the information in the debugfs. Let's add more precise fallback stats and display it better. Signed-off-by: Corentin Labbe --- .../allwinner/sun8i-ce/sun8i-ce-cipher.c | 43 +++++++++++++++---- .../crypto/allwinner/sun8i-ce/sun8i-ce-core.c | 34 +++++++++++++-- .../crypto/allwinner/sun8i-ce/sun8i-ce-hash.c | 27 +++++++++--- drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h | 11 ++++- 4 files changed, 96 insertions(+), 19 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c b/drivers/= crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c index 35ab71d3a82d..315a62e424d6 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c @@ -25,27 +25,54 @@ static int sun8i_ce_cipher_need_fallback(struct skciphe= r_request *areq) { struct crypto_skcipher *tfm =3D crypto_skcipher_reqtfm(areq); struct scatterlist *sg; + struct skcipher_alg *alg =3D crypto_skcipher_alg(tfm); + struct sun8i_ce_alg_template *algt; + + algt =3D container_of(alg, struct sun8i_ce_alg_template, alg.skcipher); =20 if (sg_nents_for_len(areq->src, areq->cryptlen) > MAX_SG || - sg_nents_for_len(areq->dst, areq->cryptlen) > MAX_SG) + sg_nents_for_len(areq->dst, areq->cryptlen) > MAX_SG) { + algt->stat_fb_maxsg++; return true; + } + + if (areq->cryptlen < crypto_skcipher_ivsize(tfm)) { + algt->stat_fb_leniv++; + return true; + } =20 - if (areq->cryptlen < crypto_skcipher_ivsize(tfm)) + if (areq->cryptlen =3D=3D 0) { + algt->stat_fb_len0++; return true; + } =20 - if (areq->cryptlen =3D=3D 0 || areq->cryptlen % 16) + if (areq->cryptlen % 16) { + algt->stat_fb_mod16++; return true; + } =20 sg =3D areq->src; while (sg) { - if (sg->length % 4 || !IS_ALIGNED(sg->offset, sizeof(u32))) + if (!IS_ALIGNED(sg->offset, sizeof(u32))) { + algt->stat_fb_srcali++; + return true; + } + if (sg->length % 4) { + algt->stat_fb_srclen++; return true; + } sg =3D sg_next(sg); } sg =3D areq->dst; while (sg) { - if (sg->length % 4 || !IS_ALIGNED(sg->offset, sizeof(u32))) + if (!IS_ALIGNED(sg->offset, sizeof(u32))) { + algt->stat_fb_dstali++; + return true; + } + if (sg->length % 4) { + algt->stat_fb_dstlen++; return true; + } sg =3D sg_next(sg); } return false; @@ -384,9 +411,9 @@ int sun8i_ce_cipher_init(struct crypto_tfm *tfm) sktfm->reqsize =3D sizeof(struct sun8i_cipher_req_ctx) + crypto_skcipher_reqsize(op->fallback_tfm); =20 - dev_info(op->ce->dev, "Fallback for %s is %s\n", - crypto_tfm_alg_driver_name(&sktfm->base), - crypto_tfm_alg_driver_name(crypto_skcipher_tfm(op->fallback_tfm))); + memcpy(algt->fbname, + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(op->fallback_tfm)), + CRYPTO_MAX_ALG_NAME); =20 op->enginectx.op.do_one_request =3D sun8i_ce_cipher_run; op->enginectx.op.prepare_request =3D sun8i_ce_cipher_prepare; diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c b/drivers/cr= ypto/allwinner/sun8i-ce/sun8i-ce-core.c index 8f902607af68..7f608e1e6bde 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c @@ -644,19 +644,47 @@ static int sun8i_ce_debugfs_show(struct seq_file *seq= , void *v) continue; switch (ce_algs[i].type) { case CRYPTO_ALG_TYPE_SKCIPHER: - seq_printf(seq, "%s %s %lu %lu\n", + seq_printf(seq, "%s %s reqs=3D%lu fallback=3D%lu\n", ce_algs[i].alg.skcipher.base.cra_driver_name, ce_algs[i].alg.skcipher.base.cra_name, ce_algs[i].stat_req, ce_algs[i].stat_fb); + seq_printf(seq, "\tLast fallback is: %s\n", + ce_algs[i].fbname); + seq_printf(seq, "\tFallback due to 0 length: %lu\n", + ce_algs[i].stat_fb_len0); + seq_printf(seq, "\tFallback due to length !mod16: %lu\n", + ce_algs[i].stat_fb_mod16); + seq_printf(seq, "\tFallback due to length < IV: %lu\n", + ce_algs[i].stat_fb_leniv); + seq_printf(seq, "\tFallback due to source alignment: %lu\n", + ce_algs[i].stat_fb_srcali); + seq_printf(seq, "\tFallback due to dest alignment: %lu\n", + ce_algs[i].stat_fb_dstali); + seq_printf(seq, "\tFallback due to source length: %lu\n", + ce_algs[i].stat_fb_srclen); + seq_printf(seq, "\tFallback due to dest length: %lu\n", + ce_algs[i].stat_fb_dstlen); + seq_printf(seq, "\tFallback due to SG numbers: %lu\n", + ce_algs[i].stat_fb_maxsg); break; case CRYPTO_ALG_TYPE_AHASH: - seq_printf(seq, "%s %s %lu %lu\n", + seq_printf(seq, "%s %s reqs=3D%lu fallback=3D%lu\n", ce_algs[i].alg.hash.halg.base.cra_driver_name, ce_algs[i].alg.hash.halg.base.cra_name, ce_algs[i].stat_req, ce_algs[i].stat_fb); + seq_printf(seq, "\tLast fallback is: %s\n", + ce_algs[i].fbname); + seq_printf(seq, "\tFallback due to 0 length: %lu\n", + ce_algs[i].stat_fb_len0); + seq_printf(seq, "\tFallback due to length: %lu\n", + ce_algs[i].stat_fb_srclen); + seq_printf(seq, "\tFallback due to alignment: %lu\n", + ce_algs[i].stat_fb_srcali); + seq_printf(seq, "\tFallback due to SG numbers: %lu\n", + ce_algs[i].stat_fb_maxsg); break; case CRYPTO_ALG_TYPE_RNG: - seq_printf(seq, "%s %s %lu %lu\n", + seq_printf(seq, "%s %s reqs=3D%lu bytes=3D%lu\n", ce_algs[i].alg.rng.base.cra_driver_name, ce_algs[i].alg.rng.base.cra_name, ce_algs[i].stat_req, ce_algs[i].stat_bytes); diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c b/drivers/cr= ypto/allwinner/sun8i-ce/sun8i-ce-hash.c index 59e07eb5f058..8b5b9b9d04c3 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c @@ -50,9 +50,9 @@ int sun8i_ce_hash_crainit(struct crypto_tfm *tfm) sizeof(struct sun8i_ce_hash_reqctx) + crypto_ahash_reqsize(op->fallback_tfm)); =20 - dev_info(op->ce->dev, "Fallback for %s is %s\n", - crypto_tfm_alg_driver_name(tfm), - crypto_tfm_alg_driver_name(&op->fallback_tfm->base)); + memcpy(algt->fbname, crypto_tfm_alg_driver_name(&op->fallback_tfm->base), + CRYPTO_MAX_ALG_NAME); + err =3D pm_runtime_get_sync(op->ce->dev); if (err < 0) goto error_pm; @@ -199,17 +199,32 @@ static int sun8i_ce_hash_digest_fb(struct ahash_reque= st *areq) =20 static bool sun8i_ce_hash_need_fallback(struct ahash_request *areq) { + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct ahash_alg *alg =3D __crypto_ahash_alg(tfm->base.__crt_alg); + struct sun8i_ce_alg_template *algt; struct scatterlist *sg; =20 - if (areq->nbytes =3D=3D 0) + algt =3D container_of(alg, struct sun8i_ce_alg_template, alg.hash); + + if (areq->nbytes =3D=3D 0) { + algt->stat_fb_len0++; return true; + } /* we need to reserve one SG for padding one */ - if (sg_nents_for_len(areq->src, areq->nbytes) > MAX_SG - 1) + if (sg_nents_for_len(areq->src, areq->nbytes) > MAX_SG - 1) { + algt->stat_fb_maxsg++; return true; + } sg =3D areq->src; while (sg) { - if (sg->length % 4 || !IS_ALIGNED(sg->offset, sizeof(u32))) + if (sg->length % 4) { + algt->stat_fb_srclen++; return true; + } + if (!IS_ALIGNED(sg->offset, sizeof(u32))) { + algt->stat_fb_srcali++; + return true; + } sg =3D sg_next(sg); } return false; diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h b/drivers/crypto/= allwinner/sun8i-ce/sun8i-ce.h index 229b696d5a2c..30a6405b2051 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h @@ -393,11 +393,18 @@ struct sun8i_ce_alg_template { struct rng_alg rng; struct akcipher_alg rsa; } alg; -#ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_DEBUG unsigned long stat_req; unsigned long stat_fb; unsigned long stat_bytes; -#endif + unsigned long stat_fb_maxsg; + unsigned long stat_fb_leniv; + unsigned long stat_fb_len0; + unsigned long stat_fb_mod16; + unsigned long stat_fb_srcali; + unsigned long stat_fb_srclen; + unsigned long stat_fb_dstali; + unsigned long stat_fb_dstlen; + char fbname[CRYPTO_MAX_ALG_NAME]; }; =20 int sun8i_ce_enqueue(struct crypto_async_request *areq, u32 type); --=20 2.35.1 From nobody Mon Jun 15 07:24:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D521CC433F5 for ; Mon, 2 May 2022 20:22:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1387415AbiEBU0P (ORCPT ); Mon, 2 May 2022 16:26:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49724 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1387432AbiEBUXr (ORCPT ); Mon, 2 May 2022 16:23:47 -0400 Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E011EE005 for ; Mon, 2 May 2022 13:20:01 -0700 (PDT) Received: by mail-wm1-x329.google.com with SMTP id n126-20020a1c2784000000b0038e8af3e788so203590wmn.1 for ; Mon, 02 May 2022 13:20:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gVZKFf6rPDkmO5DXMIf8r+ln13AjKZcUQ+EmJhnMbco=; b=vAeTdnHo3qR1FWUwsf55Yu8pevDNugRWHgAMolHx7E8DXRIRmHwHTz8j72yZWy9JL1 /DFhUMBAtwBCSTM1+dBVlXlmHosxwvoh/VgDPJ1OUt7AsbV5NFbo9clH7nIh9IdfmYQs 4ak6bMgydmbgchikddawHYISXTOv/TXpt42dUEN5jyQIKjeFSJ2L9VfRd/RyO8RIbaSL 9DlTuMDb2DQx2n2HfYRirnD/AsBLglHPakph5+N2xOW903EgTzi8W2TlBV89z4ldK7kA XYGTQOFj8ZHeracuk2vuVMteU+d3CsNfhUuOT18GlT4rS8oRQHJme8dnuqdpFCxME5yf m+6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gVZKFf6rPDkmO5DXMIf8r+ln13AjKZcUQ+EmJhnMbco=; b=rbkfWBsa8LHPWb+KSv0w38uBptKO6k7rl/SAxcs2VMi4qrUS5vvzTNbBihYahi95hv b0OgVmgmDlluflwbiY0YdoQSXk92IaZpo/qlOKMAuXY+grz0eBLiI9YdmPqyVv+hRJPr FXgStjeaCJBAKt4TmNqD5+YhzdajWqHrk0nBArOGFuAdPMDfB03vtJo4jWoFLCELHi7L +AbWO6bgA0FEdYRV2y8rJa1eF+Sfa7kjfNLFx1zy3BHWsof644MQPHCGm/k+vrxNcjYD cAJeZ7fWoWvJpxHCFXsgHhgKhOmGrQ/0LxSoBbhFaF/eSeAfsOvhnmCkBToEKYuaXMjw M1Iw== X-Gm-Message-State: AOAM530qMC8E5qIJKyGR88hR66p1kSf734fFlDXpgpy8ERkRDEepxSvG 2Rg6ecQIs+KXWLjgtuMeCA+x7b9L9TOOoA== X-Google-Smtp-Source: ABdhPJw3HaxpGN8whizH4wdXki0y1JP1MvY1TkcYUphltpBI7YZfTUqOiVT/4q729FA3sZ2p48OI5g== X-Received: by 2002:a05:600c:2045:b0:394:2457:9c36 with SMTP id p5-20020a05600c204500b0039424579c36mr578104wmg.76.1651522800228; Mon, 02 May 2022 13:20:00 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id l2-20020adfb102000000b0020c547f75easm7238183wra.101.2022.05.02.13.19.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 May 2022 13:19:59 -0700 (PDT) From: Corentin Labbe To: herbert@gondor.apana.org.au, jernej.skrabec@gmail.com, samuel@sholland.org, wens@csie.org Cc: linux-arm-kernel@lists.infradead.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Corentin Labbe Subject: [PATCH v2 19/19] crypto: sun8i-ce: do not fallback if cryptlen is less than sg length Date: Mon, 2 May 2022 20:19:29 +0000 Message-Id: <20220502201929.843194-20-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220502201929.843194-1-clabbe@baylibre.com> References: <20220502201929.843194-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The sg length could be more than remaining data on it. So check the length requirement against the minimum between those two values. Signed-off-by: Corentin Labbe --- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c b/drivers/= crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c index 315a62e424d6..74b4e910a38d 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c @@ -27,6 +27,7 @@ static int sun8i_ce_cipher_need_fallback(struct skcipher_= request *areq) struct scatterlist *sg; struct skcipher_alg *alg =3D crypto_skcipher_alg(tfm); struct sun8i_ce_alg_template *algt; + unsigned int todo, len; =20 algt =3D container_of(alg, struct sun8i_ce_alg_template, alg.skcipher); =20 @@ -51,28 +52,35 @@ static int sun8i_ce_cipher_need_fallback(struct skciphe= r_request *areq) return true; } =20 + len =3D areq->cryptlen; sg =3D areq->src; while (sg) { if (!IS_ALIGNED(sg->offset, sizeof(u32))) { algt->stat_fb_srcali++; return true; } - if (sg->length % 4) { + todo =3D min(len, sg->length); + if (todo % 4) { algt->stat_fb_srclen++; return true; } + len -=3D todo; sg =3D sg_next(sg); } + + len =3D areq->cryptlen; sg =3D areq->dst; while (sg) { if (!IS_ALIGNED(sg->offset, sizeof(u32))) { algt->stat_fb_dstali++; return true; } - if (sg->length % 4) { + todo =3D min(len, sg->length); + if (todo % 4) { algt->stat_fb_dstlen++; return true; } + len -=3D todo; sg =3D sg_next(sg); } return false; --=20 2.35.1