mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: alexander.levin@verizon.com
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"stable@vger.kernel.org" <stable@vger.kernel.org>
Cc: Romain Perier <romain.perier@free-electrons.com>,
	Herbert Xu <herbert@gondor.apana.org.au>,
	alexander.levin@verizon.com
Subject: [PATCH AUTOSEL for 4.9 48/56] crypto: marvell - Copy IVDIG before launching partial DMA ahash requests
Date: Wed, 15 Nov 2017 02:45:46 +0000	[thread overview]
Message-ID: <20171115024521.5884-48-alexander.levin@verizon.com> (raw)
In-Reply-To: <20171115024521.5884-1-alexander.levin@verizon.com>

From: Romain Perier <romain.perier@free-electrons.com>

[ Upstream commit 8759fec4af222f338d08f8f1a7ad6a77ca6cb301 ]

Currently, inner IV/DIGEST data are only copied once into the hash
engines and not set explicitly before launching a request that is not a
first frag. This is an issue especially when multiple ahash reqs are
computed in parallel or chained with cipher request, as the state of the
request being computed is not updated into the hash engine. It leads to
non-deterministic corrupted digest results.

Fixes: commit 2786cee8e50b ("crypto: marvell - Move SRAM I/O operations to step functions")
Signed-off-by: Romain Perier <romain.perier@free-electrons.com>
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
---
 drivers/crypto/marvell/cesa.h |  3 ++-
 drivers/crypto/marvell/hash.c | 34 +++++++++++++++++++++++++++++++++-
 drivers/crypto/marvell/tdma.c |  9 ++++++++-
 3 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/drivers/crypto/marvell/cesa.h b/drivers/crypto/marvell/cesa.h
index e423d33decd4..36291840a12c 100644
--- a/drivers/crypto/marvell/cesa.h
+++ b/drivers/crypto/marvell/cesa.h
@@ -273,7 +273,8 @@ struct mv_cesa_op_ctx {
 #define CESA_TDMA_SRC_IN_SRAM			BIT(30)
 #define CESA_TDMA_END_OF_REQ			BIT(29)
 #define CESA_TDMA_BREAK_CHAIN			BIT(28)
-#define CESA_TDMA_TYPE_MSK			GENMASK(27, 0)
+#define CESA_TDMA_SET_STATE			BIT(27)
+#define CESA_TDMA_TYPE_MSK			GENMASK(26, 0)
 #define CESA_TDMA_DUMMY				0
 #define CESA_TDMA_DATA				1
 #define CESA_TDMA_OP				2
diff --git a/drivers/crypto/marvell/hash.c b/drivers/crypto/marvell/hash.c
index 77712b375b84..662cf4ddb04b 100644
--- a/drivers/crypto/marvell/hash.c
+++ b/drivers/crypto/marvell/hash.c
@@ -280,13 +280,32 @@ static void mv_cesa_ahash_std_prepare(struct ahash_request *req)
 	sreq->offset = 0;
 }
 
+static void mv_cesa_ahash_dma_step(struct ahash_request *req)
+{
+	struct mv_cesa_ahash_req *creq = ahash_request_ctx(req);
+	struct mv_cesa_req *base = &creq->base;
+
+	/* We must explicitly set the digest state. */
+	if (base->chain.first->flags & CESA_TDMA_SET_STATE) {
+		struct mv_cesa_engine *engine = base->engine;
+		int i;
+
+		/* Set the hash state in the IVDIG regs. */
+		for (i = 0; i < ARRAY_SIZE(creq->state); i++)
+			writel_relaxed(creq->state[i], engine->regs +
+				       CESA_IVDIG(i));
+	}
+
+	mv_cesa_dma_step(base);
+}
+
 static void mv_cesa_ahash_step(struct crypto_async_request *req)
 {
 	struct ahash_request *ahashreq = ahash_request_cast(req);
 	struct mv_cesa_ahash_req *creq = ahash_request_ctx(ahashreq);
 
 	if (mv_cesa_req_get_type(&creq->base) == CESA_DMA_REQ)
-		mv_cesa_dma_step(&creq->base);
+		mv_cesa_ahash_dma_step(ahashreq);
 	else
 		mv_cesa_ahash_std_step(ahashreq);
 }
@@ -562,11 +581,15 @@ static int mv_cesa_ahash_dma_req_init(struct ahash_request *req)
 	struct mv_cesa_ahash_dma_iter iter;
 	struct mv_cesa_op_ctx *op = NULL;
 	unsigned int frag_len;
