From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0B71389106 for ; Thu, 28 May 2026 09:09:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959364; cv=none; b=f+lqGZsTNMF70HzsxhNt/zAPDdDrUNR9zCijdHylE0CXbUI1l3rEwwqI89PdzQtEMUA1zRuZk4HcZ2XlFXcHt1bdIDtfzJLVVy5CworCViLUUPC47y4dwH6K4SAuamzB7/xjMO8XLvP1ZvamAAM2SowYZ/txKp8jWJ8G06DVm2c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959364; c=relaxed/simple; bh=ta/Smu01jyKJATz3JseyekU4VD8FhqAsrm9jyf6++EE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AW1LOdl1y7dLHBqTgzyY+tBRLb05cOzxbncnv0dh6gQ1g2odhjkHurR19e9YPRL3JIU3HLQVyrsNFxzAiFgUK4gfKCmoejACrDYMF5EubUXvTiSG34zS1cszAT0Y1BrHXB1A6aRKrhM2kAqYPLOBjS03BjACPJipFjKfmoV69uk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Zb86Fy2/; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Zb86Fy2/" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 2AAD71A36FE; Thu, 28 May 2026 09:09:19 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 002EE60495; Thu, 28 May 2026 09:09:19 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 7FDB410888C9C; Thu, 28 May 2026 11:09:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959358; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ZAOYyGzuVeJEfkfZdY1hEMakzXPko6Rfa4nzO14aFhQ=; b=Zb86Fy2/3YyPjNSySIXug/XTLo3TyIQ09pqoU/sPtvuBDgjAGBzM5UdYny8X1SjiYupBsE x344xYyDSCaovLA9kbYmjFiEFPrRVLPYegN0twfjBEPZwQHzspPXFPEUh9CQuwXtObdJKf ILRJytY+WryR3bVfzc3fPRCnLMRCLBtU6gfsvVElmnRYVaCXYPNwHc7IUHMPLquxUE90vq dg4/Sn/ZIzgUGjG/pJF+IabHRnCU6sdIAZ0LMju46BCMUezh9iCSVVr06yJN+Ef7qhTMbk oZOvhx9wtcDMSDS/WaD9Ab/Jt5ka53ptj3+XSTJPUKg76jQxKwtOGuiMQbMv3w== From: Paul Louvel Date: Thu, 28 May 2026 11:08:14 +0200 Subject: [PATCH 01/29] crypto: talitos/hash - Use CRYPTO_AHASH_BLOCK_ONLY API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-1-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=13750; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=ta/Smu01jyKJATz3JseyekU4VD8FhqAsrm9jyf6++EE=; b=ij3JRthNFotaxPoUcPZ0DNg222To74uVJlPO0poTAQgrXJKREogDq+FRXoboXc0hCC1ZJMbyF cKH8RoQGky4A85fzUoGXNuSYbETaB+G5NDEdAsjoUayf8Qr9DOpG1DE X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 The hash implementation maintained a software buffer to accumulate partial blocks across update() calls, copying data to/from scatterlists with sg_copy_to_buffer()/sg_pcopy_to_buffer() and chaining in a virtual scatterlist entry. This is unnecessary now with CRYPTO_AHASH_ALG_BLOCK_ONLY flag. Remove unnecessary fields in the request and export structure. On completion, pass any remaining tail bytes back via ahash_request_complete() so that the core re-submits them with the next request. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos.c | 149 ++++++++++++++++++-------------------------= ---- 1 file changed, 57 insertions(+), 92 deletions(-) diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index 584508963241..3610d9f6d5ea 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c @@ -941,25 +941,18 @@ struct talitos_ctx { struct talitos_ahash_req_ctx { u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)]; unsigned int hw_context_size; - u8 buf[2][HASH_MAX_BLOCK_SIZE]; - int buf_idx; unsigned int swinit; unsigned int first_request; unsigned int last_request; unsigned int to_hash_later; - unsigned int nbuf; - struct scatterlist bufsl[2]; - struct scatterlist *psrc; }; =20 struct talitos_export_state { u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)]; - u8 buf[HASH_MAX_BLOCK_SIZE]; unsigned int swinit; unsigned int first_request; unsigned int last_request; unsigned int to_hash_later; - unsigned int nbuf; }; =20 static int aead_setkey(struct crypto_aead *authenc, @@ -1826,14 +1819,8 @@ static void ahash_done(struct device *dev, struct talitos_edesc *next; =20 if (is_sec1) { - if (!req_ctx->last_request && req_ctx->to_hash_later) { - /* Position any partial block for next update/final/finup */ - req_ctx->buf_idx =3D (req_ctx->buf_idx + 1) & 1; - req_ctx->nbuf =3D req_ctx->to_hash_later; - } - free_edesc_list_from(areq, edesc); - ahash_request_complete(areq, err); + ahash_request_complete(areq, err ?: req_ctx->to_hash_later); } else { next =3D edesc->next_desc; =20 @@ -1851,14 +1838,9 @@ static void ahash_done(struct device *dev, return; } out: - if (!req_ctx->last_request && req_ctx->to_hash_later) { - /* Position any partial block for next update/final/finup */ - req_ctx->buf_idx =3D (req_ctx->buf_idx + 1) & 1; - req_ctx->nbuf =3D req_ctx->to_hash_later; - } if (err && next) free_edesc_list_from(areq, next); - ahash_request_complete(areq, err); + ahash_request_complete(areq, err ?: req_ctx->to_hash_later); } } =20 @@ -1978,7 +1960,7 @@ ahash_process_req_prepare(struct ahash_request *areq,= unsigned int nbytes, size_t offset =3D 0; =20 do { - src =3D scatterwalk_ffwd(tmp, req_ctx->psrc, offset); + src =3D scatterwalk_ffwd(tmp, areq->src, offset); =20 to_hash_this_desc =3D min(nbytes, ALIGN_DOWN(desc_max, blocksize)); @@ -1991,8 +1973,7 @@ ahash_process_req_prepare(struct ahash_request *areq,= unsigned int nbytes, return edesc; } =20 - edesc->src =3D - scatterwalk_ffwd(edesc->bufsl, req_ctx->psrc, offset); + edesc->src =3D scatterwalk_ffwd(edesc->bufsl, areq->src, offset); edesc->desc.hdr =3D ctx->desc_hdr_template; edesc->first =3D offset =3D=3D 0; edesc->last =3D nbytes - to_hash_this_desc =3D=3D 0; @@ -2045,62 +2026,17 @@ static int ahash_process_req(struct ahash_request *= areq, unsigned int nbytes) bool is_sec1 =3D has_ftr_sec1(dev_get_drvdata(ctx->dev)); unsigned int nbytes_to_hash; unsigned int to_hash_later; - unsigned int nsg; - int nents; struct device *dev =3D ctx->dev; - u8 *ctx_buf =3D req_ctx->buf[req_ctx->buf_idx]; int ret; =20 - if (!req_ctx->last_request && (nbytes + req_ctx->nbuf <=3D blocksize)) { - /* Buffer up to one whole block */ - nents =3D sg_nents_for_len(areq->src, nbytes); - if (nents < 0) { - dev_err(dev, "Invalid number of src SG.\n"); - return nents; - } - sg_copy_to_buffer(areq->src, nents, - ctx_buf + req_ctx->nbuf, nbytes); - req_ctx->nbuf +=3D nbytes; - return 0; - } - - /* At least (blocksize + 1) bytes are available to hash */ - nbytes_to_hash =3D nbytes + req_ctx->nbuf; - to_hash_later =3D nbytes_to_hash & (blocksize - 1); + nbytes_to_hash =3D ALIGN_DOWN(nbytes, blocksize); + to_hash_later =3D nbytes - nbytes_to_hash; =20 - if (req_ctx->last_request) + if (req_ctx->last_request) { + nbytes_to_hash =3D nbytes; to_hash_later =3D 0; - else if (to_hash_later) - /* There is a partial block. Hash the full block(s) now */ - nbytes_to_hash -=3D to_hash_later; - else { - /* Keep one block buffered */ - nbytes_to_hash -=3D blocksize; - to_hash_later =3D blocksize; - } - - /* Chain in any previously buffered data */ - if (req_ctx->nbuf) { - nsg =3D (req_ctx->nbuf < nbytes_to_hash) ? 2 : 1; - sg_init_table(req_ctx->bufsl, nsg); - sg_set_buf(req_ctx->bufsl, ctx_buf, req_ctx->nbuf); - if (nsg > 1) - sg_chain(req_ctx->bufsl, 2, areq->src); - req_ctx->psrc =3D req_ctx->bufsl; - } else - req_ctx->psrc =3D areq->src; - - if (to_hash_later) { - nents =3D sg_nents_for_len(areq->src, nbytes); - if (nents < 0) { - dev_err(dev, "Invalid number of src SG.\n"); - return nents; - } - sg_pcopy_to_buffer(areq->src, nents, - req_ctx->buf[(req_ctx->buf_idx + 1) & 1], - to_hash_later, - nbytes - to_hash_later); } + req_ctx->to_hash_later =3D to_hash_later; =20 edesc =3D ahash_process_req_prepare(areq, nbytes_to_hash, blocksize, @@ -2125,8 +2061,6 @@ static int ahash_init(struct ahash_request *areq) dma_addr_t dma; =20 /* Initialize the context */ - req_ctx->buf_idx =3D 0; - req_ctx->nbuf =3D 0; req_ctx->first_request =3D 1; req_ctx->swinit =3D 0; /* assume h/w init of context */ size =3D (crypto_ahash_digestsize(tfm) <=3D SHA256_DIGEST_SIZE) @@ -2223,12 +2157,10 @@ static int ahash_export(struct ahash_request *areq,= void *out) =20 memcpy(export->hw_context, req_ctx->hw_context, req_ctx->hw_context_size); - memcpy(export->buf, req_ctx->buf[req_ctx->buf_idx], req_ctx->nbuf); export->swinit =3D req_ctx->swinit; export->first_request =3D req_ctx->first_request; export->last_request =3D req_ctx->last_request; export->to_hash_later =3D req_ctx->to_hash_later; - export->nbuf =3D req_ctx->nbuf; =20 return 0; } @@ -2249,12 +2181,10 @@ static int ahash_import(struct ahash_request *areq,= const void *in) : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512; req_ctx->hw_context_size =3D size; memcpy(req_ctx->hw_context, export->hw_context, size); - memcpy(req_ctx->buf[0], export->buf, export->nbuf); req_ctx->swinit =3D export->swinit; req_ctx->first_request =3D export->first_request; req_ctx->last_request =3D export->last_request; req_ctx->to_hash_later =3D export->to_hash_later; - req_ctx->nbuf =3D export->nbuf; =20 dma =3D dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size, DMA_TO_DEVICE); @@ -2932,8 +2862,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "md5", .cra_driver_name =3D "md5-talitos", .cra_blocksize =3D MD5_HMAC_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -2948,8 +2881,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "sha1", .cra_driver_name =3D "sha1-talitos", .cra_blocksize =3D SHA1_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -2964,8 +2900,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "sha224", .cra_driver_name =3D "sha224-talitos", .cra_blocksize =3D SHA224_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -2980,8 +2919,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "sha256", .cra_driver_name =3D "sha256-talitos", .cra_blocksize =3D SHA256_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -2996,8 +2938,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "sha384", .cra_driver_name =3D "sha384-talitos", .cra_blocksize =3D SHA384_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -3012,8 +2957,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "sha512", .cra_driver_name =3D "sha512-talitos", .cra_blocksize =3D SHA512_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -3028,8 +2976,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "hmac(md5)", .cra_driver_name =3D "hmac-md5-talitos", .cra_blocksize =3D MD5_HMAC_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -3044,8 +2995,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "hmac(sha1)", .cra_driver_name =3D "hmac-sha1-talitos", .cra_blocksize =3D SHA1_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -3060,8 +3014,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "hmac(sha224)", .cra_driver_name =3D "hmac-sha224-talitos", .cra_blocksize =3D SHA224_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -3076,8 +3033,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "hmac(sha256)", .cra_driver_name =3D "hmac-sha256-talitos", .cra_blocksize =3D SHA256_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -3092,8 +3052,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "hmac(sha384)", .cra_driver_name =3D "hmac-sha384-talitos", .cra_blocksize =3D SHA384_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -3108,8 +3071,11 @@ static struct talitos_alg_template driver_algs[] =3D= { .cra_name =3D "hmac(sha512)", .cra_driver_name =3D "hmac-sha512-talitos", .cra_blocksize =3D SHA512_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -3181,7 +3147,6 @@ static int talitos_cra_init_ahash(struct crypto_tfm *= tfm) algt.alg.hash); =20 ctx->keylen =3D 0; - crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm), sizeof(struct talitos_ahash_req_ctx)); =20 return talitos_init_common(ctx, talitos_alg); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3033B3A4539 for ; Thu, 28 May 2026 09:09:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959366; cv=none; b=qgTog9W1rPzSg4TgyObZ7PmF+dp3DLrslx8gm8HHziimvcvxYiYg049d/hUPN7mwDTENuxH7DXfpJ0l56+hRSM4UhLXbaqWtkmYhZNXF3YB792UtBkd+N9YAAaUrFF3FbcnWzNEEPINUacAFvMF4ajR3yzsFVdOtoIUSbZsmuWg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959366; c=relaxed/simple; bh=AbMNTsWT4ICFxe5P1QMFr0o1DAujs2qHoBfkOxpDHAw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ey8p+i/72tI2JpfQIOu8ksYpBwCNgLkTXV9gc8xtAl/20we6JqVark9S9QMX3N2ZXcv6pHmMMhEyzzvUV82QsHCujEVZRPqI1lSt0QedtaODayuXicQBJXe2MZWZlKWITZynU12jUWPOpGTdwcn05SeaCdj7u6VuMHAnr7R4qog= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=npRCGhuC; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="npRCGhuC" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 5F0FD1A3700; Thu, 28 May 2026 09:09:21 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2368660495; Thu, 28 May 2026 09:09:21 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id B21521088877F; Thu, 28 May 2026 11:09:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959360; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=8K8qqwYMLYf2wBsVGqxOFMAz9CzVbdicwsuOzEDro/E=; b=npRCGhuCDyEMcgRikxQFW23kIBgPuQmo87BgbexiItD80wyUCCHGstL1BkK2xMWjYcjHUp 650XL1+tgeUrbtiC1dy4+nMW9hLiTBRUS3BSrIK7pNg6p6R5xHOAkIgh/iEbSicIsTeb5C CB6Jc7tVuieGUk8UMzjKN7wce+ET/xpvK/Ku/PJRAWwOdrL6se+LIPWQ1pQ8hn5+8gxzfJ 1+zMgqqbI7PmphepSONXfqdnhlPV8Yi67QLa3EhQMN8KuTj2O/f5bBWJR9uGA59Cpsc69A l4qWn0xHJl5dVdchpkGaItey0LqLYpei7vxj1OS6m6nkB9rHyBbS7TYWFVYZnA== From: Paul Louvel Date: Thu, 28 May 2026 11:08:15 +0200 Subject: [PATCH 02/29] crypto: talitos - Move driver into dedicated directory Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-2-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=4762; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=AbMNTsWT4ICFxe5P1QMFr0o1DAujs2qHoBfkOxpDHAw=; b=nDgIywDweM6iyeGKWYCAPMxXezcxDuWNTnyYz4iX8GNew1XoACIhwUw/3zyff2jLjK8kzCzUT x+gRwxhAbLiDzbUzLU1RXFDb13EILTYQGsx1sCyUT7G0h7ywdHLghjB X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Move the talitos driver files from drivers/crypto/ into drivers/crypto/talitos/ to accommodate upcoming code reorganization. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/Kconfig | 38 +-----------------------------= ---- drivers/crypto/Makefile | 2 +- drivers/crypto/talitos/Kconfig | 36 ++++++++++++++++++++++++++++++= ++ drivers/crypto/talitos/Makefile | 1 + drivers/crypto/{ =3D> talitos}/talitos.c | 0 drivers/crypto/{ =3D> talitos}/talitos.h | 0 6 files changed, 39 insertions(+), 38 deletions(-) diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig index d23b58b81ca3..783b5dc42a42 100644 --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig @@ -253,43 +253,7 @@ config CRYPTO_DEV_HIFN_795X_RNG on the HIFN 795x crypto adapters. =20 source "drivers/crypto/caam/Kconfig" - -config CRYPTO_DEV_TALITOS - tristate "Talitos Freescale Security Engine (SEC)" - select CRYPTO_AEAD - select CRYPTO_AUTHENC - select CRYPTO_SKCIPHER - select CRYPTO_HASH - select CRYPTO_LIB_DES - select HW_RANDOM - depends on FSL_SOC - help - Say 'Y' here to use the Freescale Security Engine (SEC) - to offload cryptographic algorithm computation. - - The Freescale SEC is present on PowerQUICC 'E' processors, such - as the MPC8349E and MPC8548E. - - To compile this driver as a module, choose M here: the module - will be called talitos. - -config CRYPTO_DEV_TALITOS1 - bool "SEC1 (SEC 1.0 and SEC Lite 1.2)" - depends on CRYPTO_DEV_TALITOS - depends on PPC_8xx || PPC_82xx - default y - help - Say 'Y' here to use the Freescale Security Engine (SEC) version 1.0 - found on MPC82xx or the Freescale Security Engine (SEC Lite) - version 1.2 found on MPC8xx - -config CRYPTO_DEV_TALITOS2 - bool "SEC2+ (SEC version 2.0 or upper)" - depends on CRYPTO_DEV_TALITOS - default y if !PPC_8xx - help - Say 'Y' here to use the Freescale Security Engine (SEC) - version 2 and following as found on MPC83xx, MPC85xx, etc ... +source "drivers/crypto/talitos/Kconfig" =20 config CRYPTO_DEV_PPC4XX tristate "Driver AMCC PPC4xx crypto accelerator" diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile index 283bbc650b5b..a059139d4a75 100644 --- a/drivers/crypto/Makefile +++ b/drivers/crypto/Makefile @@ -35,7 +35,7 @@ obj-$(CONFIG_CRYPTO_DEV_SA2UL) +=3D sa2ul.o obj-$(CONFIG_CRYPTO_DEV_SAHARA) +=3D sahara.o obj-$(CONFIG_CRYPTO_DEV_SL3516) +=3D gemini/ obj-y +=3D stm32/ -obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos.o +obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos/ obj-$(CONFIG_CRYPTO_DEV_TEGRA) +=3D tegra/ obj-$(CONFIG_CRYPTO_DEV_VIRTIO) +=3D virtio/ obj-$(CONFIG_CRYPTO_DEV_BCM_SPU) +=3D bcm/ diff --git a/drivers/crypto/talitos/Kconfig b/drivers/crypto/talitos/Kconfig new file mode 100644 index 000000000000..c3470553a966 --- /dev/null +++ b/drivers/crypto/talitos/Kconfig @@ -0,0 +1,36 @@ +config CRYPTO_DEV_TALITOS + tristate "Talitos Freescale Security Engine (SEC)" + select CRYPTO_AEAD + select CRYPTO_AUTHENC + select CRYPTO_SKCIPHER + select CRYPTO_HASH + select CRYPTO_LIB_DES + select HW_RANDOM + depends on FSL_SOC + help + Say 'Y' here to use the Freescale Security Engine (SEC) + to offload cryptographic algorithm computation. + + The Freescale SEC is present on PowerQUICC 'E' processors, such + as the MPC8349E and MPC8548E. + + To compile this driver as a module, choose M here: the module + will be called talitos. + +config CRYPTO_DEV_TALITOS1 + bool "SEC1 (SEC 1.0 and SEC Lite 1.2)" + depends on CRYPTO_DEV_TALITOS + depends on PPC_8xx || PPC_82xx + default y + help + Say 'Y' here to use the Freescale Security Engine (SEC) version 1.0 + found on MPC82xx or the Freescale Security Engine (SEC Lite) + version 1.2 found on MPC8xx + +config CRYPTO_DEV_TALITOS2 + bool "SEC2+ (SEC version 2.0 or upper)" + depends on CRYPTO_DEV_TALITOS + default y if !PPC_8xx + help + Say 'Y' here to use the Freescale Security Engine (SEC) + version 2 and following as found on MPC83xx, MPC85xx, etc ... diff --git a/drivers/crypto/talitos/Makefile b/drivers/crypto/talitos/Makef= ile new file mode 100644 index 000000000000..fcc5db5e63c2 --- /dev/null +++ b/drivers/crypto/talitos/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos.o diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos/talitos.c similarity index 100% rename from drivers/crypto/talitos.c rename to drivers/crypto/talitos/talitos.c diff --git a/drivers/crypto/talitos.h b/drivers/crypto/talitos/talitos.h similarity index 100% rename from drivers/crypto/talitos.h rename to drivers/crypto/talitos/talitos.h --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF38F3A0EA6 for ; Thu, 28 May 2026 09:09:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959369; cv=none; b=k4BsvcH9w1fdGmJCvHdp/DK7ry1qlHFUebC4chfKPpT6fMN3a41yB1B01I2GfPTfNa0syWNzd9N3/87OBdVXUXQnbGaRltEb7KzPJeS6nC+/vjLB9dPdPlCW6hn8xp1Mh8DfQfI+Hs2XeRTU0NsNh/GI8D1w0ArtIBh7oiYtBhg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959369; c=relaxed/simple; bh=72MPFqbB4vxLjGV2gDXUUwFThJMyUooH3sc4YYxRMtg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cQW7a7prXRanGml+NeAT0xxTvMLeqtRl9gGnr0Ig2CUDH/QcQhZxX/zqPCpBs3fYiqgJZ9bto45BAaGFCWa+t37Ygv01PhA09fyaCnNSa3WLz6M1sbCnfsGbqFn6w3zyJqJ99KERHJNSJYAl2Gx2/2UjLDyj91NAXa16aXnDfqg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ieQIid/E; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ieQIid/E" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 90F644E42D79 for ; Thu, 28 May 2026 09:09:23 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5EA6960495; Thu, 28 May 2026 09:09:23 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A515D10888508; Thu, 28 May 2026 11:09:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959361; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=+fbd49VQbiv6xrXLwhNaPzxvtEck45Nwq5EsZcqp56A=; b=ieQIid/EmKM5f38V7LVlhelmaDxC24I/2ix1iXivD4xcFTtzaUC2B2mKQ4QooB984BAV9U 6831DaOprMtW9Wg4Hk7ZsJHC5kcGtBMZE1+SUUrDmFKdWMwsWsx24kKLpX+0TsTRmyFZ89 sw7yKq04grzwVLC2loLnyQVwDK44wl1d8Gw6UZ83lX92fPj6cp5TI1fF8mjeO21Gjw4FTO 4hd3ifAfgBEXvMLsbe8sA/ok5Y512e+xEw46X/Jf03f5uC8yJz5VvAzVgetfwD4dje/AGf Ksx2QWBgMA55PjjEPsE1wS3yQt6SLKM9rqJ8ckTuR3QqWi7TSR0/flgKlduyyA== From: Paul Louvel Date: Thu, 28 May 2026 11:08:16 +0200 Subject: [PATCH 03/29] crypto: talitos - Add missing includes to driver header file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-3-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=1415; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=72MPFqbB4vxLjGV2gDXUUwFThJMyUooH3sc4YYxRMtg=; b=LVJFk9q4RDbWM9Wh4ADC/N7So8tA3P8q2KS+fWaavmwbmrcuuZDvSciFRNL+EW7zNVi0UR4FO QZfgjdKURYADXSJG1YdzXlE4OMzWK/0cDpmY9pjKwUfRtU7YLnYeg5X X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Add explicit includes for types used by the header file to make it self-contained and fix implicit include dependencies. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/talitos.c | 3 --- drivers/crypto/talitos/talitos.h | 6 ++++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 3610d9f6d5ea..8ca587b98d92 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -15,10 +15,7 @@ #include #include #include -#include -#include #include -#include #include #include #include diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index d4ff8d589f46..56e36a65ddcc 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -5,6 +5,12 @@ * Copyright (c) 2006-2011 Freescale Semiconductor, Inc. */ =20 +#include +#include +#include +#include +#include + #define TALITOS_TIMEOUT 100000 #define TALITOS1_MAX_DATA_LEN 32768 #define TALITOS2_MAX_DATA_LEN 65535 --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 717BF3A2E12 for ; Thu, 28 May 2026 09:09:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959371; cv=none; b=Dx4Gx0SqYgnqzr8xMlaT0yYgbpcQpvH/vb5qJ8eeM+RSIJhMyi9febGvrjeKz9P0iP3ckuJvzTwTKnRVwezej1QcZAlnuQM9a8gBLpLGRyUsVIxmTU1hafczZB5OL+1Jvef17+upctndHJ/RclEdTMi5eD7aihBOdrFUAygdueE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959371; c=relaxed/simple; bh=nwED+gRb2it55nEH+dB+84AErpO9Lo1H1ndCWlFi6c8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=W5gWrrhnyjmcgZxmZvb1732M6TIk+zzFOl1MY6BQEH5u8kDwuHdv7kM6hQKPNPZ+Va5Y8N+TU4IwuMo1SgZfcJBDMkdL7xtF+aiylfYwHGORKevPqPXYgCOBbsw8N/j5DJ1SXekjC86EgzkmILwH0a3+BfMlvvMfWTQHdBbV6uQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=F5sFcetN; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="F5sFcetN" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id B9AD31A36FC; Thu, 28 May 2026 09:09:24 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8EF0960495; Thu, 28 May 2026 09:09:24 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0747710888CA7; Thu, 28 May 2026 11:09:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959363; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=aBSGuM3DUVG1FqL/RPhY2THQ09igkxVNbL+6loGb8Go=; b=F5sFcetNu11RI0cvWuexPlERFGTR0hzFEFhfXWjbLdDhLW3nW+J7jdU5pQs+A1DXlOQU1n 1DSj00ILGAse6edptdGDnBceBAltA/eeaKEbyeUyR0mM2DoxfZ71QpFrSFIpakJfahgKsO x7YLOSHwq4hGq6XGoKkvB/b9XFqQoSoQGqfzLtTy2hgmA6NoZ0NDGbhApg4jsfjERVvJXt lZG8dy0JSzdpIZvMjAzGuaGNCn8axmPV669dET1WAaJgi3k4zq1TZgrpN6wDLnGDdGlti1 5AsHoCdY14nOT0Dcya3FdszgPqIYA+x4QDqQNyhR8Z96hkgqEPitBSvGAOEROg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:17 +0200 Subject: [PATCH 04/29] crypto: talitos/hwrng - Move into separate file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-4-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=6422; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=nwED+gRb2it55nEH+dB+84AErpO9Lo1H1ndCWlFi6c8=; b=7+IVr4WiHt/uycspjEZZ4LYVAb/5M0Z7cDBNh1XXvKolzfUcfi0q7b4r4EF1ZlhlXPSvtroiv nfg573EsG1HBC3n5iWoQY7dOz4PoDFiv5wCSZMzDdYfqh2JPW8CgQVC X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Move the hardware random number generator implementation from talitos.c into a dedicated talitos-rng.c file. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/Makefile | 2 + drivers/crypto/talitos/talitos-rng.c | 93 ++++++++++++++++++++++++++++++++= ++++ drivers/crypto/talitos/talitos.c | 83 -------------------------------- drivers/crypto/talitos/talitos.h | 5 ++ 4 files changed, 100 insertions(+), 83 deletions(-) diff --git a/drivers/crypto/talitos/Makefile b/drivers/crypto/talitos/Makef= ile index fcc5db5e63c2..901ec681f010 100644 --- a/drivers/crypto/talitos/Makefile +++ b/drivers/crypto/talitos/Makefile @@ -1 +1,3 @@ obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos.o + +talitos-y :=3D talitos.o talitos-rng.o diff --git a/drivers/crypto/talitos/talitos-rng.c b/drivers/crypto/talitos/= talitos-rng.c new file mode 100644 index 000000000000..3aa00de33b25 --- /dev/null +++ b/drivers/crypto/talitos/talitos-rng.c @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * Freescale SEC (talitos) device hardware random number generator impleme= ntation + * + * Copyright (c) 2006-2011 Freescale Semiconductor, Inc. + */ + +#include +#include + +#include "talitos.h" + +static int talitos_rng_data_present(struct hwrng *rng, int wait) +{ + struct device *dev =3D (struct device *)rng->priv; + struct talitos_private *priv =3D dev_get_drvdata(dev); + u32 ofl; + int i; + + for (i =3D 0; i < 20; i++) { + ofl =3D in_be32(priv->reg_rngu + TALITOS_EUSR_LO) & + TALITOS_RNGUSR_LO_OFL; + if (ofl || !wait) + break; + udelay(10); + } + + return !!ofl; +} + +static int talitos_rng_data_read(struct hwrng *rng, u32 *data) +{ + struct device *dev =3D (struct device *)rng->priv; + struct talitos_private *priv =3D dev_get_drvdata(dev); + + /* rng fifo requires 64-bit accesses */ + *data =3D in_be32(priv->reg_rngu + TALITOS_EU_FIFO); + *data =3D in_be32(priv->reg_rngu + TALITOS_EU_FIFO_LO); + + return sizeof(u32); +} + +static int talitos_rng_init(struct hwrng *rng) +{ + struct device *dev =3D (struct device *)rng->priv; + struct talitos_private *priv =3D dev_get_drvdata(dev); + unsigned int timeout =3D TALITOS_TIMEOUT; + + setbits32(priv->reg_rngu + TALITOS_EURCR_LO, TALITOS_RNGURCR_LO_SR); + while (!(in_be32(priv->reg_rngu + TALITOS_EUSR_LO) + & TALITOS_RNGUSR_LO_RD) + && --timeout) + cpu_relax(); + if (timeout =3D=3D 0) { + dev_err(dev, "failed to reset rng hw\n"); + return -ENODEV; + } + + /* start generating */ + setbits32(priv->reg_rngu + TALITOS_EUDSR_LO, 0); + + return 0; +} + +int talitos_register_rng(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + int err; + + priv->rng.name =3D dev_driver_string(dev); + priv->rng.init =3D talitos_rng_init; + priv->rng.data_present =3D talitos_rng_data_present; + priv->rng.data_read =3D talitos_rng_data_read; + priv->rng.priv =3D (unsigned long)dev; + + err =3D hwrng_register(&priv->rng); + if (!err) + priv->rng_registered =3D true; + + return err; +} + +void talitos_unregister_rng(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + if (!priv->rng_registered) + return; + + hwrng_unregister(&priv->rng); + priv->rng_registered =3D false; +} diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 8ca587b98d92..f5feff8f7d3d 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -820,89 +820,6 @@ DEF_TALITOS2_INTERRUPT(ch0_2, TALITOS2_ISR_CH_0_2_DONE= , TALITOS2_ISR_CH_0_2_ERR, DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE, TALITOS2_ISR_CH_1_= 3_ERR, 1) =20 -/* - * hwrng - */ -static int talitos_rng_data_present(struct hwrng *rng, int wait) -{ - struct device *dev =3D (struct device *)rng->priv; - struct talitos_private *priv =3D dev_get_drvdata(dev); - u32 ofl; - int i; - - for (i =3D 0; i < 20; i++) { - ofl =3D in_be32(priv->reg_rngu + TALITOS_EUSR_LO) & - TALITOS_RNGUSR_LO_OFL; - if (ofl || !wait) - break; - udelay(10); - } - - return !!ofl; -} - -static int talitos_rng_data_read(struct hwrng *rng, u32 *data) -{ - struct device *dev =3D (struct device *)rng->priv; - struct talitos_private *priv =3D dev_get_drvdata(dev); - - /* rng fifo requires 64-bit accesses */ - *data =3D in_be32(priv->reg_rngu + TALITOS_EU_FIFO); - *data =3D in_be32(priv->reg_rngu + TALITOS_EU_FIFO_LO); - - return sizeof(u32); -} - -static int talitos_rng_init(struct hwrng *rng) -{ - struct device *dev =3D (struct device *)rng->priv; - struct talitos_private *priv =3D dev_get_drvdata(dev); - unsigned int timeout =3D TALITOS_TIMEOUT; - - setbits32(priv->reg_rngu + TALITOS_EURCR_LO, TALITOS_RNGURCR_LO_SR); - while (!(in_be32(priv->reg_rngu + TALITOS_EUSR_LO) - & TALITOS_RNGUSR_LO_RD) - && --timeout) - cpu_relax(); - if (timeout =3D=3D 0) { - dev_err(dev, "failed to reset rng hw\n"); - return -ENODEV; - } - - /* start generating */ - setbits32(priv->reg_rngu + TALITOS_EUDSR_LO, 0); - - return 0; -} - -static int talitos_register_rng(struct device *dev) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - int err; - - priv->rng.name =3D dev_driver_string(dev); - priv->rng.init =3D talitos_rng_init; - priv->rng.data_present =3D talitos_rng_data_present; - priv->rng.data_read =3D talitos_rng_data_read; - priv->rng.priv =3D (unsigned long)dev; - - err =3D hwrng_register(&priv->rng); - if (!err) - priv->rng_registered =3D true; - - return err; -} - -static void talitos_unregister_rng(struct device *dev) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - - if (!priv->rng_registered) - return; - - hwrng_unregister(&priv->rng); - priv->rng_registered =3D false; -} =20 /* * crypto alg diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 56e36a65ddcc..fa8c71b1f90f 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -431,3 +431,8 @@ static inline bool has_ftr_sec1(struct talitos_private = *priv) #define DESC_PTR_LNKTBL_JUMP 0x80 #define DESC_PTR_LNKTBL_RET 0x02 #define DESC_PTR_LNKTBL_NEXT 0x01 + +/* Hardware RNG */ + +int talitos_register_rng(struct device *dev); +void talitos_unregister_rng(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 66B5A3A4F3D; Thu, 28 May 2026 09:09:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959371; cv=none; b=uPAJcqi1qqXvjet0Mdt6VWNRYGAY0V718Ruu41ROCSSTHGcvj2SIsikwFZyGcGRs5rT44uvLTIR/u8HVjdfj31nqVC9xc0bdRFEA26ird+/MQpS+NO+HiogSLdaez9XCOdUXJQgOqpdVqOP4c9d9SVs8Ht3sqAR6a50dGwxqX0Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959371; c=relaxed/simple; bh=G2ZUDkBKY0pg85mOJ+/IFbQy8Pb1k6V9YXstlwImGSQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J2i/jUzfasbn+o1W/E+P7M9oJliOucsRmlfC8Mzd3CmO8irMcc6MB5vdOyBFj9xhpESBmvguaK3TQ7uj7JgF7pPa9r+W27+JhM33t9CzvvlSDOija88bR47f61qjyGuPde2GzA5C3N3ToO+UHH87lRq8uUKp1CLCTwszqvpig4g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=hYrqPXhn; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="hYrqPXhn" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 5B869C62445; Thu, 28 May 2026 09:09:26 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 33EA060495; Thu, 28 May 2026 09:09:26 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 36D871088877F; Thu, 28 May 2026 11:09:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959365; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=NPUCnKewshR6MyA0+VEEdSmxBjBZnSZ99GMkaHwwJu8=; b=hYrqPXhnsge2nT70x38IIPIvJZiXwwAVrrvxYufF2v6z0yqB15OeQlk/3DVg0P3GumRPGZ n+57GWvUOv5XFC9S4WzwvGqGx+5ObsqVIcLTBp2O/SvpE1fPlRPjf1uMrpnVZOWd1RJuKl eRakMTC9rZ4dxvPyD4cKcTWYOdZkzFcGCmeezi5Z8hc8enJI2AKQK46Cq2LAXdLnOQcnzZ /vnlym8u9z9WlHbQUaI/nxTzq4981NNpMehx4AQ5UWBFvp4i7YZAFhW0bbZ5smRaW8ZNSA p6GO+/c/0IRH/nXV0iGmsM0EZwQraC+flXlhGuXEjib7gR35yRpic3xfQi57Wg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:18 +0200 Subject: [PATCH 05/29] crypto: talitos - Prepare crypto implementation file splitting Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-5-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=14485; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=G2ZUDkBKY0pg85mOJ+/IFbQy8Pb1k6V9YXstlwImGSQ=; b=rPyOp/z2Uvvm1voPU4ucDwe2vS9K96OkkHnkDdY011ciojRa1zOlb63ZVgKW3rLi+vc6omBF3 olanm+EMywtCoBDO2IPMGZoxCBTF2K5jCVGNKMMaZbTjw11YXZwkqMj X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Remove the static qualifier on multiple function that will be called inside each crypto implementation file. Add them to the main driver header file. Add the common structures too. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos.c | 123 ++++++++++++++---------------------= ---- drivers/crypto/talitos/talitos.h | 91 +++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 79 deletions(-) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index f5feff8f7d3d..3fc1069062da 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -40,8 +40,8 @@ =20 #include "talitos.h" =20 -static void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr, - unsigned int len, bool is_sec1) +void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr, + unsigned int len, bool is_sec1) { ptr->ptr =3D cpu_to_be32(lower_32_bits(dma_addr)); if (is_sec1) { @@ -52,8 +52,8 @@ static void to_talitos_ptr(struct talitos_ptr *ptr, dma_a= ddr_t dma_addr, } } =20 -static void copy_talitos_ptr(struct talitos_ptr *dst_ptr, - struct talitos_ptr *src_ptr, bool is_sec1) +void copy_talitos_ptr(struct talitos_ptr *dst_ptr, + struct talitos_ptr *src_ptr, bool is_sec1) { dst_ptr->ptr =3D src_ptr->ptr; if (is_sec1) { @@ -64,8 +64,8 @@ static void copy_talitos_ptr(struct talitos_ptr *dst_ptr, } } =20 -static unsigned short from_talitos_ptr_len(struct talitos_ptr *ptr, - bool is_sec1) +unsigned short from_talitos_ptr_len(struct talitos_ptr *ptr, + bool is_sec1) { if (is_sec1) return be16_to_cpu(ptr->len1); @@ -73,14 +73,14 @@ static unsigned short from_talitos_ptr_len(struct talit= os_ptr *ptr, return be16_to_cpu(ptr->len); } =20 -static void to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val, - bool is_sec1) +void to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val, + bool is_sec1) { if (!is_sec1) ptr->j_extent =3D val; } =20 -static void to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val, bool is= _sec1) +void to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val, bool is_sec1) { if (!is_sec1) ptr->j_extent |=3D val; @@ -102,15 +102,15 @@ static void __map_single_talitos_ptr(struct device *d= ev, to_talitos_ptr(ptr, dma_addr, len, is_sec1); } =20 -static void map_single_talitos_ptr(struct device *dev, - struct talitos_ptr *ptr, - unsigned int len, void *data, - enum dma_data_direction dir) +void map_single_talitos_ptr(struct device *dev, + struct talitos_ptr *ptr, + unsigned int len, void *data, + enum dma_data_direction dir) { __map_single_talitos_ptr(dev, ptr, len, data, dir, 0); } =20 -static void map_single_talitos_ptr_nosync(struct device *dev, +void map_single_talitos_ptr_nosync(struct device *dev, struct talitos_ptr *ptr, unsigned int len, void *data, enum dma_data_direction dir) @@ -122,9 +122,9 @@ static void map_single_talitos_ptr_nosync(struct device= *dev, /* * unmap bus single (contiguous) h/w descriptor pointer */ -static void unmap_single_talitos_ptr(struct device *dev, - struct talitos_ptr *ptr, - enum dma_data_direction dir) +void unmap_single_talitos_ptr(struct device *dev, + struct talitos_ptr *ptr, + enum dma_data_direction dir) { struct talitos_private *priv =3D dev_get_drvdata(dev); bool is_sec1 =3D has_ftr_sec1(priv); @@ -303,11 +303,11 @@ static void dma_map_request(struct device *dev, struc= t talitos_request *request, * callback must check err and feedback in descriptor header * for device processing status. */ -static int talitos_submit(struct device *dev, int ch, struct talitos_desc = *desc, - void (*callback)(struct device *dev, - struct talitos_desc *desc, - void *context, int error), - void *context) +int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc, + void (*callback)(struct device *dev, + struct talitos_desc *desc, + void *context, int error), + void *context) { struct talitos_private *priv =3D dev_get_drvdata(dev); struct talitos_request *request; @@ -830,24 +830,6 @@ DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE= , TALITOS2_ISR_CH_1_3_ERR, * HMAC_SNOOP_NO_AFEA (HSNA) instead of type IPSEC_ESP */ #define TALITOS_CRA_PRIORITY_AEAD_HSNA (TALITOS_CRA_PRIORITY - 1) -#ifdef CONFIG_CRYPTO_DEV_TALITOS2 -#define TALITOS_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + SHA512_BLOCK_SIZE) -#else -#define TALITOS_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + SHA256_BLOCK_SIZE) -#endif -#define TALITOS_MAX_IV_LENGTH 16 /* max of AES_BLOCK_SIZE, DES3_EDE_BLOCK= _SIZE */ - -struct talitos_ctx { - struct device *dev; - int ch; - __be32 desc_hdr_template; - u8 key[TALITOS_MAX_KEY_SIZE]; - u8 iv[TALITOS_MAX_IV_LENGTH]; - dma_addr_t dma_key; - unsigned int keylen; - unsigned int enckeylen; - unsigned int authkeylen; -}; =20 #define HASH_MAX_BLOCK_SIZE SHA512_BLOCK_SIZE #define TALITOS_MDEU_MAX_CONTEXT_SIZE TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA= 512 @@ -939,7 +921,7 @@ static int aead_des3_setkey(struct crypto_aead *authenc, return err; } =20 -static void talitos_sg_unmap(struct device *dev, +void talitos_sg_unmap(struct device *dev, struct talitos_edesc *edesc, struct scatterlist *src, struct scatterlist *dst, @@ -1124,7 +1106,7 @@ static int sg_to_link_tbl_offset(struct scatterlist *= sg, int sg_count, return count; } =20 -static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src, +int talitos_sg_map_ext(struct device *dev, struct scatterlist *src, unsigned int len, struct talitos_edesc *edesc, struct talitos_ptr *ptr, int sg_count, unsigned int offset, int tbl_off, int elen, @@ -1161,7 +1143,7 @@ static int talitos_sg_map_ext(struct device *dev, str= uct scatterlist *src, return sg_count; } =20 -static int talitos_sg_map(struct device *dev, struct scatterlist *src, +int talitos_sg_map(struct device *dev, struct scatterlist *src, unsigned int len, struct talitos_edesc *edesc, struct talitos_ptr *ptr, int sg_count, unsigned int offset, int tbl_off) @@ -1299,17 +1281,17 @@ static int ipsec_esp(struct talitos_edesc *edesc, s= truct aead_request *areq, /* * allocate and map the extended descriptor */ -static struct talitos_edesc *talitos_edesc_alloc(struct device *dev, - struct scatterlist *src, - struct scatterlist *dst, - u8 *iv, - unsigned int assoclen, - unsigned int cryptlen, - unsigned int authsize, - unsigned int ivsize, - int icv_stashing, - u32 cryptoflags, - bool encrypt) +struct talitos_edesc *talitos_edesc_alloc(struct device *dev, + struct scatterlist *src, + struct scatterlist *dst, + u8 *iv, + unsigned int assoclen, + unsigned int cryptlen, + unsigned int authsize, + unsigned int ivsize, + int icv_stashing, + u32 cryptoflags, + bool encrypt) { struct talitos_edesc *edesc; int src_nents, dst_nents, alloc_len, dma_len, src_len, dst_len; @@ -2172,18 +2154,6 @@ static int ahash_setkey(struct crypto_ahash *tfm, co= nst u8 *key, return 0; } =20 - -struct talitos_alg_template { - u32 type; - u32 priority; - union { - struct skcipher_alg skcipher; - struct ahash_alg hash; - struct aead_alg aead; - } alg; - __be32 desc_hdr_template; -}; - static struct talitos_alg_template driver_algs[] =3D { /* AEAD algorithms. These use a single-pass ipsec_esp descriptor */ { .type =3D CRYPTO_ALG_TYPE_AEAD, @@ -2998,14 +2968,8 @@ static struct talitos_alg_template driver_algs[] =3D= { } }; =20 -struct talitos_crypto_alg { - struct list_head entry; - struct device *dev; - struct talitos_alg_template algt; -}; - -static int talitos_init_common(struct talitos_ctx *ctx, - struct talitos_crypto_alg *talitos_alg) +int talitos_init_common(struct talitos_ctx *ctx, + struct talitos_crypto_alg *talitos_alg) { struct talitos_private *priv; =20 @@ -3066,7 +3030,7 @@ static int talitos_cra_init_ahash(struct crypto_tfm *= tfm) return talitos_init_common(ctx, talitos_alg); } =20 -static void talitos_cra_exit(struct crypto_tfm *tfm) +void talitos_cra_exit(struct crypto_tfm *tfm) { struct talitos_ctx *ctx =3D crypto_tfm_ctx(tfm); struct device *dev =3D ctx->dev; @@ -3080,7 +3044,7 @@ static void talitos_cra_exit(struct crypto_tfm *tfm) * type and primary/secondary execution units required match the hw * capabilities description provided in the device tree node. */ -static int hw_supports(struct device *dev, __be32 desc_hdr_template) +int talitos_hw_supports(struct device *dev, __be32 desc_hdr_template) { struct talitos_private *priv =3D dev_get_drvdata(dev); int ret; @@ -3117,7 +3081,7 @@ static void talitos_remove(struct platform_device *of= dev) list_del(&t_alg->entry); } =20 - if (hw_supports(dev, DESC_HDR_SEL0_RNG)) + if (talitos_hw_supports(dev, DESC_HDR_SEL0_RNG)) talitos_unregister_rng(dev); =20 for (i =3D 0; i < 2; i++) @@ -3426,7 +3390,7 @@ static int talitos_probe(struct platform_device *ofde= v) } =20 /* register the RNG, if available */ - if (hw_supports(dev, DESC_HDR_SEL0_RNG)) { + if (talitos_hw_supports(dev, DESC_HDR_SEL0_RNG)) { err =3D talitos_register_rng(dev); if (err) { dev_err(dev, "failed to register hwrng: %d\n", err); @@ -3437,7 +3401,8 @@ static int talitos_probe(struct platform_device *ofde= v) =20 /* register crypto algorithms the device supports */ for (i =3D 0; i < ARRAY_SIZE(driver_algs); i++) { - if (hw_supports(dev, driver_algs[i].desc_hdr_template)) { + if (talitos_hw_supports(dev, + driver_algs[i].desc_hdr_template)) { struct talitos_crypto_alg *t_alg; struct crypto_alg *alg =3D NULL; =20 diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index fa8c71b1f90f..1f81d336dae8 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -5,7 +5,13 @@ * Copyright (c) 2006-2011 Freescale Semiconductor, Inc. */ =20 +#include +#include +#include +#include +#include #include +#include #include #include #include @@ -19,6 +25,13 @@ #define PRIMARY_EU(desc_hdr) ((be32_to_cpu(desc_hdr) >> 28) & 0xf) #define SECONDARY_EU(desc_hdr) ((be32_to_cpu(desc_hdr) >> 16) & 0xf) =20 +#ifdef CONFIG_CRYPTO_DEV_TALITOS2 +#define TALITOS_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + SHA512_BLOCK_SIZE) +#else +#define TALITOS_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + SHA256_BLOCK_SIZE) +#endif +#define TALITOS_MAX_IV_LENGTH 16 /* max of AES_BLOCK_SIZE, DES3_EDE_BLOCK= _SIZE */ + /* descriptor pointer entry */ struct talitos_ptr { union { @@ -174,6 +187,35 @@ struct talitos_private { =20 }; =20 +struct talitos_ctx { + struct device *dev; + int ch; + __be32 desc_hdr_template; + u8 key[TALITOS_MAX_KEY_SIZE]; + u8 iv[TALITOS_MAX_IV_LENGTH]; + dma_addr_t dma_key; + unsigned int keylen; + unsigned int enckeylen; + unsigned int authkeylen; +}; + +struct talitos_alg_template { + u32 type; + u32 priority; + union { + struct skcipher_alg skcipher; + struct ahash_alg hash; + struct aead_alg aead; + } alg; + __be32 desc_hdr_template; +}; + +struct talitos_crypto_alg { + struct list_head entry; + struct device *dev; + struct talitos_alg_template algt; +}; + /* .features flag */ #define TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT 0x00000001 #define TALITOS_FTR_HW_AUTH_CHECK 0x00000002 @@ -432,6 +474,55 @@ static inline bool has_ftr_sec1(struct talitos_private= *priv) #define DESC_PTR_LNKTBL_RET 0x02 #define DESC_PTR_LNKTBL_NEXT 0x01 =20 +void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr, + unsigned int len, bool is_sec1); +void copy_talitos_ptr(struct talitos_ptr *dst_ptr, struct talitos_ptr *src= _ptr, + bool is_sec1); +unsigned short from_talitos_ptr_len(struct talitos_ptr *ptr, bool is_sec1); +void to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val, bool is_sec1); +void to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val, bool is_sec1); + +void map_single_talitos_ptr(struct device *dev, struct talitos_ptr *ptr, + unsigned int len, void *data, + enum dma_data_direction dir); +void map_single_talitos_ptr_nosync(struct device *dev, struct talitos_ptr = *ptr, + unsigned int len, void *data, + enum dma_data_direction dir); +void unmap_single_talitos_ptr(struct device *dev, struct talitos_ptr *ptr, + enum dma_data_direction dir); + +int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc, + void (*callback)(struct device *dev, + struct talitos_desc *desc, void *context, + int error), + void *context); + +void talitos_sg_unmap(struct device *dev, struct talitos_edesc *edesc, + struct scatterlist *src, struct scatterlist *dst, + unsigned int len, unsigned int offset); +int talitos_sg_map_ext(struct device *dev, struct scatterlist *src, + unsigned int len, struct talitos_edesc *edesc, + struct talitos_ptr *ptr, int sg_count, + unsigned int offset, int tbl_off, int elen, bool force, + int align); +int talitos_sg_map(struct device *dev, struct scatterlist *src, + unsigned int len, struct talitos_edesc *edesc, + struct talitos_ptr *ptr, int sg_count, unsigned int offset, + int tbl_off); + +struct talitos_edesc * +talitos_edesc_alloc(struct device *dev, struct scatterlist *src, + struct scatterlist *dst, u8 *iv, unsigned int assoclen, + unsigned int cryptlen, unsigned int authsize, + unsigned int ivsize, int icv_stashing, u32 cryptoflags, + bool encrypt); + +int talitos_hw_supports(struct device *dev, __be32 desc_hdr_template); + +int talitos_init_common(struct talitos_ctx *ctx, + struct talitos_crypto_alg *talitos_alg); +void talitos_cra_exit(struct crypto_tfm *tfm); + /* Hardware RNG */ =20 int talitos_register_rng(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6DB73A7D6F for ; Thu, 28 May 2026 09:09:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959371; cv=none; b=RNQnlSCvEigOR2dTzSYE13KSp0TpAuWxCLnmsZL9wcs2Bqgz/KPbzPG/f4qsVD1/3mPofcTpg22dGKVxmB+p6vFl+cTlkiYg4MpyGCK8Ut5LshM8yxKyD4O20O1KJGNFH7Me/CHEyLUsw0cO/41uh0cZOkpTCSSNE9krfksOPyg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959371; c=relaxed/simple; bh=4FkOXZsTOD7ajNYlCTnufqOPDtAh/zL5EiNS+b3F0Hw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MHL8YVvXYXX6bc1Rusk5ifHKtIxNHfF6UTynnNL/nB2GMdBTRssa0VK2d42MjFMSqNewnAK7jEKY2wdRFjPCP37G5vRNDG+52KLyXaAqViWF4muEFrC5pBKvI80AcyctEwcCoTI95gc1PTpNP/yMERsb5eJ33qXnHbj0jKCoA/o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=pXjpjZ8z; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="pXjpjZ8z" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 56BC61A36FE for ; Thu, 28 May 2026 09:09:27 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2D26660495; Thu, 28 May 2026 09:09:27 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E4DA110888508; Thu, 28 May 2026 11:09:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959366; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=hTzGd5WnXim15n8ioTfjw21a5s8U5icq3n7d7bKzC5o=; b=pXjpjZ8zAna9pEEVt4jA9X7EndoB1qhTTQUDt3jkDueChw3PEOhVuCh7z1zLw9Y6TVyO85 LM5m4TjQR/2LO9LBQAxbE95rlvsIpxIBZz7laXcTvKaYisK71su6PDJguQNKYJBg1pS6D8 czRpZN/JDHnK47LhwuLAQa0gAS0Xor2jyEfJRvhtIb2sIbzZaYQnAgo5PsucfUX2dV6FFR 1aF0Akst6O2kdR9athhbrosgeOeA9T0YiudaWHDIReeIqeZB3pxowwH5MR8WUJBMquU1bv lTk9ffBRXdNaxzVZT7uGscTCyfADipn6EMOIrJERq1n2eFVJ/bBV2tqq5XjeOg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:19 +0200 Subject: [PATCH 06/29] crypto: talitos - Introduce registration helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-6-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=2683; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=4FkOXZsTOD7ajNYlCTnufqOPDtAh/zL5EiNS+b3F0Hw=; b=5AVFfck2l4nlkcNT5NYb/6j6Q7qIcNKAKg9oJ4FNY8S5WDc9Eub7MN2DYkjIzd8G37uapPZgC 8at3ycbnRO6DgJDMsbpqYKwzp16dNsqFf59o6RzQuRYIN/LYRHOPtXz X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Add talitos_register_common() that will be called in each respective crypto implementation file. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos.c | 53 ++++++++++++++++++++++++++++++++++++= ++++ drivers/crypto/talitos/talitos.h | 3 +++ 2 files changed, 56 insertions(+) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 3fc1069062da..869739dcc4d7 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -3095,6 +3095,59 @@ static void talitos_remove(struct platform_device *o= fdev) tasklet_kill(&priv->done_task[1]); } =20 +static void talitos_alg_set_common(struct talitos_private *priv, + struct crypto_alg *alg, u32 custom_priority, + u32 type) +{ + alg->cra_module =3D THIS_MODULE; + if (custom_priority) + alg->cra_priority =3D custom_priority; + else + alg->cra_priority =3D TALITOS_CRA_PRIORITY; + if (has_ftr_sec1(priv) && type !=3D CRYPTO_ALG_TYPE_AHASH) + alg->cra_alignmask =3D 3; + else + alg->cra_alignmask =3D 0; + alg->cra_ctxsize =3D sizeof(struct talitos_ctx); + alg->cra_flags |=3D CRYPTO_ALG_KERN_DRIVER_ONLY; +} + +int talitos_register_common(struct device *dev, + struct talitos_alg_template *template) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + struct talitos_crypto_alg *t_alg; + struct crypto_alg *alg; + int ret; + + t_alg =3D devm_kzalloc(dev, sizeof(struct talitos_crypto_alg), + GFP_KERNEL); + if (!t_alg) + return -ENOMEM; + + t_alg->algt =3D *template; + + switch (t_alg->algt.type) { + default: + dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type); + devm_kfree(dev, t_alg); + return -EINVAL; + } + + if (ret) { + dev_err(dev, "%s alg registration failed\n", + alg->cra_driver_name); + devm_kfree(dev, t_alg); + return 0; + } + + t_alg->dev =3D dev; + + list_add_tail(&t_alg->entry, &priv->alg_list); + + return 0; +} + static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, struct talitos_alg_template *template) diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 1f81d336dae8..afed9947f4c0 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -523,6 +523,9 @@ int talitos_init_common(struct talitos_ctx *ctx, struct talitos_crypto_alg *talitos_alg); void talitos_cra_exit(struct crypto_tfm *tfm); =20 +int talitos_register_common(struct device *dev, + struct talitos_alg_template *template); + /* Hardware RNG */ =20 int talitos_register_rng(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 726DC3A8723 for ; Thu, 28 May 2026 09:09:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959375; cv=none; b=KaZ7i7vPW2m536hGKSvo4VKE3c2+KiXWsdmxuMPs+8jBdpQLQvVv/YrtHlWPAqa580qdOQ7afM8n/o85TSh4i1u5lxoLabLDw+JYxSKoz3S5w5otuPBlrFuGc1GCuSkfF2EVJjpq8MAK9ydXXdIO0rfAj67KAy9eT2J4ktA5TLI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959375; c=relaxed/simple; bh=GXmmHdyB8vXvrXUbtSzi4rXR6SEz2PdIzNL0O/Pir1E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BbWF1uuhdNwpcqpOydJBOaNAd90K1X38V3U+WZJ1MufBvME9dUqmIIdzrcGJOUT4obVVwm85SX7eHDQ5FZqNdmOnwWcsNn+Av4CrkYiWyU028mGI0agF3+V9AZ7XAea3HMiutrpnnadAXDe7ru4wHUE+w1s6KwZTxI55nNUtxzo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=iuxbAI6D; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="iuxbAI6D" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id EE98D4E42D7B for ; Thu, 28 May 2026 09:09:28 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id C465360495; Thu, 28 May 2026 09:09:28 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E79CF10888054; Thu, 28 May 2026 11:09:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959367; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ML1d+F4ZjBj9QllzhD2lrI6+E5cB+NniT1fNyc7e/Uk=; b=iuxbAI6DAfQPh3LW4TxDjhq3DN7ya9NyNc1S7gWOcwKPeUgYjwZ2x44Y/CKASzdHbN1MEu a3ztIX3kSmtGjdt+ii4jogci4hdzw3B4tzo6ajwvEym7X25QhdtmEXC1nJX3iG0sOlkqX5 3ygWTIuL6QAgIX1Lx48eh1c11M1FgGZMnf1xdLs4HVEV3bkhtFovtUaw/6lusOIacsCXgH g07pLxCX1s4V+6YQuXtKdNALzDLe9glBD95hcsdQUiiMyev+aJWwd+Jz3EG+4jGiI2TVYf dsi/0eQNWHTe5ublFn5Rwtf+N5HToCaLFu3ay+xRgfP6NLAQcjC+4rhtG6FKIw== From: Paul Louvel Date: Thu, 28 May 2026 11:08:20 +0200 Subject: [PATCH 07/29] crypto: talitos/hash - Move into separate file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-7-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=56126; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=GXmmHdyB8vXvrXUbtSzi4rXR6SEz2PdIzNL0O/Pir1E=; b=+OgCqRaZ4HqPSg5S6TKkPnI/RIrffCSS6K5vKU0v6psbOMA5ZINCnWBu/TbV7BBacsl0OAohQ zabLMgTq+JfBPPV6jpu39wMsyHw5byubLzGSs1uQt4H7aqrS0bGvOQ+ X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Move the ahash algorithm implementations from talitos.c into a dedicated talitos-hash.c file. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/Makefile | 2 +- drivers/crypto/talitos/talitos-hash.c | 832 ++++++++++++++++++++++++++++++= ++++ drivers/crypto/talitos/talitos.c | 807 +-----------------------------= --- drivers/crypto/talitos/talitos.h | 4 + 4 files changed, 847 insertions(+), 798 deletions(-) diff --git a/drivers/crypto/talitos/Makefile b/drivers/crypto/talitos/Makef= ile index 901ec681f010..40d37f9364ef 100644 --- a/drivers/crypto/talitos/Makefile +++ b/drivers/crypto/talitos/Makefile @@ -1,3 +1,3 @@ obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos.o =20 -talitos-y :=3D talitos.o talitos-rng.o +talitos-y :=3D talitos.o talitos-rng.o talitos-hash.o diff --git a/drivers/crypto/talitos/talitos-hash.c b/drivers/crypto/talitos= /talitos-hash.c new file mode 100644 index 000000000000..5792e7093392 --- /dev/null +++ b/drivers/crypto/talitos/talitos-hash.c @@ -0,0 +1,832 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * Freescale SEC (talitos) hash implementation + * + * Copyright (c) 2006-2011 Freescale Semiconductor, Inc. + */ + +#include + +#include +#include +#include +#include +#include + +#include "talitos.h" + +#define HASH_MAX_BLOCK_SIZE SHA512_BLOCK_SIZE +#define TALITOS_MDEU_MAX_CONTEXT_SIZE TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA= 512 + +struct talitos_ahash_req_ctx { + u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)]; + unsigned int hw_context_size; + unsigned int swinit; + unsigned int first_request; + unsigned int last_request; + unsigned int to_hash_later; +}; + +struct talitos_export_state { + u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)]; + unsigned int swinit; + unsigned int first_request; + unsigned int last_request; + unsigned int to_hash_later; +}; + +static void common_nonsnoop_hash_unmap(struct device *dev, + struct talitos_edesc *edesc, + struct ahash_request *areq) +{ + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct talitos_private *priv =3D dev_get_drvdata(dev); + bool is_sec1 =3D has_ftr_sec1(priv); + struct talitos_desc *desc =3D &edesc->desc; + + unmap_single_talitos_ptr(dev, &desc->ptr[5], DMA_FROM_DEVICE); + + if (edesc->last && req_ctx->last_request) + memcpy(areq->result, req_ctx->hw_context, + crypto_ahash_digestsize(tfm)); + + if (edesc->src) + talitos_sg_unmap(dev, edesc, edesc->src, NULL, 0, 0); + + /* When using hashctx-in, must unmap it. */ + if (from_talitos_ptr_len(&desc->ptr[1], is_sec1)) + unmap_single_talitos_ptr(dev, &desc->ptr[1], + DMA_TO_DEVICE); + + if (edesc->dma_len) + dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, + DMA_BIDIRECTIONAL); +} + +static void free_edesc_list_from(struct ahash_request *areq, struct talito= s_edesc *edesc) +{ + struct talitos_ctx *ctx =3D crypto_ahash_ctx(crypto_ahash_reqtfm(areq)); + struct talitos_edesc *next; + + while (edesc) { + next =3D edesc->next_desc; + common_nonsnoop_hash_unmap(ctx->dev, edesc, areq); + kfree(edesc); + edesc =3D next; + } +} + +static void ahash_done(struct device *dev, + struct talitos_desc *desc, void *context, + int err) +{ + struct ahash_request *areq =3D context; + struct talitos_edesc *edesc =3D + container_of(desc, struct talitos_edesc, desc); + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + bool is_sec1 =3D has_ftr_sec1(dev_get_drvdata(dev)); + struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); + struct talitos_edesc *next; + + if (is_sec1) { + free_edesc_list_from(areq, edesc); + ahash_request_complete(areq, err ?: req_ctx->to_hash_later); + } else { + next =3D edesc->next_desc; + + common_nonsnoop_hash_unmap(dev, edesc, areq); + kfree(edesc); + + if (err) + goto out; + + if (next) { + err =3D talitos_submit(dev, ctx->ch, &next->desc, + ahash_done, areq); + if (err !=3D -EINPROGRESS) + goto out; + return; + } +out: + if (err && next) + free_edesc_list_from(areq, next); + ahash_request_complete(areq, err ?: req_ctx->to_hash_later); + } +} + +/* + * SEC1 doesn't like hashing of 0 sized message, so we do the padding + * ourself and submit a padded block + */ +static void talitos_handle_buggy_hash(struct talitos_ctx *ctx, + struct talitos_edesc *edesc, + struct talitos_ptr *ptr) +{ + static u8 padded_hash[64] =3D { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + pr_err_once("Bug in SEC1, padding ourself\n"); + edesc->desc.hdr &=3D ~DESC_HDR_MODE0_MDEU_PAD; + map_single_talitos_ptr(ctx->dev, ptr, sizeof(padded_hash), + (char *)padded_hash, DMA_TO_DEVICE); +} + +static void common_nonsnoop_hash(struct talitos_edesc *edesc, + struct ahash_request *areq, + unsigned int length) +{ + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + struct device *dev =3D ctx->dev; + struct talitos_desc *desc =3D &edesc->desc; + bool sync_needed =3D false; + struct talitos_private *priv =3D dev_get_drvdata(dev); + bool is_sec1 =3D has_ftr_sec1(priv); + int sg_count; + + /* first DWORD empty */ + + /* hash context in */ + if (!edesc->first || !req_ctx->first_request || req_ctx->swinit) { + map_single_talitos_ptr_nosync(dev, &desc->ptr[1], + req_ctx->hw_context_size, + req_ctx->hw_context, + DMA_TO_DEVICE); + req_ctx->swinit =3D 0; + } + /* Indicate next op is not the first. */ + req_ctx->first_request =3D 0; + + /* HMAC key */ + if (ctx->keylen) + to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, + is_sec1); + + sg_count =3D edesc->src_nents ?: 1; + if (is_sec1 && sg_count > 1) + sg_copy_to_buffer(edesc->src, sg_count, edesc->buf, length); + else if (length) + sg_count =3D dma_map_sg(dev, edesc->src, sg_count, DMA_TO_DEVICE); + + /* + * data in + */ + sg_count =3D talitos_sg_map(dev, edesc->src, length, edesc, &desc->ptr[3], + sg_count, 0, 0); + if (sg_count > 1) + sync_needed =3D true; + + /* fifth DWORD empty */ + + /* hash/HMAC out -or- hash context out */ + if (edesc->last && req_ctx->last_request) + map_single_talitos_ptr(dev, &desc->ptr[5], + crypto_ahash_digestsize(tfm), + req_ctx->hw_context, DMA_FROM_DEVICE); + else + map_single_talitos_ptr_nosync(dev, &desc->ptr[5], + req_ctx->hw_context_size, + req_ctx->hw_context, + DMA_FROM_DEVICE); + + /* last DWORD empty */ + + if (is_sec1 && from_talitos_ptr_len(&desc->ptr[3], true) =3D=3D 0) + talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]); + + if (sync_needed) + dma_sync_single_for_device(dev, edesc->dma_link_tbl, + edesc->dma_len, DMA_BIDIRECTIONAL); +} + +static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq, + struct scatterlist *src, + unsigned int nbytes) +{ + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); + + return talitos_edesc_alloc(ctx->dev, src, NULL, NULL, 0, + nbytes, 0, 0, 0, areq->base.flags, false); +} + +static struct talitos_edesc * +ahash_process_req_prepare(struct ahash_request *areq, unsigned int nbytes, + unsigned int blocksize, bool is_sec1) +{ + struct talitos_ctx *ctx =3D crypto_ahash_ctx(crypto_ahash_reqtfm(areq)); + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + struct talitos_edesc *first =3D NULL, *prev_edesc =3D NULL, *edesc; + size_t desc_max =3D is_sec1 ? TALITOS1_MAX_DATA_LEN : + TALITOS2_MAX_DATA_LEN; + struct scatterlist tmp[2]; + size_t to_hash_this_desc; + struct scatterlist *src; + size_t offset =3D 0; + + do { + src =3D scatterwalk_ffwd(tmp, areq->src, offset); + + to_hash_this_desc =3D + min(nbytes, ALIGN_DOWN(desc_max, blocksize)); + + /* Allocate extended descriptor */ + edesc =3D ahash_edesc_alloc(areq, src, to_hash_this_desc); + if (IS_ERR(edesc)) { + if (first) + free_edesc_list_from(areq, first); + return edesc; + } + + edesc->src =3D scatterwalk_ffwd(edesc->bufsl, areq->src, offset); + edesc->desc.hdr =3D ctx->desc_hdr_template; + edesc->first =3D offset =3D=3D 0; + edesc->last =3D nbytes - to_hash_this_desc =3D=3D 0; + + /* On last one, request SEC to pad; otherwise continue */ + if (req_ctx->last_request && edesc->last) + edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_PAD; + else + edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_CONT; + + /* request SEC to INIT hash. */ + if (req_ctx->first_request && edesc->first && !req_ctx->swinit) + edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_INIT; + + /* + * When the tfm context has a keylen, it's an HMAC. + * A first or last (ie. not middle) descriptor must request HMAC. + */ + if (ctx->keylen && ((req_ctx->first_request && edesc->first) || + (req_ctx->last_request && edesc->last))) + edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_HMAC; + + /* clear the DN bit */ + if (is_sec1 && !edesc->last) + edesc->desc.hdr &=3D ~DESC_HDR_DONE_NOTIFY; + + common_nonsnoop_hash(edesc, areq, to_hash_this_desc); + + offset +=3D to_hash_this_desc; + nbytes -=3D to_hash_this_desc; + + if (!prev_edesc) + first =3D edesc; + else + prev_edesc->next_desc =3D edesc; + prev_edesc =3D edesc; + } while (nbytes); + + return first; +} + +static int ahash_process_req(struct ahash_request *areq, unsigned int nbyt= es) +{ + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + struct talitos_edesc *edesc; + unsigned int blocksize =3D + crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm)); + bool is_sec1 =3D has_ftr_sec1(dev_get_drvdata(ctx->dev)); + unsigned int nbytes_to_hash; + unsigned int to_hash_later; + struct device *dev =3D ctx->dev; + int ret; + + nbytes_to_hash =3D ALIGN_DOWN(nbytes, blocksize); + to_hash_later =3D nbytes - nbytes_to_hash; + + if (req_ctx->last_request) { + nbytes_to_hash =3D nbytes; + to_hash_later =3D 0; + } + + req_ctx->to_hash_later =3D to_hash_later; + + edesc =3D ahash_process_req_prepare(areq, nbytes_to_hash, blocksize, + is_sec1); + if (IS_ERR(edesc)) + return PTR_ERR(edesc); + + ret =3D talitos_submit(dev, ctx->ch, &edesc->desc, ahash_done, areq); + if (ret !=3D -EINPROGRESS) + free_edesc_list_from(areq, edesc); + + return ret; +} + +static int ahash_init(struct ahash_request *areq) +{ + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); + struct device *dev =3D ctx->dev; + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + unsigned int size; + dma_addr_t dma; + + /* Initialize the context */ + req_ctx->first_request =3D 1; + req_ctx->swinit =3D 0; /* assume h/w init of context */ + size =3D (crypto_ahash_digestsize(tfm) <=3D SHA256_DIGEST_SIZE) + ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256 + : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512; + req_ctx->hw_context_size =3D size; + req_ctx->last_request =3D 0; + + dma =3D dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size, + DMA_TO_DEVICE); + dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE); + + return 0; +} + +/* + * on h/w without explicit sha224 support, we initialize h/w context + * manually with sha224 constants, and tell it to run sha256. + */ +static int ahash_init_sha224_swinit(struct ahash_request *areq) +{ + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + + req_ctx->hw_context[0] =3D SHA224_H0; + req_ctx->hw_context[1] =3D SHA224_H1; + req_ctx->hw_context[2] =3D SHA224_H2; + req_ctx->hw_context[3] =3D SHA224_H3; + req_ctx->hw_context[4] =3D SHA224_H4; + req_ctx->hw_context[5] =3D SHA224_H5; + req_ctx->hw_context[6] =3D SHA224_H6; + req_ctx->hw_context[7] =3D SHA224_H7; + + /* init 64-bit count */ + req_ctx->hw_context[8] =3D 0; + req_ctx->hw_context[9] =3D 0; + + ahash_init(areq); + req_ctx->swinit =3D 1;/* prevent h/w initting context with sha256 values*/ + + return 0; +} + +static int ahash_update(struct ahash_request *areq) +{ + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + + req_ctx->last_request =3D 0; + + return ahash_process_req(areq, areq->nbytes); +} + +static int ahash_final(struct ahash_request *areq) +{ + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + + req_ctx->last_request =3D 1; + + return ahash_process_req(areq, 0); +} + +static int ahash_finup(struct ahash_request *areq) +{ + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + + req_ctx->last_request =3D 1; + + return ahash_process_req(areq, areq->nbytes); +} + +static int ahash_digest(struct ahash_request *areq) +{ + ahash_init(areq); + return ahash_finup(areq); +} + +static int ahash_digest_sha224_swinit(struct ahash_request *areq) +{ + ahash_init_sha224_swinit(areq); + return ahash_finup(areq); +} + +static int ahash_export(struct ahash_request *areq, void *out) +{ + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + struct talitos_export_state *export =3D out; + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); + struct device *dev =3D ctx->dev; + dma_addr_t dma; + + dma =3D dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size, + DMA_FROM_DEVICE); + dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_FROM_DEVICE); + + memcpy(export->hw_context, req_ctx->hw_context, + req_ctx->hw_context_size); + export->swinit =3D req_ctx->swinit; + export->first_request =3D req_ctx->first_request; + export->last_request =3D req_ctx->last_request; + export->to_hash_later =3D req_ctx->to_hash_later; + + return 0; +} + +static int ahash_import(struct ahash_request *areq, const void *in) +{ + struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); + struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); + struct device *dev =3D ctx->dev; + const struct talitos_export_state *export =3D in; + unsigned int size; + dma_addr_t dma; + + memset(req_ctx, 0, sizeof(*req_ctx)); + size =3D (crypto_ahash_digestsize(tfm) <=3D SHA256_DIGEST_SIZE) + ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256 + : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512; + req_ctx->hw_context_size =3D size; + memcpy(req_ctx->hw_context, export->hw_context, size); + req_ctx->swinit =3D export->swinit; + req_ctx->first_request =3D export->first_request; + req_ctx->last_request =3D export->last_request; + req_ctx->to_hash_later =3D export->to_hash_later; + + dma =3D dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size, + DMA_TO_DEVICE); + dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE); + + return 0; +} + +static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int k= eylen, + u8 *hash) +{ + struct talitos_ctx *ctx =3D crypto_tfm_ctx(crypto_ahash_tfm(tfm)); + + struct scatterlist sg[1]; + struct ahash_request *req; + struct crypto_wait wait; + int ret; + + crypto_init_wait(&wait); + + req =3D ahash_request_alloc(tfm, GFP_KERNEL); + if (!req) + return -ENOMEM; + + /* Keep tfm keylen =3D=3D 0 during hash of the long key */ + ctx->keylen =3D 0; + ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, + crypto_req_done, &wait); + + sg_init_one(&sg[0], key, keylen); + + ahash_request_set_crypt(req, sg, hash, keylen); + ret =3D crypto_wait_req(crypto_ahash_digest(req), &wait); + + ahash_request_free(req); + + return ret; +} + +static int ahash_setkey(struct crypto_ahash *tfm, const u8 *key, + unsigned int keylen) +{ + struct talitos_ctx *ctx =3D crypto_tfm_ctx(crypto_ahash_tfm(tfm)); + struct device *dev =3D ctx->dev; + unsigned int blocksize =3D + crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm)); + unsigned int digestsize =3D crypto_ahash_digestsize(tfm); + unsigned int keysize =3D keylen; + u8 hash[SHA512_DIGEST_SIZE]; + int ret; + + if (keylen <=3D blocksize) + memcpy(ctx->key, key, keysize); + else { + /* Must get the hash of the long key */ + ret =3D keyhash(tfm, key, keylen, hash); + + if (ret) + return -EINVAL; + + keysize =3D digestsize; + memcpy(ctx->key, hash, digestsize); + } + + if (ctx->keylen) + dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); + + ctx->keylen =3D keysize; + ctx->dma_key =3D dma_map_single(dev, ctx->key, keysize, DMA_TO_DEVICE); + + return 0; +} + +static int talitos_cra_init_ahash(struct crypto_tfm *tfm) +{ + struct crypto_alg *alg =3D tfm->__crt_alg; + struct talitos_crypto_alg *talitos_alg; + struct talitos_ctx *ctx =3D crypto_tfm_ctx(tfm); + + talitos_alg =3D container_of(__crypto_ahash_alg(alg), + struct talitos_crypto_alg, + algt.alg.hash); + + ctx->keylen =3D 0; + sizeof(struct talitos_ahash_req_ctx)); + + return talitos_init_common(ctx, talitos_alg); +} + +static struct talitos_alg_template hash_driver_algs[] =3D { + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D MD5_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "md5", + .cra_driver_name =3D "md5-talitos", + .cra_blocksize =3D MD5_HMAC_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_MD5, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA1_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "sha1", + .cra_driver_name =3D "sha1-talitos", + .cra_blocksize =3D SHA1_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA1, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA224_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "sha224", + .cra_driver_name =3D "sha224-talitos", + .cra_blocksize =3D SHA224_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA224, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA256_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "sha256", + .cra_driver_name =3D "sha256-talitos", + .cra_blocksize =3D SHA256_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA256, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA384_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "sha384", + .cra_driver_name =3D "sha384-talitos", + .cra_blocksize =3D SHA384_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUB | + DESC_HDR_MODE0_MDEUB_SHA384, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA512_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "sha512", + .cra_driver_name =3D "sha512-talitos", + .cra_blocksize =3D SHA512_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUB | + DESC_HDR_MODE0_MDEUB_SHA512, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D MD5_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "hmac(md5)", + .cra_driver_name =3D "hmac-md5-talitos", + .cra_blocksize =3D MD5_HMAC_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_MD5, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA1_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "hmac(sha1)", + .cra_driver_name =3D "hmac-sha1-talitos", + .cra_blocksize =3D SHA1_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA1, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA224_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "hmac(sha224)", + .cra_driver_name =3D "hmac-sha224-talitos", + .cra_blocksize =3D SHA224_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA224, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA256_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "hmac(sha256)", + .cra_driver_name =3D "hmac-sha256-talitos", + .cra_blocksize =3D SHA256_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA256, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA384_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "hmac(sha384)", + .cra_driver_name =3D "hmac-sha384-talitos", + .cra_blocksize =3D SHA384_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUB | + DESC_HDR_MODE0_MDEUB_SHA384, + }, + { .type =3D CRYPTO_ALG_TYPE_AHASH, + .alg.hash =3D { + .halg.digestsize =3D SHA512_DIGEST_SIZE, + .halg.statesize =3D sizeof(struct talitos_export_state), + .halg.base =3D { + .cra_name =3D "hmac(sha512)", + .cra_driver_name =3D "hmac-sha512-talitos", + .cra_blocksize =3D SHA512_BLOCK_SIZE, + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_AHASH_ALG_FINAL_NONZERO, + } + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUB | + DESC_HDR_MODE0_MDEUB_SHA512, + } +}; + +int talitos_register_hash(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + struct ahash_alg *ahash_alg; + struct crypto_alg *alg; + size_t i; + int ret; + + for (i =3D 0; i < ARRAY_SIZE(hash_driver_algs); i++) { + if (!talitos_hw_supports(dev, + hash_driver_algs[i].desc_hdr_template)) + continue; + + ahash_alg =3D &hash_driver_algs[i].alg.hash; + alg =3D &ahash_alg->halg.base; + + alg->cra_init =3D talitos_cra_init_ahash; + alg->cra_exit =3D talitos_cra_exit; + ahash_alg->init =3D ahash_init; + ahash_alg->update =3D ahash_update; + ahash_alg->final =3D ahash_final; + ahash_alg->finup =3D ahash_finup; + ahash_alg->digest =3D ahash_digest; + if (!strncmp(alg->cra_name, "hmac", 4)) + ahash_alg->setkey =3D ahash_setkey; + ahash_alg->import =3D ahash_import; + ahash_alg->export =3D ahash_export; + + if (!(priv->features & TALITOS_FTR_HMAC_OK) && + !strncmp(alg->cra_name, "hmac", 4)) { + /* not supported */ + continue; + } + + if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) && + (!strcmp(alg->cra_name, "sha224") || + !strcmp(alg->cra_name, "hmac(sha224)"))) { + ahash_alg->init =3D ahash_init_sha224_swinit; + ahash_alg->digest =3D ahash_digest_sha224_swinit; + hash_driver_algs[i].desc_hdr_template =3D + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA256; + } + + ret =3D talitos_register_common(dev, &hash_driver_algs[i]); + if (ret) + return ret; + } + + return 0; +} diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 869739dcc4d7..b8bcb970d7d5 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -831,26 +831,6 @@ DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE= , TALITOS2_ISR_CH_1_3_ERR, */ #define TALITOS_CRA_PRIORITY_AEAD_HSNA (TALITOS_CRA_PRIORITY - 1) =20 -#define HASH_MAX_BLOCK_SIZE SHA512_BLOCK_SIZE -#define TALITOS_MDEU_MAX_CONTEXT_SIZE TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA= 512 - -struct talitos_ahash_req_ctx { - u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)]; - unsigned int hw_context_size; - unsigned int swinit; - unsigned int first_request; - unsigned int last_request; - unsigned int to_hash_later; -}; - -struct talitos_export_state { - u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)]; - unsigned int swinit; - unsigned int first_request; - unsigned int last_request; - unsigned int to_hash_later; -}; - static int aead_setkey(struct crypto_aead *authenc, const u8 *key, unsigned int keylen) { @@ -1659,501 +1639,6 @@ static int skcipher_decrypt(struct skcipher_request= *areq) return common_nonsnoop(edesc, areq, skcipher_done); } =20 -static void common_nonsnoop_hash_unmap(struct device *dev, - struct talitos_edesc *edesc, - struct ahash_request *areq) -{ - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); - struct talitos_desc *desc =3D &edesc->desc; - - unmap_single_talitos_ptr(dev, &desc->ptr[5], DMA_FROM_DEVICE); - - if (edesc->last && req_ctx->last_request) - memcpy(areq->result, req_ctx->hw_context, - crypto_ahash_digestsize(tfm)); - - if (edesc->src) - talitos_sg_unmap(dev, edesc, edesc->src, NULL, 0, 0); - - /* When using hashctx-in, must unmap it. */ - if (from_talitos_ptr_len(&desc->ptr[1], is_sec1)) - unmap_single_talitos_ptr(dev, &desc->ptr[1], - DMA_TO_DEVICE); - - if (edesc->dma_len) - dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, - DMA_BIDIRECTIONAL); -} - -static void free_edesc_list_from(struct ahash_request *areq, struct talito= s_edesc *edesc) -{ - struct talitos_ctx *ctx =3D crypto_ahash_ctx(crypto_ahash_reqtfm(areq)); - struct talitos_edesc *next; - - while (edesc) { - next =3D edesc->next_desc; - common_nonsnoop_hash_unmap(ctx->dev, edesc, areq); - kfree(edesc); - edesc =3D next; - } -} - -static void ahash_done(struct device *dev, - struct talitos_desc *desc, void *context, - int err) -{ - struct ahash_request *areq =3D context; - struct talitos_edesc *edesc =3D - container_of(desc, struct talitos_edesc, desc); - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - bool is_sec1 =3D has_ftr_sec1(dev_get_drvdata(dev)); - struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); - struct talitos_edesc *next; - - if (is_sec1) { - free_edesc_list_from(areq, edesc); - ahash_request_complete(areq, err ?: req_ctx->to_hash_later); - } else { - next =3D edesc->next_desc; - - common_nonsnoop_hash_unmap(dev, edesc, areq); - kfree(edesc); - - if (err) - goto out; - - if (next) { - err =3D talitos_submit(dev, ctx->ch, &next->desc, - ahash_done, areq); - if (err !=3D -EINPROGRESS) - goto out; - return; - } -out: - if (err && next) - free_edesc_list_from(areq, next); - ahash_request_complete(areq, err ?: req_ctx->to_hash_later); - } -} - -/* - * SEC1 doesn't like hashing of 0 sized message, so we do the padding - * ourself and submit a padded block - */ -static void talitos_handle_buggy_hash(struct talitos_ctx *ctx, - struct talitos_edesc *edesc, - struct talitos_ptr *ptr) -{ - static u8 padded_hash[64] =3D { - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - - pr_err_once("Bug in SEC1, padding ourself\n"); - edesc->desc.hdr &=3D ~DESC_HDR_MODE0_MDEU_PAD; - map_single_talitos_ptr(ctx->dev, ptr, sizeof(padded_hash), - (char *)padded_hash, DMA_TO_DEVICE); -} - -static void common_nonsnoop_hash(struct talitos_edesc *edesc, - struct ahash_request *areq, - unsigned int length) -{ - struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - struct device *dev =3D ctx->dev; - struct talitos_desc *desc =3D &edesc->desc; - bool sync_needed =3D false; - struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); - int sg_count; - - /* first DWORD empty */ - - /* hash context in */ - if (!edesc->first || !req_ctx->first_request || req_ctx->swinit) { - map_single_talitos_ptr_nosync(dev, &desc->ptr[1], - req_ctx->hw_context_size, - req_ctx->hw_context, - DMA_TO_DEVICE); - req_ctx->swinit =3D 0; - } - /* Indicate next op is not the first. */ - req_ctx->first_request =3D 0; - - /* HMAC key */ - if (ctx->keylen) - to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, - is_sec1); - - sg_count =3D edesc->src_nents ?: 1; - if (is_sec1 && sg_count > 1) - sg_copy_to_buffer(edesc->src, sg_count, edesc->buf, length); - else if (length) - sg_count =3D dma_map_sg(dev, edesc->src, sg_count, DMA_TO_DEVICE); - - /* - * data in - */ - sg_count =3D talitos_sg_map(dev, edesc->src, length, edesc, &desc->ptr[3], - sg_count, 0, 0); - if (sg_count > 1) - sync_needed =3D true; - - /* fifth DWORD empty */ - - /* hash/HMAC out -or- hash context out */ - if (edesc->last && req_ctx->last_request) - map_single_talitos_ptr(dev, &desc->ptr[5], - crypto_ahash_digestsize(tfm), - req_ctx->hw_context, DMA_FROM_DEVICE); - else - map_single_talitos_ptr_nosync(dev, &desc->ptr[5], - req_ctx->hw_context_size, - req_ctx->hw_context, - DMA_FROM_DEVICE); - - /* last DWORD empty */ - - if (is_sec1 && from_talitos_ptr_len(&desc->ptr[3], true) =3D=3D 0) - talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]); - - if (sync_needed) - dma_sync_single_for_device(dev, edesc->dma_link_tbl, - edesc->dma_len, DMA_BIDIRECTIONAL); -} - -static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq, - struct scatterlist *src, - unsigned int nbytes) -{ - struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); - - return talitos_edesc_alloc(ctx->dev, src, NULL, NULL, 0, - nbytes, 0, 0, 0, areq->base.flags, false); -} - -static struct talitos_edesc * -ahash_process_req_prepare(struct ahash_request *areq, unsigned int nbytes, - unsigned int blocksize, bool is_sec1) -{ - struct talitos_ctx *ctx =3D crypto_ahash_ctx(crypto_ahash_reqtfm(areq)); - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - struct talitos_edesc *first =3D NULL, *prev_edesc =3D NULL, *edesc; - size_t desc_max =3D is_sec1 ? TALITOS1_MAX_DATA_LEN : - TALITOS2_MAX_DATA_LEN; - struct scatterlist tmp[2]; - size_t to_hash_this_desc; - struct scatterlist *src; - size_t offset =3D 0; - - do { - src =3D scatterwalk_ffwd(tmp, areq->src, offset); - - to_hash_this_desc =3D - min(nbytes, ALIGN_DOWN(desc_max, blocksize)); - - /* Allocate extended descriptor */ - edesc =3D ahash_edesc_alloc(areq, src, to_hash_this_desc); - if (IS_ERR(edesc)) { - if (first) - free_edesc_list_from(areq, first); - return edesc; - } - - edesc->src =3D scatterwalk_ffwd(edesc->bufsl, areq->src, offset); - edesc->desc.hdr =3D ctx->desc_hdr_template; - edesc->first =3D offset =3D=3D 0; - edesc->last =3D nbytes - to_hash_this_desc =3D=3D 0; - - /* On last one, request SEC to pad; otherwise continue */ - if (req_ctx->last_request && edesc->last) - edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_PAD; - else - edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_CONT; - - /* request SEC to INIT hash. */ - if (req_ctx->first_request && edesc->first && !req_ctx->swinit) - edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_INIT; - - /* - * When the tfm context has a keylen, it's an HMAC. - * A first or last (ie. not middle) descriptor must request HMAC. - */ - if (ctx->keylen && ((req_ctx->first_request && edesc->first) || - (req_ctx->last_request && edesc->last))) - edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_HMAC; - - /* clear the DN bit */ - if (is_sec1 && !edesc->last) - edesc->desc.hdr &=3D ~DESC_HDR_DONE_NOTIFY; - - common_nonsnoop_hash(edesc, areq, to_hash_this_desc); - - offset +=3D to_hash_this_desc; - nbytes -=3D to_hash_this_desc; - - if (!prev_edesc) - first =3D edesc; - else - prev_edesc->next_desc =3D edesc; - prev_edesc =3D edesc; - } while (nbytes); - - return first; -} - -static int ahash_process_req(struct ahash_request *areq, unsigned int nbyt= es) -{ - struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - struct talitos_edesc *edesc; - unsigned int blocksize =3D - crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm)); - bool is_sec1 =3D has_ftr_sec1(dev_get_drvdata(ctx->dev)); - unsigned int nbytes_to_hash; - unsigned int to_hash_later; - struct device *dev =3D ctx->dev; - int ret; - - nbytes_to_hash =3D ALIGN_DOWN(nbytes, blocksize); - to_hash_later =3D nbytes - nbytes_to_hash; - - if (req_ctx->last_request) { - nbytes_to_hash =3D nbytes; - to_hash_later =3D 0; - } - - req_ctx->to_hash_later =3D to_hash_later; - - edesc =3D ahash_process_req_prepare(areq, nbytes_to_hash, blocksize, - is_sec1); - if (IS_ERR(edesc)) - return PTR_ERR(edesc); - - ret =3D talitos_submit(dev, ctx->ch, &edesc->desc, ahash_done, areq); - if (ret !=3D -EINPROGRESS) - free_edesc_list_from(areq, edesc); - - return ret; -} - -static int ahash_init(struct ahash_request *areq) -{ - struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); - struct device *dev =3D ctx->dev; - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - unsigned int size; - dma_addr_t dma; - - /* Initialize the context */ - req_ctx->first_request =3D 1; - req_ctx->swinit =3D 0; /* assume h/w init of context */ - size =3D (crypto_ahash_digestsize(tfm) <=3D SHA256_DIGEST_SIZE) - ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256 - : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512; - req_ctx->hw_context_size =3D size; - req_ctx->last_request =3D 0; - - dma =3D dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size, - DMA_TO_DEVICE); - dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE); - - return 0; -} - -/* - * on h/w without explicit sha224 support, we initialize h/w context - * manually with sha224 constants, and tell it to run sha256. - */ -static int ahash_init_sha224_swinit(struct ahash_request *areq) -{ - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - - req_ctx->hw_context[0] =3D SHA224_H0; - req_ctx->hw_context[1] =3D SHA224_H1; - req_ctx->hw_context[2] =3D SHA224_H2; - req_ctx->hw_context[3] =3D SHA224_H3; - req_ctx->hw_context[4] =3D SHA224_H4; - req_ctx->hw_context[5] =3D SHA224_H5; - req_ctx->hw_context[6] =3D SHA224_H6; - req_ctx->hw_context[7] =3D SHA224_H7; - - /* init 64-bit count */ - req_ctx->hw_context[8] =3D 0; - req_ctx->hw_context[9] =3D 0; - - ahash_init(areq); - req_ctx->swinit =3D 1;/* prevent h/w initting context with sha256 values*/ - - return 0; -} - -static int ahash_update(struct ahash_request *areq) -{ - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - - req_ctx->last_request =3D 0; - - return ahash_process_req(areq, areq->nbytes); -} - -static int ahash_final(struct ahash_request *areq) -{ - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - - req_ctx->last_request =3D 1; - - return ahash_process_req(areq, 0); -} - -static int ahash_finup(struct ahash_request *areq) -{ - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - - req_ctx->last_request =3D 1; - - return ahash_process_req(areq, areq->nbytes); -} - -static int ahash_digest(struct ahash_request *areq) -{ - ahash_init(areq); - return ahash_finup(areq); -} - -static int ahash_digest_sha224_swinit(struct ahash_request *areq) -{ - ahash_init_sha224_swinit(areq); - return ahash_finup(areq); -} - -static int ahash_export(struct ahash_request *areq, void *out) -{ - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - struct talitos_export_state *export =3D out; - struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); - struct device *dev =3D ctx->dev; - dma_addr_t dma; - - dma =3D dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size, - DMA_FROM_DEVICE); - dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_FROM_DEVICE); - - memcpy(export->hw_context, req_ctx->hw_context, - req_ctx->hw_context_size); - export->swinit =3D req_ctx->swinit; - export->first_request =3D req_ctx->first_request; - export->last_request =3D req_ctx->last_request; - export->to_hash_later =3D req_ctx->to_hash_later; - - return 0; -} - -static int ahash_import(struct ahash_request *areq, const void *in) -{ - struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); - struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); - struct device *dev =3D ctx->dev; - const struct talitos_export_state *export =3D in; - unsigned int size; - dma_addr_t dma; - - memset(req_ctx, 0, sizeof(*req_ctx)); - size =3D (crypto_ahash_digestsize(tfm) <=3D SHA256_DIGEST_SIZE) - ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256 - : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512; - req_ctx->hw_context_size =3D size; - memcpy(req_ctx->hw_context, export->hw_context, size); - req_ctx->swinit =3D export->swinit; - req_ctx->first_request =3D export->first_request; - req_ctx->last_request =3D export->last_request; - req_ctx->to_hash_later =3D export->to_hash_later; - - dma =3D dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size, - DMA_TO_DEVICE); - dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE); - - return 0; -} - -static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int k= eylen, - u8 *hash) -{ - struct talitos_ctx *ctx =3D crypto_tfm_ctx(crypto_ahash_tfm(tfm)); - - struct scatterlist sg[1]; - struct ahash_request *req; - struct crypto_wait wait; - int ret; - - crypto_init_wait(&wait); - - req =3D ahash_request_alloc(tfm, GFP_KERNEL); - if (!req) - return -ENOMEM; - - /* Keep tfm keylen =3D=3D 0 during hash of the long key */ - ctx->keylen =3D 0; - ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, - crypto_req_done, &wait); - - sg_init_one(&sg[0], key, keylen); - - ahash_request_set_crypt(req, sg, hash, keylen); - ret =3D crypto_wait_req(crypto_ahash_digest(req), &wait); - - ahash_request_free(req); - - return ret; -} - -static int ahash_setkey(struct crypto_ahash *tfm, const u8 *key, - unsigned int keylen) -{ - struct talitos_ctx *ctx =3D crypto_tfm_ctx(crypto_ahash_tfm(tfm)); - struct device *dev =3D ctx->dev; - unsigned int blocksize =3D - crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm)); - unsigned int digestsize =3D crypto_ahash_digestsize(tfm); - unsigned int keysize =3D keylen; - u8 hash[SHA512_DIGEST_SIZE]; - int ret; - - if (keylen <=3D blocksize) - memcpy(ctx->key, key, keysize); - else { - /* Must get the hash of the long key */ - ret =3D keyhash(tfm, key, keylen, hash); - - if (ret) - return -EINVAL; - - keysize =3D digestsize; - memcpy(ctx->key, hash, digestsize); - } - - if (ctx->keylen) - dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); - - ctx->keylen =3D keysize; - ctx->dma_key =3D dma_map_single(dev, ctx->key, keysize, DMA_TO_DEVICE); - - return 0; -} - static struct talitos_alg_template driver_algs[] =3D { /* AEAD algorithms. These use a single-pass ipsec_esp descriptor */ { .type =3D CRYPTO_ALG_TYPE_AEAD, @@ -2737,235 +2222,6 @@ static struct talitos_alg_template driver_algs[] = =3D { DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES, }, - /* AHASH algorithms. */ - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D MD5_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "md5", - .cra_driver_name =3D "md5-talitos", - .cra_blocksize =3D MD5_HMAC_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_MD5, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA1_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha1", - .cra_driver_name =3D "sha1-talitos", - .cra_blocksize =3D SHA1_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA1, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA224_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha224", - .cra_driver_name =3D "sha224-talitos", - .cra_blocksize =3D SHA224_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA224, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA256_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha256", - .cra_driver_name =3D "sha256-talitos", - .cra_blocksize =3D SHA256_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA256, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA384_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha384", - .cra_driver_name =3D "sha384-talitos", - .cra_blocksize =3D SHA384_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUB | - DESC_HDR_MODE0_MDEUB_SHA384, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA512_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha512", - .cra_driver_name =3D "sha512-talitos", - .cra_blocksize =3D SHA512_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUB | - DESC_HDR_MODE0_MDEUB_SHA512, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D MD5_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(md5)", - .cra_driver_name =3D "hmac-md5-talitos", - .cra_blocksize =3D MD5_HMAC_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_MD5, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA1_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha1)", - .cra_driver_name =3D "hmac-sha1-talitos", - .cra_blocksize =3D SHA1_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA1, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA224_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha224)", - .cra_driver_name =3D "hmac-sha224-talitos", - .cra_blocksize =3D SHA224_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA224, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA256_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha256)", - .cra_driver_name =3D "hmac-sha256-talitos", - .cra_blocksize =3D SHA256_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA256, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA384_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha384)", - .cra_driver_name =3D "hmac-sha384-talitos", - .cra_blocksize =3D SHA384_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUB | - DESC_HDR_MODE0_MDEUB_SHA384, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA512_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha512)", - .cra_driver_name =3D "hmac-sha512-talitos", - .cra_blocksize =3D SHA512_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUB | - DESC_HDR_MODE0_MDEUB_SHA512, - } }; =20 int talitos_init_common(struct talitos_ctx *ctx, @@ -3014,22 +2270,6 @@ static int talitos_cra_init_skcipher(struct crypto_s= kcipher *tfm) return talitos_init_common(ctx, talitos_alg); } =20 -static int talitos_cra_init_ahash(struct crypto_tfm *tfm) -{ - struct crypto_alg *alg =3D tfm->__crt_alg; - struct talitos_crypto_alg *talitos_alg; - struct talitos_ctx *ctx =3D crypto_tfm_ctx(tfm); - - talitos_alg =3D container_of(__crypto_ahash_alg(alg), - struct talitos_crypto_alg, - algt.alg.hash); - - ctx->keylen =3D 0; - sizeof(struct talitos_ahash_req_ctx)); - - return talitos_init_common(ctx, talitos_alg); -} - void talitos_cra_exit(struct crypto_tfm *tfm) { struct talitos_ctx *ctx =3D crypto_tfm_ctx(tfm); @@ -3128,6 +2368,12 @@ int talitos_register_common(struct device *dev, t_alg->algt =3D *template; =20 switch (t_alg->algt.type) { + case CRYPTO_ALG_TYPE_AHASH: + alg =3D &t_alg->algt.alg.hash.halg.base; + talitos_alg_set_common(priv, alg, t_alg->algt.priority, + t_alg->algt.type); + ret =3D crypto_register_ahash(&t_alg->algt.alg.hash); + break; default: dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type); devm_kfree(dev, t_alg); @@ -3193,37 +2439,6 @@ static struct talitos_crypto_alg *talitos_alg_alloc(= struct device *dev, return ERR_PTR(-ENOTSUPP); } break; - case CRYPTO_ALG_TYPE_AHASH: - alg =3D &t_alg->algt.alg.hash.halg.base; - alg->cra_init =3D talitos_cra_init_ahash; - alg->cra_exit =3D talitos_cra_exit; - t_alg->algt.alg.hash.init =3D ahash_init; - t_alg->algt.alg.hash.update =3D ahash_update; - t_alg->algt.alg.hash.final =3D ahash_final; - t_alg->algt.alg.hash.finup =3D ahash_finup; - t_alg->algt.alg.hash.digest =3D ahash_digest; - if (!strncmp(alg->cra_name, "hmac", 4)) - t_alg->algt.alg.hash.setkey =3D ahash_setkey; - t_alg->algt.alg.hash.import =3D ahash_import; - t_alg->algt.alg.hash.export =3D ahash_export; - - if (!(priv->features & TALITOS_FTR_HMAC_OK) && - !strncmp(alg->cra_name, "hmac", 4)) { - devm_kfree(dev, t_alg); - return ERR_PTR(-ENOTSUPP); - } - if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) && - (!strcmp(alg->cra_name, "sha224") || - !strcmp(alg->cra_name, "hmac(sha224)"))) { - t_alg->algt.alg.hash.init =3D ahash_init_sha224_swinit; - t_alg->algt.alg.hash.digest =3D - ahash_digest_sha224_swinit; - t_alg->algt.desc_hdr_template =3D - DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA256; - } - break; default: dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type); devm_kfree(dev, t_alg); @@ -3452,6 +2667,10 @@ static int talitos_probe(struct platform_device *ofd= ev) dev_info(dev, "hwrng\n"); } =20 + err =3D talitos_register_hash(dev); + if (err) + goto err_out; + /* register crypto algorithms the device supports */ for (i =3D 0; i < ARRAY_SIZE(driver_algs); i++) { if (talitos_hw_supports(dev, @@ -3479,12 +2698,6 @@ static int talitos_probe(struct platform_device *ofd= ev) &t_alg->algt.alg.aead); alg =3D &t_alg->algt.alg.aead.base; break; - - case CRYPTO_ALG_TYPE_AHASH: - err =3D crypto_register_ahash( - &t_alg->algt.alg.hash); - alg =3D &t_alg->algt.alg.hash.halg.base; - break; } if (err) { dev_err(dev, "%s alg registration failed\n", diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index afed9947f4c0..e703c18cb81f 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -530,3 +530,7 @@ int talitos_register_common(struct device *dev, =20 int talitos_register_rng(struct device *dev); void talitos_unregister_rng(struct device *dev); + +/* Hash */ + +int talitos_register_hash(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 712503A874A; Thu, 28 May 2026 09:09:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959375; cv=none; b=YGvJvCjQnBmloTc4b9RluCsVHD8efHjjAL2ob6qVFM8qAnlC/KrjCbsdrA/qw7XkDaBtNbFTt5hkIxzKYw5q6YOn+ptdgFLlPvvd5czcGerLgD223PQI4KiMpZ+/P6a7fNsVu2F2pMUeq091PSJopzUdzAg7bHyNp/dezt5WPVA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959375; c=relaxed/simple; bh=zWqOkEXKgIsjhkihjrTHnc4D9KyNpx3tnJHZKmzODWk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=leKwnFT0H07RtKgRfFZzF0R7Ws8CNHpCrOkS2WxPL3QfqRVv/n0QI5omtXdzARGHHZWvkqY2y/scx3bxQUXjC8Mci+E0NI46+vi17q0I9wsVAVyLWUr7BuLmSfQAmCedcust/fuapWAKVcaTqiSR4YrY1HEVDIpTGRWdlxPJV0w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=xZYAcSAs; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="xZYAcSAs" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 203494E42D77; Thu, 28 May 2026 09:09:30 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E89EC60495; Thu, 28 May 2026 09:09:29 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 61C2210888C9D; Thu, 28 May 2026 11:09:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959369; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=3i5OsKgzIzMsBY3r4xBz039E/kTod0A9Lbl7Pp22eXk=; b=xZYAcSAspKmcXCrm1gACW4385qfhIeyuWpft+iQJeVdF+6cgN1S1efhK0F/uWvsTAUVMhP GgJy5+I+WJfw0EkBe1aR6RTFT3jm++qeVuiOE67dcOwwrvWktnUJ9ktiMdMTytwgxBtvRu CSBWJExkedxPZSUzsIXtU5/gdcU29ZQxzxSJKgDQL750yqwYDsOyTQPll45cppvbTDpn2G 0hsyDBVNOg/fopmcmesCipDXajyfO6o5qpryWOMsnz9s9eEk2X++6gZTR2iA4oz1EpjJZ3 JhM6V4Sa3MEAMM/DHsaWm7VfwKzq3MNl6XrGVqRE65K9uMOIL7Ywbw2iZOBWrg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:21 +0200 Subject: [PATCH 08/29] crypto: talitos/skcipher - Move into separate file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-8-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=28341; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=zWqOkEXKgIsjhkihjrTHnc4D9KyNpx3tnJHZKmzODWk=; b=hctlmdAiIL3Y6CTFd4Ywneh1wal8MfeQwbEcvotwgo9SqvuD9yjiVYAB/cmTnFaSlMWriqJRI dNj+ASkn4tpC1hq4Sj7pDP+afU/+NeO0guVht/2c2ZMV+EQ+idoAtaX X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Move the skcipher algorithm implementations from talitos.c into a dedicated talitos-skcipher.c file. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/Makefile | 2 +- drivers/crypto/talitos/talitos-skcipher.c | 396 ++++++++++++++++++++++++++= ++++ drivers/crypto/talitos/talitos.c | 377 +-------------------------= -- drivers/crypto/talitos/talitos.h | 1 + 4 files changed, 408 insertions(+), 368 deletions(-) diff --git a/drivers/crypto/talitos/Makefile b/drivers/crypto/talitos/Makef= ile index 40d37f9364ef..d4f19f2f6375 100644 --- a/drivers/crypto/talitos/Makefile +++ b/drivers/crypto/talitos/Makefile @@ -1,3 +1,3 @@ obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos.o =20 -talitos-y :=3D talitos.o talitos-rng.o talitos-hash.o +talitos-y :=3D talitos.o talitos-rng.o talitos-hash.o talitos-skcipher.o diff --git a/drivers/crypto/talitos/talitos-skcipher.c b/drivers/crypto/tal= itos/talitos-skcipher.c new file mode 100644 index 000000000000..4f742930ec47 --- /dev/null +++ b/drivers/crypto/talitos/talitos-skcipher.c @@ -0,0 +1,396 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * Freescale SEC (talitos) skcipher implementation + * + * Copyright (c) 2006-2011 Freescale Semiconductor, Inc. + */ + +#include +#include + +#include "talitos.h" + +static void common_nonsnoop_unmap(struct device *dev, + struct talitos_edesc *edesc, + struct skcipher_request *areq) +{ + unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE); + + talitos_sg_unmap(dev, edesc, areq->src, areq->dst, areq->cryptlen, 0); + unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE); + + if (edesc->dma_len) + dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, + DMA_BIDIRECTIONAL); +} + +static void skcipher_done(struct device *dev, + struct talitos_desc *desc, void *context, + int err) +{ + struct skcipher_request *areq =3D context; + struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); + unsigned int ivsize =3D crypto_skcipher_ivsize(cipher); + struct talitos_edesc *edesc; + + edesc =3D container_of(desc, struct talitos_edesc, desc); + + common_nonsnoop_unmap(dev, edesc, areq); + memcpy(areq->iv, ctx->iv, ivsize); + + kfree(edesc); + + skcipher_request_complete(areq, err); +} + +static int common_nonsnoop(struct talitos_edesc *edesc, + struct skcipher_request *areq, + void (*callback) (struct device *dev, + struct talitos_desc *desc, + void *context, int error)) +{ + struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); + struct device *dev =3D ctx->dev; + struct talitos_desc *desc =3D &edesc->desc; + unsigned int cryptlen =3D areq->cryptlen; + unsigned int ivsize =3D crypto_skcipher_ivsize(cipher); + int sg_count, ret; + bool sync_needed =3D false; + struct talitos_private *priv =3D dev_get_drvdata(dev); + bool is_sec1 =3D has_ftr_sec1(priv); + bool is_ctr =3D (desc->hdr & DESC_HDR_SEL0_MASK) =3D=3D DESC_HDR_SEL0_AES= U && + (desc->hdr & DESC_HDR_MODE0_AESU_MASK) =3D=3D DESC_HDR_MODE0_AESU_= CTR; + + /* first DWORD empty */ + + /* cipher iv */ + to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize, is_sec1); + + /* cipher key */ + to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, is_sec1); + + sg_count =3D edesc->src_nents ?: 1; + if (is_sec1 && sg_count > 1) + sg_copy_to_buffer(areq->src, sg_count, edesc->buf, + cryptlen); + else + sg_count =3D dma_map_sg(dev, areq->src, sg_count, + (areq->src =3D=3D areq->dst) ? + DMA_BIDIRECTIONAL : DMA_TO_DEVICE); + /* + * cipher in + */ + sg_count =3D talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->p= tr[3], + sg_count, 0, 0, 0, false, is_ctr ? 16 : 1); + if (sg_count > 1) + sync_needed =3D true; + + /* cipher out */ + if (areq->src !=3D areq->dst) { + sg_count =3D edesc->dst_nents ? : 1; + if (!is_sec1 || sg_count =3D=3D 1) + dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE); + } + + ret =3D talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[4], + sg_count, 0, (edesc->src_nents + 1)); + if (ret > 1) + sync_needed =3D true; + + /* iv out */ + map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv, + DMA_FROM_DEVICE); + + /* last DWORD empty */ + + if (sync_needed) + dma_sync_single_for_device(dev, edesc->dma_link_tbl, + edesc->dma_len, DMA_BIDIRECTIONAL); + + ret =3D talitos_submit(dev, ctx->ch, desc, callback, areq); + if (ret !=3D -EINPROGRESS) { + common_nonsnoop_unmap(dev, edesc, areq); + kfree(edesc); + } + return ret; +} + +static int skcipher_setkey(struct crypto_skcipher *cipher, + const u8 *key, unsigned int keylen) +{ + struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); + struct device *dev =3D ctx->dev; + + if (ctx->keylen) + dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); + + memcpy(&ctx->key, key, keylen); + ctx->keylen =3D keylen; + + ctx->dma_key =3D dma_map_single(dev, ctx->key, keylen, DMA_TO_DEVICE); + + return 0; +} + +static int skcipher_des_setkey(struct crypto_skcipher *cipher, + const u8 *key, unsigned int keylen) +{ + return verify_skcipher_des_key(cipher, key) ?: + skcipher_setkey(cipher, key, keylen); +} + +static int skcipher_des3_setkey(struct crypto_skcipher *cipher, + const u8 *key, unsigned int keylen) +{ + return verify_skcipher_des3_key(cipher, key) ?: + skcipher_setkey(cipher, key, keylen); +} + +static int skcipher_aes_setkey(struct crypto_skcipher *cipher, + const u8 *key, unsigned int keylen) +{ + if (keylen =3D=3D AES_KEYSIZE_128 || keylen =3D=3D AES_KEYSIZE_192 || + keylen =3D=3D AES_KEYSIZE_256) + return skcipher_setkey(cipher, key, keylen); + + return -EINVAL; +} + +static struct talitos_edesc *skcipher_edesc_alloc(struct skcipher_request * + areq, bool encrypt) +{ + struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); + unsigned int ivsize =3D crypto_skcipher_ivsize(cipher); + + return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst, + areq->iv, 0, areq->cryptlen, 0, ivsize, 0, + areq->base.flags, encrypt); +} + +static int skcipher_encrypt(struct skcipher_request *areq) +{ + struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); + struct talitos_edesc *edesc; + unsigned int blocksize =3D + crypto_tfm_alg_blocksize(crypto_skcipher_tfm(cipher)); + + if (!areq->cryptlen) + return 0; + + if (areq->cryptlen % blocksize) + return -EINVAL; + + /* allocate extended descriptor */ + edesc =3D skcipher_edesc_alloc(areq, true); + if (IS_ERR(edesc)) + return PTR_ERR(edesc); + + /* set encrypt */ + edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT; + + return common_nonsnoop(edesc, areq, skcipher_done); +} + +static int skcipher_decrypt(struct skcipher_request *areq) +{ + struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); + struct talitos_edesc *edesc; + unsigned int blocksize =3D + crypto_tfm_alg_blocksize(crypto_skcipher_tfm(cipher)); + + if (!areq->cryptlen) + return 0; + + if (areq->cryptlen % blocksize) + return -EINVAL; + + /* allocate extended descriptor */ + edesc =3D skcipher_edesc_alloc(areq, false); + if (IS_ERR(edesc)) + return PTR_ERR(edesc); + + edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; + + return common_nonsnoop(edesc, areq, skcipher_done); +} + +static int talitos_cra_init_skcipher(struct crypto_skcipher *tfm) +{ + struct skcipher_alg *alg =3D crypto_skcipher_alg(tfm); + struct talitos_crypto_alg *talitos_alg; + struct talitos_ctx *ctx =3D crypto_skcipher_ctx(tfm); + + talitos_alg =3D container_of(alg, struct talitos_crypto_alg, + algt.alg.skcipher); + + return talitos_init_common(ctx, talitos_alg); +} + +static struct talitos_alg_template skcipher_driver_algs[] =3D { + { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher =3D { + .base.cra_name =3D "ecb(aes)", + .base.cra_driver_name =3D "ecb-aes-talitos", + .base.cra_blocksize =3D AES_BLOCK_SIZE, + .base.cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + .min_keysize =3D AES_MIN_KEY_SIZE, + .max_keysize =3D AES_MAX_KEY_SIZE, + .setkey =3D skcipher_aes_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU, + }, + { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher =3D { + .base.cra_name =3D "cbc(aes)", + .base.cra_driver_name =3D "cbc-aes-talitos", + .base.cra_blocksize =3D AES_BLOCK_SIZE, + .base.cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + .min_keysize =3D AES_MIN_KEY_SIZE, + .max_keysize =3D AES_MAX_KEY_SIZE, + .ivsize =3D AES_BLOCK_SIZE, + .setkey =3D skcipher_aes_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC, + }, + { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher =3D { + .base.cra_name =3D "ctr(aes)", + .base.cra_driver_name =3D "ctr-aes-talitos", + .base.cra_blocksize =3D 1, + .base.cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + .min_keysize =3D AES_MIN_KEY_SIZE, + .max_keysize =3D AES_MAX_KEY_SIZE, + .ivsize =3D AES_BLOCK_SIZE, + .setkey =3D skcipher_aes_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_AESU_CTR_NONSNOOP | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CTR, + }, + { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher =3D { + .base.cra_name =3D "ctr(aes)", + .base.cra_driver_name =3D "ctr-aes-talitos", + .base.cra_blocksize =3D 1, + .base.cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + .min_keysize =3D AES_MIN_KEY_SIZE, + .max_keysize =3D AES_MAX_KEY_SIZE, + .ivsize =3D AES_BLOCK_SIZE, + .setkey =3D skcipher_aes_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CTR, + }, + { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher =3D { + .base.cra_name =3D "ecb(des)", + .base.cra_driver_name =3D "ecb-des-talitos", + .base.cra_blocksize =3D DES_BLOCK_SIZE, + .base.cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + .min_keysize =3D DES_KEY_SIZE, + .max_keysize =3D DES_KEY_SIZE, + .setkey =3D skcipher_des_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU, + }, + { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher =3D { + .base.cra_name =3D "cbc(des)", + .base.cra_driver_name =3D "cbc-des-talitos", + .base.cra_blocksize =3D DES_BLOCK_SIZE, + .base.cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + .min_keysize =3D DES_KEY_SIZE, + .max_keysize =3D DES_KEY_SIZE, + .ivsize =3D DES_BLOCK_SIZE, + .setkey =3D skcipher_des_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC, + }, + { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher =3D { + .base.cra_name =3D "ecb(des3_ede)", + .base.cra_driver_name =3D "ecb-3des-talitos", + .base.cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .base.cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + .min_keysize =3D DES3_EDE_KEY_SIZE, + .max_keysize =3D DES3_EDE_KEY_SIZE, + .setkey =3D skcipher_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_3DES, + }, + { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher =3D { + .base.cra_name =3D "cbc(des3_ede)", + .base.cra_driver_name =3D "cbc-3des-talitos", + .base.cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .base.cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + .min_keysize =3D DES3_EDE_KEY_SIZE, + .max_keysize =3D DES3_EDE_KEY_SIZE, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .setkey =3D skcipher_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES, + }, +}; + +int talitos_register_skcipher(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + struct skcipher_alg *skcipher_alg; + struct crypto_alg *alg; + size_t i; + int ret; + + for (i =3D 0; i < ARRAY_SIZE(skcipher_driver_algs); i++) { + if (!talitos_hw_supports( + dev, skcipher_driver_algs[i].desc_hdr_template)) + continue; + + skcipher_alg =3D &skcipher_driver_algs[i].alg.skcipher; + alg =3D &skcipher_alg->base; + + alg->cra_exit =3D talitos_cra_exit; + skcipher_alg->init =3D talitos_cra_init_skcipher; + skcipher_alg->setkey =3D skcipher_alg->setkey ?: skcipher_setkey; + skcipher_alg->encrypt =3D skcipher_encrypt; + skcipher_alg->decrypt =3D skcipher_decrypt; + + if (!strcmp(alg->cra_name, "ctr(aes)") && !has_ftr_sec1(priv) && + DESC_TYPE(skcipher_driver_algs[i].desc_hdr_template) !=3D + DESC_TYPE(DESC_HDR_TYPE_AESU_CTR_NONSNOOP)) { + continue; + } + + ret =3D talitos_register_common(dev, &skcipher_driver_algs[i]); + if (ret) + return ret; + } + + return 0; +} diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index b8bcb970d7d5..cd37bc379f86 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -1430,215 +1430,6 @@ static int aead_decrypt(struct aead_request *req) return ipsec_esp(edesc, req, false, ipsec_esp_decrypt_swauth_done); } =20 -static int skcipher_setkey(struct crypto_skcipher *cipher, - const u8 *key, unsigned int keylen) -{ - struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); - struct device *dev =3D ctx->dev; - - if (ctx->keylen) - dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); - - memcpy(&ctx->key, key, keylen); - ctx->keylen =3D keylen; - - ctx->dma_key =3D dma_map_single(dev, ctx->key, keylen, DMA_TO_DEVICE); - - return 0; -} - -static int skcipher_des_setkey(struct crypto_skcipher *cipher, - const u8 *key, unsigned int keylen) -{ - return verify_skcipher_des_key(cipher, key) ?: - skcipher_setkey(cipher, key, keylen); -} - -static int skcipher_des3_setkey(struct crypto_skcipher *cipher, - const u8 *key, unsigned int keylen) -{ - return verify_skcipher_des3_key(cipher, key) ?: - skcipher_setkey(cipher, key, keylen); -} - -static int skcipher_aes_setkey(struct crypto_skcipher *cipher, - const u8 *key, unsigned int keylen) -{ - if (keylen =3D=3D AES_KEYSIZE_128 || keylen =3D=3D AES_KEYSIZE_192 || - keylen =3D=3D AES_KEYSIZE_256) - return skcipher_setkey(cipher, key, keylen); - - return -EINVAL; -} - -static void common_nonsnoop_unmap(struct device *dev, - struct talitos_edesc *edesc, - struct skcipher_request *areq) -{ - unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE); - - talitos_sg_unmap(dev, edesc, areq->src, areq->dst, areq->cryptlen, 0); - unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE); - - if (edesc->dma_len) - dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, - DMA_BIDIRECTIONAL); -} - -static void skcipher_done(struct device *dev, - struct talitos_desc *desc, void *context, - int err) -{ - struct skcipher_request *areq =3D context; - struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); - unsigned int ivsize =3D crypto_skcipher_ivsize(cipher); - struct talitos_edesc *edesc; - - edesc =3D container_of(desc, struct talitos_edesc, desc); - - common_nonsnoop_unmap(dev, edesc, areq); - memcpy(areq->iv, ctx->iv, ivsize); - - kfree(edesc); - - skcipher_request_complete(areq, err); -} - -static int common_nonsnoop(struct talitos_edesc *edesc, - struct skcipher_request *areq, - void (*callback) (struct device *dev, - struct talitos_desc *desc, - void *context, int error)) -{ - struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); - struct device *dev =3D ctx->dev; - struct talitos_desc *desc =3D &edesc->desc; - unsigned int cryptlen =3D areq->cryptlen; - unsigned int ivsize =3D crypto_skcipher_ivsize(cipher); - int sg_count, ret; - bool sync_needed =3D false; - struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); - bool is_ctr =3D (desc->hdr & DESC_HDR_SEL0_MASK) =3D=3D DESC_HDR_SEL0_AES= U && - (desc->hdr & DESC_HDR_MODE0_AESU_MASK) =3D=3D DESC_HDR_MODE0_AESU_= CTR; - - /* first DWORD empty */ - - /* cipher iv */ - to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize, is_sec1); - - /* cipher key */ - to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, is_sec1); - - sg_count =3D edesc->src_nents ?: 1; - if (is_sec1 && sg_count > 1) - sg_copy_to_buffer(areq->src, sg_count, edesc->buf, - cryptlen); - else - sg_count =3D dma_map_sg(dev, areq->src, sg_count, - (areq->src =3D=3D areq->dst) ? - DMA_BIDIRECTIONAL : DMA_TO_DEVICE); - /* - * cipher in - */ - sg_count =3D talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->p= tr[3], - sg_count, 0, 0, 0, false, is_ctr ? 16 : 1); - if (sg_count > 1) - sync_needed =3D true; - - /* cipher out */ - if (areq->src !=3D areq->dst) { - sg_count =3D edesc->dst_nents ? : 1; - if (!is_sec1 || sg_count =3D=3D 1) - dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE); - } - - ret =3D talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[4], - sg_count, 0, (edesc->src_nents + 1)); - if (ret > 1) - sync_needed =3D true; - - /* iv out */ - map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv, - DMA_FROM_DEVICE); - - /* last DWORD empty */ - - if (sync_needed) - dma_sync_single_for_device(dev, edesc->dma_link_tbl, - edesc->dma_len, DMA_BIDIRECTIONAL); - - ret =3D talitos_submit(dev, ctx->ch, desc, callback, areq); - if (ret !=3D -EINPROGRESS) { - common_nonsnoop_unmap(dev, edesc, areq); - kfree(edesc); - } - return ret; -} - -static struct talitos_edesc *skcipher_edesc_alloc(struct skcipher_request * - areq, bool encrypt) -{ - struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); - unsigned int ivsize =3D crypto_skcipher_ivsize(cipher); - - return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst, - areq->iv, 0, areq->cryptlen, 0, ivsize, 0, - areq->base.flags, encrypt); -} - -static int skcipher_encrypt(struct skcipher_request *areq) -{ - struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); - struct talitos_edesc *edesc; - unsigned int blocksize =3D - crypto_tfm_alg_blocksize(crypto_skcipher_tfm(cipher)); - - if (!areq->cryptlen) - return 0; - - if (areq->cryptlen % blocksize) - return -EINVAL; - - /* allocate extended descriptor */ - edesc =3D skcipher_edesc_alloc(areq, true); - if (IS_ERR(edesc)) - return PTR_ERR(edesc); - - /* set encrypt */ - edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT; - - return common_nonsnoop(edesc, areq, skcipher_done); -} - -static int skcipher_decrypt(struct skcipher_request *areq) -{ - struct crypto_skcipher *cipher =3D crypto_skcipher_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_skcipher_ctx(cipher); - struct talitos_edesc *edesc; - unsigned int blocksize =3D - crypto_tfm_alg_blocksize(crypto_skcipher_tfm(cipher)); - - if (!areq->cryptlen) - return 0; - - if (areq->cryptlen % blocksize) - return -EINVAL; - - /* allocate extended descriptor */ - edesc =3D skcipher_edesc_alloc(areq, false); - if (IS_ERR(edesc)) - return PTR_ERR(edesc); - - edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; - - return common_nonsnoop(edesc, areq, skcipher_done); -} - static struct talitos_alg_template driver_algs[] =3D { /* AEAD algorithms. These use a single-pass ipsec_esp descriptor */ { .type =3D CRYPTO_ALG_TYPE_AEAD, @@ -2097,131 +1888,6 @@ static struct talitos_alg_template driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_PAD | DESC_HDR_MODE1_MDEU_MD5_HMAC, }, - /* SKCIPHER algorithms. */ - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ecb(aes)", - .base.cra_driver_name =3D "ecb-aes-talitos", - .base.cra_blocksize =3D AES_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - .min_keysize =3D AES_MIN_KEY_SIZE, - .max_keysize =3D AES_MAX_KEY_SIZE, - .setkey =3D skcipher_aes_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "cbc(aes)", - .base.cra_driver_name =3D "cbc-aes-talitos", - .base.cra_blocksize =3D AES_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - .min_keysize =3D AES_MIN_KEY_SIZE, - .max_keysize =3D AES_MAX_KEY_SIZE, - .ivsize =3D AES_BLOCK_SIZE, - .setkey =3D skcipher_aes_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ctr(aes)", - .base.cra_driver_name =3D "ctr-aes-talitos", - .base.cra_blocksize =3D 1, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - .min_keysize =3D AES_MIN_KEY_SIZE, - .max_keysize =3D AES_MAX_KEY_SIZE, - .ivsize =3D AES_BLOCK_SIZE, - .setkey =3D skcipher_aes_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_AESU_CTR_NONSNOOP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CTR, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ctr(aes)", - .base.cra_driver_name =3D "ctr-aes-talitos", - .base.cra_blocksize =3D 1, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - .min_keysize =3D AES_MIN_KEY_SIZE, - .max_keysize =3D AES_MAX_KEY_SIZE, - .ivsize =3D AES_BLOCK_SIZE, - .setkey =3D skcipher_aes_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CTR, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ecb(des)", - .base.cra_driver_name =3D "ecb-des-talitos", - .base.cra_blocksize =3D DES_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - .min_keysize =3D DES_KEY_SIZE, - .max_keysize =3D DES_KEY_SIZE, - .setkey =3D skcipher_des_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "cbc(des)", - .base.cra_driver_name =3D "cbc-des-talitos", - .base.cra_blocksize =3D DES_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - .min_keysize =3D DES_KEY_SIZE, - .max_keysize =3D DES_KEY_SIZE, - .ivsize =3D DES_BLOCK_SIZE, - .setkey =3D skcipher_des_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ecb(des3_ede)", - .base.cra_driver_name =3D "ecb-3des-talitos", - .base.cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - .min_keysize =3D DES3_EDE_KEY_SIZE, - .max_keysize =3D DES3_EDE_KEY_SIZE, - .setkey =3D skcipher_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_3DES, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "cbc(des3_ede)", - .base.cra_driver_name =3D "cbc-3des-talitos", - .base.cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - .min_keysize =3D DES3_EDE_KEY_SIZE, - .max_keysize =3D DES3_EDE_KEY_SIZE, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .setkey =3D skcipher_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES, - }, }; =20 int talitos_init_common(struct talitos_ctx *ctx, @@ -2258,18 +1924,6 @@ static int talitos_cra_init_aead(struct crypto_aead = *tfm) return talitos_init_common(ctx, talitos_alg); } =20 -static int talitos_cra_init_skcipher(struct crypto_skcipher *tfm) -{ - struct skcipher_alg *alg =3D crypto_skcipher_alg(tfm); - struct talitos_crypto_alg *talitos_alg; - struct talitos_ctx *ctx =3D crypto_skcipher_ctx(tfm); - - talitos_alg =3D container_of(alg, struct talitos_crypto_alg, - algt.alg.skcipher); - - return talitos_init_common(ctx, talitos_alg); -} - void talitos_cra_exit(struct crypto_tfm *tfm) { struct talitos_ctx *ctx =3D crypto_tfm_ctx(tfm); @@ -2374,6 +2028,12 @@ int talitos_register_common(struct device *dev, t_alg->algt.type); ret =3D crypto_register_ahash(&t_alg->algt.alg.hash); break; + case CRYPTO_ALG_TYPE_SKCIPHER: + alg =3D &t_alg->algt.alg.skcipher.base; + talitos_alg_set_common(priv, alg, t_alg->algt.priority, + t_alg->algt.type); + ret =3D crypto_register_skcipher(&t_alg->algt.alg.skcipher); + break; default: dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type); devm_kfree(dev, t_alg); @@ -2410,21 +2070,6 @@ static struct talitos_crypto_alg *talitos_alg_alloc(= struct device *dev, t_alg->algt =3D *template; =20 switch (t_alg->algt.type) { - case CRYPTO_ALG_TYPE_SKCIPHER: - alg =3D &t_alg->algt.alg.skcipher.base; - alg->cra_exit =3D talitos_cra_exit; - t_alg->algt.alg.skcipher.init =3D talitos_cra_init_skcipher; - t_alg->algt.alg.skcipher.setkey =3D - t_alg->algt.alg.skcipher.setkey ?: skcipher_setkey; - t_alg->algt.alg.skcipher.encrypt =3D skcipher_encrypt; - t_alg->algt.alg.skcipher.decrypt =3D skcipher_decrypt; - if (!strcmp(alg->cra_name, "ctr(aes)") && !has_ftr_sec1(priv) && - DESC_TYPE(t_alg->algt.desc_hdr_template) !=3D - DESC_TYPE(DESC_HDR_TYPE_AESU_CTR_NONSNOOP)) { - devm_kfree(dev, t_alg); - return ERR_PTR(-ENOTSUPP); - } - break; case CRYPTO_ALG_TYPE_AEAD: alg =3D &t_alg->algt.alg.aead.base; alg->cra_exit =3D talitos_cra_exit; @@ -2671,6 +2316,10 @@ static int talitos_probe(struct platform_device *ofd= ev) if (err) goto err_out; =20 + err =3D talitos_register_skcipher(dev); + if (err) + goto err_out; + /* register crypto algorithms the device supports */ for (i =3D 0; i < ARRAY_SIZE(driver_algs); i++) { if (talitos_hw_supports(dev, @@ -2687,12 +2336,6 @@ static int talitos_probe(struct platform_device *ofd= ev) } =20 switch (t_alg->algt.type) { - case CRYPTO_ALG_TYPE_SKCIPHER: - err =3D crypto_register_skcipher( - &t_alg->algt.alg.skcipher); - alg =3D &t_alg->algt.alg.skcipher.base; - break; - case CRYPTO_ALG_TYPE_AEAD: err =3D crypto_register_aead( &t_alg->algt.alg.aead); diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index e703c18cb81f..7e7d41673fa5 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -534,3 +534,4 @@ void talitos_unregister_rng(struct device *dev); /* Hash */ =20 int talitos_register_hash(struct device *dev); +int talitos_register_skcipher(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F387E3A7194 for ; Thu, 28 May 2026 09:09:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959378; cv=none; b=sl9zlrG4eJ+6SaWRTSD2Pg3XNAXuW9obPfE0ARRYMiDU5k7+x3y4xAcQTNfaka3ZpIAy2tJArlDkivg8wfUGC8rZcvdsE2WsO34qCEjIlKhTFurADkNeNH1dg4xPXjyhDimVBey/Nckym/z2gD4MBxg8rfUMXwpDOSuIzeDDdxM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959378; c=relaxed/simple; bh=ujtsTn6y0Ty76u/paTcyBKjKNH5CsAl4tH5AiUbQj34=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eWdJnD/PoFcXMJRWEdR3wlKx/5x4r1Xv0hY8lMgIsUhpGjZHDxYTH0hEJC0q+kg7t8qKDw1aTOSPrmK3YjAYGXKDYvHWRi0YIvbuuejXlExuoXG+HD27QsrdZOmHkH1s/KX8xugiSraKc0RLKZd4eHrSA9eNHtSIqxbzi7sZ5Ag= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=F4MHzmwP; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="F4MHzmwP" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 7B4E01A3701 for ; Thu, 28 May 2026 09:09:31 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4E4A460495; Thu, 28 May 2026 09:09:31 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id AA51510888C9E; Thu, 28 May 2026 11:09:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959370; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=NnOGhm4ckcrZund8FIoIRf+lUUBcoooKiYIkSKhFZSg=; b=F4MHzmwP5aPVec1GsbfE4O96EfhEj4T3gYCQiga2+S4DJq2k91wxbGMHqFD9epkD/jvdI6 Jt422KsaOL7M5zI3FnLYJzl3Y8WE7Voz7PraXPn5//SZMdVh9gDbLcPgDw3Wwg9ElqwLk+ s1KffbmfVbR+fA8/fypMYkWL/wkT7szDb9VGLSMACHD/AYeP7N42AkhSYAD9z9GhubE03N 0P4HRGzjeUkwpP8pOvNoSbwzVc7JMJ/txexhXRw3aXG4HXULBKXnQAEkzQALbJFr49L5gj jzu1kHMc9dT4kmpSYRUWrOk2yGWbcjt54g0rmKwcAS3lTSPZwjnG47eM0hRU1g== From: Paul Louvel Date: Thu, 28 May 2026 11:08:22 +0200 Subject: [PATCH 09/29] crypto: talitos/aead - Move into separate file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-9-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=63301; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=ujtsTn6y0Ty76u/paTcyBKjKNH5CsAl4tH5AiUbQj34=; b=+eLVxE0WrzEtTLIIy+zMKc4QkDxMUp2QmL8AM6KWSnKch0W2lz+qZVcVCBf6J3B0b2oAnc3Q6 r5scxukH+z2B0ZDGDdRd2kVS40prM6FyTaD2soKDIM6y+xPJIP2qatI X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Move the AEAD algorithm implementations from talitos.c into a dedicated talitos-aead.c file. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/Makefile | 2 +- drivers/crypto/talitos/talitos-aead.c | 894 ++++++++++++++++++++++++++++++= ++ drivers/crypto/talitos/talitos.c | 947 +-----------------------------= ---- drivers/crypto/talitos/talitos.h | 3 + 4 files changed, 907 insertions(+), 939 deletions(-) diff --git a/drivers/crypto/talitos/Makefile b/drivers/crypto/talitos/Makef= ile index d4f19f2f6375..9e80bb094507 100644 --- a/drivers/crypto/talitos/Makefile +++ b/drivers/crypto/talitos/Makefile @@ -1,3 +1,3 @@ obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos.o =20 -talitos-y :=3D talitos.o talitos-rng.o talitos-hash.o talitos-skcipher.o +talitos-y :=3D talitos.o talitos-rng.o talitos-hash.o talitos-skcipher.o t= alitos-aead.o diff --git a/drivers/crypto/talitos/talitos-aead.c b/drivers/crypto/talitos= /talitos-aead.c new file mode 100644 index 000000000000..ce6bd6133fd0 --- /dev/null +++ b/drivers/crypto/talitos/talitos-aead.c @@ -0,0 +1,894 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include + +#include "talitos.h" + +/* + * Defines a priority for doing AEAD with descriptors type + * HMAC_SNOOP_NO_AFEA (HSNA) instead of type IPSEC_ESP + */ +#define TALITOS_CRA_PRIORITY_AEAD_HSNA (TALITOS_CRA_PRIORITY - 1) + +static int aead_setkey(struct crypto_aead *authenc, + const u8 *key, unsigned int keylen) +{ + struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); + struct device *dev =3D ctx->dev; + struct crypto_authenc_keys keys; + + if (crypto_authenc_extractkeys(&keys, key, keylen) !=3D 0) + goto badkey; + + if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE) + goto badkey; + + if (ctx->keylen) + dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); + + memcpy(ctx->key, keys.authkey, keys.authkeylen); + memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen); + + ctx->keylen =3D keys.authkeylen + keys.enckeylen; + ctx->enckeylen =3D keys.enckeylen; + ctx->authkeylen =3D keys.authkeylen; + ctx->dma_key =3D dma_map_single(dev, ctx->key, ctx->keylen, + DMA_TO_DEVICE); + + memzero_explicit(&keys, sizeof(keys)); + return 0; + +badkey: + memzero_explicit(&keys, sizeof(keys)); + return -EINVAL; +} + +static int aead_des3_setkey(struct crypto_aead *authenc, + const u8 *key, unsigned int keylen) +{ + struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); + struct device *dev =3D ctx->dev; + struct crypto_authenc_keys keys; + int err; + + err =3D crypto_authenc_extractkeys(&keys, key, keylen); + if (unlikely(err)) + goto out; + + err =3D -EINVAL; + if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE) + goto out; + + err =3D verify_aead_des3_key(authenc, keys.enckey, keys.enckeylen); + if (err) + goto out; + + if (ctx->keylen) + dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); + + memcpy(ctx->key, keys.authkey, keys.authkeylen); + memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen); + + ctx->keylen =3D keys.authkeylen + keys.enckeylen; + ctx->enckeylen =3D keys.enckeylen; + ctx->authkeylen =3D keys.authkeylen; + ctx->dma_key =3D dma_map_single(dev, ctx->key, ctx->keylen, + DMA_TO_DEVICE); + +out: + memzero_explicit(&keys, sizeof(keys)); + return err; +} + +static void ipsec_esp_unmap(struct device *dev, + struct talitos_edesc *edesc, + struct aead_request *areq, bool encrypt) +{ + struct crypto_aead *aead =3D crypto_aead_reqtfm(areq); + struct talitos_ctx *ctx =3D crypto_aead_ctx(aead); + unsigned int ivsize =3D crypto_aead_ivsize(aead); + unsigned int authsize =3D crypto_aead_authsize(aead); + unsigned int cryptlen =3D areq->cryptlen - (encrypt ? 0 : authsize); + bool is_ipsec_esp =3D edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP; + struct talitos_ptr *civ_ptr =3D &edesc->desc.ptr[is_ipsec_esp ? 2 : 3]; + + if (is_ipsec_esp) + unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6], + DMA_FROM_DEVICE); + unmap_single_talitos_ptr(dev, civ_ptr, DMA_TO_DEVICE); + + talitos_sg_unmap(dev, edesc, areq->src, areq->dst, + cryptlen + authsize, areq->assoclen); + + if (edesc->dma_len) + dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, + DMA_BIDIRECTIONAL); + + if (!is_ipsec_esp) { + unsigned int dst_nents =3D edesc->dst_nents ? : 1; + + sg_pcopy_to_buffer(areq->dst, dst_nents, ctx->iv, ivsize, + areq->assoclen + cryptlen - ivsize); + } +} + +/* + * ipsec_esp descriptor callbacks + */ +static void ipsec_esp_encrypt_done(struct device *dev, + struct talitos_desc *desc, void *context, + int err) +{ + struct aead_request *areq =3D context; + struct crypto_aead *authenc =3D crypto_aead_reqtfm(areq); + unsigned int ivsize =3D crypto_aead_ivsize(authenc); + struct talitos_edesc *edesc; + + edesc =3D container_of(desc, struct talitos_edesc, desc); + + ipsec_esp_unmap(dev, edesc, areq, true); + + dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE); + + kfree(edesc); + + aead_request_complete(areq, err); +} + +static void ipsec_esp_decrypt_swauth_done(struct device *dev, + struct talitos_desc *desc, + void *context, int err) +{ + struct aead_request *req =3D context; + struct crypto_aead *authenc =3D crypto_aead_reqtfm(req); + unsigned int authsize =3D crypto_aead_authsize(authenc); + struct talitos_edesc *edesc; + char *oicv, *icv; + + edesc =3D container_of(desc, struct talitos_edesc, desc); + + ipsec_esp_unmap(dev, edesc, req, false); + + if (!err) { + /* auth check */ + oicv =3D edesc->buf + edesc->dma_len; + icv =3D oicv - authsize; + + err =3D crypto_memneq(oicv, icv, authsize) ? -EBADMSG : 0; + } + + kfree(edesc); + + aead_request_complete(req, err); +} + +static void ipsec_esp_decrypt_hwauth_done(struct device *dev, + struct talitos_desc *desc, + void *context, int err) +{ + struct aead_request *req =3D context; + struct talitos_edesc *edesc; + + edesc =3D container_of(desc, struct talitos_edesc, desc); + + ipsec_esp_unmap(dev, edesc, req, false); + + /* check ICV auth status */ + if (!err && ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) !=3D + DESC_HDR_LO_ICCR1_PASS)) + err =3D -EBADMSG; + + kfree(edesc); + + aead_request_complete(req, err); +} + +/* + * fill in and submit ipsec_esp descriptor + */ +static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *are= q, + bool encrypt, + void (*callback)(struct device *dev, + struct talitos_desc *desc, + void *context, int error)) +{ + struct crypto_aead *aead =3D crypto_aead_reqtfm(areq); + unsigned int authsize =3D crypto_aead_authsize(aead); + struct talitos_ctx *ctx =3D crypto_aead_ctx(aead); + struct device *dev =3D ctx->dev; + struct talitos_desc *desc =3D &edesc->desc; + unsigned int cryptlen =3D areq->cryptlen - (encrypt ? 0 : authsize); + unsigned int ivsize =3D crypto_aead_ivsize(aead); + int tbl_off =3D 0; + int sg_count, ret; + int elen =3D 0; + bool sync_needed =3D false; + struct talitos_private *priv =3D dev_get_drvdata(dev); + bool is_sec1 =3D has_ftr_sec1(priv); + bool is_ipsec_esp =3D desc->hdr & DESC_HDR_TYPE_IPSEC_ESP; + struct talitos_ptr *civ_ptr =3D &desc->ptr[is_ipsec_esp ? 2 : 3]; + struct talitos_ptr *ckey_ptr =3D &desc->ptr[is_ipsec_esp ? 3 : 2]; + dma_addr_t dma_icv =3D edesc->dma_link_tbl + edesc->dma_len - authsize; + + /* hmac key */ + to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1); + + sg_count =3D edesc->src_nents ?: 1; + if (is_sec1 && sg_count > 1) + sg_copy_to_buffer(areq->src, sg_count, edesc->buf, + areq->assoclen + cryptlen); + else + sg_count =3D dma_map_sg(dev, areq->src, sg_count, + (areq->src =3D=3D areq->dst) ? + DMA_BIDIRECTIONAL : DMA_TO_DEVICE); + + /* hmac data */ + ret =3D talitos_sg_map(dev, areq->src, areq->assoclen, edesc, + &desc->ptr[1], sg_count, 0, tbl_off); + + if (ret > 1) { + tbl_off +=3D ret; + sync_needed =3D true; + } + + /* cipher iv */ + to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize, is_sec1); + + /* cipher key */ + to_talitos_ptr(ckey_ptr, ctx->dma_key + ctx->authkeylen, + ctx->enckeylen, is_sec1); + + /* + * cipher in + * map and adjust cipher len to aead request cryptlen. + * extent is bytes of HMAC postpended to ciphertext, + * typically 12 for ipsec + */ + if (is_ipsec_esp && (desc->hdr & DESC_HDR_MODE1_MDEU_CICV)) + elen =3D authsize; + + ret =3D talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4], + sg_count, areq->assoclen, tbl_off, elen, + false, 1); + + if (ret > 1) { + tbl_off +=3D ret; + sync_needed =3D true; + } + + /* cipher out */ + if (areq->src !=3D areq->dst) { + sg_count =3D edesc->dst_nents ? : 1; + if (!is_sec1 || sg_count =3D=3D 1) + dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE); + } + + if (is_ipsec_esp && encrypt) + elen =3D authsize; + else + elen =3D 0; + ret =3D talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5], + sg_count, areq->assoclen, tbl_off, elen, + is_ipsec_esp && !encrypt, 1); + tbl_off +=3D ret; + + if (!encrypt && is_ipsec_esp) { + struct talitos_ptr *tbl_ptr =3D &edesc->link_tbl[tbl_off]; + + /* Add an entry to the link table for ICV data */ + to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1); + to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET, is_sec1); + + /* icv data follows link tables */ + to_talitos_ptr(tbl_ptr, dma_icv, authsize, is_sec1); + to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1); + sync_needed =3D true; + } else if (!encrypt) { + to_talitos_ptr(&desc->ptr[6], dma_icv, authsize, is_sec1); + sync_needed =3D true; + } else if (!is_ipsec_esp) { + talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6], + sg_count, areq->assoclen + cryptlen, tbl_off); + } + + /* iv out */ + if (is_ipsec_esp) + map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv, + DMA_FROM_DEVICE); + + if (sync_needed) + dma_sync_single_for_device(dev, edesc->dma_link_tbl, + edesc->dma_len, + DMA_BIDIRECTIONAL); + + ret =3D talitos_submit(dev, ctx->ch, desc, callback, areq); + if (ret !=3D -EINPROGRESS) { + ipsec_esp_unmap(dev, edesc, areq, encrypt); + kfree(edesc); + } + return ret; +} + +static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u= 8 *iv, + int icv_stashing, bool encrypt) +{ + struct crypto_aead *authenc =3D crypto_aead_reqtfm(areq); + unsigned int authsize =3D crypto_aead_authsize(authenc); + struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); + unsigned int ivsize =3D crypto_aead_ivsize(authenc); + unsigned int cryptlen =3D areq->cryptlen - (encrypt ? 0 : authsize); + + return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst, + iv, areq->assoclen, cryptlen, + authsize, ivsize, icv_stashing, + areq->base.flags, encrypt); +} + +static int aead_encrypt(struct aead_request *req) +{ + struct crypto_aead *authenc =3D crypto_aead_reqtfm(req); + struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); + struct talitos_edesc *edesc; + + /* allocate extended descriptor */ + edesc =3D aead_edesc_alloc(req, req->iv, 0, true); + if (IS_ERR(edesc)) + return PTR_ERR(edesc); + + /* set encrypt */ + edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT; + + return ipsec_esp(edesc, req, true, ipsec_esp_encrypt_done); +} + +static int aead_decrypt(struct aead_request *req) +{ + struct crypto_aead *authenc =3D crypto_aead_reqtfm(req); + unsigned int authsize =3D crypto_aead_authsize(authenc); + struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); + struct talitos_private *priv =3D dev_get_drvdata(ctx->dev); + struct talitos_edesc *edesc; + void *icvdata; + + /* allocate extended descriptor */ + edesc =3D aead_edesc_alloc(req, req->iv, 1, false); + if (IS_ERR(edesc)) + return PTR_ERR(edesc); + + if ((edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP) && + (priv->features & TALITOS_FTR_HW_AUTH_CHECK) && + ((!edesc->src_nents && !edesc->dst_nents) || + priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) { + + /* decrypt and check the ICV */ + edesc->desc.hdr =3D ctx->desc_hdr_template | + DESC_HDR_DIR_INBOUND | + DESC_HDR_MODE1_MDEU_CICV; + + /* reset integrity check result bits */ + + return ipsec_esp(edesc, req, false, + ipsec_esp_decrypt_hwauth_done); + } + + /* Have to check the ICV with software */ + edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; + + /* stash incoming ICV for later cmp with ICV generated by the h/w */ + icvdata =3D edesc->buf + edesc->dma_len; + + sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize, + req->assoclen + req->cryptlen - authsize); + + return ipsec_esp(edesc, req, false, ipsec_esp_decrypt_swauth_done); +} + +static int talitos_cra_init_aead(struct crypto_aead *tfm) +{ + struct aead_alg *alg =3D crypto_aead_alg(tfm); + struct talitos_crypto_alg *talitos_alg; + struct talitos_ctx *ctx =3D crypto_aead_ctx(tfm); + + talitos_alg =3D container_of(alg, struct talitos_crypto_alg, + algt.alg.aead); + + return talitos_init_common(ctx, talitos_alg); +} + +static struct talitos_alg_template aead_driver_algs[] =3D { + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha1),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-sha1-" + "cbc-aes-talitos", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D SHA1_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA1_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha1),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-sha1-" + "cbc-aes-talitos-hsna", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D SHA1_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA1_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha1)," + "cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-sha1-" + "cbc-3des-talitos", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D SHA1_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA1_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha1)," + "cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-sha1-" + "cbc-3des-talitos-hsna", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D SHA1_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA1_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha224),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-sha224-" + "cbc-aes-talitos", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D SHA224_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA224_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha224),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-sha224-" + "cbc-aes-talitos-hsna", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D SHA224_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA224_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha224)," + "cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-sha224-" + "cbc-3des-talitos", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D SHA224_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA224_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha224)," + "cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-sha224-" + "cbc-3des-talitos-hsna", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D SHA224_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA224_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha256),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-sha256-" + "cbc-aes-talitos", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D SHA256_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA256_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha256),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-sha256-" + "cbc-aes-talitos-hsna", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D SHA256_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA256_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha256)," + "cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-sha256-" + "cbc-3des-talitos", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D SHA256_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA256_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha256)," + "cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-sha256-" + "cbc-3des-talitos-hsna", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D SHA256_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA256_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha384),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-sha384-" + "cbc-aes-talitos", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D SHA384_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUB | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEUB_SHA384_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha384)," + "cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-sha384-" + "cbc-3des-talitos", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D SHA384_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUB | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEUB_SHA384_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha512),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-sha512-" + "cbc-aes-talitos", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D SHA512_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUB | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEUB_SHA512_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(sha512)," + "cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-sha512-" + "cbc-3des-talitos", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D SHA512_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUB | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEUB_SHA512_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(md5),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-md5-" + "cbc-aes-talitos", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D MD5_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_MD5_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(md5),cbc(aes))", + .cra_driver_name =3D "authenc-hmac-md5-" + "cbc-aes-talitos-hsna", + .cra_blocksize =3D AES_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D AES_BLOCK_SIZE, + .maxauthsize =3D MD5_DIGEST_SIZE, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_MD5_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(md5),cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-md5-" + "cbc-3des-talitos", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D MD5_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_MD5_HMAC, + }, + { .type =3D CRYPTO_ALG_TYPE_AEAD, + .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .alg.aead =3D { + .base =3D { + .cra_name =3D "authenc(hmac(md5),cbc(des3_ede))", + .cra_driver_name =3D "authenc-hmac-md5-" + "cbc-3des-talitos-hsna", + .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, + .cra_flags =3D CRYPTO_ALG_ASYNC | + CRYPTO_ALG_ALLOCATES_MEMORY, + }, + .ivsize =3D DES3_EDE_BLOCK_SIZE, + .maxauthsize =3D MD5_DIGEST_SIZE, + .setkey =3D aead_des3_setkey, + }, + .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_MD5_HMAC, + }, +}; + +int talitos_register_aead(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + struct aead_alg *aead_alg; + struct crypto_alg *alg; + size_t i; + int ret; + + for (i =3D 0; i < ARRAY_SIZE(aead_driver_algs); i++) { + if (!talitos_hw_supports(dev, + aead_driver_algs[i].desc_hdr_template)) + continue; + + aead_alg =3D &aead_driver_algs[i].alg.aead; + alg =3D &aead_alg->base; + + alg->cra_exit =3D talitos_cra_exit; + aead_alg->init =3D talitos_cra_init_aead; + aead_alg->setkey =3D aead_alg->setkey ?: aead_setkey; + aead_alg->encrypt =3D aead_encrypt; + aead_alg->decrypt =3D aead_decrypt; + if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) && + !strncmp(alg->cra_name, "authenc(hmac(sha224)", 20)) { + continue; + } + + ret =3D talitos_register_common(dev, &aead_driver_algs[i]); + if (ret) + return ret; + } + + return 0; +} diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index cd37bc379f86..41d7d0e570e3 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -820,87 +820,6 @@ DEF_TALITOS2_INTERRUPT(ch0_2, TALITOS2_ISR_CH_0_2_DONE= , TALITOS2_ISR_CH_0_2_ERR, DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE, TALITOS2_ISR_CH_1_= 3_ERR, 1) =20 - -/* - * crypto alg - */ -#define TALITOS_CRA_PRIORITY 3000 -/* - * Defines a priority for doing AEAD with descriptors type - * HMAC_SNOOP_NO_AFEA (HSNA) instead of type IPSEC_ESP - */ -#define TALITOS_CRA_PRIORITY_AEAD_HSNA (TALITOS_CRA_PRIORITY - 1) - -static int aead_setkey(struct crypto_aead *authenc, - const u8 *key, unsigned int keylen) -{ - struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); - struct device *dev =3D ctx->dev; - struct crypto_authenc_keys keys; - - if (crypto_authenc_extractkeys(&keys, key, keylen) !=3D 0) - goto badkey; - - if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE) - goto badkey; - - if (ctx->keylen) - dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); - - memcpy(ctx->key, keys.authkey, keys.authkeylen); - memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen); - - ctx->keylen =3D keys.authkeylen + keys.enckeylen; - ctx->enckeylen =3D keys.enckeylen; - ctx->authkeylen =3D keys.authkeylen; - ctx->dma_key =3D dma_map_single(dev, ctx->key, ctx->keylen, - DMA_TO_DEVICE); - - memzero_explicit(&keys, sizeof(keys)); - return 0; - -badkey: - memzero_explicit(&keys, sizeof(keys)); - return -EINVAL; -} - -static int aead_des3_setkey(struct crypto_aead *authenc, - const u8 *key, unsigned int keylen) -{ - struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); - struct device *dev =3D ctx->dev; - struct crypto_authenc_keys keys; - int err; - - err =3D crypto_authenc_extractkeys(&keys, key, keylen); - if (unlikely(err)) - goto out; - - err =3D -EINVAL; - if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE) - goto out; - - err =3D verify_aead_des3_key(authenc, keys.enckey, keys.enckeylen); - if (err) - goto out; - - if (ctx->keylen) - dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE); - - memcpy(ctx->key, keys.authkey, keys.authkeylen); - memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen); - - ctx->keylen =3D keys.authkeylen + keys.enckeylen; - ctx->enckeylen =3D keys.enckeylen; - ctx->authkeylen =3D keys.authkeylen; - ctx->dma_key =3D dma_map_single(dev, ctx->key, ctx->keylen, - DMA_TO_DEVICE); - -out: - memzero_explicit(&keys, sizeof(keys)); - return err; -} - void talitos_sg_unmap(struct device *dev, struct talitos_edesc *edesc, struct scatterlist *src, @@ -929,109 +848,6 @@ void talitos_sg_unmap(struct device *dev, } } =20 -static void ipsec_esp_unmap(struct device *dev, - struct talitos_edesc *edesc, - struct aead_request *areq, bool encrypt) -{ - struct crypto_aead *aead =3D crypto_aead_reqtfm(areq); - struct talitos_ctx *ctx =3D crypto_aead_ctx(aead); - unsigned int ivsize =3D crypto_aead_ivsize(aead); - unsigned int authsize =3D crypto_aead_authsize(aead); - unsigned int cryptlen =3D areq->cryptlen - (encrypt ? 0 : authsize); - bool is_ipsec_esp =3D edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP; - struct talitos_ptr *civ_ptr =3D &edesc->desc.ptr[is_ipsec_esp ? 2 : 3]; - - if (is_ipsec_esp) - unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6], - DMA_FROM_DEVICE); - unmap_single_talitos_ptr(dev, civ_ptr, DMA_TO_DEVICE); - - talitos_sg_unmap(dev, edesc, areq->src, areq->dst, - cryptlen + authsize, areq->assoclen); - - if (edesc->dma_len) - dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, - DMA_BIDIRECTIONAL); - - if (!is_ipsec_esp) { - unsigned int dst_nents =3D edesc->dst_nents ? : 1; - - sg_pcopy_to_buffer(areq->dst, dst_nents, ctx->iv, ivsize, - areq->assoclen + cryptlen - ivsize); - } -} - -/* - * ipsec_esp descriptor callbacks - */ -static void ipsec_esp_encrypt_done(struct device *dev, - struct talitos_desc *desc, void *context, - int err) -{ - struct aead_request *areq =3D context; - struct crypto_aead *authenc =3D crypto_aead_reqtfm(areq); - unsigned int ivsize =3D crypto_aead_ivsize(authenc); - struct talitos_edesc *edesc; - - edesc =3D container_of(desc, struct talitos_edesc, desc); - - ipsec_esp_unmap(dev, edesc, areq, true); - - dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE); - - kfree(edesc); - - aead_request_complete(areq, err); -} - -static void ipsec_esp_decrypt_swauth_done(struct device *dev, - struct talitos_desc *desc, - void *context, int err) -{ - struct aead_request *req =3D context; - struct crypto_aead *authenc =3D crypto_aead_reqtfm(req); - unsigned int authsize =3D crypto_aead_authsize(authenc); - struct talitos_edesc *edesc; - char *oicv, *icv; - - edesc =3D container_of(desc, struct talitos_edesc, desc); - - ipsec_esp_unmap(dev, edesc, req, false); - - if (!err) { - /* auth check */ - oicv =3D edesc->buf + edesc->dma_len; - icv =3D oicv - authsize; - - err =3D crypto_memneq(oicv, icv, authsize) ? -EBADMSG : 0; - } - - kfree(edesc); - - aead_request_complete(req, err); -} - -static void ipsec_esp_decrypt_hwauth_done(struct device *dev, - struct talitos_desc *desc, - void *context, int err) -{ - struct aead_request *req =3D context; - struct talitos_edesc *edesc; - - edesc =3D container_of(desc, struct talitos_edesc, desc); - - ipsec_esp_unmap(dev, edesc, req, false); - - /* check ICV auth status */ - if (!err && ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) !=3D - DESC_HDR_LO_ICCR1_PASS)) - err =3D -EBADMSG; - - kfree(edesc); - - aead_request_complete(req, err); -} - /* * convert scatterlist to SEC h/w link table format * stop at cryptlen bytes @@ -1132,132 +948,6 @@ int talitos_sg_map(struct device *dev, struct scatte= rlist *src, tbl_off, 0, false, 1); } =20 -/* - * fill in and submit ipsec_esp descriptor - */ -static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *are= q, - bool encrypt, - void (*callback)(struct device *dev, - struct talitos_desc *desc, - void *context, int error)) -{ - struct crypto_aead *aead =3D crypto_aead_reqtfm(areq); - unsigned int authsize =3D crypto_aead_authsize(aead); - struct talitos_ctx *ctx =3D crypto_aead_ctx(aead); - struct device *dev =3D ctx->dev; - struct talitos_desc *desc =3D &edesc->desc; - unsigned int cryptlen =3D areq->cryptlen - (encrypt ? 0 : authsize); - unsigned int ivsize =3D crypto_aead_ivsize(aead); - int tbl_off =3D 0; - int sg_count, ret; - int elen =3D 0; - bool sync_needed =3D false; - struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); - bool is_ipsec_esp =3D desc->hdr & DESC_HDR_TYPE_IPSEC_ESP; - struct talitos_ptr *civ_ptr =3D &desc->ptr[is_ipsec_esp ? 2 : 3]; - struct talitos_ptr *ckey_ptr =3D &desc->ptr[is_ipsec_esp ? 3 : 2]; - dma_addr_t dma_icv =3D edesc->dma_link_tbl + edesc->dma_len - authsize; - - /* hmac key */ - to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1); - - sg_count =3D edesc->src_nents ?: 1; - if (is_sec1 && sg_count > 1) - sg_copy_to_buffer(areq->src, sg_count, edesc->buf, - areq->assoclen + cryptlen); - else - sg_count =3D dma_map_sg(dev, areq->src, sg_count, - (areq->src =3D=3D areq->dst) ? - DMA_BIDIRECTIONAL : DMA_TO_DEVICE); - - /* hmac data */ - ret =3D talitos_sg_map(dev, areq->src, areq->assoclen, edesc, - &desc->ptr[1], sg_count, 0, tbl_off); - - if (ret > 1) { - tbl_off +=3D ret; - sync_needed =3D true; - } - - /* cipher iv */ - to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize, is_sec1); - - /* cipher key */ - to_talitos_ptr(ckey_ptr, ctx->dma_key + ctx->authkeylen, - ctx->enckeylen, is_sec1); - - /* - * cipher in - * map and adjust cipher len to aead request cryptlen. - * extent is bytes of HMAC postpended to ciphertext, - * typically 12 for ipsec - */ - if (is_ipsec_esp && (desc->hdr & DESC_HDR_MODE1_MDEU_CICV)) - elen =3D authsize; - - ret =3D talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4], - sg_count, areq->assoclen, tbl_off, elen, - false, 1); - - if (ret > 1) { - tbl_off +=3D ret; - sync_needed =3D true; - } - - /* cipher out */ - if (areq->src !=3D areq->dst) { - sg_count =3D edesc->dst_nents ? : 1; - if (!is_sec1 || sg_count =3D=3D 1) - dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE); - } - - if (is_ipsec_esp && encrypt) - elen =3D authsize; - else - elen =3D 0; - ret =3D talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5], - sg_count, areq->assoclen, tbl_off, elen, - is_ipsec_esp && !encrypt, 1); - tbl_off +=3D ret; - - if (!encrypt && is_ipsec_esp) { - struct talitos_ptr *tbl_ptr =3D &edesc->link_tbl[tbl_off]; - - /* Add an entry to the link table for ICV data */ - to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1); - to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET, is_sec1); - - /* icv data follows link tables */ - to_talitos_ptr(tbl_ptr, dma_icv, authsize, is_sec1); - to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1); - sync_needed =3D true; - } else if (!encrypt) { - to_talitos_ptr(&desc->ptr[6], dma_icv, authsize, is_sec1); - sync_needed =3D true; - } else if (!is_ipsec_esp) { - talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6], - sg_count, areq->assoclen + cryptlen, tbl_off); - } - - /* iv out */ - if (is_ipsec_esp) - map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv, - DMA_FROM_DEVICE); - - if (sync_needed) - dma_sync_single_for_device(dev, edesc->dma_link_tbl, - edesc->dma_len, - DMA_BIDIRECTIONAL); - - ret =3D talitos_submit(dev, ctx->ch, desc, callback, areq); - if (ret !=3D -EINPROGRESS) { - ipsec_esp_unmap(dev, edesc, areq, encrypt); - kfree(edesc); - } - return ret; -} - /* * allocate and map the extended descriptor */ @@ -1356,540 +1046,6 @@ struct talitos_edesc *talitos_edesc_alloc(struct de= vice *dev, return edesc; } =20 -static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u= 8 *iv, - int icv_stashing, bool encrypt) -{ - struct crypto_aead *authenc =3D crypto_aead_reqtfm(areq); - unsigned int authsize =3D crypto_aead_authsize(authenc); - struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); - unsigned int ivsize =3D crypto_aead_ivsize(authenc); - unsigned int cryptlen =3D areq->cryptlen - (encrypt ? 0 : authsize); - - return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst, - iv, areq->assoclen, cryptlen, - authsize, ivsize, icv_stashing, - areq->base.flags, encrypt); -} - -static int aead_encrypt(struct aead_request *req) -{ - struct crypto_aead *authenc =3D crypto_aead_reqtfm(req); - struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); - struct talitos_edesc *edesc; - - /* allocate extended descriptor */ - edesc =3D aead_edesc_alloc(req, req->iv, 0, true); - if (IS_ERR(edesc)) - return PTR_ERR(edesc); - - /* set encrypt */ - edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT; - - return ipsec_esp(edesc, req, true, ipsec_esp_encrypt_done); -} - -static int aead_decrypt(struct aead_request *req) -{ - struct crypto_aead *authenc =3D crypto_aead_reqtfm(req); - unsigned int authsize =3D crypto_aead_authsize(authenc); - struct talitos_ctx *ctx =3D crypto_aead_ctx(authenc); - struct talitos_private *priv =3D dev_get_drvdata(ctx->dev); - struct talitos_edesc *edesc; - void *icvdata; - - /* allocate extended descriptor */ - edesc =3D aead_edesc_alloc(req, req->iv, 1, false); - if (IS_ERR(edesc)) - return PTR_ERR(edesc); - - if ((edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP) && - (priv->features & TALITOS_FTR_HW_AUTH_CHECK) && - ((!edesc->src_nents && !edesc->dst_nents) || - priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) { - - /* decrypt and check the ICV */ - edesc->desc.hdr =3D ctx->desc_hdr_template | - DESC_HDR_DIR_INBOUND | - DESC_HDR_MODE1_MDEU_CICV; - - /* reset integrity check result bits */ - - return ipsec_esp(edesc, req, false, - ipsec_esp_decrypt_hwauth_done); - } - - /* Have to check the ICV with software */ - edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; - - /* stash incoming ICV for later cmp with ICV generated by the h/w */ - icvdata =3D edesc->buf + edesc->dma_len; - - sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize, - req->assoclen + req->cryptlen - authsize); - - return ipsec_esp(edesc, req, false, ipsec_esp_decrypt_swauth_done); -} - -static struct talitos_alg_template driver_algs[] =3D { - /* AEAD algorithms. These use a single-pass ipsec_esp descriptor */ - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha1),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha1-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA1_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA1_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha1),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha1-" - "cbc-aes-talitos-hsna", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA1_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA1_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha1)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha1-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA1_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA1_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha1)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha1-" - "cbc-3des-talitos-hsna", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA1_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA1_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha224),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha224-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA224_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA224_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha224),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha224-" - "cbc-aes-talitos-hsna", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA224_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA224_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha224)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha224-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA224_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA224_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha224)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha224-" - "cbc-3des-talitos-hsna", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA224_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA224_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha256),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha256-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA256_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA256_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha256),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha256-" - "cbc-aes-talitos-hsna", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA256_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA256_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha256)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha256-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA256_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA256_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha256)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha256-" - "cbc-3des-talitos-hsna", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA256_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA256_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha384),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha384-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA384_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUB | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEUB_SHA384_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha384)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha384-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA384_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUB | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEUB_SHA384_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha512),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha512-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA512_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUB | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEUB_SHA512_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha512)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha512-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA512_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUB | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEUB_SHA512_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(md5),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-md5-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D MD5_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_MD5_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(md5),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-md5-" - "cbc-aes-talitos-hsna", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D MD5_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_MD5_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(md5),cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-md5-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D MD5_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_MD5_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(md5),cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-md5-" - "cbc-3des-talitos-hsna", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D MD5_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_MD5_HMAC, - }, -}; - int talitos_init_common(struct talitos_ctx *ctx, struct talitos_crypto_alg *talitos_alg) { @@ -1912,18 +1068,6 @@ int talitos_init_common(struct talitos_ctx *ctx, return 0; } =20 -static int talitos_cra_init_aead(struct crypto_aead *tfm) -{ - struct aead_alg *alg =3D crypto_aead_alg(tfm); - struct talitos_crypto_alg *talitos_alg; - struct talitos_ctx *ctx =3D crypto_aead_ctx(tfm); - - talitos_alg =3D container_of(alg, struct talitos_crypto_alg, - algt.alg.aead); - - return talitos_init_common(ctx, talitos_alg); -} - void talitos_cra_exit(struct crypto_tfm *tfm) { struct talitos_ctx *ctx =3D crypto_tfm_ctx(tfm); @@ -2034,6 +1178,12 @@ int talitos_register_common(struct device *dev, t_alg->algt.type); ret =3D crypto_register_skcipher(&t_alg->algt.alg.skcipher); break; + case CRYPTO_ALG_TYPE_AEAD: + alg =3D &t_alg->algt.alg.aead.base; + talitos_alg_set_common(priv, alg, t_alg->algt.priority, + t_alg->algt.type); + ret =3D crypto_register_aead(&t_alg->algt.alg.aead); + break; default: dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type); devm_kfree(dev, t_alg); @@ -2054,59 +1204,6 @@ int talitos_register_common(struct device *dev, return 0; } =20 -static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, - struct talitos_alg_template - *template) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - struct talitos_crypto_alg *t_alg; - struct crypto_alg *alg; - - t_alg =3D devm_kzalloc(dev, sizeof(struct talitos_crypto_alg), - GFP_KERNEL); - if (!t_alg) - return ERR_PTR(-ENOMEM); - - t_alg->algt =3D *template; - - switch (t_alg->algt.type) { - case CRYPTO_ALG_TYPE_AEAD: - alg =3D &t_alg->algt.alg.aead.base; - alg->cra_exit =3D talitos_cra_exit; - t_alg->algt.alg.aead.init =3D talitos_cra_init_aead; - t_alg->algt.alg.aead.setkey =3D t_alg->algt.alg.aead.setkey ?: - aead_setkey; - t_alg->algt.alg.aead.encrypt =3D aead_encrypt; - t_alg->algt.alg.aead.decrypt =3D aead_decrypt; - if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) && - !strncmp(alg->cra_name, "authenc(hmac(sha224)", 20)) { - devm_kfree(dev, t_alg); - return ERR_PTR(-ENOTSUPP); - } - break; - default: - dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type); - devm_kfree(dev, t_alg); - return ERR_PTR(-EINVAL); - } - - alg->cra_module =3D THIS_MODULE; - if (t_alg->algt.priority) - alg->cra_priority =3D t_alg->algt.priority; - else - alg->cra_priority =3D TALITOS_CRA_PRIORITY; - if (has_ftr_sec1(priv) && t_alg->algt.type !=3D CRYPTO_ALG_TYPE_AHASH) - alg->cra_alignmask =3D 3; - else - alg->cra_alignmask =3D 0; - alg->cra_ctxsize =3D sizeof(struct talitos_ctx); - alg->cra_flags |=3D CRYPTO_ALG_KERN_DRIVER_ONLY; - - t_alg->dev =3D dev; - - return t_alg; -} - static int talitos_probe_irq(struct platform_device *ofdev) { struct device *dev =3D &ofdev->dev; @@ -2320,36 +1417,10 @@ static int talitos_probe(struct platform_device *of= dev) if (err) goto err_out; =20 - /* register crypto algorithms the device supports */ - for (i =3D 0; i < ARRAY_SIZE(driver_algs); i++) { - if (talitos_hw_supports(dev, - driver_algs[i].desc_hdr_template)) { - struct talitos_crypto_alg *t_alg; - struct crypto_alg *alg =3D NULL; - - t_alg =3D talitos_alg_alloc(dev, &driver_algs[i]); - if (IS_ERR(t_alg)) { - err =3D PTR_ERR(t_alg); - if (err =3D=3D -ENOTSUPP) - continue; - goto err_out; - } + err =3D talitos_register_aead(dev); + if (err) + goto err_out; =20 - switch (t_alg->algt.type) { - case CRYPTO_ALG_TYPE_AEAD: - err =3D crypto_register_aead( - &t_alg->algt.alg.aead); - alg =3D &t_alg->algt.alg.aead.base; - break; - } - if (err) { - dev_err(dev, "%s alg registration failed\n", - alg->cra_driver_name); - devm_kfree(dev, t_alg); - } else - list_add_tail(&t_alg->entry, &priv->alg_list); - } - } if (!list_empty(&priv->alg_list)) dev_info(dev, "%s algorithms registered in /proc/crypto\n", (char *)of_get_property(np, "compatible", NULL)); diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 7e7d41673fa5..438be8c8f08d 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -21,6 +21,8 @@ #define TALITOS1_MAX_DATA_LEN 32768 #define TALITOS2_MAX_DATA_LEN 65535 =20 +#define TALITOS_CRA_PRIORITY 3000 + #define DESC_TYPE(desc_hdr) ((be32_to_cpu(desc_hdr) >> 3) & 0x1f) #define PRIMARY_EU(desc_hdr) ((be32_to_cpu(desc_hdr) >> 28) & 0xf) #define SECONDARY_EU(desc_hdr) ((be32_to_cpu(desc_hdr) >> 16) & 0xf) @@ -535,3 +537,4 @@ void talitos_unregister_rng(struct device *dev); =20 int talitos_register_hash(struct device *dev); int talitos_register_skcipher(struct device *dev); +int talitos_register_aead(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 886633AA4E0; Thu, 28 May 2026 09:09:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959378; cv=none; b=rDHDwNtZJcZz8eGcjQtRDKqjlg079nSdYhM/LJ8DgqGgD3GTZgJWelEHQxWGEd7yQ1xbvB0Sp+ONSidw/NWgmorPtzJXyLyTD1tieR53V6Nif3I5LiniTCH7HTicguVj7W5KtXw2FKMLtlAN55zxhyrF403kBFK8LzQirwhXDzE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959378; c=relaxed/simple; bh=23qauHN6MqNQaOfYdnWzJ9I7zLJbxiyOIHAcimo8oAY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QpeVp6ehtXcze0wQkyua6PPNDRTkim/qLpSBUoaoZaizea0kqKErood9tUArEzCiM2LotY1PXAC15bi6IZ6W+sTu78UlLajk/xEJNykm3Pn8Ybc5+/9QuG+xoG/ZGzZWxQmlYdLcpf2h9Hw88wEyjNUG1ewxGAZszmMllKkAG5g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=cGBNGq7f; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="cGBNGq7f" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 9CC82C62445; Thu, 28 May 2026 09:09:32 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7368960495; Thu, 28 May 2026 09:09:32 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E665610888CAB; Thu, 28 May 2026 11:09:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959371; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=233BQJqCuUoeXW8rbfAPDCIwm0S+paFXSEusAbBZBKs=; b=cGBNGq7fDj6oIVxuDieh2p799Uc9cYhLLsWL2DH5YXqOHlR+kPrx9SLPEykEQKxqF2UHlj mj2gTkmWTi5mI0rVGCX+jcqEaU+9T84npAZGJJFwVbfN2liugwir4p39lncQSHMpmzCZ4T vohT5UVpFu6uc9Fq34xu0KXU/dG86RrEgDp8XFS9toivBU6xLr738wkPCqk3K2PEKxKgkn xUxSKDCrNUptxAs97rypAL1xtrByTwOn7+64h0RT4hnybTkDabMX4nJNeEhNlDpQ7Vjpd0 DfdfJhtkafArrUBuv5v6Am2Fdovvvn/7E854jx5c5oItgbPMz5ZEK/uIyZyA3g== From: Paul Louvel Date: Thu, 28 May 2026 11:08:23 +0200 Subject: [PATCH 10/29] crypto: talitos - Remove alg settings in talitos_register_common() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-10-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=28223; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=23qauHN6MqNQaOfYdnWzJ9I7zLJbxiyOIHAcimo8oAY=; b=TGKLzRUJZzDGwawxuxV+1RFsyDQLRh2jl8PkrR029QWq2Xjgxs1xmd3h2aTdvmvZzhUmYHtZL gUOYT0oKg3vDjEGBWfhMuZ9sQ1TzLUJoIa9hd9TZOvlFUyctZsjQYR0 X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Algorithm properties should be set at definition time. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos-aead.c | 131 +++++++++++++++++++++++---= ---- drivers/crypto/talitos/talitos-hash.c | 72 +++++++++++++--- drivers/crypto/talitos/talitos-skcipher.c | 51 ++++++++++-- drivers/crypto/talitos/talitos.c | 23 ------ 4 files changed, 206 insertions(+), 71 deletions(-) diff --git a/drivers/crypto/talitos/talitos-aead.c b/drivers/crypto/talitos= /talitos-aead.c index ce6bd6133fd0..c09ed08be2ef 100644 --- a/drivers/crypto/talitos/talitos-aead.c +++ b/drivers/crypto/talitos/talitos-aead.c @@ -409,7 +409,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D SHA1_DIGEST_SIZE, @@ -423,7 +427,6 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_SHA1_HMAC, }, { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, .alg.aead =3D { .base =3D { .cra_name =3D "authenc(hmac(sha1),cbc(aes))", @@ -431,7 +434,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos-hsna", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D SHA1_DIGEST_SIZE, @@ -453,7 +460,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D SHA1_DIGEST_SIZE, @@ -469,7 +480,6 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_SHA1_HMAC, }, { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, .alg.aead =3D { .base =3D { .cra_name =3D "authenc(hmac(sha1)," @@ -478,7 +488,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos-hsna", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D SHA1_DIGEST_SIZE, @@ -501,7 +515,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D SHA224_DIGEST_SIZE, @@ -515,7 +533,6 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_SHA224_HMAC, }, { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, .alg.aead =3D { .base =3D { .cra_name =3D "authenc(hmac(sha224),cbc(aes))", @@ -523,7 +540,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos-hsna", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D SHA224_DIGEST_SIZE, @@ -545,7 +566,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D SHA224_DIGEST_SIZE, @@ -561,7 +586,6 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_SHA224_HMAC, }, { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, .alg.aead =3D { .base =3D { .cra_name =3D "authenc(hmac(sha224)," @@ -570,7 +594,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos-hsna", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D SHA224_DIGEST_SIZE, @@ -593,7 +621,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D SHA256_DIGEST_SIZE, @@ -607,7 +639,6 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_SHA256_HMAC, }, { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, .alg.aead =3D { .base =3D { .cra_name =3D "authenc(hmac(sha256),cbc(aes))", @@ -615,7 +646,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos-hsna", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D SHA256_DIGEST_SIZE, @@ -637,7 +672,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D SHA256_DIGEST_SIZE, @@ -653,7 +692,6 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_SHA256_HMAC, }, { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, .alg.aead =3D { .base =3D { .cra_name =3D "authenc(hmac(sha256)," @@ -662,7 +700,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos-hsna", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D SHA256_DIGEST_SIZE, @@ -685,7 +727,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D SHA384_DIGEST_SIZE, @@ -707,7 +753,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D SHA384_DIGEST_SIZE, @@ -730,7 +780,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D SHA512_DIGEST_SIZE, @@ -752,7 +806,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D SHA512_DIGEST_SIZE, @@ -775,7 +833,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D MD5_DIGEST_SIZE, @@ -789,7 +851,6 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_MD5_HMAC, }, { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, .alg.aead =3D { .base =3D { .cra_name =3D "authenc(hmac(md5),cbc(aes))", @@ -797,7 +858,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-aes-talitos-hsna", .cra_blocksize =3D AES_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D AES_BLOCK_SIZE, .maxauthsize =3D MD5_DIGEST_SIZE, @@ -818,7 +883,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D MD5_DIGEST_SIZE, @@ -834,7 +903,6 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { DESC_HDR_MODE1_MDEU_MD5_HMAC, }, { .type =3D CRYPTO_ALG_TYPE_AEAD, - .priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, .alg.aead =3D { .base =3D { .cra_name =3D "authenc(hmac(md5),cbc(des3_ede))", @@ -842,7 +910,11 @@ static struct talitos_alg_template aead_driver_algs[] = =3D { "cbc-3des-talitos-hsna", .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, }, .ivsize =3D DES3_EDE_BLOCK_SIZE, .maxauthsize =3D MD5_DIGEST_SIZE, @@ -875,6 +947,9 @@ int talitos_register_aead(struct device *dev) aead_alg =3D &aead_driver_algs[i].alg.aead; alg =3D &aead_alg->base; =20 + if (has_ftr_sec1(priv)) + alg->cra_alignmask =3D 3; + alg->cra_exit =3D talitos_cra_exit; aead_alg->init =3D talitos_cra_init_aead; aead_alg->setkey =3D aead_alg->setkey ?: aead_setkey; diff --git a/drivers/crypto/talitos/talitos-hash.c b/drivers/crypto/talitos= /talitos-hash.c index 5792e7093392..3793b6fd5b75 100644 --- a/drivers/crypto/talitos/talitos-hash.c +++ b/drivers/crypto/talitos/talitos-hash.c @@ -559,8 +559,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -578,8 +582,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -597,8 +605,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -616,8 +628,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -635,8 +651,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -654,8 +674,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -673,8 +697,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -692,8 +720,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -711,8 +743,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -730,8 +766,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -749,8 +789,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | @@ -768,8 +812,12 @@ static struct talitos_alg_template hash_driver_algs[] = =3D { .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), .cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | + CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_AHASH_ALG_BLOCK_ONLY | CRYPTO_AHASH_ALG_FINAL_NONZERO, + .cra_priority =3D TALITOS_CRA_PRIORITY, + .cra_ctxsize =3D sizeof(struct talitos_ctx), + .cra_module =3D THIS_MODULE, } }, .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | diff --git a/drivers/crypto/talitos/talitos-skcipher.c b/drivers/crypto/tal= itos/talitos-skcipher.c index 4f742930ec47..ff7b8f9344c4 100644 --- a/drivers/crypto/talitos/talitos-skcipher.c +++ b/drivers/crypto/talitos/talitos-skcipher.c @@ -239,7 +239,11 @@ static struct talitos_alg_template skcipher_driver_alg= s[] =3D { .base.cra_driver_name =3D "ecb-aes-talitos", .base.cra_blocksize =3D AES_BLOCK_SIZE, .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .base.cra_priority =3D TALITOS_CRA_PRIORITY, + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), + .base.cra_module =3D THIS_MODULE, .min_keysize =3D AES_MIN_KEY_SIZE, .max_keysize =3D AES_MAX_KEY_SIZE, .setkey =3D skcipher_aes_setkey, @@ -253,7 +257,11 @@ static struct talitos_alg_template skcipher_driver_alg= s[] =3D { .base.cra_driver_name =3D "cbc-aes-talitos", .base.cra_blocksize =3D AES_BLOCK_SIZE, .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .base.cra_priority =3D TALITOS_CRA_PRIORITY, + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), + .base.cra_module =3D THIS_MODULE, .min_keysize =3D AES_MIN_KEY_SIZE, .max_keysize =3D AES_MAX_KEY_SIZE, .ivsize =3D AES_BLOCK_SIZE, @@ -269,7 +277,11 @@ static struct talitos_alg_template skcipher_driver_alg= s[] =3D { .base.cra_driver_name =3D "ctr-aes-talitos", .base.cra_blocksize =3D 1, .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .base.cra_priority =3D TALITOS_CRA_PRIORITY, + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), + .base.cra_module =3D THIS_MODULE, .min_keysize =3D AES_MIN_KEY_SIZE, .max_keysize =3D AES_MAX_KEY_SIZE, .ivsize =3D AES_BLOCK_SIZE, @@ -285,7 +297,11 @@ static struct talitos_alg_template skcipher_driver_alg= s[] =3D { .base.cra_driver_name =3D "ctr-aes-talitos", .base.cra_blocksize =3D 1, .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .base.cra_priority =3D TALITOS_CRA_PRIORITY, + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), + .base.cra_module =3D THIS_MODULE, .min_keysize =3D AES_MIN_KEY_SIZE, .max_keysize =3D AES_MAX_KEY_SIZE, .ivsize =3D AES_BLOCK_SIZE, @@ -301,7 +317,11 @@ static struct talitos_alg_template skcipher_driver_alg= s[] =3D { .base.cra_driver_name =3D "ecb-des-talitos", .base.cra_blocksize =3D DES_BLOCK_SIZE, .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .base.cra_priority =3D TALITOS_CRA_PRIORITY, + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), + .base.cra_module =3D THIS_MODULE, .min_keysize =3D DES_KEY_SIZE, .max_keysize =3D DES_KEY_SIZE, .setkey =3D skcipher_des_setkey, @@ -315,7 +335,11 @@ static struct talitos_alg_template skcipher_driver_alg= s[] =3D { .base.cra_driver_name =3D "cbc-des-talitos", .base.cra_blocksize =3D DES_BLOCK_SIZE, .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .base.cra_priority =3D TALITOS_CRA_PRIORITY, + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), + .base.cra_module =3D THIS_MODULE, .min_keysize =3D DES_KEY_SIZE, .max_keysize =3D DES_KEY_SIZE, .ivsize =3D DES_BLOCK_SIZE, @@ -331,7 +355,11 @@ static struct talitos_alg_template skcipher_driver_alg= s[] =3D { .base.cra_driver_name =3D "ecb-3des-talitos", .base.cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .base.cra_priority =3D TALITOS_CRA_PRIORITY, + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), + .base.cra_module =3D THIS_MODULE, .min_keysize =3D DES3_EDE_KEY_SIZE, .max_keysize =3D DES3_EDE_KEY_SIZE, .setkey =3D skcipher_des3_setkey, @@ -346,7 +374,11 @@ static struct talitos_alg_template skcipher_driver_alg= s[] =3D { .base.cra_driver_name =3D "cbc-3des-talitos", .base.cra_blocksize =3D DES3_EDE_BLOCK_SIZE, .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY, + CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_KERN_DRIVER_ONLY, + .base.cra_priority =3D TALITOS_CRA_PRIORITY, + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), + .base.cra_module =3D THIS_MODULE, .min_keysize =3D DES3_EDE_KEY_SIZE, .max_keysize =3D DES3_EDE_KEY_SIZE, .ivsize =3D DES3_EDE_BLOCK_SIZE, @@ -375,6 +407,9 @@ int talitos_register_skcipher(struct device *dev) skcipher_alg =3D &skcipher_driver_algs[i].alg.skcipher; alg =3D &skcipher_alg->base; =20 + if (has_ftr_sec1(priv)) + alg->cra_alignmask =3D 3; + alg->cra_exit =3D talitos_cra_exit; skcipher_alg->init =3D talitos_cra_init_skcipher; skcipher_alg->setkey =3D skcipher_alg->setkey ?: skcipher_setkey; diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 41d7d0e570e3..f38a156a0459 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -1133,23 +1133,6 @@ static void talitos_remove(struct platform_device *o= fdev) tasklet_kill(&priv->done_task[1]); } =20 -static void talitos_alg_set_common(struct talitos_private *priv, - struct crypto_alg *alg, u32 custom_priority, - u32 type) -{ - alg->cra_module =3D THIS_MODULE; - if (custom_priority) - alg->cra_priority =3D custom_priority; - else - alg->cra_priority =3D TALITOS_CRA_PRIORITY; - if (has_ftr_sec1(priv) && type !=3D CRYPTO_ALG_TYPE_AHASH) - alg->cra_alignmask =3D 3; - else - alg->cra_alignmask =3D 0; - alg->cra_ctxsize =3D sizeof(struct talitos_ctx); - alg->cra_flags |=3D CRYPTO_ALG_KERN_DRIVER_ONLY; -} - int talitos_register_common(struct device *dev, struct talitos_alg_template *template) { @@ -1168,20 +1151,14 @@ int talitos_register_common(struct device *dev, switch (t_alg->algt.type) { case CRYPTO_ALG_TYPE_AHASH: alg =3D &t_alg->algt.alg.hash.halg.base; - talitos_alg_set_common(priv, alg, t_alg->algt.priority, - t_alg->algt.type); ret =3D crypto_register_ahash(&t_alg->algt.alg.hash); break; case CRYPTO_ALG_TYPE_SKCIPHER: alg =3D &t_alg->algt.alg.skcipher.base; - talitos_alg_set_common(priv, alg, t_alg->algt.priority, - t_alg->algt.type); ret =3D crypto_register_skcipher(&t_alg->algt.alg.skcipher); break; case CRYPTO_ALG_TYPE_AEAD: alg =3D &t_alg->algt.alg.aead.base; - talitos_alg_set_common(priv, alg, t_alg->algt.priority, - t_alg->algt.type); ret =3D crypto_register_aead(&t_alg->algt.alg.aead); break; default: --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 042B73AA517; Thu, 28 May 2026 09:09:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959378; cv=none; b=dX4slaqRX8BJbtS4LZFcshb9xPz/yeVPSCxfKwU5f7CFhxarmEIlwYsWq1ayZXmuc4u73uqOWtvGD82YTEBTfBobi1gdScsIM7JHTznIxud2XVyei+8J7HTec893FyeOtoSvV4qYh3GJ5H0pDmyF8FEUdDcLiGYQVfTQ1sWxx6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959378; c=relaxed/simple; bh=S/1dG4bsyIIViXbgS02bbpnmmLKSvCc4zmx0WqU1GLc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fRrArGV0TkWXtE0jIOM0Cud/yCXfoAfOtLdpTARwbfTeGq6+wBBTfezyo6+sqNLf5zE1C2bnfN/0z5tm9VGZ9fjFDmR40Oy671ZvwGmTgrRu/IZ3ENeN+1T7EX+ULLaWT5ZwzTA9947sbESk+y65Tk2fubHCKQ8OXQCNSe0VcK0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=wHP6nJ6s; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="wHP6nJ6s" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id C4E00C62447; Thu, 28 May 2026 09:09:33 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9E60C60495; Thu, 28 May 2026 09:09:33 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 52A8F10888C72; Thu, 28 May 2026 11:09:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959373; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=4FzTPaj1dYIgTp2U5poQ40jpJf1rVzQEeowpKSrLRks=; b=wHP6nJ6sbX55TI3aModQF1/yQkAXbbQrZKXkRxTfqvqUBxNytkw/fiWn/pRKlz9UFBQ692 deoZtW473/kWvIqow/P4Q/REZrJ0+BmV5Piam7zRydUfhWiQvcq8UXFc2Y53/0MHKOLyXR TN4OJ++zPVolzgZJ00bV4hd6jg0UyHlJ7K287FQAGwSp+28Myi9HTJAA4H+bn8QT2+jSV3 hmQzyNX6nVM3EH0ttqWF6TVB0Eu+uGOJ2qFQwYJkAQR7ADIg86MWjYo1sfL2K1DQYIWMj0 bcCNlwqcmmcMheaJgi6kL/OOujgvTqM0FJLQvGDev4rjfanLLYx3zSoHDZ2zPg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:24 +0200 Subject: [PATCH 11/29] crypto: talitos - Remove unused priority field in struct talitos_alg_template Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-11-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=674; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=S/1dG4bsyIIViXbgS02bbpnmmLKSvCc4zmx0WqU1GLc=; b=U3htglhSDRqXJriWcshXuXst8t5py5IyGK1ky7Mdk8rpLhLISiBfmjpJUrd7pjvPairr4kHPd oDUD4JyfMT+DXC7246v8d4Ck5+vBpYqFpnuRN/IUifTLtDcJw+7PleG X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 After algorithm properties are now set at definition time, the priority field in struct talitos_alg_template is no longer used. Remove it. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos.h | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 438be8c8f08d..6cf3628c52c2 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -203,7 +203,6 @@ struct talitos_ctx { =20 struct talitos_alg_template { u32 type; - u32 priority; union { struct skcipher_alg skcipher; struct ahash_alg hash; --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A8303AB496 for ; Thu, 28 May 2026 09:09:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959378; cv=none; b=JbIn32rtx2vFShOftrN1/Jjtmb0l62zUKLdC6vIuWSeW7s1PTfpcunIl/zB3cUjB8vnHAXHosSZehMYXQv/52V0GQTgj09khrJsds7H1FQJqG+jG4yglJAwrL3lADNkQaq40yOFmAQDvjoscUhUdZIfhx4c7ociEBNzRduJ31Ho= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959378; c=relaxed/simple; bh=ZXe65ajiA2xhqUjYaTc5+KBF2tDu7XgEiIFo9uwwF0w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cPgE4nqRHbuYkqZVnKhs0pIDd77inD24qKqTccs+4+vFDRdw4BHFJC/5GDUFY8mvSrwmXdhHob/i2kTDz7kXw9hulfXCB1CekTTB3Qgmw5xMwV4oGsxl/eXlLzbGmmYMUmWvRvh/8pxQ5ExEVt3ldH60EZZ0H9QB7YlCMAd3rtM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Zv9m+Qs+; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Zv9m+Qs+" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id C7F961A3700; Thu, 28 May 2026 09:09:34 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9D75260495; Thu, 28 May 2026 09:09:34 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5DEF410888C9C; Thu, 28 May 2026 11:09:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959374; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=t/XyCD+6bs97zFnYzJuari1Ec9xU05fRhaIvDYXeox4=; b=Zv9m+Qs+Ju5JVYF7Dcl75xPN8vrLC7MWIcm2TDudb7ys2tEzZNBhH8BFP06dViDY92s4nZ 92MvLQtwTJm2gWr42tmCptqY1yCdfPw3p7SWgcTX4Rcivy49rf/KJrRcHZFrP6/Xl5HvZA 0D0eNZkguXgWMKIcNoFyB0TnDfun8UK/NWcTwu0UEWTqlasiluvmxI4MO22xIAv2qZpUgB nZAJt1NDdjQj/tvZbQTeoFBy9fhXFva9fJ+pwhowkbVL+x9dzRlG+VLG+XL/XQTmhngvAn uqhxdx0sM7jcNM3wFFY8qs3/NgDDCN61eWy7BorxnWhVssSBJ7aVJrOqBOGo5Q== From: Paul Louvel Date: Thu, 28 May 2026 11:08:25 +0200 Subject: [PATCH 12/29] crypto: talitos/hash - Convert to init_tfm/exit_tfm type-specific API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-12-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=2096; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=ZXe65ajiA2xhqUjYaTc5+KBF2tDu7XgEiIFo9uwwF0w=; b=HmLNBoBBiIH/SSeHbun3kOZjlXsVQNGh7yZJMT4aD+nSr+uvDH5BHEgo96FmvwgvIOd3fem42 eHUuZd4KfrEDFLftAZaTILspES9fnsw8KLaj5+6loflGlaKimpcqSn3 X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Since commit 6eed1e3552fc0 ("crypto: api - Mark cra_init/cra_exit as deprecated"), both cra_{init,exit} are deprecated. Switch hash from the deprecated cra_init/cra_exit fields on crypto_alg to the preferred init_tfm/exit_tfm fields on ahash_alg. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/talitos-hash.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/crypto/talitos/talitos-hash.c b/drivers/crypto/talitos= /talitos-hash.c index 3793b6fd5b75..f7f6f01cfddf 100644 --- a/drivers/crypto/talitos/talitos-hash.c +++ b/drivers/crypto/talitos/talitos-hash.c @@ -531,22 +531,26 @@ static int ahash_setkey(struct crypto_ahash *tfm, con= st u8 *key, return 0; } =20 -static int talitos_cra_init_ahash(struct crypto_tfm *tfm) +static int talitos_cra_init_ahash(struct crypto_ahash *tfm) { - struct crypto_alg *alg =3D tfm->__crt_alg; + struct ahash_alg *alg =3D crypto_ahash_alg(tfm); struct talitos_crypto_alg *talitos_alg; - struct talitos_ctx *ctx =3D crypto_tfm_ctx(tfm); + struct talitos_ctx *ctx =3D crypto_ahash_ctx(tfm); =20 - talitos_alg =3D container_of(__crypto_ahash_alg(alg), + talitos_alg =3D container_of(alg, struct talitos_crypto_alg, algt.alg.hash); =20 ctx->keylen =3D 0; - sizeof(struct talitos_ahash_req_ctx)); =20 return talitos_init_common(ctx, talitos_alg); } =20 +static void talitos_cra_exit_ahash(struct crypto_ahash *tfm) +{ + talitos_cra_exit(crypto_ahash_tfm(tfm)); +} + static struct talitos_alg_template hash_driver_algs[] =3D { { .type =3D CRYPTO_ALG_TYPE_AHASH, .alg.hash =3D { @@ -842,8 +846,8 @@ int talitos_register_hash(struct device *dev) ahash_alg =3D &hash_driver_algs[i].alg.hash; alg =3D &ahash_alg->halg.base; =20 - alg->cra_init =3D talitos_cra_init_ahash; - alg->cra_exit =3D talitos_cra_exit; + ahash_alg->init_tfm =3D talitos_cra_init_ahash; + ahash_alg->exit_tfm =3D talitos_cra_exit_ahash; ahash_alg->init =3D ahash_init; ahash_alg->update =3D ahash_update; ahash_alg->final =3D ahash_final; --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8CA103AC0C5; Thu, 28 May 2026 09:09:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959379; cv=none; b=YQWXtFB8Qhxdb2rb0VUsoOj236qcgRrHRj/MOxr/RDsC3uwwHbZZ8k6MGPCq6uRY46cU8yoJP5YlBbeW4p/V7rCSnAB//9KQaJR3VyJxp2AxlL0V7s0J3mnjCS3M4HLm/OaM25zJBngF92rravNSuuPW++aQq+p71GuNkR2pxSE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959379; c=relaxed/simple; bh=904WpYOHZPsExOaDAxUlwzazB5kY+aW5rChymNFlCic=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kt86m+J91AZ87pC/waWHxrCu1VCgR8fehmHXiej1BA/38JlpLwNtjjga3fQvujlo/9rhO6CfBb+fSR7LkF8xTHnYUKfRKrSqTJ8tCyZs69zY+eWWZ4U5x/s32pB3PNhze1URot7fmdXktkApcvPs9Ho7VQpVFL/SnoLQNqutcOw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=cGzQsD9v; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="cGzQsD9v" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 317201A36FC; Thu, 28 May 2026 09:09:36 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0723060495; Thu, 28 May 2026 09:09:36 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8B82A10888C75; Thu, 28 May 2026 11:09:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959375; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=NAXDwi3B7w8PYJPqZf+jnonoJaMavnNfwWf4SNnY4wc=; b=cGzQsD9vflxRvTwJtOp42O0rtOQzkPdtfIohXkyRCah0fGSLT3C45nLOIuITkVy5n+6sie tWfDuf61PDlqrq220KDnu3LLlWYF1Bb1IHOPNLHUiDmFrSmKVlx05CZZWz3nDcBKRg9EyR 6WsrB0mDX/dvbsWO/NLpwSoDO5whTb3tJUifI3Sgbv+69mufvINUaLQ2BsyzXXX1UKXFem kXULJuG2GK1NhoSCus4RIMZd6AHdoM6cRX1f/fHvMEbx3p21Fvuu8LkRr16m5MEoVf52Y2 XOyTSMpJMG1C8ID5h8S2SjuR9ierpontsM82xmBNT5PwYFguwgQgz3tIIAp5Tg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:26 +0200 Subject: [PATCH 13/29] crypto: talitos/skcipher - Convert to init/exit type-specific API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-13-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=1541; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=904WpYOHZPsExOaDAxUlwzazB5kY+aW5rChymNFlCic=; b=B3Y9ilcTC/x68gzURX8cTz2PxBs3fr2Ngx1cLhdVRptDxME+5FmRZJ/LPOCVHVCn+/ICyJuEB 4cKlRHVIZ3qD/a1E7r1ohUtu/PmUq7Rv0AqE+VS0fzqT8qpBrmeaUaF X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Since commit 6eed1e3552fc0 ("crypto: api - Mark cra_init/cra_exit as deprecated"), both cra_{init,exit} are deprecated. Restore the type-specific talitos_cra_exit_skcipher() wrapper and use skcipher_alg->exit instead of the generic cra_exit field, matching the pattern used by init. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/talitos-skcipher.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/crypto/talitos/talitos-skcipher.c b/drivers/crypto/tal= itos/talitos-skcipher.c index ff7b8f9344c4..f86a0a9a0ffe 100644 --- a/drivers/crypto/talitos/talitos-skcipher.c +++ b/drivers/crypto/talitos/talitos-skcipher.c @@ -232,6 +232,11 @@ static int talitos_cra_init_skcipher(struct crypto_skc= ipher *tfm) return talitos_init_common(ctx, talitos_alg); } =20 +static void talitos_cra_exit_skcipher(struct crypto_skcipher *tfm) +{ + talitos_cra_exit(crypto_skcipher_tfm(tfm)); +} + static struct talitos_alg_template skcipher_driver_algs[] =3D { { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, .alg.skcipher =3D { @@ -410,8 +415,8 @@ int talitos_register_skcipher(struct device *dev) if (has_ftr_sec1(priv)) alg->cra_alignmask =3D 3; =20 - alg->cra_exit =3D talitos_cra_exit; skcipher_alg->init =3D talitos_cra_init_skcipher; + skcipher_alg->exit =3D talitos_cra_exit_skcipher; skcipher_alg->setkey =3D skcipher_alg->setkey ?: skcipher_setkey; skcipher_alg->encrypt =3D skcipher_encrypt; skcipher_alg->decrypt =3D skcipher_decrypt; --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 64C673ABD91 for ; Thu, 28 May 2026 09:09:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959380; cv=none; b=E9e3xptSXjo/nOiyTLdsXhmUW6+Ji7FCtYYCM45RlmXPOXWc/lVU2LLAfdxWo6JIE6zWMvdoC2ykYmu1TEzKjyIBBU3VvRZqJUnAeZqRebTEYvGbPxLMvLPmBYlRl0HeRu22HCXe/cHCTc4ssv7dJgLmTJivjhRB5aTc0oxKB3M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959380; c=relaxed/simple; bh=q7qSJQDokLdcDUwXUuBg0Al0s9oooXo2HrzO8kz3Ad8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Eo31nAMnrHYCgLhirEqzZAW6Ouq8mKStKhu4NdaRhZ3Z+zybJGgaoXnsG2SFwzoJI7L1g3qDufxKlrbUzH6YylUWqTVCbWcjEoBAI63v4zbGXKuC1Bf9rKfZ0OEbQXUCKhYCqSD+93GaH6nK7lTEc1lQ+1dY+jOBGhCy8bqKfb8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=W6MpDIvQ; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="W6MpDIvQ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 64BA3C62448; Thu, 28 May 2026 09:09:37 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 3D6C060495; Thu, 28 May 2026 09:09:37 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id AD81910888CAE; Thu, 28 May 2026 11:09:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959376; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ViNyMDYAb1KrmKBvZFYYGVbJO0qJnR0mIJIdy3shCiI=; b=W6MpDIvQeXeXBM4hRTTWgJbkb2SRMxULGhhYyvPRo+S0H0xQXLoIdgcgXfUZXghjiEpMuh xR8ZXtkNsAm8TCNJBrbV6sH9fuhge0KfqWoPJKrNIy6bgJNPfOz3KuqOuCoQ/kMGeiI6qj H05udIFcBLCETTQ0lsVD7Ki6vh3UYM5tBt59Xh103uELEeuBK0P/p8NMRY+Fl5msg3Keta NJbFS1SgCrGRVjCE4qG6bwhO6SYoN40z8dqO3LsnFbMmlRjKNn/jyXEMWXfBcu+THkwsKi 1xjRzpXYttloxIhe1+LHPxH3NdZ2iBGCN2FWUIV4dI6e0buSNNRkD3yB4CqXYQ== From: Paul Louvel Date: Thu, 28 May 2026 11:08:27 +0200 Subject: [PATCH 14/29] crypto: talitos/aead - Convert to init/exit type-specific API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-14-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=1433; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=q7qSJQDokLdcDUwXUuBg0Al0s9oooXo2HrzO8kz3Ad8=; b=71yr0AJcd7OyPXQ0wNuz/1QvNYzNRZ5KPcz6dEbEOIX5JXiP7bpKGTWomILZHZ6LdBM8lIKil /Wafa+rtrzGD5OddWREfJxe632BXEstMcM/2jNj3FKVYhiaVo48npCl X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Since commit 6eed1e3552fc0 ("crypto: api - Mark cra_init/cra_exit as deprecated"), both cra_{init,exit} are deprecated. Restore the type-specific talitos_cra_exit_aead() wrapper and use aead_alg->exit instead of the generic cra_exit field, matching the pattern used by init. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/talitos-aead.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/crypto/talitos/talitos-aead.c b/drivers/crypto/talitos= /talitos-aead.c index c09ed08be2ef..38df616c9b22 100644 --- a/drivers/crypto/talitos/talitos-aead.c +++ b/drivers/crypto/talitos/talitos-aead.c @@ -400,6 +400,11 @@ static int talitos_cra_init_aead(struct crypto_aead *t= fm) return talitos_init_common(ctx, talitos_alg); } =20 +static void talitos_cra_exit_aead(struct crypto_aead *tfm) +{ + talitos_cra_exit(crypto_aead_tfm(tfm)); +} + static struct talitos_alg_template aead_driver_algs[] =3D { { .type =3D CRYPTO_ALG_TYPE_AEAD, .alg.aead =3D { @@ -950,8 +955,8 @@ int talitos_register_aead(struct device *dev) if (has_ftr_sec1(priv)) alg->cra_alignmask =3D 3; =20 - alg->cra_exit =3D talitos_cra_exit; aead_alg->init =3D talitos_cra_init_aead; + aead_alg->exit =3D talitos_cra_exit_aead; aead_alg->setkey =3D aead_alg->setkey ?: aead_setkey; aead_alg->encrypt =3D aead_encrypt; aead_alg->decrypt =3D aead_decrypt; --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 977C33A75A4 for ; Thu, 28 May 2026 09:09:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959384; cv=none; b=foR+vGBTPYRza7GR9m31uDL5+tCeHq27wEBoBWHYbXPEMX70lZmy2S6qGbOX6Vw7SLfwbg4bGPY0ijvPBtLCtCmpozCyoseceueJ6Ch8UhNVZL/ywvWXjwp6omXDVXbDAVaDb4hv4/wf52lIH9Dg2KEuFS4dPbUvGNdHNZGTjW0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959384; c=relaxed/simple; bh=DLC4pIGNz6aHaYwLLNtekInry3bIulgy7QMwDGrZrmM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uIALBEXBcdUIkoRE/qNyhQ0hoZtDu0kWsq3MGizxnK/AE13AZ2Qwp1BBYEpM9cs7iYIBgA0m7IcMHZm5amqm5dWL0bAQk4KJnEvF2yJKfuur8MAV6aRx1n3URnqFoPPOF46s/7lzv+EpPvILnWZZwQBNdPix4X9/8VXvuitGuHs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=yiZEvneD; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="yiZEvneD" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 3C2F34E42D77; Thu, 28 May 2026 09:09:39 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 11C7560495; Thu, 28 May 2026 09:09:39 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0C2C710888CB2; Thu, 28 May 2026 11:09:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959378; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=1WYe0VAZorY8zEbQ7xQbUC7MjEQH8bd6sYe2kC6a1aU=; b=yiZEvneDBlQqvcuyLFbPIKMxKFCEri0I3n5qpcfpL8JmP54pPzFJit4Hfi1yRWq/I8bjkP a+u6+JGG4ONoAfPqiySkvQGLBpa1puH7OGY+SBnNfqb2PKFVyhvQ98pznu5QPNVEVDVtre rHIO45bEPrWQn4kj2VOn6xDvTLCwTFDjn4aBS9OScq+/iUOvp1hNebbGE/s3d2wTxk43QG cCDse/xxuFdjgIdR4ilsW0MMUw9GdUkVcTeEllh0i3ejXfgTEFYyf27exP9UA4Bzh6xCKH icAGfuMGPvkF4viffkOzSOHBTK1M1Pn+M91+NiKmOTSt3GIlwfCHY2oDax38eg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:28 +0200 Subject: [PATCH 15/29] crypto: talitos/hash - Use macro for algorithm definitions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-15-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=15956; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=DLC4pIGNz6aHaYwLLNtekInry3bIulgy7QMwDGrZrmM=; b=0Jl3+rIu3VWUGlyzNG3Gu3Hm640EM+ep4olz6qhv77f6rtowmdj4lsDLuYVqUixFXYcOAjWSV BvPC4tJz6U2CgnXuUhXTnH9qA8NYb2kF2GpYXBGm1NDNOwKCAXmTqOH X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Replace the repetitive struct initializer entries in hash_driver_algs[] with preprocessor macros (TALITOS_HASH_ALG, TALITOS_HMAC_HASH_ALG). Remove the function pointer assignments (init_tfm, exit_tfm, init, update, final, finup, digest, export, import). The HMAC setkey assignment, previously done by comparing the algorithm name at runtime, is now handled by passing ahash_setkey directly through the TALITOS_HMAC_HASH_ALG macro variant. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/talitos-hash.c | 392 +++++++++---------------------= ---- 1 file changed, 104 insertions(+), 288 deletions(-) diff --git a/drivers/crypto/talitos/talitos-hash.c b/drivers/crypto/talitos= /talitos-hash.c index f7f6f01cfddf..9e6d849c3123 100644 --- a/drivers/crypto/talitos/talitos-hash.c +++ b/drivers/crypto/talitos/talitos-hash.c @@ -551,283 +551,111 @@ static void talitos_cra_exit_ahash(struct crypto_ah= ash *tfm) talitos_cra_exit(crypto_ahash_tfm(tfm)); } =20 -static struct talitos_alg_template hash_driver_algs[] =3D { - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D MD5_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "md5", - .cra_driver_name =3D "md5-talitos", - .cra_blocksize =3D MD5_HMAC_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_MD5, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA1_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha1", - .cra_driver_name =3D "sha1-talitos", - .cra_blocksize =3D SHA1_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA1, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA224_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha224", - .cra_driver_name =3D "sha224-talitos", - .cra_blocksize =3D SHA224_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA224, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA256_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha256", - .cra_driver_name =3D "sha256-talitos", - .cra_blocksize =3D SHA256_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA256, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA384_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha384", - .cra_driver_name =3D "sha384-talitos", - .cra_blocksize =3D SHA384_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUB | - DESC_HDR_MODE0_MDEUB_SHA384, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA512_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "sha512", - .cra_driver_name =3D "sha512-talitos", - .cra_blocksize =3D SHA512_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUB | - DESC_HDR_MODE0_MDEUB_SHA512, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D MD5_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(md5)", - .cra_driver_name =3D "hmac-md5-talitos", - .cra_blocksize =3D MD5_HMAC_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_MD5, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA1_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha1)", - .cra_driver_name =3D "hmac-sha1-talitos", - .cra_blocksize =3D SHA1_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA1, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA224_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha224)", - .cra_driver_name =3D "hmac-sha224-talitos", - .cra_blocksize =3D SHA224_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA224, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA256_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha256)", - .cra_driver_name =3D "hmac-sha256-talitos", - .cra_blocksize =3D SHA256_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUA | - DESC_HDR_MODE0_MDEU_SHA256, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA384_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha384)", - .cra_driver_name =3D "hmac-sha384-talitos", - .cra_blocksize =3D SHA384_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUB | - DESC_HDR_MODE0_MDEUB_SHA384, - }, - { .type =3D CRYPTO_ALG_TYPE_AHASH, - .alg.hash =3D { - .halg.digestsize =3D SHA512_DIGEST_SIZE, - .halg.statesize =3D sizeof(struct talitos_export_state), - .halg.base =3D { - .cra_name =3D "hmac(sha512)", - .cra_driver_name =3D "hmac-sha512-talitos", - .cra_blocksize =3D SHA512_BLOCK_SIZE, - .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_AHASH_ALG_BLOCK_ONLY | - CRYPTO_AHASH_ALG_FINAL_NONZERO, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - } - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_MDEUB | - DESC_HDR_MODE0_MDEUB_SHA512, +#define TALITOS_HASH_ALG_COMMON(name, digest_size, block_size, template, \ + set_key) \ + { \ + .type =3D CRYPTO_ALG_TYPE_AHASH, \ + .alg.hash =3D { \ + .init_tfm =3D talitos_cra_init_ahash, \ + .exit_tfm =3D talitos_cra_exit_ahash, \ + .init =3D ahash_init, \ + .update =3D ahash_update, \ + .final =3D ahash_final, \ + .finup =3D ahash_finup, \ + .digest =3D ahash_digest, \ + .setkey =3D set_key, \ + .import =3D ahash_import, \ + .export =3D ahash_export, \ + .halg.digestsize =3D digest_size, \ + .halg.statesize =3D sizeof(struct talitos_export_state), \ + .halg.base =3D { \ + .cra_name =3D name, \ + .cra_driver_name =3D name"-talitos", \ + .cra_blocksize =3D block_size, \ + .cra_reqsize =3D sizeof(struct talitos_ahash_req_ctx), \ + .cra_flags =3D CRYPTO_ALG_ASYNC | \ + CRYPTO_ALG_ALLOCATES_MEMORY | \ + CRYPTO_ALG_KERN_DRIVER_ONLY | \ + CRYPTO_AHASH_ALG_BLOCK_ONLY | \ + CRYPTO_AHASH_ALG_FINAL_NONZERO, \ + .cra_priority =3D TALITOS_CRA_PRIORITY, \ + .cra_ctxsize =3D sizeof(struct talitos_ctx), \ + .cra_module =3D THIS_MODULE, \ + }, \ + }, \ + .desc_hdr_template =3D template, \ } + +#define TALITOS_HASH_ALG(name, digest_size, block_size, desc_hdr_template)= \ + TALITOS_HASH_ALG_COMMON(name, digest_size, block_size, \ + desc_hdr_template, NULL) + +#define TALITOS_HMAC_HASH_ALG(name, digest_size, block_size, = \ + desc_hdr_template) \ + TALITOS_HASH_ALG_COMMON("hmac(" name ")", digest_size, block_size, \ + desc_hdr_template, ahash_setkey) + +static struct talitos_alg_template hash_driver_algs[] =3D { + TALITOS_HASH_ALG("md5", MD5_DIGEST_SIZE, MD5_HMAC_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | DESC_HDR_MODE0_MDEU_MD5), + + TALITOS_HASH_ALG("sha1", SHA1_DIGEST_SIZE, SHA1_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA1), + + TALITOS_HASH_ALG("sha224", SHA224_DIGEST_SIZE, SHA224_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA224), + + TALITOS_HASH_ALG("sha256", SHA256_DIGEST_SIZE, SHA256_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA256), + + TALITOS_HASH_ALG("sha384", SHA384_DIGEST_SIZE, SHA384_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUB | + DESC_HDR_MODE0_MDEUB_SHA384), + + TALITOS_HASH_ALG("sha512", SHA512_DIGEST_SIZE, SHA512_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUB | + DESC_HDR_MODE0_MDEUB_SHA512), + + /* HMAC */ + + TALITOS_HMAC_HASH_ALG("md5", MD5_DIGEST_SIZE, MD5_HMAC_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_MD5), + + TALITOS_HMAC_HASH_ALG("sha1", SHA1_DIGEST_SIZE, SHA1_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA1), + + TALITOS_HMAC_HASH_ALG("sha224", SHA224_DIGEST_SIZE, SHA224_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA224), + + TALITOS_HMAC_HASH_ALG("sha256", SHA256_DIGEST_SIZE, SHA256_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUA | + DESC_HDR_MODE0_MDEU_SHA256), + + TALITOS_HMAC_HASH_ALG("sha384", SHA384_DIGEST_SIZE, SHA384_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUB | + DESC_HDR_MODE0_MDEUB_SHA384), + + TALITOS_HMAC_HASH_ALG("sha512", SHA512_DIGEST_SIZE, SHA512_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_MDEUB | + DESC_HDR_MODE0_MDEUB_SHA512), }; =20 int talitos_register_hash(struct device *dev) @@ -846,18 +674,6 @@ int talitos_register_hash(struct device *dev) ahash_alg =3D &hash_driver_algs[i].alg.hash; alg =3D &ahash_alg->halg.base; =20 - ahash_alg->init_tfm =3D talitos_cra_init_ahash; - ahash_alg->exit_tfm =3D talitos_cra_exit_ahash; - ahash_alg->init =3D ahash_init; - ahash_alg->update =3D ahash_update; - ahash_alg->final =3D ahash_final; - ahash_alg->finup =3D ahash_finup; - ahash_alg->digest =3D ahash_digest; - if (!strncmp(alg->cra_name, "hmac", 4)) - ahash_alg->setkey =3D ahash_setkey; - ahash_alg->import =3D ahash_import; - ahash_alg->export =3D ahash_export; - if (!(priv->features & TALITOS_FTR_HMAC_OK) && !strncmp(alg->cra_name, "hmac", 4)) { /* not supported */ --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1874C3A8732 for ; Thu, 28 May 2026 09:09:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959385; cv=none; b=toQ8OZ0E8j5jDei67kjb6Eg16zU7xmE2IYXwz3NaalgKe3178NnlpF5GwU8o4x9pBQ135fbIVEBBLGzUKlToo3pqiTL6QMyIKqLcLm2kSzTvgxRR3XuFKJfDin2hvOt1OFmwhm9w30LvoWQUcz9Pmy0ce95e5KhIcsQtUvuTBQE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959385; c=relaxed/simple; bh=hhYsVanrXyzb+tob9dsvLMayir9e1H6WeaRtwq4PGpc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QakJnEQ6ug+1HN0Z/lhR41ckOxnde5QH2CIGlU3L/6Z/DmuBVMLa726uL5XNc0A7W5t88CWt/eVUrOOkkQPNwou55EPtRjEHLxFF8tVKsQ2/YAmWvQVWDtnGCLaDZUoENB2RMyitqzMrs2prFrhyFySMJjcciHU3xA6eKYUzkcg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=w11IxH+r; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="w11IxH+r" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 879A44E42D78; Thu, 28 May 2026 09:09:40 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 5DE8460495; Thu, 28 May 2026 09:09:40 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9F0FB10888CA6; Thu, 28 May 2026 11:09:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959379; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=nK7aLxnbgh2LvF1eUah5cZDWiub2DETCbV8lSv4qK9A=; b=w11IxH+rqWWfMa8VJWT1f/bu4vPgkYIGamAJ4uaC+LRU3/W+SFatIjQ9AQVYJL1ZHe2wSw 4Y4IX2esSN3e0Z/3iszFIVnPnfwzG+UiBOr3MuP37FRp1gigG32HQSZWgEzsyXtRKXi+4g RhgMnIJ5IjzjkC607mo69iwyetNo+wcp9bzEz/SPImO/+FmyRDUZvTas5LbDKf+Jm7BByu WH0EtWYdKesNUe08v10oZubyhCifeIPw9WmcRwz/sbrtL//K8OVyXMZs/EnYh4eVM38Gqp geOswRV7DFwB8iPLym/MK2LB3fF5Jhme5VN2y4oYtiazNrkST1nV6VAdQ2gajg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:29 +0200 Subject: [PATCH 16/29] crypto: talitos/skcipher - Use macro for algorithm definitions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-16-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=10554; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=hhYsVanrXyzb+tob9dsvLMayir9e1H6WeaRtwq4PGpc=; b=vCLBVrzpd6R+m4A5P/LlaJZoo2i6bXY7rq1W3uNae1UyBt+Uj+fl1he+XEET2jeDRp2T3cpmS wC2T0+BKYH/CIwmT5l9UAJnR++dnxkDmq/laPcABjogEzPTcXYxboNH X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Replace the repetitive struct initializer entries in skcipher_driver_algs[] with preprocessor macros (TALITOS_SKCIPHER_ALG_AES, TALITOS_SKCIPHER_ALG_DES, TALITOS_SKCIPHER_ALG_DES3). Move the function pointer assignments (init, exit, encrypt, decrypt) from the registration loop into the static initializer, since they are identical for all algorithms. The fallback setkey assignment (skcipher_alg->setkey ?: skcipher_setkey) is no longer needed because each macro specifies the correct setkey handler directly. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/talitos-skcipher.c | 244 ++++++++++----------------= ---- 1 file changed, 82 insertions(+), 162 deletions(-) diff --git a/drivers/crypto/talitos/talitos-skcipher.c b/drivers/crypto/tal= itos/talitos-skcipher.c index f86a0a9a0ffe..b12191243aae 100644 --- a/drivers/crypto/talitos/talitos-skcipher.c +++ b/drivers/crypto/talitos/talitos-skcipher.c @@ -237,163 +237,89 @@ static void talitos_cra_exit_skcipher(struct crypto_= skcipher *tfm) talitos_cra_exit(crypto_skcipher_tfm(tfm)); } =20 +#define TALITOS_SKCIPHER_ALG_COMMON(name, blk_sz, iv_sz, min_ksz, max_ksz,= \ + set_key, desc_template) \ + { \ + .type =3D CRYPTO_ALG_TYPE_SKCIPHER, \ + .alg.skcipher =3D { \ + .base.cra_name =3D name, \ + .base.cra_driver_name =3D name"-talitos", \ + .base.cra_blocksize =3D blk_sz, \ + .base.cra_flags =3D CRYPTO_ALG_ASYNC | \ + CRYPTO_ALG_ALLOCATES_MEMORY | \ + CRYPTO_ALG_KERN_DRIVER_ONLY, \ + .base.cra_priority =3D TALITOS_CRA_PRIORITY, \ + .base.cra_ctxsize =3D sizeof(struct talitos_ctx), \ + .base.cra_module =3D THIS_MODULE, \ + .min_keysize =3D min_ksz, \ + .max_keysize =3D max_ksz, \ + .ivsize =3D iv_sz, \ + .setkey =3D set_key, \ + .init =3D talitos_cra_init_skcipher, \ + .exit =3D talitos_cra_exit_skcipher, \ + .encrypt =3D skcipher_encrypt, \ + .decrypt =3D skcipher_decrypt, \ + }, \ + .desc_hdr_template =3D desc_template, \ + } + +#define TALITOS_SKCIPHER_ALG_AES(name, blk_sz, iv_sz, desc_template) = \ + TALITOS_SKCIPHER_ALG_COMMON(name, blk_sz, iv_sz, AES_MIN_KEY_SIZE, \ + AES_MAX_KEY_SIZE, skcipher_aes_setkey, \ + desc_template) + +#define TALITOS_SKCIPHER_ALG_DES(name, blk_sz, iv_sz, desc_template) \ + TALITOS_SKCIPHER_ALG_COMMON(name, blk_sz, iv_sz, DES_KEY_SIZE, \ + DES_KEY_SIZE, skcipher_des_setkey, \ + desc_template) + +#define TALITOS_SKCIPHER_ALG_DES3(name, blk_sz, iv_sz, desc_template) = \ + TALITOS_SKCIPHER_ALG_COMMON(name, blk_sz, iv_sz, DES3_EDE_KEY_SIZE, \ + DES3_EDE_KEY_SIZE, skcipher_des3_setkey, \ + desc_template) + static struct talitos_alg_template skcipher_driver_algs[] =3D { - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ecb(aes)", - .base.cra_driver_name =3D "ecb-aes-talitos", - .base.cra_blocksize =3D AES_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .base.cra_priority =3D TALITOS_CRA_PRIORITY, - .base.cra_ctxsize =3D sizeof(struct talitos_ctx), - .base.cra_module =3D THIS_MODULE, - .min_keysize =3D AES_MIN_KEY_SIZE, - .max_keysize =3D AES_MAX_KEY_SIZE, - .setkey =3D skcipher_aes_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "cbc(aes)", - .base.cra_driver_name =3D "cbc-aes-talitos", - .base.cra_blocksize =3D AES_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .base.cra_priority =3D TALITOS_CRA_PRIORITY, - .base.cra_ctxsize =3D sizeof(struct talitos_ctx), - .base.cra_module =3D THIS_MODULE, - .min_keysize =3D AES_MIN_KEY_SIZE, - .max_keysize =3D AES_MAX_KEY_SIZE, - .ivsize =3D AES_BLOCK_SIZE, - .setkey =3D skcipher_aes_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ctr(aes)", - .base.cra_driver_name =3D "ctr-aes-talitos", - .base.cra_blocksize =3D 1, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .base.cra_priority =3D TALITOS_CRA_PRIORITY, - .base.cra_ctxsize =3D sizeof(struct talitos_ctx), - .base.cra_module =3D THIS_MODULE, - .min_keysize =3D AES_MIN_KEY_SIZE, - .max_keysize =3D AES_MAX_KEY_SIZE, - .ivsize =3D AES_BLOCK_SIZE, - .setkey =3D skcipher_aes_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_AESU_CTR_NONSNOOP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CTR, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ctr(aes)", - .base.cra_driver_name =3D "ctr-aes-talitos", - .base.cra_blocksize =3D 1, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .base.cra_priority =3D TALITOS_CRA_PRIORITY, - .base.cra_ctxsize =3D sizeof(struct talitos_ctx), - .base.cra_module =3D THIS_MODULE, - .min_keysize =3D AES_MIN_KEY_SIZE, - .max_keysize =3D AES_MAX_KEY_SIZE, - .ivsize =3D AES_BLOCK_SIZE, - .setkey =3D skcipher_aes_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CTR, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ecb(des)", - .base.cra_driver_name =3D "ecb-des-talitos", - .base.cra_blocksize =3D DES_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .base.cra_priority =3D TALITOS_CRA_PRIORITY, - .base.cra_ctxsize =3D sizeof(struct talitos_ctx), - .base.cra_module =3D THIS_MODULE, - .min_keysize =3D DES_KEY_SIZE, - .max_keysize =3D DES_KEY_SIZE, - .setkey =3D skcipher_des_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "cbc(des)", - .base.cra_driver_name =3D "cbc-des-talitos", - .base.cra_blocksize =3D DES_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .base.cra_priority =3D TALITOS_CRA_PRIORITY, - .base.cra_ctxsize =3D sizeof(struct talitos_ctx), - .base.cra_module =3D THIS_MODULE, - .min_keysize =3D DES_KEY_SIZE, - .max_keysize =3D DES_KEY_SIZE, - .ivsize =3D DES_BLOCK_SIZE, - .setkey =3D skcipher_des_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "ecb(des3_ede)", - .base.cra_driver_name =3D "ecb-3des-talitos", - .base.cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .base.cra_priority =3D TALITOS_CRA_PRIORITY, - .base.cra_ctxsize =3D sizeof(struct talitos_ctx), - .base.cra_module =3D THIS_MODULE, - .min_keysize =3D DES3_EDE_KEY_SIZE, - .max_keysize =3D DES3_EDE_KEY_SIZE, - .setkey =3D skcipher_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_3DES, - }, - { .type =3D CRYPTO_ALG_TYPE_SKCIPHER, - .alg.skcipher =3D { - .base.cra_name =3D "cbc(des3_ede)", - .base.cra_driver_name =3D "cbc-3des-talitos", - .base.cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .base.cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .base.cra_priority =3D TALITOS_CRA_PRIORITY, - .base.cra_ctxsize =3D sizeof(struct talitos_ctx), - .base.cra_module =3D THIS_MODULE, - .min_keysize =3D DES3_EDE_KEY_SIZE, - .max_keysize =3D DES3_EDE_KEY_SIZE, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .setkey =3D skcipher_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES, - }, + /* AES */ + + TALITOS_SKCIPHER_ALG_AES("ecb(aes)", AES_BLOCK_SIZE, 0, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU), + + TALITOS_SKCIPHER_ALG_AES("cbc(aes)", AES_BLOCK_SIZE, AES_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC), + + TALITOS_SKCIPHER_ALG_AES("ctr(aes)", 1, AES_BLOCK_SIZE, + DESC_HDR_TYPE_AESU_CTR_NONSNOOP | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CTR), + + TALITOS_SKCIPHER_ALG_AES("ctr(aes)", 1, AES_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CTR), + /* DES */ + + TALITOS_SKCIPHER_ALG_DES("ecb(des)", DES_BLOCK_SIZE, 0, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU), + + TALITOS_SKCIPHER_ALG_DES("cbc(des)", DES_BLOCK_SIZE, DES_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC), + /* DES3 */ + + TALITOS_SKCIPHER_ALG_DES3("ecb(des3_ede)", DES3_EDE_BLOCK_SIZE, 0, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | + DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_3DES), + + TALITOS_SKCIPHER_ALG_DES3( + "cbc(des3_ede)", DES3_EDE_BLOCK_SIZE, DES3_EDE_BLOCK_SIZE, + DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES), }; =20 int talitos_register_skcipher(struct device *dev) @@ -415,12 +341,6 @@ int talitos_register_skcipher(struct device *dev) if (has_ftr_sec1(priv)) alg->cra_alignmask =3D 3; =20 - skcipher_alg->init =3D talitos_cra_init_skcipher; - skcipher_alg->exit =3D talitos_cra_exit_skcipher; - skcipher_alg->setkey =3D skcipher_alg->setkey ?: skcipher_setkey; - skcipher_alg->encrypt =3D skcipher_encrypt; - skcipher_alg->decrypt =3D skcipher_decrypt; - if (!strcmp(alg->cra_name, "ctr(aes)") && !has_ftr_sec1(priv) && DESC_TYPE(skcipher_driver_algs[i].desc_hdr_template) !=3D DESC_TYPE(DESC_HDR_TYPE_AESU_CTR_NONSNOOP)) { --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 168673AB5B2; Thu, 28 May 2026 09:09:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959387; cv=none; b=e5jMdrXDL5WLe33fcP9cgpSI0eca3azDVoS/4Kh/V2BNSU/372ZGikSU/ytZ45hIcNxUqGDal4oHa4i+lHS/o4aPp3e1mEykIN0axlChQggjYk6Lr9QeXxuHP8gnC65nvei2WrkNc9U5PsitysT4dwry1UMuDKM20KGkNH6zw3U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959387; c=relaxed/simple; bh=rd4olOUlOVTNKHjozSqayQ4PemT0cvcCs2HvOhqoGIQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gZrMx1pKoc9qgxohBBljvYELEYd9FPvZqmM9rKXbqOOnkB/wGA2Zom3ol+pwdG2Fh5Y3ykrbB1lRVNlRxLncc1cvkBy3EbgA0RqULDPLcH6WpaCpaEEucS9uqdmytRZQHvYytuSs2S+h2khxWSqm4oEmDUKrKNxvIjed9HWmf+M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=pMU9UMCr; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="pMU9UMCr" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 9DD5A1A36FE; Thu, 28 May 2026 09:09:41 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7288A60495; Thu, 28 May 2026 09:09:41 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D8C7710888CAD; Thu, 28 May 2026 11:09:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959380; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=sWCu94ziuMpQAkpZlRJ/zho4nehm5zT8ajfpWs0vumU=; b=pMU9UMCrr6msD5UU5CJSrQjifjzhLBI5ILKwJHeA97xTsT6+pP7qhkm7irHNUoOQcCp6XG 7CM/GXDp/Sd9TLzS43dGbR28oS9iMQ8MiVe2npInI8QBRa+I/xmkGCp6QNEFJfWWriJtNT 8Xx0wqBpHLaobNRtCeZzVEd6DOo2QZi3sw73uu5jDtHCI2UxIAFyzyamH6if33qveP/krU J97hSC6F3xUO/et0h3yAkflJqByJNaRVyMK6a4MpfqCDjwUU5wouA2jOwBT7word+Q40P2 02+MavGgMFIuN3u4Q54M/ThN4J8qf9sR8i1VvfoeRGyqcLwEmA6eYOlT1VRKJQ== From: Paul Louvel Date: Thu, 28 May 2026 11:08:30 +0200 Subject: [PATCH 17/29] crypto: talitos/aead - Use macro for algorithm definitions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-17-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=28140; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=rd4olOUlOVTNKHjozSqayQ4PemT0cvcCs2HvOhqoGIQ=; b=eDFd15TrjstnjnhS1AHsRLzu0ArEQMdXBG6YgxPyb13WfSikOpN65wZ0rlZngFsMascIJodlD gSv+Df+ut6+AWAZpddZ7FEOg0jd92TcyPABzPgriNxsqL85wB5kNJQ8 X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Replace the repetitive struct initializer entries in aead_driver_algs[] with preprocessor macros (TALITOS_AEAD_ALG, TALITOS_AEAD_ALG_HSNA). Move the function pointer assignments (init, exit, encrypt, decrypt) from the registration loop into the static initializer, since they are identical for all algorithms. The fallback setkey assignment (aead_alg->setkey ?: aead_setkey) is replaced by specifying the correct setkey handler directly in each macro invocation. Signed-off-by: Paul Louvel Reviewed-by: Christophe Leroy (CS GROUP) --- drivers/crypto/talitos/talitos-aead.c | 751 ++++++++++--------------------= ---- 1 file changed, 218 insertions(+), 533 deletions(-) diff --git a/drivers/crypto/talitos/talitos-aead.c b/drivers/crypto/talitos= /talitos-aead.c index 38df616c9b22..cd1b8e6d371b 100644 --- a/drivers/crypto/talitos/talitos-aead.c +++ b/drivers/crypto/talitos/talitos-aead.c @@ -405,535 +405,225 @@ static void talitos_cra_exit_aead(struct crypto_aea= d *tfm) talitos_cra_exit(crypto_aead_tfm(tfm)); } =20 +#define TALITOS_AEAD_ALG_COMMON(name, name_prefix, set_key, block_size, \ + max_auth_size, template, priority) \ + { \ + .type =3D CRYPTO_ALG_TYPE_AEAD, \ + .alg.aead =3D { \ + .base =3D { \ + .cra_name =3D name, \ + .cra_driver_name =3D name"-talitos"name_prefix, \ + .cra_blocksize =3D block_size, \ + .cra_flags =3D CRYPTO_ALG_ASYNC | \ + CRYPTO_ALG_ALLOCATES_MEMORY | \ + CRYPTO_ALG_KERN_DRIVER_ONLY, \ + .cra_priority =3D (priority), \ + .cra_ctxsize =3D sizeof(struct talitos_ctx), \ + .cra_module =3D THIS_MODULE, \ + }, \ + .ivsize =3D block_size, \ + .maxauthsize =3D max_auth_size, \ + .setkey =3D set_key, \ + .init =3D talitos_cra_init_aead, \ + .exit =3D talitos_cra_exit_aead, \ + .encrypt =3D aead_encrypt, \ + .decrypt =3D aead_decrypt, \ + }, \ + .desc_hdr_template =3D template, \ + } + +#define TALITOS_AEAD_ALG(name, set_key, block_size, max_auth_size, templat= e) \ + TALITOS_AEAD_ALG_COMMON(name, "", set_key, block_size, max_auth_size, \ + template, TALITOS_CRA_PRIORITY) + +#define TALITOS_AEAD_ALG_HSNA(name, set_key, block_size, max_auth_size, \ + template) \ + TALITOS_AEAD_ALG_COMMON(name, "-hsna", set_key, block_size, \ + max_auth_size, template, \ + TALITOS_CRA_PRIORITY_AEAD_HSNA) + static struct talitos_alg_template aead_driver_algs[] =3D { - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha1),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha1-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA1_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA1_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha1),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha1-" - "cbc-aes-talitos-hsna", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA1_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA1_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha1)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha1-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA1_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA1_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha1)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha1-" - "cbc-3des-talitos-hsna", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA1_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA1_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha224),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha224-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA224_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA224_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha224),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha224-" - "cbc-aes-talitos-hsna", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA224_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA224_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha224)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha224-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA224_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA224_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha224)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha224-" - "cbc-3des-talitos-hsna", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA224_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA224_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha256),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha256-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA256_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA256_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha256),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha256-" - "cbc-aes-talitos-hsna", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA256_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA256_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha256)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha256-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA256_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA256_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha256)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha256-" - "cbc-3des-talitos-hsna", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA256_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_SHA256_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha384),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha384-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA384_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUB | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEUB_SHA384_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha384)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha384-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA384_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUB | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEUB_SHA384_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha512),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-sha512-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D SHA512_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUB | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEUB_SHA512_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(sha512)," - "cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-sha512-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D SHA512_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUB | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEUB_SHA512_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(md5),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-md5-" - "cbc-aes-talitos", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D MD5_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_MD5_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(md5),cbc(aes))", - .cra_driver_name =3D "authenc-hmac-md5-" - "cbc-aes-talitos-hsna", - .cra_blocksize =3D AES_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D AES_BLOCK_SIZE, - .maxauthsize =3D MD5_DIGEST_SIZE, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_AESU | - DESC_HDR_MODE0_AESU_CBC | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_MD5_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(md5),cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-md5-" - "cbc-3des-talitos", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D MD5_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_IPSEC_ESP | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_MD5_HMAC, - }, - { .type =3D CRYPTO_ALG_TYPE_AEAD, - .alg.aead =3D { - .base =3D { - .cra_name =3D "authenc(hmac(md5),cbc(des3_ede))", - .cra_driver_name =3D "authenc-hmac-md5-" - "cbc-3des-talitos-hsna", - .cra_blocksize =3D DES3_EDE_BLOCK_SIZE, - .cra_flags =3D CRYPTO_ALG_ASYNC | - CRYPTO_ALG_ALLOCATES_MEMORY | - CRYPTO_ALG_KERN_DRIVER_ONLY, - .cra_priority =3D TALITOS_CRA_PRIORITY_AEAD_HSNA, - .cra_ctxsize =3D sizeof(struct talitos_ctx), - .cra_module =3D THIS_MODULE, - }, - .ivsize =3D DES3_EDE_BLOCK_SIZE, - .maxauthsize =3D MD5_DIGEST_SIZE, - .setkey =3D aead_des3_setkey, - }, - .desc_hdr_template =3D DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | - DESC_HDR_SEL0_DEU | - DESC_HDR_MODE0_DEU_CBC | - DESC_HDR_MODE0_DEU_3DES | - DESC_HDR_SEL1_MDEUA | - DESC_HDR_MODE1_MDEU_INIT | - DESC_HDR_MODE1_MDEU_PAD | - DESC_HDR_MODE1_MDEU_MD5_HMAC, - }, + /* AEAD algorithms. These use a single-pass ipsec_esp descriptor */ + + /* sha1 auth */ + + TALITOS_AEAD_ALG("authenc(hmac(sha1),cbc(aes))", aead_setkey, + AES_BLOCK_SIZE, SHA1_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA1_HMAC), + + TALITOS_AEAD_ALG_HSNA( + "authenc(hmac(sha1),cbc(aes))", aead_setkey, AES_BLOCK_SIZE, + SHA1_DIGEST_SIZE, + DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA1_HMAC), + + TALITOS_AEAD_ALG("authenc(hmac(sha1),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, SHA1_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | + DESC_HDR_MODE0_DEU_3DES | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA1_HMAC), + + TALITOS_AEAD_ALG_HSNA( + "authenc(hmac(sha1),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, SHA1_DIGEST_SIZE, + DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA1_HMAC), + + /* sha224 auth */ + + TALITOS_AEAD_ALG("authenc(hmac(sha224),cbc(aes))", aead_setkey, + AES_BLOCK_SIZE, SHA224_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA224_HMAC), + + TALITOS_AEAD_ALG_HSNA( + "authenc(hmac(sha224),cbc(aes))", aead_setkey, AES_BLOCK_SIZE, + SHA224_DIGEST_SIZE, + DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA224_HMAC), + + TALITOS_AEAD_ALG( + "authenc(hmac(sha224),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, SHA224_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA224_HMAC), + + TALITOS_AEAD_ALG_HSNA( + "authenc(hmac(sha224),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, SHA224_DIGEST_SIZE, + DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA224_HMAC), + + /* sha256 auth */ + + TALITOS_AEAD_ALG("authenc(hmac(sha256),cbc(aes))", aead_setkey, + AES_BLOCK_SIZE, SHA256_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA256_HMAC), + + TALITOS_AEAD_ALG_HSNA( + "authenc(hmac(sha256),cbc(aes))", aead_setkey, AES_BLOCK_SIZE, + SHA256_DIGEST_SIZE, + DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA256_HMAC), + + TALITOS_AEAD_ALG( + "authenc(hmac(sha256),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, SHA256_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA256_HMAC), + + TALITOS_AEAD_ALG_HSNA( + "authenc(hmac(sha256),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, SHA256_DIGEST_SIZE, + DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_SHA256_HMAC), + + /* sha384 auth */ + + TALITOS_AEAD_ALG("authenc(hmac(sha384),cbc(aes))", aead_setkey, + AES_BLOCK_SIZE, SHA384_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUB | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEUB_SHA384_HMAC), + + TALITOS_AEAD_ALG( + "authenc(hmac(sha384),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, SHA384_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUB | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEUB_SHA384_HMAC), + + /* sha512 auth */ + + TALITOS_AEAD_ALG("authenc(hmac(sha512),cbc(aes))", aead_setkey, + AES_BLOCK_SIZE, SHA512_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUB | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEUB_SHA512_HMAC), + + TALITOS_AEAD_ALG( + "authenc(hmac(sha512),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, SHA512_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUB | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEUB_SHA512_HMAC), + + /* md5 auth */ + + TALITOS_AEAD_ALG("authenc(hmac(md5),cbc(aes))", aead_setkey, + AES_BLOCK_SIZE, MD5_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_MD5_HMAC), + + TALITOS_AEAD_ALG_HSNA( + "authenc(hmac(md5),cbc(aes))", aead_setkey, AES_BLOCK_SIZE, + MD5_DIGEST_SIZE, + DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CBC | DESC_HDR_SEL1_MDEUA | + DESC_HDR_MODE1_MDEU_INIT | DESC_HDR_MODE1_MDEU_PAD | + DESC_HDR_MODE1_MDEU_MD5_HMAC), + + TALITOS_AEAD_ALG( + "authenc(hmac(md5),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, MD5_DIGEST_SIZE, + DESC_HDR_TYPE_IPSEC_ESP | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | DESC_HDR_MODE1_MDEU_MD5_HMAC), + + TALITOS_AEAD_ALG_HSNA( + "authenc(hmac(md5),cbc(des3_ede))", aead_des3_setkey, + DES3_EDE_BLOCK_SIZE, MD5_DIGEST_SIZE, + DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU | DESC_HDR_SEL0_DEU | + DESC_HDR_MODE0_DEU_CBC | DESC_HDR_MODE0_DEU_3DES | + DESC_HDR_SEL1_MDEUA | DESC_HDR_MODE1_MDEU_INIT | + DESC_HDR_MODE1_MDEU_PAD | DESC_HDR_MODE1_MDEU_MD5_HMAC), }; =20 int talitos_register_aead(struct device *dev) @@ -955,11 +645,6 @@ int talitos_register_aead(struct device *dev) if (has_ftr_sec1(priv)) alg->cra_alignmask =3D 3; =20 - aead_alg->init =3D talitos_cra_init_aead; - aead_alg->exit =3D talitos_cra_exit_aead; - aead_alg->setkey =3D aead_alg->setkey ?: aead_setkey; - aead_alg->encrypt =3D aead_encrypt; - aead_alg->decrypt =3D aead_decrypt; if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) && !strncmp(alg->cra_name, "authenc(hmac(sha224)", 20)) { continue; --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B7AB03A8744; Thu, 28 May 2026 09:09:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959389; cv=none; b=XnQI2tAVzT/5b1P41YEM2tOlPuOPs81+WJpd6VYGJN5AAIOX1MR9D6ol10m6yder2bX/ShIxekvdXQn8Nvv9gczLRhwgm29INEOV/4+g/YwZipAk4YHZ2zBsNLxhgDXZ0jw+dYL8zzngEu3oJa2BHEgqCyvYXONIURMgrWxzggk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959389; c=relaxed/simple; bh=EpX8lH3BWxsZp3er98EGl6Wzlm9rLwIPgk55NXa6Bo8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r0R0S7hhz4CNj4M+4Vjf7cCKpkoB1/NbycjDeYhNLGGzkfvAoQ5RMFcQ5qsSm/V2lNEe3KzlefV2cydrWZvCdLwZYSdnt9asTALhfK/jub4sSyOOuweFLhdC5yvlmwmLZp8a0BKjG6LMaSVdKKEXzaHlPpnsQ0IP/Ea66Hx1aI8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=p8DHcNts; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="p8DHcNts" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 3A131C62445; Thu, 28 May 2026 09:09:43 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0FC0D60495; Thu, 28 May 2026 09:09:43 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2FC0F10888CA4; Thu, 28 May 2026 11:09:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959381; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Dq5GK8winGSPm6fBJZoHcPJtZ0HIFg06XjXahWyltqU=; b=p8DHcNtsghLI6T5rBiYPkukzxqBhEywasCkLnnXbaLGOS/g9SKdpTRfG2g4jwEiVw8TVPd BWhADu4yhrbG2BXAa5TZ3kJfJFw2DBNJZu83vWVfvoDQW4p8DIj+9iYJ8ApCO/gZ5y7uL9 wS0/cqPwHse+NxrDEZRcN1MMu96zNpC+YTvNpwT0l1eChhUQsPUpeIvKzX6jIBwUC/MXma jBp62KhaY8PB59w5+DXsMjaWKLvJ4y7Z+tYhGPja//gNiY9NWplyjlkLAHlij6EIByI8ze fSQLLlhR+Vr/8oAKgYtJTbn9HtZzSquQgJfmL5b7tMKrK14cwzTHFwfenkIuFQ== From: Paul Louvel Date: Thu, 28 May 2026 11:08:31 +0200 Subject: [PATCH 18/29] crypto: talitos - Split SEC1/SEC2 code into separate function variants Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-18-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=27042; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=EpX8lH3BWxsZp3er98EGl6Wzlm9rLwIPgk55NXa6Bo8=; b=uWmqTu4ZkiuS5pcSSyCpGZ1FPR/Xv7x72KmAH0GzInSPx3C5XG9kgUTCVWC+VVkiZOV08EcMH i2QF8SnTzENDmKi1ZWyHi5T+eL4njjsy1zv3P6kJMfUKV1CyoWvlnlT X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Split the functions that have SEC1/SEC2-specific behavior into separate sec1_ and sec2_ function variants, removing the runtime is_sec1 checks from within each function body. The callers still dispatch between the two variants using local is_sec1 variables and if/else checks. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos.c | 524 +++++++++++++++++++++++++----------= ---- drivers/crypto/talitos/talitos.h | 36 ++- 2 files changed, 357 insertions(+), 203 deletions(-) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index f38a156a0459..b6793d97735e 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -133,75 +133,124 @@ void unmap_single_talitos_ptr(struct device *dev, from_talitos_ptr_len(ptr, is_sec1), dir); } =20 -static int reset_channel(struct device *dev, int ch) +static int sec1_reset_channel(struct device *dev, int ch) { struct talitos_private *priv =3D dev_get_drvdata(dev); unsigned int timeout =3D TALITOS_TIMEOUT; - bool is_sec1 =3D has_ftr_sec1(priv); =20 - if (is_sec1) { - setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, - TALITOS1_CCCR_LO_RESET); + setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, TALITOS1_CCCR_LO_RESET); =20 - while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR_LO) & - TALITOS1_CCCR_LO_RESET) && --timeout) - cpu_relax(); - } else { - setbits32(priv->chan[ch].reg + TALITOS_CCCR, - TALITOS2_CCCR_RESET); + while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR_LO) & + TALITOS1_CCCR_LO_RESET) && + --timeout) + cpu_relax(); =20 - while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) & - TALITOS2_CCCR_RESET) && --timeout) - cpu_relax(); + if (timeout =3D=3D 0) { + dev_err(dev, "failed to reset sec1 channel %d\n", ch); + return -EIO; } =20 + setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, + TALITOS_CCCR_LO_NE | TALITOS_CCCR_LO_CDIE | + TALITOS_CCCR_LO_CDWE); + + return 0; +} + +static int sec2_reset_channel(struct device *dev, int ch) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + unsigned int timeout =3D TALITOS_TIMEOUT; + + setbits32(priv->chan[ch].reg + TALITOS_CCCR, TALITOS2_CCCR_RESET); + + while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) & + TALITOS2_CCCR_RESET) && + --timeout) + cpu_relax(); + if (timeout =3D=3D 0) { - dev_err(dev, "failed to reset channel %d\n", ch); + dev_err(dev, "failed to reset sec2 channel %d\n", ch); return -EIO; } =20 - /* set 36-bit addressing, done writeback enable and done IRQ enable */ - setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, TALITOS_CCCR_LO_EAE | - TALITOS_CCCR_LO_CDWE | TALITOS_CCCR_LO_CDIE); - /* enable chaining descriptors */ - if (is_sec1) - setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, - TALITOS_CCCR_LO_NE); + setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, + TALITOS_CCCR_LO_EAE | TALITOS_CCCR_LO_CDWE | + TALITOS_CCCR_LO_CDIE); =20 - /* and ICCR writeback, if available */ + /* ICCR writeback, if available */ if (priv->features & TALITOS_FTR_HW_AUTH_CHECK) setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, - TALITOS_CCCR_LO_IWSE); + TALITOS_CCCR_LO_IWSE); =20 return 0; } =20 -static int reset_device(struct device *dev) +static int sec1_reset_device(struct device *dev) { struct talitos_private *priv =3D dev_get_drvdata(dev); unsigned int timeout =3D TALITOS_TIMEOUT; - bool is_sec1 =3D has_ftr_sec1(priv); - u32 mcr =3D is_sec1 ? TALITOS1_MCR_SWR : TALITOS2_MCR_SWR; =20 - setbits32(priv->reg + TALITOS_MCR, mcr); + setbits32(priv->reg + TALITOS_MCR, TALITOS1_MCR_SWR); =20 - while ((in_be32(priv->reg + TALITOS_MCR) & mcr) - && --timeout) + while ((in_be32(priv->reg + TALITOS_MCR) & TALITOS1_MCR_SWR) && + --timeout) cpu_relax(); =20 - if (priv->irq[1]) { - mcr =3D TALITOS_MCR_RCA1 | TALITOS_MCR_RCA3; - setbits32(priv->reg + TALITOS_MCR, mcr); + if (timeout =3D=3D 0) { + dev_err(dev, "failed to reset sec1 device\n"); + return -EIO; } =20 + return 0; +} + +static int sec2_reset_device(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + unsigned int timeout =3D TALITOS_TIMEOUT; + + setbits32(priv->reg + TALITOS_MCR, TALITOS2_MCR_SWR); + + while ((in_be32(priv->reg + TALITOS_MCR) & TALITOS2_MCR_SWR) && + --timeout) + cpu_relax(); + + if (priv->irq[1]) + setbits32(priv->reg + TALITOS_MCR, + TALITOS_MCR_RCA1 | TALITOS_MCR_RCA3); + if (timeout =3D=3D 0) { - dev_err(dev, "failed to reset device\n"); + dev_err(dev, "failed to reset sec2 device\n"); return -EIO; } =20 return 0; } =20 +static void sec1_configure_device(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + clrbits32(priv->reg + TALITOS_IMR, TALITOS1_IMR_INIT); + clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT); + /* disable parity error check in DEU (erroneous? test vect.) */ + setbits32(priv->reg_deu + TALITOS_EUICR, TALITOS1_DEUICR_KPE); +} + +static void sec2_configure_device(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + setbits32(priv->reg + TALITOS_IMR, TALITOS2_IMR_INIT); + setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT); + + /* disable integrity check error interrupts (use writeback instead) */ + if (priv->features & TALITOS_FTR_HW_AUTH_CHECK) + setbits32(priv->reg_mdeu + TALITOS_EUICR_LO, + TALITOS_MDEUICR_LO_ICE); +} + /* * Reset and initialize the device */ @@ -217,80 +266,81 @@ static int init_device(struct device *dev) * are not fully cleared by writing the MCR:SWR bit, * set bit twice to completely reset */ - err =3D reset_device(dev); + if (is_sec1) + err =3D sec1_reset_device(dev); + else + err =3D sec2_reset_device(dev); + if (err) return err; =20 - err =3D reset_device(dev); + if (is_sec1) + err =3D sec1_reset_device(dev); + else + err =3D sec2_reset_device(dev); if (err) return err; =20 /* reset channels */ for (ch =3D 0; ch < priv->num_channels; ch++) { - err =3D reset_channel(dev, ch); + if (is_sec1) + err =3D sec1_reset_channel(dev, ch); + else + err =3D sec2_reset_channel(dev, ch); if (err) return err; } =20 - /* enable channel done and error interrupts */ - if (is_sec1) { - clrbits32(priv->reg + TALITOS_IMR, TALITOS1_IMR_INIT); - clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT); - /* disable parity error check in DEU (erroneous? test vect.) */ - setbits32(priv->reg_deu + TALITOS_EUICR, TALITOS1_DEUICR_KPE); - } else { - setbits32(priv->reg + TALITOS_IMR, TALITOS2_IMR_INIT); - setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT); - } - - /* disable integrity check error interrupts (use writeback instead) */ - if (priv->features & TALITOS_FTR_HW_AUTH_CHECK) - setbits32(priv->reg_mdeu + TALITOS_EUICR_LO, - TALITOS_MDEUICR_LO_ICE); + if (is_sec1) + sec1_configure_device(dev); + else + sec2_configure_device(dev); =20 return 0; } =20 -static void dma_map_request(struct device *dev, struct talitos_request *re= quest, - struct talitos_desc *desc, bool is_sec1) +static void sec1_dma_map_request(struct device *dev, + struct talitos_request *request, + struct talitos_desc *desc) { struct talitos_edesc *edesc =3D container_of(desc, struct talitos_edesc, desc); dma_addr_t dma_desc, prev_dma_desc; struct talitos_edesc *prev_edesc =3D NULL; =20 - if (is_sec1) { - while (edesc) { - edesc->desc.hdr1 =3D edesc->desc.hdr; + while (edesc) { + edesc->desc.hdr1 =3D edesc->desc.hdr; =20 - dma_desc =3D dma_map_single(dev, &edesc->desc.hdr1, - TALITOS_DESC_SIZE, - DMA_BIDIRECTIONAL); + dma_desc =3D dma_map_single(dev, &edesc->desc.hdr1, + TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); =20 - if (!prev_edesc) { - request->dma_desc =3D dma_desc; - goto next; - } + if (!prev_edesc) { + request->dma_desc =3D dma_desc; + goto next; + } =20 - /* Chain in any previous descriptors. */ + /* Chain in any previous descriptors. */ =20 - prev_edesc->desc.next_desc =3D cpu_to_be32(dma_desc); + prev_edesc->desc.next_desc =3D cpu_to_be32(dma_desc); =20 - dma_sync_single_for_device(dev, prev_dma_desc, - TALITOS_DESC_SIZE, - DMA_TO_DEVICE); + dma_sync_single_for_device(dev, prev_dma_desc, + TALITOS_DESC_SIZE, DMA_TO_DEVICE); =20 next: - prev_edesc =3D edesc; - prev_dma_desc =3D dma_desc; - edesc =3D edesc->next_desc; - } - } else { - request->dma_desc =3D dma_map_single(dev, desc, TALITOS_DESC_SIZE, - DMA_BIDIRECTIONAL); + prev_edesc =3D edesc; + prev_dma_desc =3D dma_desc; + edesc =3D edesc->next_desc; } } =20 +static void sec2_dma_map_request(struct device *dev, + struct talitos_request *request, + struct talitos_desc *desc) +{ + request->dma_desc =3D + dma_map_single(dev, desc, TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); +} + /** * talitos_submit - submits a descriptor to the device for processing * @dev: the SEC device to be used @@ -327,7 +377,10 @@ int talitos_submit(struct device *dev, int ch, struct = talitos_desc *desc, request =3D &priv->chan[ch].fifo[head]; =20 /* map descriptor and save caller data */ - dma_map_request(dev, request, desc, is_sec1); + if (is_sec1) + sec1_dma_map_request(dev, request, desc); + else + sec2_dma_map_request(dev, request, desc); request->callback =3D callback; request->context =3D context; =20 @@ -349,19 +402,12 @@ int talitos_submit(struct device *dev, int ch, struct= talitos_desc *desc, return -EINPROGRESS; } =20 -static __be32 get_request_hdr(struct device *dev, - struct talitos_request *request, bool is_sec1) +static __be32 sec1_get_request_hdr(struct device *dev, + struct talitos_request *request) { struct talitos_edesc *edesc; dma_addr_t dma_desc; =20 - if (!is_sec1) { - dma_sync_single_for_cpu(dev, request->dma_desc, - TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); - - return request->desc->hdr; - } - edesc =3D container_of(request->desc, struct talitos_edesc, desc); dma_desc =3D request->dma_desc; while (edesc->next_desc) { @@ -375,27 +421,37 @@ static __be32 get_request_hdr(struct device *dev, return edesc->desc.hdr1; } =20 -static void dma_unmap_request(struct device *dev, - struct talitos_request *request, bool is_sec1) +static __be32 sec2_get_request_hdr(struct device *dev, + struct talitos_request *request) +{ + dma_sync_single_for_cpu(dev, request->dma_desc, TALITOS_DESC_SIZE, + DMA_BIDIRECTIONAL); + + return request->desc->hdr; +} + +static void sec1_dma_unmap_request(struct device *dev, + struct talitos_request *request) { struct talitos_edesc *edesc; =20 - if (is_sec1) { - dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, - DMA_BIDIRECTIONAL); - edesc =3D container_of(request->desc, struct talitos_edesc, desc); - while (edesc->next_desc) { - dma_unmap_single(dev, - be32_to_cpu(edesc->desc.next_desc), - TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); - edesc =3D edesc->next_desc; - } - } else { - dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, - DMA_BIDIRECTIONAL); + dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, + DMA_BIDIRECTIONAL); + edesc =3D container_of(request->desc, struct talitos_edesc, desc); + while (edesc->next_desc) { + dma_unmap_single(dev, be32_to_cpu(edesc->desc.next_desc), + TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); + edesc =3D edesc->next_desc; } } =20 +static void sec2_dma_unmap_request(struct device *dev, + struct talitos_request *request) +{ + dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, + DMA_BIDIRECTIONAL); +} + /* * process what was done, notify callback of error if not */ @@ -417,7 +473,10 @@ static void flush_channel(struct device *dev, int ch, = int error, int reset_ch) =20 /* descriptors with their done bits set don't get the error */ rmb(); - hdr =3D get_request_hdr(dev, request, is_sec1); + if (is_sec1) + hdr =3D sec1_get_request_hdr(dev, request); + else + hdr =3D sec2_get_request_hdr(dev, request); =20 if ((hdr & DESC_HDR_DONE) =3D=3D DESC_HDR_DONE) status =3D 0; @@ -427,7 +486,10 @@ static void flush_channel(struct device *dev, int ch, = int error, int reset_ch) else status =3D error; =20 - dma_unmap_request(dev, request, is_sec1); + if (is_sec1) + sec1_dma_unmap_request(dev, request); + else + sec2_dma_unmap_request(dev, request); =20 /* copy entries so we can call callback outside lock */ saved_req.desc =3D request->desc; @@ -516,21 +578,30 @@ DEF_TALITOS2_DONE(ch0, TALITOS2_ISR_CH_0_DONE) DEF_TALITOS2_DONE(ch0_2, TALITOS2_ISR_CH_0_2_DONE) DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE) =20 -static __be32 search_desc_hdr_in_request(struct talitos_request *request, - dma_addr_t cur_desc, bool is_sec1) +static __be32 sec1_search_desc_hdr_in_request(struct talitos_request *requ= est, + dma_addr_t cur_desc) { struct talitos_edesc *edesc; =20 - if (request->dma_desc =3D=3D cur_desc) { + + if (request->dma_desc =3D=3D cur_desc) return request->desc->hdr; - } else if (is_sec1) { - edesc =3D container_of(request->desc, struct talitos_edesc, desc); - while (edesc->next_desc) { - if (edesc->desc.next_desc =3D=3D cpu_to_be32(cur_desc)) - return edesc->next_desc->desc.hdr1; - edesc =3D edesc->next_desc; - } + + edesc =3D container_of(request->desc, struct talitos_edesc, desc); + while (edesc->next_desc) { + if (edesc->desc.next_desc =3D=3D cpu_to_be32(cur_desc)) + return edesc->next_desc->desc.hdr1; + edesc =3D edesc->next_desc; } + + return 0; +} + +static __be32 sec2_search_desc_hdr_in_request(struct talitos_request *requ= est, + dma_addr_t cur_desc) +{ + if (request->dma_desc =3D=3D cur_desc) + return request->desc->hdr; return 0; } =20 @@ -559,7 +630,10 @@ static __be32 current_desc_hdr(struct device *dev, int= ch) do { request =3D &priv->chan[ch].fifo[iter]; =20 - hdr =3D search_desc_hdr_in_request(request, cur_desc, is_sec1); + if (is_sec1) + hdr =3D sec1_search_desc_hdr_in_request(request, cur_desc); + else + hdr =3D sec2_search_desc_hdr_in_request(request, cur_desc); if (hdr) break; =20 @@ -647,79 +721,100 @@ static void report_eu_error(struct device *dev, int = ch, __be32 desc_hdr) in_be32(priv->chan[ch].reg + TALITOS_DESCBUF_LO + 8*i)); } =20 -/* - * recover from error interrupts - */ -static void talitos_error(struct device *dev, u32 isr, u32 isr_lo) +static int sec1_talitos_handle_error(struct device *dev, u32 isr, u32 isr_= lo) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + int ch, error; + u32 v_lo; + + for (ch =3D 0; ch < priv->num_channels; ch++) { + if (!TALITOS1_CH_HAS_ERROR(isr, ch)) + continue; + + v_lo =3D in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO); + + error =3D -EINVAL; + + if (v_lo & TALITOS1_CCPSR_LO_TEA) + dev_err(dev, "transfer error acknowledge\n"); + if (v_lo & TALITOS1_CCPSR_LO_PTRNC) + dev_err(dev, "pointer not complete error\n"); + if (v_lo & TALITOS1_CCPSR_LO_PE) + dev_err(dev, "parity error\n"); + if (v_lo & TALITOS1_CCPSR_LO_IDH) + dev_err(dev, "illegal descriptor header error\n"); + if (v_lo & TALITOS1_CCPSR_LO_SA) + dev_err(dev, "static assignment error\n"); + if (v_lo & TALITOS1_CCPSR_LO_EU) + report_eu_error(dev, ch, current_desc_hdr(dev, ch)); + + flush_channel(dev, ch, error, 1); + priv->ops->reset_channel(dev, ch); + } + + if (isr_lo & TALITOS1_ISR_TEA_ERR) + dev_err(dev, "TEA error: ISR 0x%08x_%08x\n", isr, isr_lo); + + return (isr & ~TALITOS1_ISR_4CHERR) || isr_lo; +} + +static int sec2_talitos_handle_error(struct device *dev, u32 isr, u32 isr_= lo) { struct talitos_private *priv =3D dev_get_drvdata(dev); unsigned int timeout =3D TALITOS_TIMEOUT; int ch, error, reset_dev =3D 0; u32 v_lo; - bool is_sec1 =3D has_ftr_sec1(priv); - int reset_ch =3D is_sec1 ? 1 : 0; /* only SEC2 supports continuation */ + int reset_ch =3D 0; =20 for (ch =3D 0; ch < priv->num_channels; ch++) { - /* skip channels without errors */ - if (is_sec1) { - /* bits 29, 31, 17, 19 */ - if (!(isr & (1 << (29 + (ch & 1) * 2 - (ch & 2) * 6)))) - continue; - } else { - if (!(isr & (1 << (ch * 2 + 1)))) - continue; - } + if (!TALITOS2_CH_HAS_ERROR(isr, ch)) + continue; =20 error =3D -EINVAL; =20 v_lo =3D in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO); =20 - if (v_lo & TALITOS_CCPSR_LO_DOF) { + if (v_lo & TALITOS2_CCPSR_LO_DOF) { dev_err(dev, "double fetch fifo overflow error\n"); error =3D -EAGAIN; reset_ch =3D 1; } - if (v_lo & TALITOS_CCPSR_LO_SOF) { + if (v_lo & TALITOS2_CCPSR_LO_SOF) { /* h/w dropped descriptor */ dev_err(dev, "single fetch fifo overflow error\n"); error =3D -EAGAIN; } - if (v_lo & TALITOS_CCPSR_LO_MDTE) + if (v_lo & TALITOS2_CCPSR_LO_MDTE) dev_err(dev, "master data transfer error\n"); - if (v_lo & TALITOS_CCPSR_LO_SGDLZ) - dev_err(dev, is_sec1 ? "pointer not complete error\n" - : "s/g data length zero error\n"); - if (v_lo & TALITOS_CCPSR_LO_FPZ) - dev_err(dev, is_sec1 ? "parity error\n" - : "fetch pointer zero error\n"); - if (v_lo & TALITOS_CCPSR_LO_IDH) + if (v_lo & TALITOS2_CCPSR_LO_SGDLZ) + dev_err(dev, "s/g data length zero error\n"); + if (v_lo & TALITOS2_CCPSR_LO_FPZ) + dev_err(dev, "fetch pointer zero error\n"); + if (v_lo & TALITOS2_CCPSR_LO_IDH) dev_err(dev, "illegal descriptor header error\n"); - if (v_lo & TALITOS_CCPSR_LO_IEU) - dev_err(dev, is_sec1 ? "static assignment error\n" - : "invalid exec unit error\n"); - if (v_lo & TALITOS_CCPSR_LO_EU) + if (v_lo & TALITOS2_CCPSR_LO_IEU) + dev_err(dev, "invalid exec unit error\n"); + if (v_lo & TALITOS2_CCPSR_LO_EU) report_eu_error(dev, ch, current_desc_hdr(dev, ch)); - if (!is_sec1) { - if (v_lo & TALITOS_CCPSR_LO_GB) - dev_err(dev, "gather boundary error\n"); - if (v_lo & TALITOS_CCPSR_LO_GRL) - dev_err(dev, "gather return/length error\n"); - if (v_lo & TALITOS_CCPSR_LO_SB) - dev_err(dev, "scatter boundary error\n"); - if (v_lo & TALITOS_CCPSR_LO_SRL) - dev_err(dev, "scatter return/length error\n"); - } + if (v_lo & TALITOS2_CCPSR_LO_GB) + dev_err(dev, "gather boundary error\n"); + if (v_lo & TALITOS2_CCPSR_LO_GRL) + dev_err(dev, "gather return/length error\n"); + if (v_lo & TALITOS2_CCPSR_LO_SB) + dev_err(dev, "scatter boundary error\n"); + if (v_lo & TALITOS2_CCPSR_LO_SRL) + dev_err(dev, "scatter return/length error\n"); =20 flush_channel(dev, ch, error, reset_ch); =20 if (reset_ch) { - reset_channel(dev, ch); + priv->ops->reset_channel(dev, ch); } else { setbits32(priv->chan[ch].reg + TALITOS_CCCR, TALITOS2_CCCR_CONT); setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, 0); while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) & - TALITOS2_CCCR_CONT) && --timeout) + TALITOS2_CCCR_CONT) && --timeout) cpu_relax(); if (timeout =3D=3D 0) { dev_err(dev, "failed to restart channel %d\n", @@ -728,14 +823,29 @@ static void talitos_error(struct device *dev, u32 isr= , u32 isr_lo) } } } - if (reset_dev || (is_sec1 && isr & ~TALITOS1_ISR_4CHERR) || - (!is_sec1 && isr & ~TALITOS2_ISR_4CHERR) || isr_lo) { - if (is_sec1 && (isr_lo & TALITOS1_ISR_TEA_ERR)) - dev_err(dev, "TEA error: ISR 0x%08x_%08x\n", - isr, isr_lo); - else - dev_err(dev, "done overflow, internal time out, or " - "rngu error: ISR 0x%08x_%08x\n", isr, isr_lo); + + return reset_dev || (isr & ~TALITOS2_ISR_4CHERR) || isr_lo; +} + +/* + * recover from error interrupts + */ +static void talitos_error(struct device *dev, u32 isr, u32 isr_lo) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + bool is_sec1 =3D has_ftr_sec1(priv); + int ch, reset_dev; + + if (is_sec1) + reset_dev =3D sec1_talitos_handle_error(dev, isr, isr_lo); + else + reset_dev =3D sec2_talitos_handle_error(dev, isr, isr_lo); + + if (reset_dev) { + dev_err(dev, + "done overflow, internal time out, or " + "rngu error: ISR 0x%08x_%08x\n", + isr, isr_lo); =20 /* purge request queues */ for (ch =3D 0; ch < priv->num_channels; ch++) @@ -1181,25 +1291,41 @@ int talitos_register_common(struct device *dev, return 0; } =20 -static int talitos_probe_irq(struct platform_device *ofdev) +static int sec1_talitos_probe_irq(struct platform_device *ofdev) { struct device *dev =3D &ofdev->dev; struct device_node *np =3D ofdev->dev.of_node; struct talitos_private *priv =3D dev_get_drvdata(dev); int err; - bool is_sec1 =3D has_ftr_sec1(priv); =20 priv->irq[0] =3D irq_of_parse_and_map(np, 0); if (!priv->irq[0]) { dev_err(dev, "failed to map irq\n"); return -EINVAL; } - if (is_sec1) { - err =3D request_irq(priv->irq[0], talitos1_interrupt_4ch, 0, - dev_driver_string(dev), dev); - goto primary_out; + err =3D request_irq(priv->irq[0], talitos1_interrupt_4ch, 0, + dev_driver_string(dev), dev); + if (err) { + dev_err(dev, "failed to request primary irq\n"); + irq_dispose_mapping(priv->irq[0]); + priv->irq[0] =3D 0; } =20 + return err; +} + +static int sec2_talitos_probe_irq(struct platform_device *ofdev) +{ + struct device *dev =3D &ofdev->dev; + struct device_node *np =3D ofdev->dev.of_node; + struct talitos_private *priv =3D dev_get_drvdata(dev); + int err; + + priv->irq[0] =3D irq_of_parse_and_map(np, 0); + if (!priv->irq[0]) { + dev_err(dev, "failed to map irq\n"); + return -EINVAL; + } priv->irq[1] =3D irq_of_parse_and_map(np, 1); =20 /* get the primary irq line */ @@ -1235,6 +1361,36 @@ static int talitos_probe_irq(struct platform_device = *ofdev) return err; } =20 +static void sec1_init_task(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + if (priv->num_channels =3D=3D 1) + tasklet_init(&priv->done_task[0], talitos1_done_ch0, + (unsigned long)dev); + else + tasklet_init(&priv->done_task[0], talitos1_done_4ch, + (unsigned long)dev); +} + +static void sec2_init_task(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + if (priv->irq[1]) { + tasklet_init(&priv->done_task[0], talitos2_done_ch0_2, + (unsigned long)dev); + tasklet_init(&priv->done_task[1], talitos2_done_ch1_3, + (unsigned long)dev); + } else if (priv->num_channels =3D=3D 1) { + tasklet_init(&priv->done_task[0], talitos2_done_ch0, + (unsigned long)dev); + } else { + tasklet_init(&priv->done_task[0], talitos2_done_4ch, + (unsigned long)dev); + } +} + static int talitos_probe(struct platform_device *ofdev) { struct device *dev =3D &ofdev->dev; @@ -1317,31 +1473,17 @@ static int talitos_probe(struct platform_device *of= dev) stride =3D TALITOS2_CH_STRIDE; } =20 - err =3D talitos_probe_irq(ofdev); + if (has_ftr_sec1(priv)) + err =3D sec1_talitos_probe_irq(ofdev); + else + err =3D sec2_talitos_probe_irq(ofdev); if (err) goto err_out; =20 - if (has_ftr_sec1(priv)) { - if (priv->num_channels =3D=3D 1) - tasklet_init(&priv->done_task[0], talitos1_done_ch0, - (unsigned long)dev); - else - tasklet_init(&priv->done_task[0], talitos1_done_4ch, - (unsigned long)dev); - } else { - if (priv->irq[1]) { - tasklet_init(&priv->done_task[0], talitos2_done_ch0_2, - (unsigned long)dev); - tasklet_init(&priv->done_task[1], talitos2_done_ch1_3, - (unsigned long)dev); - } else if (priv->num_channels =3D=3D 1) { - tasklet_init(&priv->done_task[0], talitos2_done_ch0, - (unsigned long)dev); - } else { - tasklet_init(&priv->done_task[0], talitos2_done_4ch, - (unsigned long)dev); - } - } + if (has_ftr_sec1(priv)) + sec1_init_task(dev); + else + sec2_init_task(dev); =20 priv->fifo_len =3D roundup_pow_of_two(priv->chfifo_len); =20 diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 6cf3628c52c2..904fdc9dec80 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -301,20 +301,32 @@ static inline bool has_ftr_sec1(struct talitos_privat= e *priv) #define TALITOS1_CCCR_LO_RESET 0x1 /* channel reset on SEC1 */ =20 /* CCPSR: channel pointer status register */ + +/* bits 29, 31, 17, 19 */ +#define TALITOS1_CH_HAS_ERROR(isr, ch) \ + ((isr) & (1 << (29 + ((ch) & 1) * 2 - ((ch) & 2) * 6))) +#define TALITOS2_CH_HAS_ERROR(isr, ch) ((isr) & (1 << ((ch) * 2 + 1))) + #define TALITOS_CCPSR 0x10 #define TALITOS_CCPSR_LO 0x14 -#define TALITOS_CCPSR_LO_DOF 0x8000 /* double FF write oflow error */ -#define TALITOS_CCPSR_LO_SOF 0x4000 /* single FF write oflow error */ -#define TALITOS_CCPSR_LO_MDTE 0x2000 /* master data transfer error */ -#define TALITOS_CCPSR_LO_SGDLZ 0x1000 /* s/g data len zero error */ -#define TALITOS_CCPSR_LO_FPZ 0x0800 /* fetch ptr zero error */ -#define TALITOS_CCPSR_LO_IDH 0x0400 /* illegal desc hdr error */ -#define TALITOS_CCPSR_LO_IEU 0x0200 /* invalid EU error */ -#define TALITOS_CCPSR_LO_EU 0x0100 /* EU error detected */ -#define TALITOS_CCPSR_LO_GB 0x0080 /* gather boundary error */ -#define TALITOS_CCPSR_LO_GRL 0x0040 /* gather return/length error */ -#define TALITOS_CCPSR_LO_SB 0x0020 /* scatter boundary error */ -#define TALITOS_CCPSR_LO_SRL 0x0010 /* scatter return/length error */ +#define TALITOS1_CCPSR_LO_TEA 0x2000 /* transfer error acknowledge */ +#define TALITOS1_CCPSR_LO_PTRNC 0x1000 /* pointer not complete error */ +#define TALITOS1_CCPSR_LO_PE 0x0800 /* parity error */ +#define TALITOS1_CCPSR_LO_IDH 0x0400 /* illegal desc hdr error */ +#define TALITOS1_CCPSR_LO_SA 0x0200 /* static assignment error */ +#define TALITOS1_CCPSR_LO_EU 0x0100 /* EU error detected */ +#define TALITOS2_CCPSR_LO_DOF 0x8000 /* double FF write oflow error */ +#define TALITOS2_CCPSR_LO_SOF 0x4000 /* single FF write oflow error */ +#define TALITOS2_CCPSR_LO_MDTE 0x2000 /* master data transfer error */ +#define TALITOS2_CCPSR_LO_SGDLZ 0x1000 /* s/g data len zero error */ +#define TALITOS2_CCPSR_LO_FPZ 0x0800 /* fetch ptr zero error */ +#define TALITOS2_CCPSR_LO_IDH 0x0400 /* illegal desc hdr error */ +#define TALITOS2_CCPSR_LO_IEU 0x0200 /* invalid EU error */ +#define TALITOS2_CCPSR_LO_EU 0x0100 /* EU error detected */ +#define TALITOS2_CCPSR_LO_GB 0x0080 /* gather boundary error */ +#define TALITOS2_CCPSR_LO_GRL 0x0040 /* gather return/length error */ +#define TALITOS2_CCPSR_LO_SB 0x0020 /* scatter boundary error */ +#define TALITOS2_CCPSR_LO_SRL 0x0010 /* scatter return/length error */ =20 /* channel fetch fifo register */ #define TALITOS_FF 0x48 --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CD60F3A5E97 for ; Thu, 28 May 2026 09:09:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959388; cv=none; b=dG3QLAePT+ynvn33e4t7LQZECOba++atm8CpW0gZYEgHHXM12y1XNeTKd9YHRvr4ynIhwe+4lcIYVoOo+hVOh3LbMZyfOMJifnn6lTEpizVdcYRlIsMU3DVaprwaIjo0Lota6HQd7mnZAMPOwHJrnTWbxdDMRRamyiHryoOfgvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959388; c=relaxed/simple; bh=BTSBwgLt5hMWdGb57lM5d4Vc1JnP+up3s67JkokV3F4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r0HGO8/W4CA9YNy6L79sXspbUz80OEv+UVAe5lUiDOglL8+P4hqIz9PQXOA2qVvrnXPfbY1gugPzS5fzhmMUkJQFAf+ccMle48HV9jqHSMM9AuLt1eDTPeZGAhAmpFZYVg9R4GbI7GPD7z6wJ1JV9Gp4V4DRXt83zB88iBrligQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=fh+HrzOy; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="fh+HrzOy" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id AB908C62447 for ; Thu, 28 May 2026 09:09:44 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 85E5560495; Thu, 28 May 2026 09:09:44 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id AF69010888CB8; Thu, 28 May 2026 11:09:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959383; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=9Vbekx4ZRxkiaYwmI5aO6ELGv1+EJRijyqHbfJpFx3U=; b=fh+HrzOyon5YlxK+EKFBKzKtAbGEFOqCd4N4kXvBUuz4amWnu11XkisaqyvcI8CLxDGpan gPJE75lHBbvab2p0tra4j04D6oq7djAvuFOtF639w6GVWFeX7oLIGM0L/jv1pDHLLTZfD2 sqLeCOC69fywScQ0QtKqwvhTyp3KgSfRUcgMFZxNpiA9GaTFRKptxVAyjyADN84ELoMT9y CbNkYyaN9JAeknpLp/wJioszl9GeRVtqKwYOdRJsxumApXzizd/S5SQphPYE/wsn2TPZOE WLIXOBE2gLDmSXI07c0NmA7tSjgFHl8vMGZ/tCCMQXRElLWrjobmyAEsZqrJAA== From: Paul Louvel Date: Thu, 28 May 2026 11:08:32 +0200 Subject: [PATCH 19/29] crypto: talitos - Introduce struct talitos_ops Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-19-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=2103; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=BTSBwgLt5hMWdGb57lM5d4Vc1JnP+up3s67JkokV3F4=; b=O9qNjN9+omr/lmCsYQ7U8UTfXePPWWSYAeSsm7unGn5iE6G/a7c3Z/7MBZgVi2n+zT03t+t8s KKRZaB+Hgm9D/1pIb8bJTwLP6MNld2DfvzURWaVianvYUlIad1WCko+ X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Add struct talitos_ops containing function pointers for IRQ probing, tasklet initialization, device and channel reset, device configuration, descriptor DMA mapping, request header retrieval and error handling. Add an ops pointer to struct talitos_private. The ops pointer will be initialized at probe time based on the detected hardware and used to dispatch SEC1/SEC2-specific behaviour. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 904fdc9dec80..46de1bf1ef27 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include =20 @@ -139,6 +140,25 @@ struct talitos_channel { int tail; }; =20 +struct talitos_ops { + int (*probe_irq)(struct platform_device *ofdev); + void (*init_task)(struct device *dev); + int (*reset_device)(struct device *dev); + int (*reset_channel)(struct device *dev, int ch); + void (*configure_device)(struct device *dev); + + void (*dma_map_request)(struct device *dev, + struct talitos_request *request, + struct talitos_desc *desc); + void (*dma_unmap_request)(struct device *dev, + struct talitos_request *request); + __be32 (*get_request_hdr)(struct device *dev, + struct talitos_request *request); + __be32 (*search_desc_hdr_in_request)(struct talitos_request *request, + dma_addr_t cpdr); + int (*handle_error)(struct device *dev, u32 isr, u32 isr_lo); +}; + struct talitos_private { struct device *dev; struct platform_device *ofdev; @@ -162,6 +182,8 @@ struct talitos_private { unsigned int exec_units; unsigned int desc_types; =20 + const struct talitos_ops *ops; + /* SEC Compatibility info */ unsigned long features; =20 --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7505C3A8758 for ; Thu, 28 May 2026 09:09:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959390; cv=none; b=dNFy+Yi5b3ybpIzmYVcoM7tj5q5KpTSNHTsxXdPV2xyBaI30CF256LjCwEU998eYttB/lz1p0ozBFRUDbBOT/xAKoIHnpCEpclutNs7aS6NFYh/IoZE0cG9CC1oWIh3mnaNMGMndx0MTbWTM5P8iKEgLC0Ty03KFfNVHY2mukAE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959390; c=relaxed/simple; bh=+p2GgZeogZTfewEXHIK7LPOkpg/e4FldtqmLtyqa18A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=geEpzSqUaZhmE3XXoYu8Rwd7AsAtg9mfRI1ys31hNB2jyPKuXQ0Bdpa8JEp8my2roN6MYCHKkC5Pmo77+OWjs0OwRLp7hBswDgmZL6YP5Xf9A9mLarQvPOjbLTKUCMSSTw/Xi7BwRAApLztmj4S7QZ466hhWlinhOp0AO/oKw1k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=trr/vtxn; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="trr/vtxn" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id DCB164E42D78 for ; Thu, 28 May 2026 09:09:45 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AB18960495; Thu, 28 May 2026 09:09:45 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 415CA10888CB3; Thu, 28 May 2026 11:09:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959384; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Bli1OtLsg/EBK3jU4yfqXHO/RH6s09XQRTVVFHo48Js=; b=trr/vtxnGqyFzvaMx7L96W+mmdHkINLN6wwg2IgeK6QDdp+faTc7BoiC1cUER/mvdEQc3s vlabSCvurMNTqZrni6PaLrL35zWZZnTTukF9oYSHX9eO8yVGZ7LvbRDPS8yvc7qOode0DV U255m6ktUZh/HG9bKoecLgSxxi0vGy/0MXiiJ3rtZyE2sA1iHB0PV7S1KdM9ewvtl0cUPe v2AycMbugky0gI1CExPh+LJh7HM31/SDy8xrAnO1IN+ijOs0/YwgOHmXmIdbtlKx9Gs143 Ubgp81A9bKSQ8WVNLvYz4IKLfMAjchQYnZxzLU/FsvDRsZ5BtRuD8MnbOeAdBw== From: Paul Louvel Date: Thu, 28 May 2026 11:08:33 +0200 Subject: [PATCH 20/29] crypto: talitos - Replace SEC1/SEC2 conditionals with ops dispatch Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-20-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=6529; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=+p2GgZeogZTfewEXHIK7LPOkpg/e4FldtqmLtyqa18A=; b=fe7ZEMusNxWOuPHdDFjhXWQlZNN/GaFW7JCZm93voPO0tTeKndtGwZfKHks67kvmBVwJCYhA/ bOu7JY5oX5aCQOlsUEN6pwiptp+jam4VccUZu3nBtCRH7ti1qYsQQr6 X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Replace the if/else is_sec1 dispatches in callers with indirect calls through priv->ops. Add static const sec1_ops and sec2_ops structs populated with the SEC1 and SEC2 function variants, and set priv->ops at probe time based on the detected hardware. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos.c | 88 +++++++++++++++++++-----------------= ---- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index b6793d97735e..c4a311a8e7fd 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -258,7 +258,6 @@ static int init_device(struct device *dev) { struct talitos_private *priv =3D dev_get_drvdata(dev); int ch, err; - bool is_sec1 =3D has_ftr_sec1(priv); =20 /* * Master reset @@ -266,35 +265,23 @@ static int init_device(struct device *dev) * are not fully cleared by writing the MCR:SWR bit, * set bit twice to completely reset */ - if (is_sec1) - err =3D sec1_reset_device(dev); - else - err =3D sec2_reset_device(dev); + err =3D priv->ops->reset_device(dev); =20 if (err) return err; =20 - if (is_sec1) - err =3D sec1_reset_device(dev); - else - err =3D sec2_reset_device(dev); + err =3D priv->ops->reset_device(dev); if (err) return err; =20 /* reset channels */ for (ch =3D 0; ch < priv->num_channels; ch++) { - if (is_sec1) - err =3D sec1_reset_channel(dev, ch); - else - err =3D sec2_reset_channel(dev, ch); + err =3D priv->ops->reset_channel(dev, ch); if (err) return err; } =20 - if (is_sec1) - sec1_configure_device(dev); - else - sec2_configure_device(dev); + priv->ops->configure_device(dev); =20 return 0; } @@ -363,7 +350,6 @@ int talitos_submit(struct device *dev, int ch, struct t= alitos_desc *desc, struct talitos_request *request; unsigned long flags; int head; - bool is_sec1 =3D has_ftr_sec1(priv); =20 spin_lock_irqsave(&priv->chan[ch].head_lock, flags); =20 @@ -377,10 +363,8 @@ int talitos_submit(struct device *dev, int ch, struct = talitos_desc *desc, request =3D &priv->chan[ch].fifo[head]; =20 /* map descriptor and save caller data */ - if (is_sec1) - sec1_dma_map_request(dev, request, desc); - else - sec2_dma_map_request(dev, request, desc); + priv->ops->dma_map_request(dev, request, desc); + request->callback =3D callback; request->context =3D context; =20 @@ -461,7 +445,6 @@ static void flush_channel(struct device *dev, int ch, i= nt error, int reset_ch) struct talitos_request *request, saved_req; unsigned long flags; int tail, status; - bool is_sec1 =3D has_ftr_sec1(priv); =20 spin_lock_irqsave(&priv->chan[ch].tail_lock, flags); =20 @@ -473,10 +456,7 @@ static void flush_channel(struct device *dev, int ch, = int error, int reset_ch) =20 /* descriptors with their done bits set don't get the error */ rmb(); - if (is_sec1) - hdr =3D sec1_get_request_hdr(dev, request); - else - hdr =3D sec2_get_request_hdr(dev, request); + hdr =3D priv->ops->get_request_hdr(dev, request); =20 if ((hdr & DESC_HDR_DONE) =3D=3D DESC_HDR_DONE) status =3D 0; @@ -486,10 +466,7 @@ static void flush_channel(struct device *dev, int ch, = int error, int reset_ch) else status =3D error; =20 - if (is_sec1) - sec1_dma_unmap_request(dev, request); - else - sec2_dma_unmap_request(dev, request); + priv->ops->dma_unmap_request(dev, request); =20 /* copy entries so we can call callback outside lock */ saved_req.desc =3D request->desc; @@ -611,7 +588,6 @@ static __be32 sec2_search_desc_hdr_in_request(struct ta= litos_request *request, static __be32 current_desc_hdr(struct device *dev, int ch) { struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); struct talitos_request *request; int tail, iter; dma_addr_t cur_desc; @@ -630,10 +606,7 @@ static __be32 current_desc_hdr(struct device *dev, int= ch) do { request =3D &priv->chan[ch].fifo[iter]; =20 - if (is_sec1) - hdr =3D sec1_search_desc_hdr_in_request(request, cur_desc); - else - hdr =3D sec2_search_desc_hdr_in_request(request, cur_desc); + hdr =3D priv->ops->search_desc_hdr_in_request(request, cur_desc); if (hdr) break; =20 @@ -833,13 +806,9 @@ static int sec2_talitos_handle_error(struct device *de= v, u32 isr, u32 isr_lo) static void talitos_error(struct device *dev, u32 isr, u32 isr_lo) { struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); int ch, reset_dev; =20 - if (is_sec1) - reset_dev =3D sec1_talitos_handle_error(dev, isr, isr_lo); - else - reset_dev =3D sec2_talitos_handle_error(dev, isr, isr_lo); + reset_dev =3D priv->ops->handle_error(dev, isr, isr_lo); =20 if (reset_dev) { dev_err(dev, @@ -1391,6 +1360,32 @@ static void sec2_init_task(struct device *dev) } } =20 +static const struct talitos_ops sec1_ops =3D { + .probe_irq =3D sec1_talitos_probe_irq, + .init_task =3D sec1_init_task, + .reset_device =3D sec1_reset_device, + .reset_channel =3D sec1_reset_channel, + .configure_device =3D sec1_configure_device, + .dma_map_request =3D sec1_dma_map_request, + .dma_unmap_request =3D sec1_dma_unmap_request, + .get_request_hdr =3D sec1_get_request_hdr, + .search_desc_hdr_in_request =3D sec1_search_desc_hdr_in_request, + .handle_error =3D sec1_talitos_handle_error, +}; + +static const struct talitos_ops sec2_ops =3D { + .probe_irq =3D sec2_talitos_probe_irq, + .init_task =3D sec2_init_task, + .reset_device =3D sec2_reset_device, + .reset_channel =3D sec2_reset_channel, + .configure_device =3D sec2_configure_device, + .dma_map_request =3D sec2_dma_map_request, + .dma_unmap_request =3D sec2_dma_unmap_request, + .get_request_hdr =3D sec2_get_request_hdr, + .search_desc_hdr_in_request =3D sec2_search_desc_hdr_in_request, + .handle_error =3D sec2_talitos_handle_error, +}; + static int talitos_probe(struct platform_device *ofdev) { struct device *dev =3D &ofdev->dev; @@ -1474,16 +1469,15 @@ static int talitos_probe(struct platform_device *of= dev) } =20 if (has_ftr_sec1(priv)) - err =3D sec1_talitos_probe_irq(ofdev); + priv->ops =3D &sec1_ops; else - err =3D sec2_talitos_probe_irq(ofdev); + priv->ops =3D &sec2_ops; + + err =3D priv->ops->probe_irq(ofdev); if (err) goto err_out; =20 - if (has_ftr_sec1(priv)) - sec1_init_task(dev); - else - sec2_init_task(dev); + priv->ops->init_task(dev); =20 priv->fifo_len =3D roundup_pow_of_two(priv->chfifo_len); =20 --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C22CB3AF67C; Thu, 28 May 2026 09:09:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959391; cv=none; b=eWyomY+lKQRTU8bvtrf7Ui4epTGbFz7fdGaCYcVvVZr84FYLq42v4NdxuzXCFFocuHMrFL7e3rYqJuR83s+rkJteD7Y8PfJ+JoabW8ria0ZI106urvBqwdUWYxOsCyLwfD15hQzYgMaqkjXbd3LV+iYVWixEZMoKusBG4akigI0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959391; c=relaxed/simple; bh=5Pmjn+ztmMrgnlm74oBBbo6EUluEiD9cCOgWsGrMha8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LwOu6jQXC0S0DqDXh383Dedz6vF/WWAvekTt4OJnM2z8nos16GK4YJgpTO16OSQfnwzOcIXFhf2uIii2SAAJ16vJ/XuCIkgc/CjkUnQHV0SA+5ynqikEPKQ1f5tR9ELlee/6474IyUHw8kKaVSz4/ctOfTQO17R9sz/sBVBprPM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ROJAGqFm; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ROJAGqFm" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 4231B1A36FE; Thu, 28 May 2026 09:09:47 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0BE4B60495; Thu, 28 May 2026 09:09:47 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 698CE10888CB5; Thu, 28 May 2026 11:09:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959386; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=xKJBjvpBTiYz28369BMq8WqlUyUro9t2c5FC6cwFWis=; b=ROJAGqFmq482coHZC+I4TtwTJnJViloKrSWQhNb6WKu9/mNMFO/TRSdkwVx73Sf5hx+JZh Cr6CBvz295dWrRToJLMv87HvQWxC3sq6372B8LvUuYRBuTK5G/asdUsFbX+BOwFocee9Ny dXKio5v89DBu/RdzxgSzeqzMzVP3XBIagohvQhUCgqGi3wC2/+4+9At9GNO8VdYBd/M9sb wRMd3Z60Y2retZqV2B/hiLhWJd+RKNf53ZFXU/r8UgCnfbZiVyYjm7MqQOjooOGTufjSvh nwS4fUuYZqe48mCFFisfBVFe6Xt69WlBkeAAxLJ0xD7G38zOWhYpUBjxt2DM3w== From: Paul Louvel Date: Thu, 28 May 2026 11:08:34 +0200 Subject: [PATCH 21/29] crypto: talitos - Export common channel and error handling routines Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-21-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=6201; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=5Pmjn+ztmMrgnlm74oBBbo6EUluEiD9cCOgWsGrMha8=; b=xh2AQWTNu2V1pwKAKRD4UJ4AQhsqDpek7OmaA92TqMBNh4BP3kuKa8nHTtfxXC/CS3jiwoBO3 bhz/n9faRT9A2Fpe0PK4CAev0KlIuZcbjEGkE4qmWL1fgFJSOhTaqwu X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Remove the static qualifier from flush_channel(), current_desc_hdr(), report_eu_error(), and talitos_error(); add the talitos_ prefix where missing; and declare them in talitos.h. These routines will be called from the upcoming SEC1/SEC2 compilation units, so they need to be externally visible. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos.c | 36 +++++++++++++++++++----------------- drivers/crypto/talitos/talitos.h | 5 +++++ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index c4a311a8e7fd..827d075ecfaa 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -439,7 +439,7 @@ static void sec2_dma_unmap_request(struct device *dev, /* * process what was done, notify callback of error if not */ -static void flush_channel(struct device *dev, int ch, int error, int reset= _ch) +void talitos_flush_channel(struct device *dev, int ch, int error, int rese= t_ch) { struct talitos_private *priv =3D dev_get_drvdata(dev); struct talitos_request *request, saved_req; @@ -507,13 +507,13 @@ static void talitos1_done_##name(unsigned long data) = \ unsigned long flags; \ \ if (ch_done_mask & 0x10000000) \ - flush_channel(dev, 0, 0, 0); \ + talitos_flush_channel(dev, 0, 0, 0); \ if (ch_done_mask & 0x40000000) \ - flush_channel(dev, 1, 0, 0); \ + talitos_flush_channel(dev, 1, 0, 0); \ if (ch_done_mask & 0x00010000) \ - flush_channel(dev, 2, 0, 0); \ + talitos_flush_channel(dev, 2, 0, 0); \ if (ch_done_mask & 0x00040000) \ - flush_channel(dev, 3, 0, 0); \ + talitos_flush_channel(dev, 3, 0, 0); \ \ /* At this point, all completed channels have been processed */ \ /* Unmask done interrupts for channels completed later on. */ \ @@ -534,13 +534,13 @@ static void talitos2_done_##name(unsigned long data) = \ unsigned long flags; \ \ if (ch_done_mask & 1) \ - flush_channel(dev, 0, 0, 0); \ + talitos_flush_channel(dev, 0, 0, 0); \ if (ch_done_mask & (1 << 2)) \ - flush_channel(dev, 1, 0, 0); \ + talitos_flush_channel(dev, 1, 0, 0); \ if (ch_done_mask & (1 << 4)) \ - flush_channel(dev, 2, 0, 0); \ + talitos_flush_channel(dev, 2, 0, 0); \ if (ch_done_mask & (1 << 6)) \ - flush_channel(dev, 3, 0, 0); \ + talitos_flush_channel(dev, 3, 0, 0); \ \ /* At this point, all completed channels have been processed */ \ /* Unmask done interrupts for channels completed later on. */ \ @@ -585,7 +585,7 @@ static __be32 sec2_search_desc_hdr_in_request(struct ta= litos_request *request, /* * locate current (offending) descriptor */ -static __be32 current_desc_hdr(struct device *dev, int ch) +__be32 talitos_current_desc_hdr(struct device *dev, int ch) { struct talitos_private *priv =3D dev_get_drvdata(dev); struct talitos_request *request; @@ -622,7 +622,7 @@ static __be32 current_desc_hdr(struct device *dev, int = ch) /* * user diagnostics; report root cause of error based on execution unit st= atus */ -static void report_eu_error(struct device *dev, int ch, __be32 desc_hdr) +void talitos_report_eu_error(struct device *dev, int ch, __be32 desc_hdr) { struct talitos_private *priv =3D dev_get_drvdata(dev); int i; @@ -719,9 +719,10 @@ static int sec1_talitos_handle_error(struct device *de= v, u32 isr, u32 isr_lo) if (v_lo & TALITOS1_CCPSR_LO_SA) dev_err(dev, "static assignment error\n"); if (v_lo & TALITOS1_CCPSR_LO_EU) - report_eu_error(dev, ch, current_desc_hdr(dev, ch)); + talitos_report_eu_error( + dev, ch, talitos_current_desc_hdr(dev, ch)); =20 - flush_channel(dev, ch, error, 1); + talitos_flush_channel(dev, ch, error, 1); priv->ops->reset_channel(dev, ch); } =20 @@ -768,7 +769,8 @@ static int sec2_talitos_handle_error(struct device *dev= , u32 isr, u32 isr_lo) if (v_lo & TALITOS2_CCPSR_LO_IEU) dev_err(dev, "invalid exec unit error\n"); if (v_lo & TALITOS2_CCPSR_LO_EU) - report_eu_error(dev, ch, current_desc_hdr(dev, ch)); + talitos_report_eu_error( + dev, ch, talitos_current_desc_hdr(dev, ch)); if (v_lo & TALITOS2_CCPSR_LO_GB) dev_err(dev, "gather boundary error\n"); if (v_lo & TALITOS2_CCPSR_LO_GRL) @@ -778,7 +780,7 @@ static int sec2_talitos_handle_error(struct device *dev= , u32 isr, u32 isr_lo) if (v_lo & TALITOS2_CCPSR_LO_SRL) dev_err(dev, "scatter return/length error\n"); =20 - flush_channel(dev, ch, error, reset_ch); + talitos_flush_channel(dev, ch, error, reset_ch); =20 if (reset_ch) { priv->ops->reset_channel(dev, ch); @@ -803,7 +805,7 @@ static int sec2_talitos_handle_error(struct device *dev= , u32 isr, u32 isr_lo) /* * recover from error interrupts */ -static void talitos_error(struct device *dev, u32 isr, u32 isr_lo) +void talitos_error(struct device *dev, u32 isr, u32 isr_lo) { struct talitos_private *priv =3D dev_get_drvdata(dev); int ch, reset_dev; @@ -818,7 +820,7 @@ static void talitos_error(struct device *dev, u32 isr, = u32 isr_lo) =20 /* purge request queues */ for (ch =3D 0; ch < priv->num_channels; ch++) - flush_channel(dev, ch, -EIO, 1); + talitos_flush_channel(dev, ch, -EIO, 1); =20 /* reset and reinitialize the device */ init_device(dev); diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 46de1bf1ef27..98b2cb5115f8 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -561,6 +561,11 @@ void talitos_cra_exit(struct crypto_tfm *tfm); int talitos_register_common(struct device *dev, struct talitos_alg_template *template); =20 +void talitos_flush_channel(struct device *dev, int ch, int error, int rese= t_ch); +__be32 talitos_current_desc_hdr(struct device *dev, int ch); +void talitos_error(struct device *dev, u32 isr, u32 isr_lo); +void talitos_report_eu_error(struct device *dev, int ch, __be32 desc_hdr); + /* Hardware RNG */ =20 int talitos_register_rng(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CFBE63A8741 for ; Thu, 28 May 2026 09:09:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959393; cv=none; b=hyTdb66Ti3kRXa4EbUhTnpnhFKEWQIvMzlita6qd5CTiXbzgDBKvOWk5ROGWXecRqgLpVI4pXG/aYLGScU/+bwuD2rn/Xx+9wMW6lL3ceaHGVssdhVKv1M0Uk5iZ00c4+r6S4hP0BSL7MnFrcqwOswBhUJpXcbPg8oTi3wVvMyE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959393; c=relaxed/simple; bh=VBAD9NuH03xWJrTBmRuvHN3BavrW/bFp/FqE7e0d3FY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Dz2CXfF5MjdivH9ylPXlDesC0Usij/yvho55DuST2LTeRyyODoKGolSZqTJzlOWD3AZe9E2zcJ7TKf6q6DqHKmzb720+YsOqPnQpm73Wd+ByGBv+51HFQOSJg68KIp5MWqGKpOghQEG6o91c9jHT3W47vPKk5lK+Eg7mK02yhwQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=vFfA/i4h; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="vFfA/i4h" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 73EDFC6244A for ; Thu, 28 May 2026 09:09:48 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4C59260495; Thu, 28 May 2026 09:09:48 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8D9EA10888054; Thu, 28 May 2026 11:09:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959387; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=sHutvC1GP3emoHslG85fSmnHI5NVAmOhI7EifFu37Fc=; b=vFfA/i4hbm/0N5LaOxIXZZwscuHvoR+VVnRenzgv3vP1m3b11OxUKBZGTUf7rGGkZqqKPY o+pBT5aUZbvOqjIW0RtzoXwJ/Rh3CLO+qOOM/5l/73QEURb7g/WczQqt23VHDbHmmgGKA2 eXjHIZ13a6h9ECMC020XJUw0w/qz5EP91laF/PqzZO9c8i+PmlOatXYkMSKc2+VLU9CM9N L/iwnXRwF6s0iunTeUxtxsZbMCdnJt2qxt3HN4lmKXuU4eLzG0xVn4R+shIsv4TutKshPB zTi8WPR6kFR7jGHQaXNH9Y8GXWBKFEL0krJ/ekIiBTS1uDj3fEi9isRBZixrMg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:35 +0200 Subject: [PATCH 22/29] crypto: talitos - Move SEC1 ops into talitos-sec1.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-22-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=23999; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=VBAD9NuH03xWJrTBmRuvHN3BavrW/bFp/FqE7e0d3FY=; b=doE2xtTdKqt0zH3pXGUNBQBYyLl9s0NajlcDOZkTuo7vLL5uqd/ZvHNfQHKtwtPuf7BFtJ1qW wKbCKhJrn+2COibunvS0Za74FzOyFHOQw/nnPP0o+4Ac0dHmflZ+/Tp X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Relocate all SEC1-specific functions and the sec1_ops / talitos_register_sec1() definitions from talitos.c into a new talitos-sec1.c compilation unit. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/Makefile | 2 + drivers/crypto/talitos/talitos-sec1.c | 305 ++++++++++++++++++++++++++++++= ++++ drivers/crypto/talitos/talitos.c | 289 +-----------------------------= -- drivers/crypto/talitos/talitos.h | 8 + 4 files changed, 316 insertions(+), 288 deletions(-) diff --git a/drivers/crypto/talitos/Makefile b/drivers/crypto/talitos/Makef= ile index 9e80bb094507..5f3bc89ad7ea 100644 --- a/drivers/crypto/talitos/Makefile +++ b/drivers/crypto/talitos/Makefile @@ -1,3 +1,5 @@ obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos.o =20 talitos-y :=3D talitos.o talitos-rng.o talitos-hash.o talitos-skcipher.o t= alitos-aead.o + +talitos-$(CONFIG_CRYPTO_DEV_TALITOS1) +=3D talitos-sec1.o diff --git a/drivers/crypto/talitos/talitos-sec1.c b/drivers/crypto/talitos= /talitos-sec1.c new file mode 100644 index 000000000000..695d531aa7f4 --- /dev/null +++ b/drivers/crypto/talitos/talitos-sec1.c @@ -0,0 +1,305 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * Freescale SEC (talitos) SEC1 specific driver code + * + * Copyright (c) 2006-2011 Freescale Semiconductor, Inc. + */ + +#include +#include + +#include "talitos.h" + +#define DEF_TALITOS1_DONE(name, ch_done_mask) \ +static void talitos1_done_##name(unsigned long data) \ +{ \ + struct device *dev =3D (struct device *)data; \ + struct talitos_private *priv =3D dev_get_drvdata(dev); \ + unsigned long flags; \ + \ + if (ch_done_mask & 0x10000000) \ + talitos_flush_channel(dev, 0, 0, 0); \ + if (ch_done_mask & 0x40000000) \ + talitos_flush_channel(dev, 1, 0, 0); \ + if (ch_done_mask & 0x00010000) \ + talitos_flush_channel(dev, 2, 0, 0); \ + if (ch_done_mask & 0x00040000) \ + talitos_flush_channel(dev, 3, 0, 0); \ + \ + /* At this point, all completed channels have been processed */ \ + /* Unmask done interrupts for channels completed later on. */ \ + spin_lock_irqsave(&priv->reg_lock, flags); \ + clrbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ + clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT); \ + spin_unlock_irqrestore(&priv->reg_lock, flags); \ +} + +DEF_TALITOS1_DONE(4ch, TALITOS1_ISR_4CHDONE) +DEF_TALITOS1_DONE(ch0, TALITOS1_ISR_CH_0_DONE) + +#define DEF_TALITOS1_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet) = \ +static irqreturn_t talitos1_interrupt_##name(int irq, void *data) \ +{ \ + struct device *dev =3D data; \ + struct talitos_private *priv =3D dev_get_drvdata(dev); \ + u32 isr, isr_lo; \ + unsigned long flags; \ + \ + spin_lock_irqsave(&priv->reg_lock, flags); \ + isr =3D in_be32(priv->reg + TALITOS_ISR); \ + isr_lo =3D in_be32(priv->reg + TALITOS_ISR_LO); \ + /* Acknowledge interrupt */ \ + out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \ + out_be32(priv->reg + TALITOS_ICR_LO, isr_lo); \ + \ + if (unlikely(isr & ch_err_mask || isr_lo & TALITOS1_IMR_LO_INIT)) { \ + spin_unlock_irqrestore(&priv->reg_lock, flags); \ + talitos_error(dev, isr & ch_err_mask, isr_lo); \ + } \ + else { \ + if (likely(isr & ch_done_mask)) { \ + /* mask further done interrupts. */ \ + setbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ + /* done_task will unmask done interrupts at exit */ \ + tasklet_schedule(&priv->done_task[tlet]); \ + } \ + spin_unlock_irqrestore(&priv->reg_lock, flags); \ + } \ + \ + return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED : \ + IRQ_NONE; \ +} + +DEF_TALITOS1_INTERRUPT(4ch, TALITOS1_ISR_4CHDONE, TALITOS1_ISR_4CHERR, 0) + +static int sec1_reset_device(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + unsigned int timeout =3D TALITOS_TIMEOUT; + + setbits32(priv->reg + TALITOS_MCR, TALITOS1_MCR_SWR); + + while ((in_be32(priv->reg + TALITOS_MCR) & TALITOS1_MCR_SWR) && + --timeout) + cpu_relax(); + + if (timeout =3D=3D 0) { + dev_err(dev, "failed to reset sec1 device\n"); + return -EIO; + } + + return 0; +} + +static int sec1_reset_channel(struct device *dev, int ch) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + unsigned int timeout =3D TALITOS_TIMEOUT; + + setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, TALITOS1_CCCR_LO_RESET); + + while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR_LO) & + TALITOS1_CCCR_LO_RESET) && + --timeout) + cpu_relax(); + + if (timeout =3D=3D 0) { + dev_err(dev, "failed to reset sec1 channel %d\n", ch); + return -EIO; + } + + setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, + TALITOS_CCCR_LO_NE | TALITOS_CCCR_LO_CDIE | + TALITOS_CCCR_LO_CDWE); + + return 0; +} + +static void sec1_configure_device(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + clrbits32(priv->reg + TALITOS_IMR, TALITOS1_IMR_INIT); + clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT); + /* disable parity error check in DEU (erroneous? test vect.) */ + setbits32(priv->reg_deu + TALITOS_EUICR, TALITOS1_DEUICR_KPE); +} + +static void sec1_dma_map_request(struct device *dev, + struct talitos_request *request, + struct talitos_desc *desc) +{ + struct talitos_edesc *edesc =3D + container_of(desc, struct talitos_edesc, desc); + dma_addr_t dma_desc, prev_dma_desc; + struct talitos_edesc *prev_edesc =3D NULL; + + while (edesc) { + edesc->desc.hdr1 =3D edesc->desc.hdr; + + dma_desc =3D dma_map_single(dev, &edesc->desc.hdr1, + TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); + + if (!prev_edesc) { + request->dma_desc =3D dma_desc; + goto next; + } + + /* Chain in any previous descriptors. */ + + prev_edesc->desc.next_desc =3D cpu_to_be32(dma_desc); + + dma_sync_single_for_device(dev, prev_dma_desc, + TALITOS_DESC_SIZE, DMA_TO_DEVICE); + +next: + prev_edesc =3D edesc; + prev_dma_desc =3D dma_desc; + edesc =3D edesc->next_desc; + } +} + +static void sec1_dma_unmap_request(struct device *dev, + struct talitos_request *request) +{ + struct talitos_edesc *edesc; + + dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, + DMA_BIDIRECTIONAL); + edesc =3D container_of(request->desc, struct talitos_edesc, desc); + while (edesc->next_desc) { + dma_unmap_single(dev, be32_to_cpu(edesc->desc.next_desc), + TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); + edesc =3D edesc->next_desc; + } +} + +static __be32 sec1_get_request_hdr(struct device *dev, + struct talitos_request *request) +{ + struct talitos_edesc *edesc; + dma_addr_t dma_desc; + + edesc =3D container_of(request->desc, struct talitos_edesc, desc); + dma_desc =3D request->dma_desc; + while (edesc->next_desc) { + dma_desc =3D be32_to_cpu(edesc->desc.next_desc); + edesc =3D edesc->next_desc; + } + + dma_sync_single_for_cpu(dev, dma_desc, TALITOS_DESC_SIZE, + DMA_BIDIRECTIONAL); + + return edesc->desc.hdr1; +} + +static __be32 sec1_search_desc_hdr_in_request(struct talitos_request *requ= est, + dma_addr_t cur_desc) +{ + struct talitos_edesc *edesc; + + + if (request->dma_desc =3D=3D cur_desc) + return request->desc->hdr; + + edesc =3D container_of(request->desc, struct talitos_edesc, desc); + while (edesc->next_desc) { + if (edesc->desc.next_desc =3D=3D cpu_to_be32(cur_desc)) + return edesc->next_desc->desc.hdr1; + edesc =3D edesc->next_desc; + } + + return 0; +} + +static int sec1_talitos_handle_error(struct device *dev, u32 isr, u32 isr_= lo) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + int ch, error; + u32 v_lo; + + for (ch =3D 0; ch < priv->num_channels; ch++) { + if (!TALITOS1_CH_HAS_ERROR(isr, ch)) + continue; + + v_lo =3D in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO); + + error =3D -EINVAL; + + if (v_lo & TALITOS1_CCPSR_LO_TEA) + dev_err(dev, "transfer error acknowledge\n"); + if (v_lo & TALITOS1_CCPSR_LO_PTRNC) + dev_err(dev, "pointer not complete error\n"); + if (v_lo & TALITOS1_CCPSR_LO_PE) + dev_err(dev, "parity error\n"); + if (v_lo & TALITOS1_CCPSR_LO_IDH) + dev_err(dev, "illegal descriptor header error\n"); + if (v_lo & TALITOS1_CCPSR_LO_SA) + dev_err(dev, "static assignment error\n"); + if (v_lo & TALITOS1_CCPSR_LO_EU) + talitos_report_eu_error( + dev, ch, talitos_current_desc_hdr(dev, ch)); + + talitos_flush_channel(dev, ch, error, 1); + priv->ops->reset_channel(dev, ch); + } + + if (isr_lo & TALITOS1_ISR_TEA_ERR) + dev_err(dev, "TEA error: ISR 0x%08x_%08x\n", isr, isr_lo); + + return (isr & ~TALITOS1_ISR_4CHERR) || isr_lo; +} + +static int sec1_talitos_probe_irq(struct platform_device *ofdev) +{ + struct device *dev =3D &ofdev->dev; + struct device_node *np =3D ofdev->dev.of_node; + struct talitos_private *priv =3D dev_get_drvdata(dev); + int err; + + priv->irq[0] =3D irq_of_parse_and_map(np, 0); + if (!priv->irq[0]) { + dev_err(dev, "failed to map irq\n"); + return -EINVAL; + } + err =3D request_irq(priv->irq[0], talitos1_interrupt_4ch, 0, + dev_driver_string(dev), dev); + if (err) { + dev_err(dev, "failed to request primary irq\n"); + irq_dispose_mapping(priv->irq[0]); + priv->irq[0] =3D 0; + } + + return err; +} + +static void sec1_init_task(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + if (priv->num_channels =3D=3D 1) + tasklet_init(&priv->done_task[0], talitos1_done_ch0, + (unsigned long)dev); + else + tasklet_init(&priv->done_task[0], talitos1_done_4ch, + (unsigned long)dev); +} + +static const struct talitos_ops sec1_ops =3D { + .probe_irq =3D sec1_talitos_probe_irq, + .init_task =3D sec1_init_task, + .reset_device =3D sec1_reset_device, + .reset_channel =3D sec1_reset_channel, + .configure_device =3D sec1_configure_device, + .dma_map_request =3D sec1_dma_map_request, + .dma_unmap_request =3D sec1_dma_unmap_request, + .get_request_hdr =3D sec1_get_request_hdr, + .search_desc_hdr_in_request =3D sec1_search_desc_hdr_in_request, + .handle_error =3D sec1_talitos_handle_error, +}; + +void talitos_register_sec1(struct talitos_private *priv) +{ + priv->ops =3D &sec1_ops; +} diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 827d075ecfaa..a4fd14c8bef5 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -133,30 +133,6 @@ void unmap_single_talitos_ptr(struct device *dev, from_talitos_ptr_len(ptr, is_sec1), dir); } =20 -static int sec1_reset_channel(struct device *dev, int ch) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - unsigned int timeout =3D TALITOS_TIMEOUT; - - setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, TALITOS1_CCCR_LO_RESET); - - while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR_LO) & - TALITOS1_CCCR_LO_RESET) && - --timeout) - cpu_relax(); - - if (timeout =3D=3D 0) { - dev_err(dev, "failed to reset sec1 channel %d\n", ch); - return -EIO; - } - - setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, - TALITOS_CCCR_LO_NE | TALITOS_CCCR_LO_CDIE | - TALITOS_CCCR_LO_CDWE); - - return 0; -} - static int sec2_reset_channel(struct device *dev, int ch) { struct talitos_private *priv =3D dev_get_drvdata(dev); @@ -186,25 +162,6 @@ static int sec2_reset_channel(struct device *dev, int = ch) return 0; } =20 -static int sec1_reset_device(struct device *dev) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - unsigned int timeout =3D TALITOS_TIMEOUT; - - setbits32(priv->reg + TALITOS_MCR, TALITOS1_MCR_SWR); - - while ((in_be32(priv->reg + TALITOS_MCR) & TALITOS1_MCR_SWR) && - --timeout) - cpu_relax(); - - if (timeout =3D=3D 0) { - dev_err(dev, "failed to reset sec1 device\n"); - return -EIO; - } - - return 0; -} - static int sec2_reset_device(struct device *dev) { struct talitos_private *priv =3D dev_get_drvdata(dev); @@ -228,16 +185,6 @@ static int sec2_reset_device(struct device *dev) return 0; } =20 -static void sec1_configure_device(struct device *dev) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - - clrbits32(priv->reg + TALITOS_IMR, TALITOS1_IMR_INIT); - clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT); - /* disable parity error check in DEU (erroneous? test vect.) */ - setbits32(priv->reg_deu + TALITOS_EUICR, TALITOS1_DEUICR_KPE); -} - static void sec2_configure_device(struct device *dev) { struct talitos_private *priv =3D dev_get_drvdata(dev); @@ -286,40 +233,6 @@ static int init_device(struct device *dev) return 0; } =20 -static void sec1_dma_map_request(struct device *dev, - struct talitos_request *request, - struct talitos_desc *desc) -{ - struct talitos_edesc *edesc =3D - container_of(desc, struct talitos_edesc, desc); - dma_addr_t dma_desc, prev_dma_desc; - struct talitos_edesc *prev_edesc =3D NULL; - - while (edesc) { - edesc->desc.hdr1 =3D edesc->desc.hdr; - - dma_desc =3D dma_map_single(dev, &edesc->desc.hdr1, - TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); - - if (!prev_edesc) { - request->dma_desc =3D dma_desc; - goto next; - } - - /* Chain in any previous descriptors. */ - - prev_edesc->desc.next_desc =3D cpu_to_be32(dma_desc); - - dma_sync_single_for_device(dev, prev_dma_desc, - TALITOS_DESC_SIZE, DMA_TO_DEVICE); - -next: - prev_edesc =3D edesc; - prev_dma_desc =3D dma_desc; - edesc =3D edesc->next_desc; - } -} - static void sec2_dma_map_request(struct device *dev, struct talitos_request *request, struct talitos_desc *desc) @@ -386,25 +299,6 @@ int talitos_submit(struct device *dev, int ch, struct = talitos_desc *desc, return -EINPROGRESS; } =20 -static __be32 sec1_get_request_hdr(struct device *dev, - struct talitos_request *request) -{ - struct talitos_edesc *edesc; - dma_addr_t dma_desc; - - edesc =3D container_of(request->desc, struct talitos_edesc, desc); - dma_desc =3D request->dma_desc; - while (edesc->next_desc) { - dma_desc =3D be32_to_cpu(edesc->desc.next_desc); - edesc =3D edesc->next_desc; - } - - dma_sync_single_for_cpu(dev, dma_desc, TALITOS_DESC_SIZE, - DMA_BIDIRECTIONAL); - - return edesc->desc.hdr1; -} - static __be32 sec2_get_request_hdr(struct device *dev, struct talitos_request *request) { @@ -414,21 +308,6 @@ static __be32 sec2_get_request_hdr(struct device *dev, return request->desc->hdr; } =20 -static void sec1_dma_unmap_request(struct device *dev, - struct talitos_request *request) -{ - struct talitos_edesc *edesc; - - dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, - DMA_BIDIRECTIONAL); - edesc =3D container_of(request->desc, struct talitos_edesc, desc); - while (edesc->next_desc) { - dma_unmap_single(dev, be32_to_cpu(edesc->desc.next_desc), - TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); - edesc =3D edesc->next_desc; - } -} - static void sec2_dma_unmap_request(struct device *dev, struct talitos_request *request) { @@ -499,32 +378,6 @@ void talitos_flush_channel(struct device *dev, int ch,= int error, int reset_ch) /* * process completed requests for channels that have done status */ -#define DEF_TALITOS1_DONE(name, ch_done_mask) \ -static void talitos1_done_##name(unsigned long data) \ -{ \ - struct device *dev =3D (struct device *)data; \ - struct talitos_private *priv =3D dev_get_drvdata(dev); \ - unsigned long flags; \ - \ - if (ch_done_mask & 0x10000000) \ - talitos_flush_channel(dev, 0, 0, 0); \ - if (ch_done_mask & 0x40000000) \ - talitos_flush_channel(dev, 1, 0, 0); \ - if (ch_done_mask & 0x00010000) \ - talitos_flush_channel(dev, 2, 0, 0); \ - if (ch_done_mask & 0x00040000) \ - talitos_flush_channel(dev, 3, 0, 0); \ - \ - /* At this point, all completed channels have been processed */ \ - /* Unmask done interrupts for channels completed later on. */ \ - spin_lock_irqsave(&priv->reg_lock, flags); \ - clrbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ - clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT); \ - spin_unlock_irqrestore(&priv->reg_lock, flags); \ -} - -DEF_TALITOS1_DONE(4ch, TALITOS1_ISR_4CHDONE) -DEF_TALITOS1_DONE(ch0, TALITOS1_ISR_CH_0_DONE) =20 #define DEF_TALITOS2_DONE(name, ch_done_mask) \ static void talitos2_done_##name(unsigned long data) \ @@ -555,25 +408,6 @@ DEF_TALITOS2_DONE(ch0, TALITOS2_ISR_CH_0_DONE) DEF_TALITOS2_DONE(ch0_2, TALITOS2_ISR_CH_0_2_DONE) DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE) =20 -static __be32 sec1_search_desc_hdr_in_request(struct talitos_request *requ= est, - dma_addr_t cur_desc) -{ - struct talitos_edesc *edesc; - - - if (request->dma_desc =3D=3D cur_desc) - return request->desc->hdr; - - edesc =3D container_of(request->desc, struct talitos_edesc, desc); - while (edesc->next_desc) { - if (edesc->desc.next_desc =3D=3D cpu_to_be32(cur_desc)) - return edesc->next_desc->desc.hdr1; - edesc =3D edesc->next_desc; - } - - return 0; -} - static __be32 sec2_search_desc_hdr_in_request(struct talitos_request *requ= est, dma_addr_t cur_desc) { @@ -694,44 +528,6 @@ void talitos_report_eu_error(struct device *dev, int c= h, __be32 desc_hdr) in_be32(priv->chan[ch].reg + TALITOS_DESCBUF_LO + 8*i)); } =20 -static int sec1_talitos_handle_error(struct device *dev, u32 isr, u32 isr_= lo) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - int ch, error; - u32 v_lo; - - for (ch =3D 0; ch < priv->num_channels; ch++) { - if (!TALITOS1_CH_HAS_ERROR(isr, ch)) - continue; - - v_lo =3D in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO); - - error =3D -EINVAL; - - if (v_lo & TALITOS1_CCPSR_LO_TEA) - dev_err(dev, "transfer error acknowledge\n"); - if (v_lo & TALITOS1_CCPSR_LO_PTRNC) - dev_err(dev, "pointer not complete error\n"); - if (v_lo & TALITOS1_CCPSR_LO_PE) - dev_err(dev, "parity error\n"); - if (v_lo & TALITOS1_CCPSR_LO_IDH) - dev_err(dev, "illegal descriptor header error\n"); - if (v_lo & TALITOS1_CCPSR_LO_SA) - dev_err(dev, "static assignment error\n"); - if (v_lo & TALITOS1_CCPSR_LO_EU) - talitos_report_eu_error( - dev, ch, talitos_current_desc_hdr(dev, ch)); - - talitos_flush_channel(dev, ch, error, 1); - priv->ops->reset_channel(dev, ch); - } - - if (isr_lo & TALITOS1_ISR_TEA_ERR) - dev_err(dev, "TEA error: ISR 0x%08x_%08x\n", isr, isr_lo); - - return (isr & ~TALITOS1_ISR_4CHERR) || isr_lo; -} - static int sec2_talitos_handle_error(struct device *dev, u32 isr, u32 isr_= lo) { struct talitos_private *priv =3D dev_get_drvdata(dev); @@ -827,41 +623,6 @@ void talitos_error(struct device *dev, u32 isr, u32 is= r_lo) } } =20 -#define DEF_TALITOS1_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet) = \ -static irqreturn_t talitos1_interrupt_##name(int irq, void *data) \ -{ \ - struct device *dev =3D data; \ - struct talitos_private *priv =3D dev_get_drvdata(dev); \ - u32 isr, isr_lo; \ - unsigned long flags; \ - \ - spin_lock_irqsave(&priv->reg_lock, flags); \ - isr =3D in_be32(priv->reg + TALITOS_ISR); \ - isr_lo =3D in_be32(priv->reg + TALITOS_ISR_LO); \ - /* Acknowledge interrupt */ \ - out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \ - out_be32(priv->reg + TALITOS_ICR_LO, isr_lo); \ - \ - if (unlikely(isr & ch_err_mask || isr_lo & TALITOS1_IMR_LO_INIT)) { \ - spin_unlock_irqrestore(&priv->reg_lock, flags); \ - talitos_error(dev, isr & ch_err_mask, isr_lo); \ - } \ - else { \ - if (likely(isr & ch_done_mask)) { \ - /* mask further done interrupts. */ \ - setbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ - /* done_task will unmask done interrupts at exit */ \ - tasklet_schedule(&priv->done_task[tlet]); \ - } \ - spin_unlock_irqrestore(&priv->reg_lock, flags); \ - } \ - \ - return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED : \ - IRQ_NONE; \ -} - -DEF_TALITOS1_INTERRUPT(4ch, TALITOS1_ISR_4CHDONE, TALITOS1_ISR_4CHERR, 0) - #define DEF_TALITOS2_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet) = \ static irqreturn_t talitos2_interrupt_##name(int irq, void *data) \ { \ @@ -1262,29 +1023,6 @@ int talitos_register_common(struct device *dev, return 0; } =20 -static int sec1_talitos_probe_irq(struct platform_device *ofdev) -{ - struct device *dev =3D &ofdev->dev; - struct device_node *np =3D ofdev->dev.of_node; - struct talitos_private *priv =3D dev_get_drvdata(dev); - int err; - - priv->irq[0] =3D irq_of_parse_and_map(np, 0); - if (!priv->irq[0]) { - dev_err(dev, "failed to map irq\n"); - return -EINVAL; - } - err =3D request_irq(priv->irq[0], talitos1_interrupt_4ch, 0, - dev_driver_string(dev), dev); - if (err) { - dev_err(dev, "failed to request primary irq\n"); - irq_dispose_mapping(priv->irq[0]); - priv->irq[0] =3D 0; - } - - return err; -} - static int sec2_talitos_probe_irq(struct platform_device *ofdev) { struct device *dev =3D &ofdev->dev; @@ -1332,18 +1070,6 @@ static int sec2_talitos_probe_irq(struct platform_de= vice *ofdev) return err; } =20 -static void sec1_init_task(struct device *dev) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - - if (priv->num_channels =3D=3D 1) - tasklet_init(&priv->done_task[0], talitos1_done_ch0, - (unsigned long)dev); - else - tasklet_init(&priv->done_task[0], talitos1_done_4ch, - (unsigned long)dev); -} - static void sec2_init_task(struct device *dev) { struct talitos_private *priv =3D dev_get_drvdata(dev); @@ -1362,19 +1088,6 @@ static void sec2_init_task(struct device *dev) } } =20 -static const struct talitos_ops sec1_ops =3D { - .probe_irq =3D sec1_talitos_probe_irq, - .init_task =3D sec1_init_task, - .reset_device =3D sec1_reset_device, - .reset_channel =3D sec1_reset_channel, - .configure_device =3D sec1_configure_device, - .dma_map_request =3D sec1_dma_map_request, - .dma_unmap_request =3D sec1_dma_unmap_request, - .get_request_hdr =3D sec1_get_request_hdr, - .search_desc_hdr_in_request =3D sec1_search_desc_hdr_in_request, - .handle_error =3D sec1_talitos_handle_error, -}; - static const struct talitos_ops sec2_ops =3D { .probe_irq =3D sec2_talitos_probe_irq, .init_task =3D sec2_init_task, @@ -1471,7 +1184,7 @@ static int talitos_probe(struct platform_device *ofde= v) } =20 if (has_ftr_sec1(priv)) - priv->ops =3D &sec1_ops; + talitos_register_sec1(priv); else priv->ops =3D &sec2_ops; =20 diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 98b2cb5115f8..f5e98050c4cb 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -566,6 +566,14 @@ __be32 talitos_current_desc_hdr(struct device *dev, in= t ch); void talitos_error(struct device *dev, u32 isr, u32 isr_lo); void talitos_report_eu_error(struct device *dev, int ch, __be32 desc_hdr); =20 +#ifdef CONFIG_CRYPTO_DEV_TALITOS1 +void talitos_register_sec1(struct talitos_private *priv); +#else +static inline void talitos_register_sec1(struct talitos_private *priv) +{ +} +#endif + /* Hardware RNG */ =20 int talitos_register_rng(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ECE793AFD15 for ; Thu, 28 May 2026 09:09:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959395; cv=none; b=EMmWe2byKKeQZVXZn39BZ+67MW38XY7aaxBFuZ71QVzdZ+BzSFn5uD9o6h4VEeUzPMK4I82/XiRqR98kGWUZEa8b3oDZC1Orp2ZATqV2rzKuh+NrfEiGehJ1YLvePBMqOxJ030UleC5PwqH/phsIG0IHHM9rHxKn93vYjXSIEDY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959395; c=relaxed/simple; bh=G2Rh7ItojjDOD/vsIVPY/V4JRlOlXe8zoHg/E/XqAiw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KM0QrHc/kDrrpKa9/9VId4p+WsPqEOkxhY6pw9rBL2vYzTDNeodvknMTaMGnMjstYW5nmEFDzuD40u2Pc+N/YGkWoN1EgRV1x2ldhhCLaV9+VQctQQH2Dm4SnXZkIoccpmcgmCFGdvlyu+xvd3Xrvn8KCCTT08RK/MK0R9W3fAU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=tBG55HCX; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="tBG55HCX" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id A35B31A3701; Thu, 28 May 2026 09:09:50 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7847160495; Thu, 28 May 2026 09:09:50 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0F5B410888508; Thu, 28 May 2026 11:09:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959389; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=7Cl6V4bJQiHOW1rUQE5wCi24+z761xmT1stBeV67bbI=; b=tBG55HCX7SDOO/B4e/WHs3yi8w7JDKS8iID/lulBKD+ZxhBx5F/5Xx4OBLK59aQayCkl7w 6vFeVg8HRrKF3faZnCfSYc3Ee+AX/+CohAbGk7XSKWhB6Quxbibawq0/SIHfyojKfoCFwe lfEglTVR6JkuJQRuYudCRW3yaQo8tVFpYjDd69vLi6h4YLqd4Qh49/U9aCl9eJEC7wf6BK B5Piv6lzkOP1FGJX/EIsIbB5mIh0wjetc3SoQbQw+iGcMGUifEIqhU+hcJQRXzT+kcu0cy 9P44BMl3nEz5Xhmu3z9at5DF/6+PPBuylixP0huU/6JyCPwziQQ1FNpX39/89g== From: Paul Louvel Date: Thu, 28 May 2026 11:08:36 +0200 Subject: [PATCH 23/29] crypto: talitos - Move SEC2 ops into talitos-sec2.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-23-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=24452; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=G2Rh7ItojjDOD/vsIVPY/V4JRlOlXe8zoHg/E/XqAiw=; b=pdAmiEyokmkc+jmlDwVObhe/dBfO0E7c02WdCYF4f2vHUJsaupLNXKaRo5eNyzUeG4viYbHXW 3YSf/FycGlDA9WBYwRXU9XKNTk36CRAiUKBQgFsoYLye+OTngyVvsHn X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Relocate all SEC2-specific functions and the sec2_ops / talitos_register_sec2() definitions from talitos.c into a new talitos-sec2.c compilation unit. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/Makefile | 1 + drivers/crypto/talitos/talitos-sec2.c | 330 ++++++++++++++++++++++++++++++= ++++ drivers/crypto/talitos/talitos.c | 319 +-----------------------------= -- drivers/crypto/talitos/talitos.h | 8 + 4 files changed, 340 insertions(+), 318 deletions(-) diff --git a/drivers/crypto/talitos/Makefile b/drivers/crypto/talitos/Makef= ile index 5f3bc89ad7ea..3d9fa2570f2c 100644 --- a/drivers/crypto/talitos/Makefile +++ b/drivers/crypto/talitos/Makefile @@ -3,3 +3,4 @@ obj-$(CONFIG_CRYPTO_DEV_TALITOS) +=3D talitos.o talitos-y :=3D talitos.o talitos-rng.o talitos-hash.o talitos-skcipher.o t= alitos-aead.o =20 talitos-$(CONFIG_CRYPTO_DEV_TALITOS1) +=3D talitos-sec1.o +talitos-$(CONFIG_CRYPTO_DEV_TALITOS2) +=3D talitos-sec2.o diff --git a/drivers/crypto/talitos/talitos-sec2.c b/drivers/crypto/talitos= /talitos-sec2.c new file mode 100644 index 000000000000..962e7cd43631 --- /dev/null +++ b/drivers/crypto/talitos/talitos-sec2.c @@ -0,0 +1,330 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * Freescale SEC (talitos) SEC2 specific driver code + * + * Copyright (c) 2006-2011 Freescale Semiconductor, Inc. + */ + +#include +#include + +#include "talitos.h" + +#define DEF_TALITOS2_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet) = \ +static irqreturn_t talitos2_interrupt_##name(int irq, void *data) \ +{ \ + struct device *dev =3D data; \ + struct talitos_private *priv =3D dev_get_drvdata(dev); \ + u32 isr, isr_lo; \ + unsigned long flags; \ + \ + spin_lock_irqsave(&priv->reg_lock, flags); \ + isr =3D in_be32(priv->reg + TALITOS_ISR); \ + isr_lo =3D in_be32(priv->reg + TALITOS_ISR_LO); \ + /* Acknowledge interrupt */ \ + out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \ + out_be32(priv->reg + TALITOS_ICR_LO, isr_lo); \ + \ + if (unlikely(isr & ch_err_mask || isr_lo)) { \ + spin_unlock_irqrestore(&priv->reg_lock, flags); \ + talitos_error(dev, isr & ch_err_mask, isr_lo); \ + } \ + else { \ + if (likely(isr & ch_done_mask)) { \ + /* mask further done interrupts. */ \ + clrbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ + /* done_task will unmask done interrupts at exit */ \ + tasklet_schedule(&priv->done_task[tlet]); \ + } \ + spin_unlock_irqrestore(&priv->reg_lock, flags); \ + } \ + \ + return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED : \ + IRQ_NONE; \ +} + +DEF_TALITOS2_INTERRUPT(4ch, TALITOS2_ISR_4CHDONE, TALITOS2_ISR_4CHERR, 0) +DEF_TALITOS2_INTERRUPT(ch0_2, TALITOS2_ISR_CH_0_2_DONE, TALITOS2_ISR_CH_0_= 2_ERR, + 0) +DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE, TALITOS2_ISR_CH_1_= 3_ERR, + 1) + +#define DEF_TALITOS2_DONE(name, ch_done_mask) \ +static void talitos2_done_##name(unsigned long data) \ +{ \ + struct device *dev =3D (struct device *)data; \ + struct talitos_private *priv =3D dev_get_drvdata(dev); \ + unsigned long flags; \ + \ + if (ch_done_mask & 1) \ + talitos_flush_channel(dev, 0, 0, 0); \ + if (ch_done_mask & (1 << 2)) \ + talitos_flush_channel(dev, 1, 0, 0); \ + if (ch_done_mask & (1 << 4)) \ + talitos_flush_channel(dev, 2, 0, 0); \ + if (ch_done_mask & (1 << 6)) \ + talitos_flush_channel(dev, 3, 0, 0); \ + \ + /* At this point, all completed channels have been processed */ \ + /* Unmask done interrupts for channels completed later on. */ \ + spin_lock_irqsave(&priv->reg_lock, flags); \ + setbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ + setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT); \ + spin_unlock_irqrestore(&priv->reg_lock, flags); \ +} + +DEF_TALITOS2_DONE(4ch, TALITOS2_ISR_4CHDONE) +DEF_TALITOS2_DONE(ch0, TALITOS2_ISR_CH_0_DONE) +DEF_TALITOS2_DONE(ch0_2, TALITOS2_ISR_CH_0_2_DONE) +DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE) + +static int sec2_reset_channel(struct device *dev, int ch) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + unsigned int timeout =3D TALITOS_TIMEOUT; + + setbits32(priv->chan[ch].reg + TALITOS_CCCR, TALITOS2_CCCR_RESET); + + while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) & + TALITOS2_CCCR_RESET) && + --timeout) + cpu_relax(); + + if (timeout =3D=3D 0) { + dev_err(dev, "failed to reset sec2 channel %d\n", ch); + return -EIO; + } + + setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, + TALITOS_CCCR_LO_EAE | TALITOS_CCCR_LO_CDWE | + TALITOS_CCCR_LO_CDIE); + + /* ICCR writeback, if available */ + if (priv->features & TALITOS_FTR_HW_AUTH_CHECK) + setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, + TALITOS_CCCR_LO_IWSE); + + return 0; +} + +static int sec2_reset_device(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + unsigned int timeout =3D TALITOS_TIMEOUT; + + setbits32(priv->reg + TALITOS_MCR, TALITOS2_MCR_SWR); + + while ((in_be32(priv->reg + TALITOS_MCR) & TALITOS2_MCR_SWR) && + --timeout) + cpu_relax(); + + if (priv->irq[1]) + setbits32(priv->reg + TALITOS_MCR, + TALITOS_MCR_RCA1 | TALITOS_MCR_RCA3); + + if (timeout =3D=3D 0) { + dev_err(dev, "failed to reset sec2 device\n"); + return -EIO; + } + + return 0; +} + +static void sec2_configure_device(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + setbits32(priv->reg + TALITOS_IMR, TALITOS2_IMR_INIT); + setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT); + + /* disable integrity check error interrupts (use writeback instead) */ + if (priv->features & TALITOS_FTR_HW_AUTH_CHECK) + setbits32(priv->reg_mdeu + TALITOS_EUICR_LO, + TALITOS_MDEUICR_LO_ICE); +} + +static void sec2_dma_map_request(struct device *dev, + struct talitos_request *request, + struct talitos_desc *desc) +{ + request->dma_desc =3D + dma_map_single(dev, desc, TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); +} + +static int sec2_talitos_handle_error(struct device *dev, u32 isr, u32 isr_= lo) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + unsigned int timeout =3D TALITOS_TIMEOUT; + int ch, error, reset_dev =3D 0; + u32 v_lo; + int reset_ch =3D 0; + + for (ch =3D 0; ch < priv->num_channels; ch++) { + if (!TALITOS2_CH_HAS_ERROR(isr, ch)) + continue; + + error =3D -EINVAL; + + v_lo =3D in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO); + + if (v_lo & TALITOS2_CCPSR_LO_DOF) { + dev_err(dev, "double fetch fifo overflow error\n"); + error =3D -EAGAIN; + reset_ch =3D 1; + } + if (v_lo & TALITOS2_CCPSR_LO_SOF) { + /* h/w dropped descriptor */ + dev_err(dev, "single fetch fifo overflow error\n"); + error =3D -EAGAIN; + } + if (v_lo & TALITOS2_CCPSR_LO_MDTE) + dev_err(dev, "master data transfer error\n"); + if (v_lo & TALITOS2_CCPSR_LO_SGDLZ) + dev_err(dev, "s/g data length zero error\n"); + if (v_lo & TALITOS2_CCPSR_LO_FPZ) + dev_err(dev, "fetch pointer zero error\n"); + if (v_lo & TALITOS2_CCPSR_LO_IDH) + dev_err(dev, "illegal descriptor header error\n"); + if (v_lo & TALITOS2_CCPSR_LO_IEU) + dev_err(dev, "invalid exec unit error\n"); + if (v_lo & TALITOS2_CCPSR_LO_EU) + talitos_report_eu_error( + dev, ch, talitos_current_desc_hdr(dev, ch)); + if (v_lo & TALITOS2_CCPSR_LO_GB) + dev_err(dev, "gather boundary error\n"); + if (v_lo & TALITOS2_CCPSR_LO_GRL) + dev_err(dev, "gather return/length error\n"); + if (v_lo & TALITOS2_CCPSR_LO_SB) + dev_err(dev, "scatter boundary error\n"); + if (v_lo & TALITOS2_CCPSR_LO_SRL) + dev_err(dev, "scatter return/length error\n"); + + talitos_flush_channel(dev, ch, error, reset_ch); + + if (reset_ch) { + priv->ops->reset_channel(dev, ch); + } else { + setbits32(priv->chan[ch].reg + TALITOS_CCCR, + TALITOS2_CCCR_CONT); + setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, 0); + while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) & + TALITOS2_CCCR_CONT) && --timeout) + cpu_relax(); + if (timeout =3D=3D 0) { + dev_err(dev, "failed to restart channel %d\n", + ch); + reset_dev =3D 1; + } + } + } + + return reset_dev || (isr & ~TALITOS2_ISR_4CHERR) || isr_lo; +} + +static int sec2_talitos_probe_irq(struct platform_device *ofdev) +{ + struct device *dev =3D &ofdev->dev; + struct device_node *np =3D ofdev->dev.of_node; + struct talitos_private *priv =3D dev_get_drvdata(dev); + int err; + + priv->irq[0] =3D irq_of_parse_and_map(np, 0); + if (!priv->irq[0]) { + dev_err(dev, "failed to map irq\n"); + return -EINVAL; + } + priv->irq[1] =3D irq_of_parse_and_map(np, 1); + + /* get the primary irq line */ + if (!priv->irq[1]) { + err =3D request_irq(priv->irq[0], talitos2_interrupt_4ch, 0, + dev_driver_string(dev), dev); + goto primary_out; + } + + err =3D request_irq(priv->irq[0], talitos2_interrupt_ch0_2, 0, + dev_driver_string(dev), dev); + if (err) + goto primary_out; + + /* get the secondary irq line */ + err =3D request_irq(priv->irq[1], talitos2_interrupt_ch1_3, 0, + dev_driver_string(dev), dev); + if (err) { + dev_err(dev, "failed to request secondary irq\n"); + irq_dispose_mapping(priv->irq[1]); + priv->irq[1] =3D 0; + } + + return err; + +primary_out: + if (err) { + dev_err(dev, "failed to request primary irq\n"); + irq_dispose_mapping(priv->irq[0]); + priv->irq[0] =3D 0; + } + + return err; +} + +static void sec2_init_task(struct device *dev) +{ + struct talitos_private *priv =3D dev_get_drvdata(dev); + + if (priv->irq[1]) { + tasklet_init(&priv->done_task[0], talitos2_done_ch0_2, + (unsigned long)dev); + tasklet_init(&priv->done_task[1], talitos2_done_ch1_3, + (unsigned long)dev); + } else if (priv->num_channels =3D=3D 1) { + tasklet_init(&priv->done_task[0], talitos2_done_ch0, + (unsigned long)dev); + } else { + tasklet_init(&priv->done_task[0], talitos2_done_4ch, + (unsigned long)dev); + } +} + +static void sec2_dma_unmap_request(struct device *dev, + struct talitos_request *request) +{ + dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, + DMA_BIDIRECTIONAL); +} + +static __be32 sec2_get_request_hdr(struct device *dev, + struct talitos_request *request) +{ + dma_sync_single_for_cpu(dev, request->dma_desc, TALITOS_DESC_SIZE, + DMA_BIDIRECTIONAL); + + return request->desc->hdr; +} + +static __be32 sec2_search_desc_hdr_in_request(struct talitos_request *requ= est, + dma_addr_t cur_desc) +{ + if (request->dma_desc =3D=3D cur_desc) + return request->desc->hdr; + return 0; +} + +static const struct talitos_ops sec2_ops =3D { + .probe_irq =3D sec2_talitos_probe_irq, + .init_task =3D sec2_init_task, + .reset_device =3D sec2_reset_device, + .reset_channel =3D sec2_reset_channel, + .configure_device =3D sec2_configure_device, + .dma_map_request =3D sec2_dma_map_request, + .dma_unmap_request =3D sec2_dma_unmap_request, + .get_request_hdr =3D sec2_get_request_hdr, + .search_desc_hdr_in_request =3D sec2_search_desc_hdr_in_request, + .handle_error =3D sec2_talitos_handle_error, +}; + +void talitos_register_sec2(struct talitos_private *priv) +{ + priv->ops =3D &sec2_ops; +} diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index a4fd14c8bef5..152618998819 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -133,71 +133,6 @@ void unmap_single_talitos_ptr(struct device *dev, from_talitos_ptr_len(ptr, is_sec1), dir); } =20 -static int sec2_reset_channel(struct device *dev, int ch) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - unsigned int timeout =3D TALITOS_TIMEOUT; - - setbits32(priv->chan[ch].reg + TALITOS_CCCR, TALITOS2_CCCR_RESET); - - while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) & - TALITOS2_CCCR_RESET) && - --timeout) - cpu_relax(); - - if (timeout =3D=3D 0) { - dev_err(dev, "failed to reset sec2 channel %d\n", ch); - return -EIO; - } - - setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, - TALITOS_CCCR_LO_EAE | TALITOS_CCCR_LO_CDWE | - TALITOS_CCCR_LO_CDIE); - - /* ICCR writeback, if available */ - if (priv->features & TALITOS_FTR_HW_AUTH_CHECK) - setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, - TALITOS_CCCR_LO_IWSE); - - return 0; -} - -static int sec2_reset_device(struct device *dev) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - unsigned int timeout =3D TALITOS_TIMEOUT; - - setbits32(priv->reg + TALITOS_MCR, TALITOS2_MCR_SWR); - - while ((in_be32(priv->reg + TALITOS_MCR) & TALITOS2_MCR_SWR) && - --timeout) - cpu_relax(); - - if (priv->irq[1]) - setbits32(priv->reg + TALITOS_MCR, - TALITOS_MCR_RCA1 | TALITOS_MCR_RCA3); - - if (timeout =3D=3D 0) { - dev_err(dev, "failed to reset sec2 device\n"); - return -EIO; - } - - return 0; -} - -static void sec2_configure_device(struct device *dev) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - - setbits32(priv->reg + TALITOS_IMR, TALITOS2_IMR_INIT); - setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT); - - /* disable integrity check error interrupts (use writeback instead) */ - if (priv->features & TALITOS_FTR_HW_AUTH_CHECK) - setbits32(priv->reg_mdeu + TALITOS_EUICR_LO, - TALITOS_MDEUICR_LO_ICE); -} - /* * Reset and initialize the device */ @@ -233,14 +168,6 @@ static int init_device(struct device *dev) return 0; } =20 -static void sec2_dma_map_request(struct device *dev, - struct talitos_request *request, - struct talitos_desc *desc) -{ - request->dma_desc =3D - dma_map_single(dev, desc, TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); -} - /** * talitos_submit - submits a descriptor to the device for processing * @dev: the SEC device to be used @@ -299,22 +226,6 @@ int talitos_submit(struct device *dev, int ch, struct = talitos_desc *desc, return -EINPROGRESS; } =20 -static __be32 sec2_get_request_hdr(struct device *dev, - struct talitos_request *request) -{ - dma_sync_single_for_cpu(dev, request->dma_desc, TALITOS_DESC_SIZE, - DMA_BIDIRECTIONAL); - - return request->desc->hdr; -} - -static void sec2_dma_unmap_request(struct device *dev, - struct talitos_request *request) -{ - dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, - DMA_BIDIRECTIONAL); -} - /* * process what was done, notify callback of error if not */ @@ -375,47 +286,6 @@ void talitos_flush_channel(struct device *dev, int ch,= int error, int reset_ch) spin_unlock_irqrestore(&priv->chan[ch].tail_lock, flags); } =20 -/* - * process completed requests for channels that have done status - */ - -#define DEF_TALITOS2_DONE(name, ch_done_mask) \ -static void talitos2_done_##name(unsigned long data) \ -{ \ - struct device *dev =3D (struct device *)data; \ - struct talitos_private *priv =3D dev_get_drvdata(dev); \ - unsigned long flags; \ - \ - if (ch_done_mask & 1) \ - talitos_flush_channel(dev, 0, 0, 0); \ - if (ch_done_mask & (1 << 2)) \ - talitos_flush_channel(dev, 1, 0, 0); \ - if (ch_done_mask & (1 << 4)) \ - talitos_flush_channel(dev, 2, 0, 0); \ - if (ch_done_mask & (1 << 6)) \ - talitos_flush_channel(dev, 3, 0, 0); \ - \ - /* At this point, all completed channels have been processed */ \ - /* Unmask done interrupts for channels completed later on. */ \ - spin_lock_irqsave(&priv->reg_lock, flags); \ - setbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ - setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT); \ - spin_unlock_irqrestore(&priv->reg_lock, flags); \ -} - -DEF_TALITOS2_DONE(4ch, TALITOS2_ISR_4CHDONE) -DEF_TALITOS2_DONE(ch0, TALITOS2_ISR_CH_0_DONE) -DEF_TALITOS2_DONE(ch0_2, TALITOS2_ISR_CH_0_2_DONE) -DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE) - -static __be32 sec2_search_desc_hdr_in_request(struct talitos_request *requ= est, - dma_addr_t cur_desc) -{ - if (request->dma_desc =3D=3D cur_desc) - return request->desc->hdr; - return 0; -} - /* * locate current (offending) descriptor */ @@ -528,76 +398,6 @@ void talitos_report_eu_error(struct device *dev, int c= h, __be32 desc_hdr) in_be32(priv->chan[ch].reg + TALITOS_DESCBUF_LO + 8*i)); } =20 -static int sec2_talitos_handle_error(struct device *dev, u32 isr, u32 isr_= lo) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - unsigned int timeout =3D TALITOS_TIMEOUT; - int ch, error, reset_dev =3D 0; - u32 v_lo; - int reset_ch =3D 0; - - for (ch =3D 0; ch < priv->num_channels; ch++) { - if (!TALITOS2_CH_HAS_ERROR(isr, ch)) - continue; - - error =3D -EINVAL; - - v_lo =3D in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO); - - if (v_lo & TALITOS2_CCPSR_LO_DOF) { - dev_err(dev, "double fetch fifo overflow error\n"); - error =3D -EAGAIN; - reset_ch =3D 1; - } - if (v_lo & TALITOS2_CCPSR_LO_SOF) { - /* h/w dropped descriptor */ - dev_err(dev, "single fetch fifo overflow error\n"); - error =3D -EAGAIN; - } - if (v_lo & TALITOS2_CCPSR_LO_MDTE) - dev_err(dev, "master data transfer error\n"); - if (v_lo & TALITOS2_CCPSR_LO_SGDLZ) - dev_err(dev, "s/g data length zero error\n"); - if (v_lo & TALITOS2_CCPSR_LO_FPZ) - dev_err(dev, "fetch pointer zero error\n"); - if (v_lo & TALITOS2_CCPSR_LO_IDH) - dev_err(dev, "illegal descriptor header error\n"); - if (v_lo & TALITOS2_CCPSR_LO_IEU) - dev_err(dev, "invalid exec unit error\n"); - if (v_lo & TALITOS2_CCPSR_LO_EU) - talitos_report_eu_error( - dev, ch, talitos_current_desc_hdr(dev, ch)); - if (v_lo & TALITOS2_CCPSR_LO_GB) - dev_err(dev, "gather boundary error\n"); - if (v_lo & TALITOS2_CCPSR_LO_GRL) - dev_err(dev, "gather return/length error\n"); - if (v_lo & TALITOS2_CCPSR_LO_SB) - dev_err(dev, "scatter boundary error\n"); - if (v_lo & TALITOS2_CCPSR_LO_SRL) - dev_err(dev, "scatter return/length error\n"); - - talitos_flush_channel(dev, ch, error, reset_ch); - - if (reset_ch) { - priv->ops->reset_channel(dev, ch); - } else { - setbits32(priv->chan[ch].reg + TALITOS_CCCR, - TALITOS2_CCCR_CONT); - setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, 0); - while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) & - TALITOS2_CCCR_CONT) && --timeout) - cpu_relax(); - if (timeout =3D=3D 0) { - dev_err(dev, "failed to restart channel %d\n", - ch); - reset_dev =3D 1; - } - } - } - - return reset_dev || (isr & ~TALITOS2_ISR_4CHERR) || isr_lo; -} - /* * recover from error interrupts */ @@ -623,45 +423,6 @@ void talitos_error(struct device *dev, u32 isr, u32 is= r_lo) } } =20 -#define DEF_TALITOS2_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet) = \ -static irqreturn_t talitos2_interrupt_##name(int irq, void *data) \ -{ \ - struct device *dev =3D data; \ - struct talitos_private *priv =3D dev_get_drvdata(dev); \ - u32 isr, isr_lo; \ - unsigned long flags; \ - \ - spin_lock_irqsave(&priv->reg_lock, flags); \ - isr =3D in_be32(priv->reg + TALITOS_ISR); \ - isr_lo =3D in_be32(priv->reg + TALITOS_ISR_LO); \ - /* Acknowledge interrupt */ \ - out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \ - out_be32(priv->reg + TALITOS_ICR_LO, isr_lo); \ - \ - if (unlikely(isr & ch_err_mask || isr_lo)) { \ - spin_unlock_irqrestore(&priv->reg_lock, flags); \ - talitos_error(dev, isr & ch_err_mask, isr_lo); \ - } \ - else { \ - if (likely(isr & ch_done_mask)) { \ - /* mask further done interrupts. */ \ - clrbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ - /* done_task will unmask done interrupts at exit */ \ - tasklet_schedule(&priv->done_task[tlet]); \ - } \ - spin_unlock_irqrestore(&priv->reg_lock, flags); \ - } \ - \ - return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED : \ - IRQ_NONE; \ -} - -DEF_TALITOS2_INTERRUPT(4ch, TALITOS2_ISR_4CHDONE, TALITOS2_ISR_4CHERR, 0) -DEF_TALITOS2_INTERRUPT(ch0_2, TALITOS2_ISR_CH_0_2_DONE, TALITOS2_ISR_CH_0_= 2_ERR, - 0) -DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE, TALITOS2_ISR_CH_1_= 3_ERR, - 1) - void talitos_sg_unmap(struct device *dev, struct talitos_edesc *edesc, struct scatterlist *src, @@ -1023,84 +784,6 @@ int talitos_register_common(struct device *dev, return 0; } =20 -static int sec2_talitos_probe_irq(struct platform_device *ofdev) -{ - struct device *dev =3D &ofdev->dev; - struct device_node *np =3D ofdev->dev.of_node; - struct talitos_private *priv =3D dev_get_drvdata(dev); - int err; - - priv->irq[0] =3D irq_of_parse_and_map(np, 0); - if (!priv->irq[0]) { - dev_err(dev, "failed to map irq\n"); - return -EINVAL; - } - priv->irq[1] =3D irq_of_parse_and_map(np, 1); - - /* get the primary irq line */ - if (!priv->irq[1]) { - err =3D request_irq(priv->irq[0], talitos2_interrupt_4ch, 0, - dev_driver_string(dev), dev); - goto primary_out; - } - - err =3D request_irq(priv->irq[0], talitos2_interrupt_ch0_2, 0, - dev_driver_string(dev), dev); - if (err) - goto primary_out; - - /* get the secondary irq line */ - err =3D request_irq(priv->irq[1], talitos2_interrupt_ch1_3, 0, - dev_driver_string(dev), dev); - if (err) { - dev_err(dev, "failed to request secondary irq\n"); - irq_dispose_mapping(priv->irq[1]); - priv->irq[1] =3D 0; - } - - return err; - -primary_out: - if (err) { - dev_err(dev, "failed to request primary irq\n"); - irq_dispose_mapping(priv->irq[0]); - priv->irq[0] =3D 0; - } - - return err; -} - -static void sec2_init_task(struct device *dev) -{ - struct talitos_private *priv =3D dev_get_drvdata(dev); - - if (priv->irq[1]) { - tasklet_init(&priv->done_task[0], talitos2_done_ch0_2, - (unsigned long)dev); - tasklet_init(&priv->done_task[1], talitos2_done_ch1_3, - (unsigned long)dev); - } else if (priv->num_channels =3D=3D 1) { - tasklet_init(&priv->done_task[0], talitos2_done_ch0, - (unsigned long)dev); - } else { - tasklet_init(&priv->done_task[0], talitos2_done_4ch, - (unsigned long)dev); - } -} - -static const struct talitos_ops sec2_ops =3D { - .probe_irq =3D sec2_talitos_probe_irq, - .init_task =3D sec2_init_task, - .reset_device =3D sec2_reset_device, - .reset_channel =3D sec2_reset_channel, - .configure_device =3D sec2_configure_device, - .dma_map_request =3D sec2_dma_map_request, - .dma_unmap_request =3D sec2_dma_unmap_request, - .get_request_hdr =3D sec2_get_request_hdr, - .search_desc_hdr_in_request =3D sec2_search_desc_hdr_in_request, - .handle_error =3D sec2_talitos_handle_error, -}; - static int talitos_probe(struct platform_device *ofdev) { struct device *dev =3D &ofdev->dev; @@ -1186,7 +869,7 @@ static int talitos_probe(struct platform_device *ofdev) if (has_ftr_sec1(priv)) talitos_register_sec1(priv); else - priv->ops =3D &sec2_ops; + talitos_register_sec2(priv); =20 err =3D priv->ops->probe_irq(ofdev); if (err) diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index f5e98050c4cb..ae0bdb2ea78e 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -574,6 +574,14 @@ static inline void talitos_register_sec1(struct talito= s_private *priv) } #endif =20 +#ifdef CONFIG_CRYPTO_DEV_TALITOS2 +void talitos_register_sec2(struct talitos_private *priv); +#else +static inline void talitos_register_sec2(struct talitos_private *priv) +{ +} +#endif + /* Hardware RNG */ =20 int talitos_register_rng(struct device *dev); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D12B53B0AED; Thu, 28 May 2026 09:09:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959395; cv=none; b=lrf5QCtdZicaSnR2g34wYClLNVSnsaCAwknWMChJMwq6E9rRcuRz/7EsrVK3W4mkzsmWS7UAhKXqnsS+BRpheagjjdlHPKpR+vAryBfk6yD0UY9u6Cnr1Uahfwqbsk8Ob+VI04evE/kSpTsjdxa2Kd4d0SxRldWwgSZV4rGpVB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959395; c=relaxed/simple; bh=iq70Z8rbnGJlAOc3vpwLwwU40krFOpjeZrtcjWh8hY8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g17R5lJoJ0BOU3qHdxfjAfJAJloJQXonrhuOJo+UosCq/68dtoG9IZ9QAQ0ZYNgD5MCgVm1okOYu/iOt1Tae7EwTFaHPeqkictF3Yp19vTar6Hl8zKSi84mDgnk5F833ADRk5cu3sy5tG5TKOBilv8prHrhmsB04CoArM8j/A64= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ARGNcOqd; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ARGNcOqd" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id BE280C62447; Thu, 28 May 2026 09:09:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9791C60495; Thu, 28 May 2026 09:09:51 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3CFBD10888C9D; Thu, 28 May 2026 11:09:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959391; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=rOqCDyfSNrhyPoftsOduoHVV0/bL+E9q6q6nwQdNV2w=; b=ARGNcOqdgGhpfXmxki2ftNFaOmKvrQ27lVln/sJzW+l+Oar4pVy/Y3gZd84fC9aasm/LAh kHBdM9/Vy6IqmlXScJ/+N2Z5iRTXpwDLassaUeLkfwo4cXaoLEL6zeepo3PxzgtKhUxvEx 2jMwZAdi0qTMj18tPsKoeezsb1Gk0BAcxs7scF7UUOGh+Cak5lYHDb+jHVjYZTgKvsAjt8 bkG8krCFqP8F6dYRNj2ILeAZER55QOPy7aLutX6W2rSTn8m5CxKWaDcQrpHWUnHDiiXR89 99gj6uFvakIHBjDfDsDTUiKNZ+o4LEn2oUhqRQk4SGQ7DCn6M07mSiUzDLttYw== From: Paul Louvel Date: Thu, 28 May 2026 11:08:37 +0200 Subject: [PATCH 24/29] crypto: talitos - Introduce per-SEC-version pointer helper ops Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-24-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=6271; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=iq70Z8rbnGJlAOc3vpwLwwU40krFOpjeZrtcjWh8hY8=; b=sLeUZtfrQBV4rqisNOhhukRpkMacJo6Q8jho3Mfflwems6Ogq81UDLNird/egl3q/I6vNZKja EwoYoQE8YTpBqG6wDNq3IX401mhv5okv6VxOTyCuiikq5yXspxrTIB2 X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Introduce struct talitos_ptr_ops to abstract SEC1/SEC2 differences in pointer handling behind per-SEC-version ops. Add ptr_ops to struct talitos_private and struct talitos_ctx, and register the appropriate SEC1 or SEC2 implementation at probe time. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos-sec1.c | 36 +++++++++++++++++++++++++++++++ drivers/crypto/talitos/talitos-sec2.c | 40 +++++++++++++++++++++++++++++++= ++++ drivers/crypto/talitos/talitos.c | 2 ++ drivers/crypto/talitos/talitos.h | 12 +++++++++++ 4 files changed, 90 insertions(+) diff --git a/drivers/crypto/talitos/talitos-sec1.c b/drivers/crypto/talitos= /talitos-sec1.c index 695d531aa7f4..ef1bd19b6772 100644 --- a/drivers/crypto/talitos/talitos-sec1.c +++ b/drivers/crypto/talitos/talitos-sec1.c @@ -73,6 +73,33 @@ static irqreturn_t talitos1_interrupt_##name(int irq, vo= id *data) \ =20 DEF_TALITOS1_INTERRUPT(4ch, TALITOS1_ISR_4CHDONE, TALITOS1_ISR_4CHERR, 0) =20 +static void sec1_to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_ad= dr, + unsigned int len) +{ + ptr->ptr =3D cpu_to_be32(lower_32_bits(dma_addr)); + ptr->len1 =3D cpu_to_be16(len); +} + +static void sec1_copy_talitos_ptr(struct talitos_ptr *dst_ptr, + struct talitos_ptr *src_ptr) +{ + dst_ptr->ptr =3D src_ptr->ptr; + dst_ptr->len1 =3D src_ptr->len1; +} + +static unsigned short sec1_from_talitos_ptr_len(struct talitos_ptr *ptr) +{ + return be16_to_cpu(ptr->len1); +} + +static void sec1_to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val) +{ +} + +static void sec1_to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val) +{ +} + static int sec1_reset_device(struct device *dev) { struct talitos_private *priv =3D dev_get_drvdata(dev); @@ -286,6 +313,14 @@ static void sec1_init_task(struct device *dev) (unsigned long)dev); } =20 +static const struct talitos_ptr_ops sec1_ptr_ops =3D { + .to_talitos_ptr =3D sec1_to_talitos_ptr, + .copy_talitos_ptr =3D sec1_copy_talitos_ptr, + .from_talitos_ptr_len =3D sec1_from_talitos_ptr_len, + .to_talitos_ptr_ext_set =3D sec1_to_talitos_ptr_ext_set, + .to_talitos_ptr_ext_or =3D sec1_to_talitos_ptr_ext_or, +}; + static const struct talitos_ops sec1_ops =3D { .probe_irq =3D sec1_talitos_probe_irq, .init_task =3D sec1_init_task, @@ -302,4 +337,5 @@ static const struct talitos_ops sec1_ops =3D { void talitos_register_sec1(struct talitos_private *priv) { priv->ops =3D &sec1_ops; + priv->ptr_ops =3D &sec1_ptr_ops; } diff --git a/drivers/crypto/talitos/talitos-sec2.c b/drivers/crypto/talitos= /talitos-sec2.c index 962e7cd43631..14f0ca13e6e5 100644 --- a/drivers/crypto/talitos/talitos-sec2.c +++ b/drivers/crypto/talitos/talitos-sec2.c @@ -79,6 +79,37 @@ DEF_TALITOS2_DONE(ch0, TALITOS2_ISR_CH_0_DONE) DEF_TALITOS2_DONE(ch0_2, TALITOS2_ISR_CH_0_2_DONE) DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE) =20 +static void sec2_to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_ad= dr, + unsigned int len) +{ + ptr->ptr =3D cpu_to_be32(lower_32_bits(dma_addr)); + ptr->len =3D cpu_to_be16(len); + ptr->eptr =3D upper_32_bits(dma_addr); +} + +static void sec2_copy_talitos_ptr(struct talitos_ptr *dst_ptr, + struct talitos_ptr *src_ptr) +{ + dst_ptr->ptr =3D src_ptr->ptr; + dst_ptr->len =3D src_ptr->len; + dst_ptr->eptr =3D src_ptr->eptr; +} + +static unsigned short sec2_from_talitos_ptr_len(struct talitos_ptr *ptr) +{ + return be16_to_cpu(ptr->len); +} + +static void sec2_to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val) +{ + ptr->j_extent =3D val; +} + +static void sec2_to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val) +{ + ptr->j_extent |=3D val; +} + static int sec2_reset_channel(struct device *dev, int ch) { struct talitos_private *priv =3D dev_get_drvdata(dev); @@ -311,6 +342,14 @@ static __be32 sec2_search_desc_hdr_in_request(struct t= alitos_request *request, return 0; } =20 +static const struct talitos_ptr_ops sec2_ptr_ops =3D { + .to_talitos_ptr =3D sec2_to_talitos_ptr, + .copy_talitos_ptr =3D sec2_copy_talitos_ptr, + .from_talitos_ptr_len =3D sec2_from_talitos_ptr_len, + .to_talitos_ptr_ext_set =3D sec2_to_talitos_ptr_ext_set, + .to_talitos_ptr_ext_or =3D sec2_to_talitos_ptr_ext_or, +}; + static const struct talitos_ops sec2_ops =3D { .probe_irq =3D sec2_talitos_probe_irq, .init_task =3D sec2_init_task, @@ -327,4 +366,5 @@ static const struct talitos_ops sec2_ops =3D { void talitos_register_sec2(struct talitos_private *priv) { priv->ops =3D &sec2_ops; + priv->ptr_ops =3D &sec2_ptr_ops; } diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 152618998819..0e4bd130ac6d 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -668,6 +668,8 @@ int talitos_init_common(struct talitos_ctx *ctx, /* select done notification */ ctx->desc_hdr_template |=3D DESC_HDR_DONE_NOTIFY; =20 + ctx->ptr_ops =3D priv->ptr_ops; + return 0; } =20 diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index ae0bdb2ea78e..09d4e8fb0e62 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -140,6 +140,16 @@ struct talitos_channel { int tail; }; =20 +struct talitos_ptr_ops { + void (*to_talitos_ptr)(struct talitos_ptr *ptr, dma_addr_t addr, + unsigned int len); + void (*copy_talitos_ptr)(struct talitos_ptr *dst_ptr, + struct talitos_ptr *src_ptr); + unsigned short (*from_talitos_ptr_len)(struct talitos_ptr *ptr); + void (*to_talitos_ptr_ext_set)(struct talitos_ptr *ptr, u8 val); + void (*to_talitos_ptr_ext_or)(struct talitos_ptr *ptr, u8 val); +}; + struct talitos_ops { int (*probe_irq)(struct platform_device *ofdev); void (*init_task)(struct device *dev); @@ -183,6 +193,7 @@ struct talitos_private { unsigned int desc_types; =20 const struct talitos_ops *ops; + const struct talitos_ptr_ops *ptr_ops; =20 /* SEC Compatibility info */ unsigned long features; @@ -213,6 +224,7 @@ struct talitos_private { =20 struct talitos_ctx { struct device *dev; + const struct talitos_ptr_ops *ptr_ops; int ch; __be32 desc_hdr_template; u8 key[TALITOS_MAX_KEY_SIZE]; --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 695C93A9628; Thu, 28 May 2026 09:09:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959397; cv=none; b=U080FlWZlHeIr4+K7kM3SBBdAL68Ii0YDNR3dtpMDH8XZkWA5ZwxcOTEN81/yQLVVaPHKzgt7ZuG0REBQY8oLOCRzHTdvXt+uwP+PolGhKZi+kyXngMjLZuWZ7vQOpUnDO6aHQe1ccVZae9jDcGmYqbnoAprYL4lTPjS0WIjjuI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959397; c=relaxed/simple; bh=O3nMGprxow/W8RPiJMzlZBmxcC5VWI3bexCBwQBeiSo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tM/LIPcgaoVr+8XtdXH/sq5LBI7L2h3B3SBB4H60rdxJ81RlZSLfuGRLv7hDW2yzM+ayljWGjxrMmYYVq49PGrL16kUBNjiMitOfBMNZpQnaDOLiykGVUefTR2PeMKrdBAJMqedJepANCpSajuWfKyBG+M3nwGhMpnhzQVzN9zA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=sEz/oV/i; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="sEz/oV/i" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id E39784E42D79; Thu, 28 May 2026 09:09:52 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B8A9160495; Thu, 28 May 2026 09:09:52 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 6BB2F1088877F; Thu, 28 May 2026 11:09:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959392; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ogAfMImEqTNegJvs4Lseq3VUA+KFZdj5xvSobayj+CA=; b=sEz/oV/iSlRflS5ChvyuDfQmqoLa8UalkFxXTcmEqS4Oi0cXU04lXQ/eo/wRubF9oAi4aQ PWfQw17GTIC7DxNvTigGuWDfdjQpcQVfHH2VfJJ0uY6lzkBgR4unAU6r5PGKTA+rQZVisE w5uU+ZzLrjADpb92Q7+Mfr7s98T/o5I2M5mI6rPlq+lt1pMWWGd71zjWEQmmITV2w5wTx4 2Mk0zsbpeft3N5iy3bIK4vaQ/fG+Sl/ry1WzaZENlEqeBnfQAt3KWR+lGwygBdKbL1wQHm +pbLBdY8C0+YaZ+xIb0e2A4kN7vjVSc4tNRKYdjNm7qtfJ9GZsNz1LqM/2J5VQ== From: Paul Louvel Date: Thu, 28 May 2026 11:08:38 +0200 Subject: [PATCH 25/29] crypto: talitos - Dispatch pointer helpers through ptr_ops Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-25-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=11035; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=O3nMGprxow/W8RPiJMzlZBmxcC5VWI3bexCBwQBeiSo=; b=DT0485l7oJgs4nSGqCnmIWIgypOmPGkHt9yEkQFmR4e6TMKbQpH1mt9iKY/8xGaGa7V1pr8zm 5W3EzUVf756CfUaa2LRjPBwY1nO/SeZvLlg0gAeA+3F2I2cCxmqupXl X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Replace all direct calls to to_talitos_ptr(), copy_talitos_ptr(), from_talitos_ptr_len(), to_talitos_ptr_ext_set() and to_talitos_ptr_ext_or() with indirect calls through ctx->ptr_ops or priv->ptr_ops. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos-aead.c | 18 ++++++------ drivers/crypto/talitos/talitos-hash.c | 24 ++++++++-------- drivers/crypto/talitos/talitos-skcipher.c | 4 +-- drivers/crypto/talitos/talitos.c | 47 ++++++++++++++++-----------= ---- 4 files changed, 46 insertions(+), 47 deletions(-) diff --git a/drivers/crypto/talitos/talitos-aead.c b/drivers/crypto/talitos= /talitos-aead.c index cd1b8e6d371b..b585abdd2275 100644 --- a/drivers/crypto/talitos/talitos-aead.c +++ b/drivers/crypto/talitos/talitos-aead.c @@ -216,7 +216,7 @@ static int ipsec_esp(struct talitos_edesc *edesc, struc= t aead_request *areq, dma_addr_t dma_icv =3D edesc->dma_link_tbl + edesc->dma_len - authsize; =20 /* hmac key */ - to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1); + ctx->ptr_ops->to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen= ); =20 sg_count =3D edesc->src_nents ?: 1; if (is_sec1 && sg_count > 1) @@ -237,11 +237,11 @@ static int ipsec_esp(struct talitos_edesc *edesc, str= uct aead_request *areq, } =20 /* cipher iv */ - to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize, is_sec1); + ctx->ptr_ops->to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize); =20 /* cipher key */ - to_talitos_ptr(ckey_ptr, ctx->dma_key + ctx->authkeylen, - ctx->enckeylen, is_sec1); + ctx->ptr_ops->to_talitos_ptr(ckey_ptr, ctx->dma_key + ctx->authkeylen, + ctx->enckeylen); =20 /* * cipher in @@ -281,15 +281,15 @@ static int ipsec_esp(struct talitos_edesc *edesc, str= uct aead_request *areq, struct talitos_ptr *tbl_ptr =3D &edesc->link_tbl[tbl_off]; =20 /* Add an entry to the link table for ICV data */ - to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1); - to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET, is_sec1); + ctx->ptr_ops->to_talitos_ptr_ext_set(tbl_ptr - 1, 0); + ctx->ptr_ops->to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET); =20 /* icv data follows link tables */ - to_talitos_ptr(tbl_ptr, dma_icv, authsize, is_sec1); - to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1); + ctx->ptr_ops->to_talitos_ptr(tbl_ptr, dma_icv, authsize); + ctx->ptr_ops->to_talitos_ptr_ext_or(&desc->ptr[5], authsize); sync_needed =3D true; } else if (!encrypt) { - to_talitos_ptr(&desc->ptr[6], dma_icv, authsize, is_sec1); + ctx->ptr_ops->to_talitos_ptr(&desc->ptr[6], dma_icv, authsize); sync_needed =3D true; } else if (!is_ipsec_esp) { talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6], diff --git a/drivers/crypto/talitos/talitos-hash.c b/drivers/crypto/talitos= /talitos-hash.c index 9e6d849c3123..026eebf037f5 100644 --- a/drivers/crypto/talitos/talitos-hash.c +++ b/drivers/crypto/talitos/talitos-hash.c @@ -36,32 +36,30 @@ struct talitos_export_state { unsigned int to_hash_later; }; =20 -static void common_nonsnoop_hash_unmap(struct device *dev, +static void common_nonsnoop_hash_unmap(struct talitos_ctx *ctx, struct talitos_edesc *edesc, struct ahash_request *areq) { struct talitos_ahash_req_ctx *req_ctx =3D ahash_request_ctx(areq); struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); - struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); struct talitos_desc *desc =3D &edesc->desc; =20 - unmap_single_talitos_ptr(dev, &desc->ptr[5], DMA_FROM_DEVICE); + unmap_single_talitos_ptr(ctx->dev, &desc->ptr[5], DMA_FROM_DEVICE); =20 if (edesc->last && req_ctx->last_request) memcpy(areq->result, req_ctx->hw_context, crypto_ahash_digestsize(tfm)); =20 if (edesc->src) - talitos_sg_unmap(dev, edesc, edesc->src, NULL, 0, 0); + talitos_sg_unmap(ctx->dev, edesc, edesc->src, NULL, 0, 0); =20 /* When using hashctx-in, must unmap it. */ - if (from_talitos_ptr_len(&desc->ptr[1], is_sec1)) - unmap_single_talitos_ptr(dev, &desc->ptr[1], + if (ctx->ptr_ops->from_talitos_ptr_len(&desc->ptr[1])) + unmap_single_talitos_ptr(ctx->dev, &desc->ptr[1], DMA_TO_DEVICE); =20 if (edesc->dma_len) - dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, + dma_unmap_single(ctx->dev, edesc->dma_link_tbl, edesc->dma_len, DMA_BIDIRECTIONAL); } =20 @@ -72,7 +70,7 @@ static void free_edesc_list_from(struct ahash_request *ar= eq, struct talitos_edes =20 while (edesc) { next =3D edesc->next_desc; - common_nonsnoop_hash_unmap(ctx->dev, edesc, areq); + common_nonsnoop_hash_unmap(ctx, edesc, areq); kfree(edesc); edesc =3D next; } @@ -97,7 +95,7 @@ static void ahash_done(struct device *dev, } else { next =3D edesc->next_desc; =20 - common_nonsnoop_hash_unmap(dev, edesc, areq); + common_nonsnoop_hash_unmap(ctx, edesc, areq); kfree(edesc); =20 if (err) @@ -167,8 +165,8 @@ static void common_nonsnoop_hash(struct talitos_edesc *= edesc, =20 /* HMAC key */ if (ctx->keylen) - to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, - is_sec1); + ctx->ptr_ops->to_talitos_ptr(&desc->ptr[2], ctx->dma_key, + ctx->keylen); =20 sg_count =3D edesc->src_nents ?: 1; if (is_sec1 && sg_count > 1) @@ -199,7 +197,7 @@ static void common_nonsnoop_hash(struct talitos_edesc *= edesc, =20 /* last DWORD empty */ =20 - if (is_sec1 && from_talitos_ptr_len(&desc->ptr[3], true) =3D=3D 0) + if (is_sec1 && ctx->ptr_ops->from_talitos_ptr_len(&desc->ptr[3]) =3D=3D 0) talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]); =20 if (sync_needed) diff --git a/drivers/crypto/talitos/talitos-skcipher.c b/drivers/crypto/tal= itos/talitos-skcipher.c index b12191243aae..a96f827c7b93 100644 --- a/drivers/crypto/talitos/talitos-skcipher.c +++ b/drivers/crypto/talitos/talitos-skcipher.c @@ -67,10 +67,10 @@ static int common_nonsnoop(struct talitos_edesc *edesc, /* first DWORD empty */ =20 /* cipher iv */ - to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize, is_sec1); + ctx->ptr_ops->to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize); =20 /* cipher key */ - to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, is_sec1); + ctx->ptr_ops->to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen); =20 sg_count =3D edesc->src_nents ?: 1; if (is_sec1 && sg_count > 1) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 0e4bd130ac6d..ff88f3dc3869 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -97,9 +97,8 @@ static void __map_single_talitos_ptr(struct device *dev, { dma_addr_t dma_addr =3D dma_map_single_attrs(dev, data, len, dir, attrs); struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); =20 - to_talitos_ptr(ptr, dma_addr, len, is_sec1); + priv->ptr_ops->to_talitos_ptr(ptr, dma_addr, len); } =20 void map_single_talitos_ptr(struct device *dev, @@ -127,10 +126,9 @@ void unmap_single_talitos_ptr(struct device *dev, enum dma_data_direction dir) { struct talitos_private *priv =3D dev_get_drvdata(dev); - bool is_sec1 =3D has_ftr_sec1(priv); =20 dma_unmap_single(dev, be32_to_cpu(ptr->ptr), - from_talitos_ptr_len(ptr, is_sec1), dir); + priv->ptr_ops->from_talitos_ptr_len(ptr), dir); } =20 /* @@ -455,7 +453,8 @@ void talitos_sg_unmap(struct device *dev, * convert scatterlist to SEC h/w link table format * stop at cryptlen bytes */ -static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count, +static int sg_to_link_tbl_offset(const struct talitos_ptr_ops *ptr_ops, + struct scatterlist *sg, int sg_count, unsigned int offset, int datalen, int elen, struct talitos_ptr *link_tbl_ptr, int align) { @@ -478,16 +477,16 @@ static int sg_to_link_tbl_offset(struct scatterlist *= sg, int sg_count, len =3D cryptlen; =20 if (datalen > 0 && len > datalen) { - to_talitos_ptr(link_tbl_ptr + count, - sg_dma_address(sg) + offset, datalen, 0); - to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0); + ptr_ops->to_talitos_ptr(link_tbl_ptr + count, + sg_dma_address(sg) + offset, datalen); + ptr_ops->to_talitos_ptr_ext_set(link_tbl_ptr + count, 0); count++; len -=3D datalen; offset +=3D datalen; } - to_talitos_ptr(link_tbl_ptr + count, - sg_dma_address(sg) + offset, sg_next(sg) ? len : len + padding, = 0); - to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0); + ptr_ops->to_talitos_ptr(link_tbl_ptr + count, + sg_dma_address(sg) + offset, sg_next(sg) ? len : len + padding); + ptr_ops->to_talitos_ptr_ext_set(link_tbl_ptr + count, 0); count++; cryptlen -=3D len; datalen -=3D len; @@ -499,8 +498,8 @@ static int sg_to_link_tbl_offset(struct scatterlist *sg= , int sg_count, =20 /* tag end of link table */ if (count > 0) - to_talitos_ptr_ext_set(link_tbl_ptr + count - 1, - DESC_PTR_LNKTBL_RET, 0); + ptr_ops->to_talitos_ptr_ext_set(link_tbl_ptr + count - 1, + DESC_PTR_LNKTBL_RET); =20 return count; } @@ -512,32 +511,34 @@ int talitos_sg_map_ext(struct device *dev, struct sca= tterlist *src, bool force, int align) { struct talitos_private *priv =3D dev_get_drvdata(dev); + const struct talitos_ptr_ops *ptr_ops =3D priv->ptr_ops; bool is_sec1 =3D has_ftr_sec1(priv); int aligned_len =3D ALIGN(len, align); =20 if (!src) { - to_talitos_ptr(ptr, 0, 0, is_sec1); + ptr_ops->to_talitos_ptr(ptr, 0, 0); return 1; } - to_talitos_ptr_ext_set(ptr, elen, is_sec1); + ptr_ops->to_talitos_ptr_ext_set(ptr, elen); if (sg_count =3D=3D 1 && !force) { - to_talitos_ptr(ptr, sg_dma_address(src) + offset, aligned_len, is_sec1); + ptr_ops->to_talitos_ptr(ptr, sg_dma_address(src) + offset, aligned_len); return sg_count; } if (is_sec1) { - to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, aligned_len, is_sec1); + ptr_ops->to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, aligned_len); return sg_count; } - sg_count =3D sg_to_link_tbl_offset(src, sg_count, offset, len, elen, - &edesc->link_tbl[tbl_off], align); + sg_count =3D sg_to_link_tbl_offset(ptr_ops, src, sg_count, offset, + len, elen, &edesc->link_tbl[tbl_off], + align); if (sg_count =3D=3D 1 && !force) { /* Only one segment now, so no link tbl needed*/ - copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off], is_sec1); + ptr_ops->copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off]); return sg_count; } - to_talitos_ptr(ptr, edesc->dma_link_tbl + - tbl_off * sizeof(struct talitos_ptr), aligned_len, is_sec1); - to_talitos_ptr_ext_or(ptr, DESC_PTR_LNKTBL_JUMP, is_sec1); + ptr_ops->to_talitos_ptr(ptr, edesc->dma_link_tbl + + tbl_off * sizeof(struct talitos_ptr), aligned_len); + ptr_ops->to_talitos_ptr_ext_or(ptr, DESC_PTR_LNKTBL_JUMP); =20 return sg_count; } --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 505D03B2FFE for ; Thu, 28 May 2026 09:09:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959397; cv=none; b=J4N8/gYgajgSQvZejvatUqWBoA/7w8seYbLtvvdEoZyWykXirXS1nrM+Xluz9os+RkA9ucM0IctUKfpiff27CDwWzt+MJIMOXH2lufxYllI0k7WV/7XlLIgBadc9PykDlzeR744wigwWHtPZsstDCEdFNMgikjYvOdQb8UDcRbs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959397; c=relaxed/simple; bh=T9HscMeaz6gg5XlEag5GYjUMRqxENoEO1Fp75BiOQuA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=byw6NodEPd6xmE8ZXH/NfHBnvpQeNeVj0lnqTHKFT/AmX2AdbT90jNOhzJyBUuKf9c0KX5gl5FkuAA3mjqH/YXOR5opGfiADt5jz5L1JeernrYaPJqV8Husamdf7qfthCvPB4v55Ng5AIUQ8Qcs474SG12WQqmaISbq6C8kFWEk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=QHQ+zzuK; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="QHQ+zzuK" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 08CD8C62445; Thu, 28 May 2026 09:09:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D50CE60495; Thu, 28 May 2026 09:09:53 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 728E410888C9E; Thu, 28 May 2026 11:09:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959393; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=XzCaY1aPlW7IrM7DEbItV1ujQEkMDOecqKFHMXBmDlY=; b=QHQ+zzuKvj6QMcMzTDjF13xVLJAPzBdJ2ZMOugK/w2JPe8CdaTZlOt2Bh9zeNImKrFfKPl Bnr0E4U31xJsuGRHMToceUMhe88uxbo7rs/2hyiNmLsI0aNzyFi/xi3ZcYu2q1Autfjeds eyKEqg5VaojqWnrhC77rUDKqppJNsQdCjAV2E137b4arkhJOnxrGkQmhOy5qvm29HJ3YwX xLESk+VD50HYhU4h7th/QKGB97ZEbTuwxjBEflB2oZwaYQj7aMTP9b9tNiZ4sn6GMpnvct nWyeCKGHfFLQIu3Fl+n2n1J2pD+IBbN2HXU+TQcZuwwtlNodaltghwL0wFoLkw== From: Paul Louvel Date: Thu, 28 May 2026 11:08:39 +0200 Subject: [PATCH 26/29] crypto: talitos - Remove now-unused global pointer helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-26-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=2854; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=T9HscMeaz6gg5XlEag5GYjUMRqxENoEO1Fp75BiOQuA=; b=bJzkzL7uqVWx1COxIqD4e2OU5jER24ff2d8JfgZ2rif6fiEIjUQhWRvEB//x1PMYa5tVvnoD8 Ti1QphHRFjQAT4jXboHHHyWUT8W4UyBNjxBr5womrRe3zs9+7zvNmiE X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Remove to_talitos_ptr(), copy_talitos_ptr(), from_talitos_ptr_len(), to_talitos_ptr_ext_set() and to_talitos_ptr_ext_or() from talitos.c and their declarations from talitos.h, now that all callers dispatch through the per-SEC-version ptr_ops. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos.c | 46 ------------------------------------= ---- drivers/crypto/talitos/talitos.h | 8 ------- 2 files changed, 54 deletions(-) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index ff88f3dc3869..19e63ce6cc3e 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -40,52 +40,6 @@ =20 #include "talitos.h" =20 -void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr, - unsigned int len, bool is_sec1) -{ - ptr->ptr =3D cpu_to_be32(lower_32_bits(dma_addr)); - if (is_sec1) { - ptr->len1 =3D cpu_to_be16(len); - } else { - ptr->len =3D cpu_to_be16(len); - ptr->eptr =3D upper_32_bits(dma_addr); - } -} - -void copy_talitos_ptr(struct talitos_ptr *dst_ptr, - struct talitos_ptr *src_ptr, bool is_sec1) -{ - dst_ptr->ptr =3D src_ptr->ptr; - if (is_sec1) { - dst_ptr->len1 =3D src_ptr->len1; - } else { - dst_ptr->len =3D src_ptr->len; - dst_ptr->eptr =3D src_ptr->eptr; - } -} - -unsigned short from_talitos_ptr_len(struct talitos_ptr *ptr, - bool is_sec1) -{ - if (is_sec1) - return be16_to_cpu(ptr->len1); - else - return be16_to_cpu(ptr->len); -} - -void to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val, - bool is_sec1) -{ - if (!is_sec1) - ptr->j_extent =3D val; -} - -void to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val, bool is_sec1) -{ - if (!is_sec1) - ptr->j_extent |=3D val; -} - /* * map virtual single (contiguous) pointer to h/w descriptor pointer */ diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 09d4e8fb0e62..54e33da03fd0 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -521,14 +521,6 @@ static inline bool has_ftr_sec1(struct talitos_private= *priv) #define DESC_PTR_LNKTBL_RET 0x02 #define DESC_PTR_LNKTBL_NEXT 0x01 =20 -void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr, - unsigned int len, bool is_sec1); -void copy_talitos_ptr(struct talitos_ptr *dst_ptr, struct talitos_ptr *src= _ptr, - bool is_sec1); -unsigned short from_talitos_ptr_len(struct talitos_ptr *ptr, bool is_sec1); -void to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val, bool is_sec1); -void to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val, bool is_sec1); - void map_single_talitos_ptr(struct device *dev, struct talitos_ptr *ptr, unsigned int len, void *data, enum dma_data_direction dir); --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C10D33B3C0A for ; Thu, 28 May 2026 09:09:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959402; cv=none; b=fcV9mZZHjr5MHPgnbMyGxVTIM5Q/SUPAFhwOSWp2c8FTzGKXen4pDclXtIj3Qkl4FL4agrra+JBYaUVhWoyQg82CrTHEY+6Zwo/Xv5IQU9v3f0vrbHcTtHY8WWSdZnRd25PRVcRtuLKGfyssLJY5d7/fLTHy/kwyuhPeiOI1G+8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959402; c=relaxed/simple; bh=AwkTne2DpjaskKOcVrTB7wsu1t/Np5cmtR2G7RoY2x4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RUojiNxcqLUFu0jAvtZLhvmKC3wmD7iocVbmAWKHfvMbE0tvX91cVjYBNBAp93D66aTG8KK6bMByeTxKNiCRTztppUHF/YGUimaI85Bh84n9BCemWD3sJiksiB37tIYhRcWPPX+5z+u54MfJrcip3wzlVcgFbo6vkRLZIn8oZeA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=szqTbnht; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="szqTbnht" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 32F194E42D77; Thu, 28 May 2026 09:09:55 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 082E060495; Thu, 28 May 2026 09:09:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 902E110888CAB; Thu, 28 May 2026 11:09:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959394; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=4d3SOoFS+otUkmIWzxrwa2PblaZecXy59CvGvvWOFL4=; b=szqTbnhtX4AMa8HDwCPudRQ4/ZqMWk0+LV64ugC8iEK3YaaYDShDeajmYGpuR2rTTdNMcR VZdtwjb7XfZrEgqfnXhZC+JyVRkh8amYld/ZOrzeItKMZTDfg1XmIOXXr5P0oPIiShLPO9 AIdgRl6YdD7dV7NAJ0x5aL0x3s2FcH5/hvVijhHR+lXDZVmDvpBxIu1FpSlmlq2RQbYGDC PdsSHHGlgHs5CXExqmamVCR3RSBlYllwVxBcmMbM2iGjhtKk+8AFBpBOisdilL9AzFguyc AlZqOOC3bLlPyuK6012zTnVtdu/3rPS3Eot+dm84yWNjG0Ax1M1geN3NeoMhzQ== From: Paul Louvel Date: Thu, 28 May 2026 11:08:40 +0200 Subject: [PATCH 27/29] crypto: talitos - Introduce per-SEC-version descriptor structures and ops Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-27-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=30709; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=AwkTne2DpjaskKOcVrTB7wsu1t/Np5cmtR2G7RoY2x4=; b=4sG+FaWtOwOW9sZNR740WGyJ+0HsuVDo8A0+rBfgdOjWJkYkiZXQHyhCQt+fNSP+B2F9tUwUI lsfm5K6/OAfBpQXAujpUev2geAvzcBYVS6WEsSsqCNZFBlxEZ5Zwjq8 X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 The driver used a single shared talitos_desc with overlapping union members and a SEC1-specific "hdr1" hack to handle differences between SEC1 and SEC2 descriptor layouts. Introduce distinct sec1_talitos_desc/sec2_talitos_desc and sec1_talitos_ptr/sec2_talitos_ptr structures, nested inside a union in talitos_desc/talitos_ptr. Mark them packed to reflect that these structures are used directly by the hardware, even if the structure is naturally aligned. Abstract descriptor field access through a new talitos_desc_ops structure (set_hdr, get_hdr, get_hdr_lo, get_ptr), and add get_ptr_value to the existing talitos_ptr_ops. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos-aead.c | 76 +++++++++++++++++++--------= ---- drivers/crypto/talitos/talitos-hash.c | 51 +++++++++++++-------- drivers/crypto/talitos/talitos-sec1.c | 61 +++++++++++++++++++------ drivers/crypto/talitos/talitos-sec2.c | 56 ++++++++++++++++++----- drivers/crypto/talitos/talitos-skcipher.c | 46 +++++++++++-------- drivers/crypto/talitos/talitos.c | 4 +- drivers/crypto/talitos/talitos.h | 60 +++++++++++++++++------- 7 files changed, 244 insertions(+), 110 deletions(-) diff --git a/drivers/crypto/talitos/talitos-aead.c b/drivers/crypto/talitos= /talitos-aead.c index b585abdd2275..d1cec7e4dd3f 100644 --- a/drivers/crypto/talitos/talitos-aead.c +++ b/drivers/crypto/talitos/talitos-aead.c @@ -94,12 +94,15 @@ static void ipsec_esp_unmap(struct device *dev, unsigned int ivsize =3D crypto_aead_ivsize(aead); unsigned int authsize =3D crypto_aead_authsize(aead); unsigned int cryptlen =3D areq->cryptlen - (encrypt ? 0 : authsize); - bool is_ipsec_esp =3D edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP; - struct talitos_ptr *civ_ptr =3D &edesc->desc.ptr[is_ipsec_esp ? 2 : 3]; + bool is_ipsec_esp =3D ctx->desc_ops->get_hdr(&edesc->desc) & + DESC_HDR_TYPE_IPSEC_ESP; + struct talitos_ptr *civ_ptr =3D + ctx->desc_ops->get_ptr(&edesc->desc, is_ipsec_esp ? 2 : 3); =20 if (is_ipsec_esp) - unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6], - DMA_FROM_DEVICE); + unmap_single_talitos_ptr( + dev, ctx->desc_ops->get_ptr(&edesc->desc, 6), + DMA_FROM_DEVICE); unmap_single_talitos_ptr(dev, civ_ptr, DMA_TO_DEVICE); =20 talitos_sg_unmap(dev, edesc, areq->src, areq->dst, @@ -171,6 +174,7 @@ static void ipsec_esp_decrypt_hwauth_done(struct device= *dev, struct talitos_desc *desc, void *context, int err) { + struct talitos_ctx *ctx =3D crypto_aead_ctx(crypto_aead_reqtfm(context)); struct aead_request *req =3D context; struct talitos_edesc *edesc; =20 @@ -179,8 +183,8 @@ static void ipsec_esp_decrypt_hwauth_done(struct device= *dev, ipsec_esp_unmap(dev, edesc, req, false); =20 /* check ICV auth status */ - if (!err && ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) !=3D - DESC_HDR_LO_ICCR1_PASS)) + if (!err && ((ctx->desc_ops->get_hdr_lo(desc) & + DESC_HDR_LO_ICCR1_MASK) !=3D DESC_HDR_LO_ICCR1_PASS)) err =3D -EBADMSG; =20 kfree(edesc); @@ -210,13 +214,17 @@ static int ipsec_esp(struct talitos_edesc *edesc, str= uct aead_request *areq, bool sync_needed =3D false; struct talitos_private *priv =3D dev_get_drvdata(dev); bool is_sec1 =3D has_ftr_sec1(priv); - bool is_ipsec_esp =3D desc->hdr & DESC_HDR_TYPE_IPSEC_ESP; - struct talitos_ptr *civ_ptr =3D &desc->ptr[is_ipsec_esp ? 2 : 3]; - struct talitos_ptr *ckey_ptr =3D &desc->ptr[is_ipsec_esp ? 3 : 2]; + bool is_ipsec_esp =3D ctx->desc_ops->get_hdr(desc) & + DESC_HDR_TYPE_IPSEC_ESP; + struct talitos_ptr *civ_ptr =3D + ctx->desc_ops->get_ptr(desc, is_ipsec_esp ? 2 : 3); + struct talitos_ptr *ckey_ptr =3D + ctx->desc_ops->get_ptr(desc, is_ipsec_esp ? 3 : 2); dma_addr_t dma_icv =3D edesc->dma_link_tbl + edesc->dma_len - authsize; =20 /* hmac key */ - ctx->ptr_ops->to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen= ); + ctx->ptr_ops->to_talitos_ptr(ctx->desc_ops->get_ptr(desc, 0), + ctx->dma_key, ctx->authkeylen); =20 sg_count =3D edesc->src_nents ?: 1; if (is_sec1 && sg_count > 1) @@ -229,7 +237,8 @@ static int ipsec_esp(struct talitos_edesc *edesc, struc= t aead_request *areq, =20 /* hmac data */ ret =3D talitos_sg_map(dev, areq->src, areq->assoclen, edesc, - &desc->ptr[1], sg_count, 0, tbl_off); + ctx->desc_ops->get_ptr(desc, 1), sg_count, 0, + tbl_off); =20 if (ret > 1) { tbl_off +=3D ret; @@ -249,12 +258,13 @@ static int ipsec_esp(struct talitos_edesc *edesc, str= uct aead_request *areq, * extent is bytes of HMAC postpended to ciphertext, * typically 12 for ipsec */ - if (is_ipsec_esp && (desc->hdr & DESC_HDR_MODE1_MDEU_CICV)) + if (is_ipsec_esp && + (ctx->desc_ops->get_hdr(desc) & DESC_HDR_MODE1_MDEU_CICV)) elen =3D authsize; =20 - ret =3D talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4], - sg_count, areq->assoclen, tbl_off, elen, - false, 1); + ret =3D talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, + ctx->desc_ops->get_ptr(desc, 4), sg_count, + areq->assoclen, tbl_off, elen, false, 1); =20 if (ret > 1) { tbl_off +=3D ret; @@ -272,8 +282,9 @@ static int ipsec_esp(struct talitos_edesc *edesc, struc= t aead_request *areq, elen =3D authsize; else elen =3D 0; - ret =3D talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5], - sg_count, areq->assoclen, tbl_off, elen, + ret =3D talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, + ctx->desc_ops->get_ptr(desc, 5), sg_count, + areq->assoclen, tbl_off, elen, is_ipsec_esp && !encrypt, 1); tbl_off +=3D ret; =20 @@ -286,20 +297,23 @@ static int ipsec_esp(struct talitos_edesc *edesc, str= uct aead_request *areq, =20 /* icv data follows link tables */ ctx->ptr_ops->to_talitos_ptr(tbl_ptr, dma_icv, authsize); - ctx->ptr_ops->to_talitos_ptr_ext_or(&desc->ptr[5], authsize); + ctx->ptr_ops->to_talitos_ptr_ext_or( + ctx->desc_ops->get_ptr(desc, 5), authsize); sync_needed =3D true; } else if (!encrypt) { - ctx->ptr_ops->to_talitos_ptr(&desc->ptr[6], dma_icv, authsize); + ctx->ptr_ops->to_talitos_ptr(ctx->desc_ops->get_ptr(desc, 6), + dma_icv, authsize); sync_needed =3D true; } else if (!is_ipsec_esp) { - talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6], - sg_count, areq->assoclen + cryptlen, tbl_off); + talitos_sg_map(dev, areq->dst, authsize, edesc, + ctx->desc_ops->get_ptr(desc, 6), sg_count, + areq->assoclen + cryptlen, tbl_off); } =20 /* iv out */ if (is_ipsec_esp) - map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv, - DMA_FROM_DEVICE); + map_single_talitos_ptr(dev, ctx->desc_ops->get_ptr(desc, 6), + ivsize, ctx->iv, DMA_FROM_DEVICE); =20 if (sync_needed) dma_sync_single_for_device(dev, edesc->dma_link_tbl, @@ -341,7 +355,7 @@ static int aead_encrypt(struct aead_request *req) return PTR_ERR(edesc); =20 /* set encrypt */ - edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT; + ctx->desc_ops->set_hdr(&edesc->desc, ctx->desc_hdr_template | DESC_HDR_MO= DE0_ENCRYPT); =20 return ipsec_esp(edesc, req, true, ipsec_esp_encrypt_done); } @@ -354,21 +368,24 @@ static int aead_decrypt(struct aead_request *req) struct talitos_private *priv =3D dev_get_drvdata(ctx->dev); struct talitos_edesc *edesc; void *icvdata; + __be32 hdr; =20 /* allocate extended descriptor */ edesc =3D aead_edesc_alloc(req, req->iv, 1, false); if (IS_ERR(edesc)) return PTR_ERR(edesc); =20 - if ((edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP) && + hdr =3D ctx->desc_ops->get_hdr(&edesc->desc); + if ((hdr & DESC_HDR_TYPE_IPSEC_ESP) && (priv->features & TALITOS_FTR_HW_AUTH_CHECK) && ((!edesc->src_nents && !edesc->dst_nents) || priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) { =20 /* decrypt and check the ICV */ - edesc->desc.hdr =3D ctx->desc_hdr_template | - DESC_HDR_DIR_INBOUND | - DESC_HDR_MODE1_MDEU_CICV; + ctx->desc_ops->set_hdr(&edesc->desc, + ctx->desc_hdr_template | + DESC_HDR_DIR_INBOUND | + DESC_HDR_MODE1_MDEU_CICV); =20 /* reset integrity check result bits */ =20 @@ -377,7 +394,8 @@ static int aead_decrypt(struct aead_request *req) } =20 /* Have to check the ICV with software */ - edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; + ctx->desc_ops->set_hdr(&edesc->desc, + ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND); =20 /* stash incoming ICV for later cmp with ICV generated by the h/w */ icvdata =3D edesc->buf + edesc->dma_len; diff --git a/drivers/crypto/talitos/talitos-hash.c b/drivers/crypto/talitos= /talitos-hash.c index 026eebf037f5..fb4d53e2abf8 100644 --- a/drivers/crypto/talitos/talitos-hash.c +++ b/drivers/crypto/talitos/talitos-hash.c @@ -44,7 +44,8 @@ static void common_nonsnoop_hash_unmap(struct talitos_ctx= *ctx, struct crypto_ahash *tfm =3D crypto_ahash_reqtfm(areq); struct talitos_desc *desc =3D &edesc->desc; =20 - unmap_single_talitos_ptr(ctx->dev, &desc->ptr[5], DMA_FROM_DEVICE); + unmap_single_talitos_ptr(ctx->dev, ctx->desc_ops->get_ptr(desc, 5), + DMA_FROM_DEVICE); =20 if (edesc->last && req_ctx->last_request) memcpy(areq->result, req_ctx->hw_context, @@ -54,8 +55,9 @@ static void common_nonsnoop_hash_unmap(struct talitos_ctx= *ctx, talitos_sg_unmap(ctx->dev, edesc, edesc->src, NULL, 0, 0); =20 /* When using hashctx-in, must unmap it. */ - if (ctx->ptr_ops->from_talitos_ptr_len(&desc->ptr[1])) - unmap_single_talitos_ptr(ctx->dev, &desc->ptr[1], + if (ctx->ptr_ops->from_talitos_ptr_len(ctx->desc_ops->get_ptr(desc, 1))) + unmap_single_talitos_ptr(ctx->dev, + ctx->desc_ops->get_ptr(desc, 1), DMA_TO_DEVICE); =20 if (edesc->dma_len) @@ -131,7 +133,9 @@ static void talitos_handle_buggy_hash(struct talitos_ct= x *ctx, }; =20 pr_err_once("Bug in SEC1, padding ourself\n"); - edesc->desc.hdr &=3D ~DESC_HDR_MODE0_MDEU_PAD; + ctx->desc_ops->set_hdr(&edesc->desc, + ctx->desc_ops->get_hdr(&edesc->desc) & + ~DESC_HDR_MODE0_MDEU_PAD); map_single_talitos_ptr(ctx->dev, ptr, sizeof(padded_hash), (char *)padded_hash, DMA_TO_DEVICE); } @@ -154,7 +158,8 @@ static void common_nonsnoop_hash(struct talitos_edesc *= edesc, =20 /* hash context in */ if (!edesc->first || !req_ctx->first_request || req_ctx->swinit) { - map_single_talitos_ptr_nosync(dev, &desc->ptr[1], + map_single_talitos_ptr_nosync(dev, + ctx->desc_ops->get_ptr(desc, 1), req_ctx->hw_context_size, req_ctx->hw_context, DMA_TO_DEVICE); @@ -165,8 +170,8 @@ static void common_nonsnoop_hash(struct talitos_edesc *= edesc, =20 /* HMAC key */ if (ctx->keylen) - ctx->ptr_ops->to_talitos_ptr(&desc->ptr[2], ctx->dma_key, - ctx->keylen); + ctx->ptr_ops->to_talitos_ptr(ctx->desc_ops->get_ptr(desc, 2), + ctx->dma_key, ctx->keylen); =20 sg_count =3D edesc->src_nents ?: 1; if (is_sec1 && sg_count > 1) @@ -177,8 +182,10 @@ static void common_nonsnoop_hash(struct talitos_edesc = *edesc, /* * data in */ - sg_count =3D talitos_sg_map(dev, edesc->src, length, edesc, &desc->ptr[3], - sg_count, 0, 0); + sg_count =3D talitos_sg_map(dev, edesc->src, length, edesc, + ctx->desc_ops->get_ptr(desc, 3), sg_count, 0, + 0); + if (sg_count > 1) sync_needed =3D true; =20 @@ -186,19 +193,22 @@ static void common_nonsnoop_hash(struct talitos_edesc= *edesc, =20 /* hash/HMAC out -or- hash context out */ if (edesc->last && req_ctx->last_request) - map_single_talitos_ptr(dev, &desc->ptr[5], + map_single_talitos_ptr(dev, ctx->desc_ops->get_ptr(desc, 5), crypto_ahash_digestsize(tfm), req_ctx->hw_context, DMA_FROM_DEVICE); else - map_single_talitos_ptr_nosync(dev, &desc->ptr[5], + map_single_talitos_ptr_nosync(dev, + ctx->desc_ops->get_ptr(desc, 5), req_ctx->hw_context_size, req_ctx->hw_context, DMA_FROM_DEVICE); =20 /* last DWORD empty */ =20 - if (is_sec1 && ctx->ptr_ops->from_talitos_ptr_len(&desc->ptr[3]) =3D=3D 0) - talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]); + if (is_sec1 && ctx->ptr_ops->from_talitos_ptr_len( + ctx->desc_ops->get_ptr(desc, 3)) =3D=3D 0) + talitos_handle_buggy_hash(ctx, edesc, + ctx->desc_ops->get_ptr(desc, 3)); =20 if (sync_needed) dma_sync_single_for_device(dev, edesc->dma_link_tbl, @@ -229,6 +239,7 @@ ahash_process_req_prepare(struct ahash_request *areq, u= nsigned int nbytes, size_t to_hash_this_desc; struct scatterlist *src; size_t offset =3D 0; + __be32 hdr; =20 do { src =3D scatterwalk_ffwd(tmp, areq->src, offset); @@ -245,19 +256,19 @@ ahash_process_req_prepare(struct ahash_request *areq,= unsigned int nbytes, } =20 edesc->src =3D scatterwalk_ffwd(edesc->bufsl, areq->src, offset); - edesc->desc.hdr =3D ctx->desc_hdr_template; + hdr =3D ctx->desc_hdr_template; edesc->first =3D offset =3D=3D 0; edesc->last =3D nbytes - to_hash_this_desc =3D=3D 0; =20 /* On last one, request SEC to pad; otherwise continue */ if (req_ctx->last_request && edesc->last) - edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_PAD; + hdr |=3D DESC_HDR_MODE0_MDEU_PAD; else - edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_CONT; + hdr |=3D DESC_HDR_MODE0_MDEU_CONT; =20 /* request SEC to INIT hash. */ if (req_ctx->first_request && edesc->first && !req_ctx->swinit) - edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_INIT; + hdr |=3D DESC_HDR_MODE0_MDEU_INIT; =20 /* * When the tfm context has a keylen, it's an HMAC. @@ -265,11 +276,13 @@ ahash_process_req_prepare(struct ahash_request *areq,= unsigned int nbytes, */ if (ctx->keylen && ((req_ctx->first_request && edesc->first) || (req_ctx->last_request && edesc->last))) - edesc->desc.hdr |=3D DESC_HDR_MODE0_MDEU_HMAC; + hdr |=3D DESC_HDR_MODE0_MDEU_HMAC; =20 /* clear the DN bit */ if (is_sec1 && !edesc->last) - edesc->desc.hdr &=3D ~DESC_HDR_DONE_NOTIFY; + hdr &=3D ~DESC_HDR_DONE_NOTIFY; + + ctx->desc_ops->set_hdr(&edesc->desc, hdr); =20 common_nonsnoop_hash(edesc, areq, to_hash_this_desc); =20 diff --git a/drivers/crypto/talitos/talitos-sec1.c b/drivers/crypto/talitos= /talitos-sec1.c index ef1bd19b6772..e4f482520372 100644 --- a/drivers/crypto/talitos/talitos-sec1.c +++ b/drivers/crypto/talitos/talitos-sec1.c @@ -76,20 +76,20 @@ DEF_TALITOS1_INTERRUPT(4ch, TALITOS1_ISR_4CHDONE, TALIT= OS1_ISR_4CHERR, 0) static void sec1_to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_ad= dr, unsigned int len) { - ptr->ptr =3D cpu_to_be32(lower_32_bits(dma_addr)); - ptr->len1 =3D cpu_to_be16(len); + ptr->sec1.ptr =3D cpu_to_be32(lower_32_bits(dma_addr)); + ptr->sec1.len =3D cpu_to_be16(len); } =20 static void sec1_copy_talitos_ptr(struct talitos_ptr *dst_ptr, struct talitos_ptr *src_ptr) { - dst_ptr->ptr =3D src_ptr->ptr; - dst_ptr->len1 =3D src_ptr->len1; + dst_ptr->sec1.ptr =3D src_ptr->sec1.ptr; + dst_ptr->sec1.len =3D src_ptr->sec1.len; } =20 static unsigned short sec1_from_talitos_ptr_len(struct talitos_ptr *ptr) { - return be16_to_cpu(ptr->len1); + return be16_to_cpu(ptr->sec1.len); } =20 static void sec1_to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val) @@ -100,6 +100,31 @@ static void sec1_to_talitos_ptr_ext_or(struct talitos_= ptr *ptr, u8 val) { } =20 +static __be32 sec1_get_ptr_value(struct talitos_ptr *ptr) +{ + return ptr->sec1.ptr; +} + +static __be32 sec1_get_hdr(struct talitos_desc *desc) +{ + return desc->sec1.hdr; +} + +static __be32 sec1_get_hdr_lo(struct talitos_desc *desc) +{ + return 0; +} + +static void sec1_set_hdr(struct talitos_desc *desc, __be32 val) +{ + desc->sec1.hdr =3D val; +} + +static struct talitos_ptr *sec1_get_ptr(struct talitos_desc *desc, size_t = idx) +{ + return (struct talitos_ptr *)&desc->sec1.ptr[idx]; +} + static int sec1_reset_device(struct device *dev) { struct talitos_private *priv =3D dev_get_drvdata(dev); @@ -163,9 +188,8 @@ static void sec1_dma_map_request(struct device *dev, struct talitos_edesc *prev_edesc =3D NULL; =20 while (edesc) { - edesc->desc.hdr1 =3D edesc->desc.hdr; =20 - dma_desc =3D dma_map_single(dev, &edesc->desc.hdr1, + dma_desc =3D dma_map_single(dev, &edesc->desc.sec1.hdr, TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); =20 if (!prev_edesc) { @@ -175,7 +199,7 @@ static void sec1_dma_map_request(struct device *dev, =20 /* Chain in any previous descriptors. */ =20 - prev_edesc->desc.next_desc =3D cpu_to_be32(dma_desc); + prev_edesc->desc.sec1.next_desc =3D cpu_to_be32(dma_desc); =20 dma_sync_single_for_device(dev, prev_dma_desc, TALITOS_DESC_SIZE, DMA_TO_DEVICE); @@ -196,7 +220,7 @@ static void sec1_dma_unmap_request(struct device *dev, DMA_BIDIRECTIONAL); edesc =3D container_of(request->desc, struct talitos_edesc, desc); while (edesc->next_desc) { - dma_unmap_single(dev, be32_to_cpu(edesc->desc.next_desc), + dma_unmap_single(dev, be32_to_cpu(edesc->desc.sec1.next_desc), TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); edesc =3D edesc->next_desc; } @@ -211,14 +235,14 @@ static __be32 sec1_get_request_hdr(struct device *dev, edesc =3D container_of(request->desc, struct talitos_edesc, desc); dma_desc =3D request->dma_desc; while (edesc->next_desc) { - dma_desc =3D be32_to_cpu(edesc->desc.next_desc); + dma_desc =3D be32_to_cpu(edesc->desc.sec1.next_desc); edesc =3D edesc->next_desc; } =20 dma_sync_single_for_cpu(dev, dma_desc, TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); =20 - return edesc->desc.hdr1; + return edesc->desc.sec1.hdr; } =20 static __be32 sec1_search_desc_hdr_in_request(struct talitos_request *requ= est, @@ -228,12 +252,12 @@ static __be32 sec1_search_desc_hdr_in_request(struct = talitos_request *request, =20 =20 if (request->dma_desc =3D=3D cur_desc) - return request->desc->hdr; + return request->desc->sec1.hdr; =20 edesc =3D container_of(request->desc, struct talitos_edesc, desc); while (edesc->next_desc) { - if (edesc->desc.next_desc =3D=3D cpu_to_be32(cur_desc)) - return edesc->next_desc->desc.hdr1; + if (edesc->desc.sec1.next_desc =3D=3D cpu_to_be32(cur_desc)) + return edesc->next_desc->desc.sec1.hdr; edesc =3D edesc->next_desc; } =20 @@ -319,6 +343,14 @@ static const struct talitos_ptr_ops sec1_ptr_ops =3D { .from_talitos_ptr_len =3D sec1_from_talitos_ptr_len, .to_talitos_ptr_ext_set =3D sec1_to_talitos_ptr_ext_set, .to_talitos_ptr_ext_or =3D sec1_to_talitos_ptr_ext_or, + .get_ptr_value =3D sec1_get_ptr_value, +}; + +static const struct talitos_desc_ops sec1_desc_ops =3D { + .set_hdr =3D sec1_set_hdr, + .get_hdr =3D sec1_get_hdr, + .get_hdr_lo =3D sec1_get_hdr_lo, + .get_ptr =3D sec1_get_ptr, }; =20 static const struct talitos_ops sec1_ops =3D { @@ -337,5 +369,6 @@ static const struct talitos_ops sec1_ops =3D { void talitos_register_sec1(struct talitos_private *priv) { priv->ops =3D &sec1_ops; + priv->desc_ops =3D &sec1_desc_ops; priv->ptr_ops =3D &sec1_ptr_ops; } diff --git a/drivers/crypto/talitos/talitos-sec2.c b/drivers/crypto/talitos= /talitos-sec2.c index 14f0ca13e6e5..52f783ddc8b6 100644 --- a/drivers/crypto/talitos/talitos-sec2.c +++ b/drivers/crypto/talitos/talitos-sec2.c @@ -82,32 +82,57 @@ DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE) static void sec2_to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_ad= dr, unsigned int len) { - ptr->ptr =3D cpu_to_be32(lower_32_bits(dma_addr)); - ptr->len =3D cpu_to_be16(len); - ptr->eptr =3D upper_32_bits(dma_addr); + ptr->sec2.ptr =3D cpu_to_be32(lower_32_bits(dma_addr)); + ptr->sec2.len =3D cpu_to_be16(len); + ptr->sec2.eptr =3D upper_32_bits(dma_addr); } =20 static void sec2_copy_talitos_ptr(struct talitos_ptr *dst_ptr, struct talitos_ptr *src_ptr) { - dst_ptr->ptr =3D src_ptr->ptr; - dst_ptr->len =3D src_ptr->len; - dst_ptr->eptr =3D src_ptr->eptr; + dst_ptr->sec2.ptr =3D src_ptr->sec2.ptr; + dst_ptr->sec2.len =3D src_ptr->sec2.len; + dst_ptr->sec2.eptr =3D src_ptr->sec2.eptr; } =20 static unsigned short sec2_from_talitos_ptr_len(struct talitos_ptr *ptr) { - return be16_to_cpu(ptr->len); + return be16_to_cpu(ptr->sec2.len); } =20 static void sec2_to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val) { - ptr->j_extent =3D val; + ptr->sec2.j_extent =3D val; } =20 static void sec2_to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val) { - ptr->j_extent |=3D val; + ptr->sec2.j_extent |=3D val; +} + +static __be32 sec2_get_ptr_value(struct talitos_ptr *ptr) +{ + return ptr->sec2.ptr; +} + +static __be32 sec2_get_hdr(struct talitos_desc *desc) +{ + return desc->sec2.hdr; +} + +static __be32 sec2_get_hdr_lo(struct talitos_desc *desc) +{ + return desc->sec2.hdr_lo; +} + +static void sec2_set_hdr(struct talitos_desc *desc, __be32 val) +{ + desc->sec2.hdr =3D val; +} + +static struct talitos_ptr *sec2_get_ptr(struct talitos_desc *desc, size_t = idx) +{ + return (struct talitos_ptr *)&desc->sec2.ptr[idx]; } =20 static int sec2_reset_channel(struct device *dev, int ch) @@ -331,14 +356,14 @@ static __be32 sec2_get_request_hdr(struct device *dev, dma_sync_single_for_cpu(dev, request->dma_desc, TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); =20 - return request->desc->hdr; + return request->desc->sec2.hdr; } =20 static __be32 sec2_search_desc_hdr_in_request(struct talitos_request *requ= est, dma_addr_t cur_desc) { if (request->dma_desc =3D=3D cur_desc) - return request->desc->hdr; + return request->desc->sec2.hdr; return 0; } =20 @@ -348,6 +373,14 @@ static const struct talitos_ptr_ops sec2_ptr_ops =3D { .from_talitos_ptr_len =3D sec2_from_talitos_ptr_len, .to_talitos_ptr_ext_set =3D sec2_to_talitos_ptr_ext_set, .to_talitos_ptr_ext_or =3D sec2_to_talitos_ptr_ext_or, + .get_ptr_value =3D sec2_get_ptr_value, +}; + +static const struct talitos_desc_ops sec2_desc_ops =3D { + .set_hdr =3D sec2_set_hdr, + .get_hdr =3D sec2_get_hdr, + .get_hdr_lo =3D sec2_get_hdr_lo, + .get_ptr =3D sec2_get_ptr, }; =20 static const struct talitos_ops sec2_ops =3D { @@ -366,5 +399,6 @@ static const struct talitos_ops sec2_ops =3D { void talitos_register_sec2(struct talitos_private *priv) { priv->ops =3D &sec2_ops; + priv->desc_ops =3D &sec2_desc_ops; priv->ptr_ops =3D &sec2_ptr_ops; } diff --git a/drivers/crypto/talitos/talitos-skcipher.c b/drivers/crypto/tal= itos/talitos-skcipher.c index a96f827c7b93..58ad931ff3a4 100644 --- a/drivers/crypto/talitos/talitos-skcipher.c +++ b/drivers/crypto/talitos/talitos-skcipher.c @@ -11,17 +11,21 @@ =20 #include "talitos.h" =20 -static void common_nonsnoop_unmap(struct device *dev, +static void common_nonsnoop_unmap(struct talitos_ctx *ctx, struct talitos_edesc *edesc, struct skcipher_request *areq) { - unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE); + unmap_single_talitos_ptr(ctx->dev, + ctx->desc_ops->get_ptr(&edesc->desc, 5), + DMA_FROM_DEVICE); =20 - talitos_sg_unmap(dev, edesc, areq->src, areq->dst, areq->cryptlen, 0); - unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE); + talitos_sg_unmap(ctx->dev, edesc, areq->src, areq->dst, areq->cryptlen, 0= ); + unmap_single_talitos_ptr(ctx->dev, + ctx->desc_ops->get_ptr(&edesc->desc, 1), + DMA_TO_DEVICE); =20 if (edesc->dma_len) - dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, + dma_unmap_single(ctx->dev, edesc->dma_link_tbl, edesc->dma_len, DMA_BIDIRECTIONAL); } =20 @@ -37,7 +41,7 @@ static void skcipher_done(struct device *dev, =20 edesc =3D container_of(desc, struct talitos_edesc, desc); =20 - common_nonsnoop_unmap(dev, edesc, areq); + common_nonsnoop_unmap(ctx, edesc, areq); memcpy(areq->iv, ctx->iv, ivsize); =20 kfree(edesc); @@ -61,16 +65,18 @@ static int common_nonsnoop(struct talitos_edesc *edesc, bool sync_needed =3D false; struct talitos_private *priv =3D dev_get_drvdata(dev); bool is_sec1 =3D has_ftr_sec1(priv); - bool is_ctr =3D (desc->hdr & DESC_HDR_SEL0_MASK) =3D=3D DESC_HDR_SEL0_AES= U && - (desc->hdr & DESC_HDR_MODE0_AESU_MASK) =3D=3D DESC_HDR_MODE0_AESU_= CTR; + bool is_ctr =3D (ctx->desc_ops->get_hdr(desc) & DESC_HDR_SEL0_MASK) =3D= =3D + DESC_HDR_SEL0_AESU && + (ctx->desc_ops->get_hdr(desc) & + DESC_HDR_MODE0_AESU_MASK) =3D=3D DESC_HDR_MODE0_AESU_CTR; =20 /* first DWORD empty */ =20 /* cipher iv */ - ctx->ptr_ops->to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize); + ctx->ptr_ops->to_talitos_ptr(ctx->desc_ops->get_ptr(desc, 1), edesc->iv_d= ma, ivsize); =20 /* cipher key */ - ctx->ptr_ops->to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen); + ctx->ptr_ops->to_talitos_ptr(ctx->desc_ops->get_ptr(desc, 2), ctx->dma_ke= y, ctx->keylen); =20 sg_count =3D edesc->src_nents ?: 1; if (is_sec1 && sg_count > 1) @@ -83,8 +89,9 @@ static int common_nonsnoop(struct talitos_edesc *edesc, /* * cipher in */ - sg_count =3D talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->p= tr[3], - sg_count, 0, 0, 0, false, is_ctr ? 16 : 1); + sg_count =3D talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, + ctx->desc_ops->get_ptr(desc, 3), sg_count, + 0, 0, 0, false, is_ctr ? 16 : 1); if (sg_count > 1) sync_needed =3D true; =20 @@ -95,14 +102,15 @@ static int common_nonsnoop(struct talitos_edesc *edesc, dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE); } =20 - ret =3D talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[4], - sg_count, 0, (edesc->src_nents + 1)); + ret =3D talitos_sg_map(dev, areq->dst, cryptlen, edesc, + ctx->desc_ops->get_ptr(desc, 4), sg_count, 0, + (edesc->src_nents + 1)); if (ret > 1) sync_needed =3D true; =20 /* iv out */ - map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv, - DMA_FROM_DEVICE); + map_single_talitos_ptr(dev, ctx->desc_ops->get_ptr(desc, 5), ivsize, + ctx->iv, DMA_FROM_DEVICE); =20 /* last DWORD empty */ =20 @@ -112,7 +120,7 @@ static int common_nonsnoop(struct talitos_edesc *edesc, =20 ret =3D talitos_submit(dev, ctx->ch, desc, callback, areq); if (ret !=3D -EINPROGRESS) { - common_nonsnoop_unmap(dev, edesc, areq); + common_nonsnoop_unmap(ctx, edesc, areq); kfree(edesc); } return ret; @@ -191,7 +199,7 @@ static int skcipher_encrypt(struct skcipher_request *ar= eq) return PTR_ERR(edesc); =20 /* set encrypt */ - edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT; + ctx->desc_ops->set_hdr(&edesc->desc, ctx->desc_hdr_template | DESC_HDR_MO= DE0_ENCRYPT); =20 return common_nonsnoop(edesc, areq, skcipher_done); } @@ -215,7 +223,7 @@ static int skcipher_decrypt(struct skcipher_request *ar= eq) if (IS_ERR(edesc)) return PTR_ERR(edesc); =20 - edesc->desc.hdr =3D ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; + ctx->desc_ops->set_hdr(&edesc->desc, ctx->desc_hdr_template | DESC_HDR_DI= R_INBOUND); =20 return common_nonsnoop(edesc, areq, skcipher_done); } diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index 19e63ce6cc3e..a032907e900f 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -81,7 +81,7 @@ void unmap_single_talitos_ptr(struct device *dev, { struct talitos_private *priv =3D dev_get_drvdata(dev); =20 - dma_unmap_single(dev, be32_to_cpu(ptr->ptr), + dma_unmap_single(dev, be32_to_cpu(priv->ptr_ops->get_ptr_value(ptr)), priv->ptr_ops->from_talitos_ptr_len(ptr), dir); } =20 @@ -625,6 +625,8 @@ int talitos_init_common(struct talitos_ctx *ctx, =20 ctx->ptr_ops =3D priv->ptr_ops; =20 + ctx->desc_ops =3D priv->desc_ops; + return 0; } =20 diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/tali= tos.h index 54e33da03fd0..2107fb1ade5d 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -36,33 +36,49 @@ #define TALITOS_MAX_IV_LENGTH 16 /* max of AES_BLOCK_SIZE, DES3_EDE_BLOCK= _SIZE */ =20 /* descriptor pointer entry */ + +struct sec1_talitos_ptr { + __be16 res; + __be16 len; + __be32 ptr; +} __packed; + +struct sec2_talitos_ptr { + __be16 len; + u8 j_extent; + u8 eptr; + __be32 ptr; +} __packed; + struct talitos_ptr { union { - struct { /* SEC2 format */ - __be16 len; /* length */ - u8 j_extent; /* jump to sg link table and/or extent*/ - u8 eptr; /* extended address */ - }; - struct { /* SEC1 format */ - __be16 res; - __be16 len1; /* length */ - }; + struct sec1_talitos_ptr sec1; + struct sec2_talitos_ptr sec2; }; - __be32 ptr; /* address */ }; =20 -/* descriptor */ +/* descriptor format */ + +struct sec1_talitos_desc { + __be32 hdr; + struct sec1_talitos_ptr ptr[7]; + __be32 next_desc; +} __packed; + +struct sec2_talitos_desc { + __be32 hdr; + __be32 hdr_lo; + struct sec2_talitos_ptr ptr[7]; +} __packed; + struct talitos_desc { - __be32 hdr; /* header high bits */ union { - __be32 hdr_lo; /* header low bits */ - __be32 hdr1; /* header for SEC1 */ + struct sec1_talitos_desc sec1; + struct sec2_talitos_desc sec2; }; - struct talitos_ptr ptr[7]; /* ptr/len pair array */ - __be32 next_desc; /* next descriptor (SEC1) */ }; =20 -#define TALITOS_DESC_SIZE (sizeof(struct talitos_desc) - sizeof(__be32)) +#define TALITOS_DESC_SIZE sizeof(struct talitos_desc) =20 /* * talitos_edesc - s/w-extended descriptor @@ -148,6 +164,14 @@ struct talitos_ptr_ops { unsigned short (*from_talitos_ptr_len)(struct talitos_ptr *ptr); void (*to_talitos_ptr_ext_set)(struct talitos_ptr *ptr, u8 val); void (*to_talitos_ptr_ext_or)(struct talitos_ptr *ptr, u8 val); + __be32 (*get_ptr_value)(struct talitos_ptr *ptr); +}; + +struct talitos_desc_ops { + void (*set_hdr)(struct talitos_desc *desc, __be32 val); + __be32 (*get_hdr)(struct talitos_desc *desc); + __be32 (*get_hdr_lo)(struct talitos_desc *desc); + struct talitos_ptr *(*get_ptr)(struct talitos_desc *desc, size_t idx); }; =20 struct talitos_ops { @@ -194,6 +218,7 @@ struct talitos_private { =20 const struct talitos_ops *ops; const struct talitos_ptr_ops *ptr_ops; + const struct talitos_desc_ops *desc_ops; =20 /* SEC Compatibility info */ unsigned long features; @@ -225,6 +250,7 @@ struct talitos_private { struct talitos_ctx { struct device *dev; const struct talitos_ptr_ops *ptr_ops; + const struct talitos_desc_ops *desc_ops; int ch; __be32 desc_hdr_template; u8 key[TALITOS_MAX_KEY_SIZE]; --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CCAE43B47D3 for ; Thu, 28 May 2026 09:09:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959401; cv=none; b=blA5XvSlLaSRAVVKLy1YdsGUIeAYGPBPijnRgusGntaPauU7MbMBhXge4fzfKtReueKS3dKNYtHiO5RjBxoZvYs8kItffCpCXXEe1CQFLOwTZTQVWBSzLnuBrCUH4vic5z65WYJH9r2cVtZkt7FShQj6K7OdEaPIK0cc8eDT0B4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959401; c=relaxed/simple; bh=RTLGPCn4Yl9FCwEWU+ZjV1xR6Pj/feI8xfccScr+XeM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fndWxUyJs15RxYY7P0SK2u6/Bu1GKA2dZqx2mVMQN2hy5dTTvNdK7fV0RCsahuom9MqCtz/GaSSqvSaBbHgPhtL14Lw1iGzBO+fk4ZyHVxbKMb3v4wW6olH0ICcEkf6umKQfT6Dr4FSWLAH7NVZVbsctxdm4unPNjlGy7AqpOW4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=00SAzke+; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="00SAzke+" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 4EC271A3700; Thu, 28 May 2026 09:09:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 12C0B60495; Thu, 28 May 2026 09:09:56 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id B966210888CA7; Thu, 28 May 2026 11:09:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959395; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=GmBOagk7heMxPnu+nJQo7jUrc6JXEHxO6S90oTM45jQ=; b=00SAzke+uMOHasOjTywdtTWFtcx0NB6Qnax+I2jh210x+TkkufQMZZn+7yOVPUhaaG0bkQ onFjRRfxCacOYv8ncQs/uRtPv7n+KWn7XFNUbHdbsmkjfUUzmAXCoSD8ea9F4qQGqtZhRT +ytkZDCf48LmU/wlkNtaV0AgRyJd5NK2++bc+MllqTg+wAp9kqstPAq/YktGbMRVM1rs+o qOtILZ8dfLxvy4W649Vj0wWumCHopONViGq36MJZeXcwu4LP0/d1B3q5l/eI+V67xz9lRV jbIICJKNuhlTDS/D7yw/AVCguewe631iJKYWUbsE7TpJL1lgKGh2rLNtf+7O1g== From: Paul Louvel Date: Thu, 28 May 2026 11:08:41 +0200 Subject: [PATCH 28/29] crypto: talitos - Clean up includes in core driver file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-28-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=1573; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=RTLGPCn4Yl9FCwEWU+ZjV1xR6Pj/feI8xfccScr+XeM=; b=5n1IveK/PBtxDvB6d0imj2yMjdZG+DV9Fs2TWSu9i+oLDcipN1unm9/CmcuMlxmNy8VeOCdUg r/I5RubDLZ5Ch0BiIgtZ3bCjRsSWPI+pEehnf0gTXnnAkhW+1ABlSZ1 X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Now that the crypto implementations have been moved into their own translation units, the talitos core driver file no longer needs the includes that were only required by the hash, skcipher, aead, and hwrng code. Remove them, and drop duplicates already provided by talitos.h. Also sort the remaining includes alphabetically. --- drivers/crypto/talitos/talitos.c | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/tali= tos.c index a032907e900f..43939a9cd9ce 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -12,32 +12,15 @@ * All rights reserved. */ =20 +#include +#include #include -#include #include -#include +#include #include #include -#include -#include -#include -#include -#include #include =20 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "talitos.h" =20 /* --=20 2.54.0 From nobody Mon Jun 8 15:48:20 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D20463B47FD; Thu, 28 May 2026 09:09:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959401; cv=none; b=kk3kWSP0GbIAoDbU7OTGXIHmwDSQCVYVCOCdRcYxVREa3BE9Y7xeyUzFjlKNMZkFybPwTUubOnJJKKZkPjg/XVRE9IeaEoxupVu4tDCeZ6jKUEhx1aOKTaqxRHZyVRNstet0sImU0zxE9tbtanZkE3N5n9tc+ad//08JUOcSfHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779959401; c=relaxed/simple; bh=HnzYZ5JzFHt+vA2kwbJgkI6CDjM3BNM9ZmBbgxAHFls=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UeHA9h7Tth1HqPBQEU4k6QeDgf5IhS7YaDqRHcARqBwH9kHJ+sQOTiaRB5yM59ficz4de2dYtcopWwWM+flhwpPFaE5jiqocpPsa9Xp1zKudUwNsAiz6czfzN+hg2lBOOr6bvtp3eGnHLh7vfFQwPrf2IqG/8+FSgKedd0Sgmr0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=pvjUywwb; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="pvjUywwb" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 5C3791A3701; Thu, 28 May 2026 09:09:57 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 31F9D60495; Thu, 28 May 2026 09:09:57 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E495710888CAF; Thu, 28 May 2026 11:09:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779959396; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=6sg0tvaanYkdhi2xR1TE4kvycHowtU8MfgTRjfSHJoQ=; b=pvjUywwb+qnLVpi9mqY2rsa0iAIlyjMRU37EiFdTNJQ002Msl60OqRgHyB2O+QVOepckn6 PyUgNe1lA05NOtUyCICh0ryavU3ocVDIpYVG51KG5uRdsYsvqT7/hg7gVrFqLW9kiuXkmE vfwn2i48ftoPqw6OYByIr8VX7P6qYxFXMDDXYTxR/D1yDDKJh8IcTyluTUfOVYjZlt4m39 2tx0JG1a9X156J5FNOaU8YYt0f53x0z2Dazagp/spOXbVuw+sWqVKJIKDIqxFKMIwz1/g5 MYp6/MDs89NFh50Yzju9DwuEOXQ0PWIJ7YQoRy3+ARB5aT7vYXK6m7/J29rBMg== From: Paul Louvel Date: Thu, 28 May 2026 11:08:42 +0200 Subject: [PATCH 29/29] crypto: talitos - Remove TALITOS_DESC_SIZE macro Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260528-7-1-rc1_talitos_cleanup-v1-29-cb1ad6cdea49@bootlin.com> References: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> In-Reply-To: <20260528-7-1-rc1_talitos_cleanup-v1-0-cb1ad6cdea49@bootlin.com> To: Herbert Xu , "David S. Miller" Cc: Thomas Petazzoni , Herve Codina , Christophe Leroy , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Louvel X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779959350; l=3521; i=paul.louvel@bootlin.com; s=20260313; h=from:subject:message-id; bh=HnzYZ5JzFHt+vA2kwbJgkI6CDjM3BNM9ZmBbgxAHFls=; b=d9oBIpbemFkWufKqKa7gDQQJZnpQ7IZr2Cho9TMZc2E956rF4OpxrCmfAclJRQrOfLIA6oBsA AvhOfaTWWfRANckRcFaO3+Tmqe0NV3+tB7WIEpUCWZtxdpgVsj8jzWh X-Developer-Key: i=paul.louvel@bootlin.com; a=ed25519; pk=eLW50NT18UAvUT5cAcYf88zNbBCZDLFXuptpyLVhVIU= X-Last-TLS-Session-Version: TLSv1.3 Now that struct talitos_desc no longer has the SEC1-only next_desc field (it was moved into sec1_talitos_desc), TALITOS_DESC_SIZE is identical to sizeof(struct talitos_desc) and no longer serves any purpose. Remove it and use sizeof directly at each macro invocation. Signed-off-by: Paul Louvel --- drivers/crypto/talitos/talitos-sec1.c | 10 +++++----- drivers/crypto/talitos/talitos-sec2.c | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/crypto/talitos/talitos-sec1.c b/drivers/crypto/talitos= /talitos-sec1.c index e4f482520372..504ce9e23e59 100644 --- a/drivers/crypto/talitos/talitos-sec1.c +++ b/drivers/crypto/talitos/talitos-sec1.c @@ -190,7 +190,7 @@ static void sec1_dma_map_request(struct device *dev, while (edesc) { =20 dma_desc =3D dma_map_single(dev, &edesc->desc.sec1.hdr, - TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); + sizeof(struct talitos_desc), DMA_BIDIRECTIONAL); =20 if (!prev_edesc) { request->dma_desc =3D dma_desc; @@ -202,7 +202,7 @@ static void sec1_dma_map_request(struct device *dev, prev_edesc->desc.sec1.next_desc =3D cpu_to_be32(dma_desc); =20 dma_sync_single_for_device(dev, prev_dma_desc, - TALITOS_DESC_SIZE, DMA_TO_DEVICE); + sizeof(struct talitos_desc), DMA_TO_DEVICE); =20 next: prev_edesc =3D edesc; @@ -216,12 +216,12 @@ static void sec1_dma_unmap_request(struct device *dev, { struct talitos_edesc *edesc; =20 - dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, + dma_unmap_single(dev, request->dma_desc, sizeof(struct talitos_desc), DMA_BIDIRECTIONAL); edesc =3D container_of(request->desc, struct talitos_edesc, desc); while (edesc->next_desc) { dma_unmap_single(dev, be32_to_cpu(edesc->desc.sec1.next_desc), - TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); + sizeof(struct talitos_desc), DMA_BIDIRECTIONAL); edesc =3D edesc->next_desc; } } @@ -239,7 +239,7 @@ static __be32 sec1_get_request_hdr(struct device *dev, edesc =3D edesc->next_desc; } =20 - dma_sync_single_for_cpu(dev, dma_desc, TALITOS_DESC_SIZE, + dma_sync_single_for_cpu(dev, dma_desc, sizeof(struct talitos_desc), DMA_BIDIRECTIONAL); =20 return edesc->desc.sec1.hdr; diff --git a/drivers/crypto/talitos/talitos-sec2.c b/drivers/crypto/talitos= /talitos-sec2.c index 52f783ddc8b6..0df3b22510c7 100644 --- a/drivers/crypto/talitos/talitos-sec2.c +++ b/drivers/crypto/talitos/talitos-sec2.c @@ -205,7 +205,7 @@ static void sec2_dma_map_request(struct device *dev, struct talitos_desc *desc) { request->dma_desc =3D - dma_map_single(dev, desc, TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL); + dma_map_single(dev, desc, sizeof(struct talitos_desc), DMA_BIDIRECTIONAL= ); } =20 static int sec2_talitos_handle_error(struct device *dev, u32 isr, u32 isr_= lo) @@ -346,14 +346,14 @@ static void sec2_init_task(struct device *dev) static void sec2_dma_unmap_request(struct device *dev, struct talitos_request *request) { - dma_unmap_single(dev, request->dma_desc, TALITOS_DESC_SIZE, + dma_unmap_single(dev, request->dma_desc, sizeof(struct talitos_desc), DMA_BIDIRECTIONAL); } =20 static __be32 sec2_get_request_hdr(struct device *dev, struct talitos_request *request) { - dma_sync_single_for_cpu(dev, request->dma_desc, TALITOS_DESC_SIZE, + dma_sync_single_for_cpu(dev, request->dma_desc, sizeof(struct talitos_des= c), DMA_BIDIRECTIONAL); =20 return request->desc->sec2.hdr; --=20 2.54.0