+	bool set_state = false;
 	int ret;
 
 	basereq->chain.first = NULL;
 	basereq->chain.last = NULL;
 
+	if (!mv_cesa_mac_op_is_first_frag(&creq->op_tmpl))
+		set_state = true;
+
 	if (creq->src_nents) {
 		ret = dma_map_sg(cesa_dev->dev, req->src, creq->src_nents,
 				 DMA_TO_DEVICE);
@@ -650,6 +673,15 @@ static int mv_cesa_ahash_dma_req_init(struct ahash_request *req)
 	basereq->chain.last->flags |= (CESA_TDMA_END_OF_REQ |
 				       CESA_TDMA_BREAK_CHAIN);
 
+	if (set_state) {
+		/*
+		 * Put the CESA_TDMA_SET_STATE flag on the first tdma desc to
+		 * let the step logic know that the IVDIG registers should be
+		 * explicitly set before launching a TDMA chain.
+		 */
+		basereq->chain.first->flags |= CESA_TDMA_SET_STATE;
+	}
+
 	return 0;
 
 err_free_tdma:
diff --git a/drivers/crypto/marvell/tdma.c b/drivers/crypto/marvell/tdma.c
index 9fd7a5fbaa1b..0cda6e3f2b4b 100644
--- a/drivers/crypto/marvell/tdma.c
+++ b/drivers/crypto/marvell/tdma.c
@@ -112,7 +112,14 @@ void mv_cesa_tdma_chain(struct mv_cesa_engine *engine,
 		last->next = dreq->chain.first;
 		engine->chain.last = dreq->chain.last;
 
-		if (!(last->flags & CESA_TDMA_BREAK_CHAIN))
+		/*
+		 * Break the DMA chain if the CESA_TDMA_BREAK_CHAIN is set on
+		 * the last element of the current chain, or if the request
+		 * being queued needs the IV regs to be set before lauching
+		 * the request.
+		 */
+		if (!(last->flags & CESA_TDMA_BREAK_CHAIN) &&
+		    !(dreq->chain.first->flags & CESA_TDMA_SET_STATE))
 			last->next_dma = dreq->chain.first->cur_dma;
 	}
 }
-- 
2.11.0

  parent reply	other threads:[~2017-11-15  2:52 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-15  2:45 [PATCH AUTOSEL for 4.9 01/56] ACPICA: Resources: Not a valid resource if buffer length too long alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 02/56] RDS: make message size limit compliant with spec alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 04/56] RDS: RDMA: fix the ib_map_mr_sg_zbva() argument alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 05/56] PCI: Apply _HPX settings only to relevant devices alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 03/56] RDS: RDMA: return appropriate error on rdma map failures alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 07/56] clk: sunxi-ng: A31: Fix spdif clock register alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 08/56] clk: sunxi-ng: fix PLL_CPUX adjusting on A33 alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 06/56] drm/sun4i: Fix a return value in case of error alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 11/56] fscrypt: use ENOTDIR when setting encryption policy on nondirectory alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 12/56] net: Allow IP_MULTICAST_IF to set index to L3 slave alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 09/56] dmaengine: zx: set DMA_CYCLIC cap_mask bit alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 10/56] fscrypt: use ENOKEY when file cannot be created w/o key alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 17/56] adm80211: return an error if adm8211_alloc_rings() fails alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 16/56] rt2800: set minimum MPDU and PSDU lengths to sane values alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 14/56] net: 3com: typhoon: typhoon_init_one: fix incorrect return values alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 13/56] net: 3com: typhoon: typhoon_init_one: make return values more specific alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 15/56] drm/armada: Fix compile fail alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 18/56] mwifiex: sdio: fix use after free issue for save_adapter alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 21/56] ath10k: fix potential memory leak in ath10k_wmi_tlv_op_pull_fw_stats() alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 20/56] ath10k: ignore configuring the incorrect board_id alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 19/56] ath10k: fix incorrect txpower set by P2P_DEVICE interface alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 22/56] pinctrl: sirf: atlas7: Add missing 'of_node_put()' alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 23/56] bnxt_en: Set default completion ring for async events alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 25/56] ALSA: hda - Apply ALC269_FIXUP_NO_SHUTUP on HDA_FIXUP_ACT_PROBE alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 24/56] ath10k: set CTS protection VDEV param only if VDEV is up alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 27/56] drm: Apply range restriction after color adjustment when allocation alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 26/56] gpio: mockup: dynamically allocate memory for chip name alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 28/56] drm/915: Parsing the missed out DTD fields from the VBT alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 29/56] clk: qcom: ipq4019: Add all the frequencies for apss cpu alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 33/56] mac80211: Remove invalid flag operations in mesh TSF synchronization alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 30/56] drm/atomic: Unconditionally call prepare_fb alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 32/56] drm/mediatek: don't use drm_put_dev alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 31/56] ASoC: da7218: Set DAI output pin high impedance when not in use alexander.levin
2017-11-15 12:19   ` Mark Brown
2017-11-15 16:43     ` alexander.levin
2017-11-15 16:55       ` Adam Thomson
2017-11-16 10:46         ` Mark Brown
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 37/56] adm80211: add checks for dma mapping errors alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 35/56] drm/i915: Protect DSPARB registers with a spinlock alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 34/56] mac80211: Suppress NEW_PEER_CANDIDATE event if no room alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 36/56] drm/i915: Fix the level 0 max_wm hack on VLV/CHV alexander.levin
2017-11-15 11:08   ` Ville Syrjälä
2017-11-15 16:44     ` alexander.levin
2017-11-15 17:03       ` Ville Syrjälä
2017-11-17 11:28         ` Jani Nikula
2017-11-17 12:41           ` Greg KH
2017-11-17 12:53             ` Ville Syrjälä
2017-11-17 12:59               ` Greg KH
2017-11-17 13:13                 ` [Intel-gfx] " Emil Velikov
2017-11-17 13:58                   ` Greg KH
2017-11-17 13:01             ` Jani Nikula
2017-11-17 13:57               ` Greg KH
2017-11-18  3:15               ` alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 39/56] staging: iio: cdc: fix improper return value alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 41/56] drm/i915: Protect dev_priv->atomic_cdclk_freq with all the crtc locks alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 38/56] iio: light: fix improper return value alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 40/56] drm/i915: Assert no external observers when unwind a failed request alloc alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 43/56] spi: SPI_FSL_DSPI should depend on HAS_DMA alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 42/56] drm/i915/bxt: Correct dual-link MIPI port control alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 45/56] netfilter: nft_queue: use raw_smp_processor_id() alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 44/56] ASoC: dwc: Fix PIO mode initialization alexander.levin
2017-11-15 10:54   ` Mark Brown
2017-11-15 12:46     ` Jose Abreu
2017-11-15 13:20       ` Mark Brown
2017-11-15 14:06         ` Jose Abreu
2017-11-15 16:41           ` alexander.levin
2017-11-16 10:51             ` Mark Brown
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 46/56] netfilter: nf_tables: fix oob access alexander.levin
2017-11-15  2:45 ` alexander.levin [this message]
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 49/56] btrfs: return the actual error value from from btrfs_uuid_tree_iterate alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 47/56] ASoC: rsnd: don't double free kctrl alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 51/56] s390/kbuild: enable modversions for symbols exported from asm alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 50/56] ASoC: wm_adsp: Don't overrun firmware file buffer when reading region data alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 53/56] [media] cec: CEC_MSG_GIVE_FEATURES should abort for CEC version < 2 alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 52/56] [media] cec: when canceling a message, don't overwrite old status info alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 54/56] [media] cec: update log_addr[] before finishing configuration alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 56/56] xen: xenbus driver must not accept invalid transaction ids alexander.levin
2017-11-15  2:45 ` [PATCH AUTOSEL for 4.9 55/56] nvmet: fix KATO offset in Set Features alexander.levin
     [not found] ` <94F2FBAB4432B54E8AACC7DFDE6C92E37E619757@ORSMSX110.amr.corp.intel.com>
2017-11-15 16:39   ` [PATCH AUTOSEL for 4.9 01/56] ACPICA: Resources: Not a valid resource if buffer length too long alexander.levin
2017-11-15 17:05     ` Schmauss, Erik
2017-11-17  0:56       ` alexander.levin
2017-11-20 17:22         ` Schmauss, Erik
2017-11-22 23:24           ` alexander.levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171115024521.5884-48-alexander.levin@verizon.com \
    --to=alexander.levin@verizon.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=romain.perier@free-electrons.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®