On Fri, May 16, 2025 at 02:41:02PM +0200, Corentin Labbe wrote: > > Yes I have still errors: Great! Please apply my debugging patch and see if it shines any light on the problem. Thanks, -- Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- diff --git a/drivers/crypto/marvell/cesa/cesa.c b/drivers/crypto/marvell/cesa/cesa.c index 9c21f5d835d2..fd7f43575cb2 100644 --- a/drivers/crypto/marvell/cesa/cesa.c +++ b/drivers/crypto/marvell/cesa/cesa.c @@ -127,6 +127,8 @@ static irqreturn_t mv_cesa_int(int irq, void *priv) if (!(status & mask)) break; + pr_err("mv_cesa_int: %d 0x%x 0x%x\n", engine->id, status, mask); + /* * TODO: avoid clearing the FPGA_INT_STATUS if this not * relevant on some platforms. diff --git a/drivers/crypto/marvell/cesa/hash.c b/drivers/crypto/marvell/cesa/hash.c index 2200bc6a034f..be8471a8ab22 100644 --- a/drivers/crypto/marvell/cesa/hash.c +++ b/drivers/crypto/marvell/cesa/hash.c @@ -396,6 +396,8 @@ static void mv_cesa_ahash_complete(struct crypto_async_request *req) } atomic_sub(ahashreq->nbytes, &engine->load); + + pr_err("mv_cesa_ahash_complete: %d 0x%lx\n", engine->id, (unsigned long)ahashreq); } static void mv_cesa_ahash_prepare(struct crypto_async_request *req, @@ -417,6 +419,8 @@ static void mv_cesa_ahash_req_cleanup(struct crypto_async_request *req) struct ahash_request *ahashreq = ahash_request_cast(req); struct mv_cesa_ahash_req *creq = ahash_request_ctx(ahashreq); + pr_err("mv_cesa_ahash_req_cleanup: %d 0x%lx\n", creq->base.engine->id, (unsigned long)ahashreq); + if (creq->last_req) mv_cesa_ahash_last_cleanup(ahashreq); @@ -783,6 +787,7 @@ static int mv_cesa_ahash_queue_req(struct ahash_request *req) engine = mv_cesa_select_engine(req->nbytes); mv_cesa_ahash_prepare(&req->base, engine); + pr_err("mv_cesa_ahash_queue_req: %d 0x%lx %d %d\n", engine->id, (unsigned long)req, req->nbytes, creq->last_req); ret = mv_cesa_queue_req(&req->base, &creq->base); if (mv_cesa_req_needs_cleanup(&req->base, ret)) diff --git a/drivers/crypto/marvell/cesa/tdma.c b/drivers/crypto/marvell/cesa/tdma.c index 9b5fd957dde2..59be742c5a1c 100644 --- a/drivers/crypto/marvell/cesa/tdma.c +++ b/drivers/crypto/marvell/cesa/tdma.c @@ -47,6 +47,8 @@ void mv_cesa_dma_step(struct mv_cesa_req *dreq) engine->chain_hw.last = dreq->chain.last; spin_unlock_bh(&engine->lock); + pr_err("mv_cesa_dma_step: %d 0x%lx 0x%lx 0x%lx\n", engine->id, (unsigned long)dreq, (unsigned long)dreq->chain.first->cur_dma, (unsigned long)dreq->chain.last->cur_dma); + writel_relaxed(0, engine->regs + CESA_SA_CFG); mv_cesa_set_int_mask(engine, CESA_SA_INT_ACC0_IDMA_DONE); @@ -137,6 +139,7 @@ int mv_cesa_tdma_process(struct mv_cesa_engine *engine, u32 status) int res = 0; tdma_cur = readl(engine->regs + CESA_TDMA_CUR); + pr_err("mv_cesa_tdma_process: %d 0x%lx\n", engine->id, (unsigned long)tdma_cur); for (tdma = engine->chain_hw.first; tdma; tdma = next) { spin_lock_bh(&engine->lock); @@ -186,6 +189,8 @@ int mv_cesa_tdma_process(struct mv_cesa_engine *engine, u32 status) break; } + pr_err("mv_cesa_tdma_process: %d %d 0x%lx\n", engine->id, res, (unsigned long)req); + /* * Save the last request in error to engine->req, so that the core * knows which request was faulty diff --git a/drivers/crypto/marvell/cesa/hash.c b/drivers/crypto/marvell/cesa/hash.c index 6815eddc9068..230501fe843b 100644 --- a/drivers/crypto/marvell/cesa/hash.c +++ b/drivers/crypto/marvell/cesa/hash.c @@ -374,6 +374,12 @@ static void mv_cesa_ahash_complete(struct crypto_async_request *req) memcpy(ahashreq->result, data, digsize); } else { + struct { + u32 digest[8]; + u64 len; + } state; + + memcpy(state.digest, creq->state, digsize); for (i = 0; i < digsize / 4; i++) creq->state[i] = readl_relaxed(engine->regs + CESA_IVDIG(i)); @@ -393,6 +399,21 @@ static void mv_cesa_ahash_complete(struct crypto_async_request *req) for (i = 0; i < digsize / 4; i++) result[i] = cpu_to_be32(creq->state[i]); } + } else { + HASH_FBREQ_ON_STACK(fbreq, ahashreq); + + crypto_ahash_import_core(fbreq, &state); + crypto_ahash_update(fbreq); + crypto_ahash_export_core(fbreq, &state); + if (memcmp(state.digest, creq->state, digsize)) { + pr_err("mv_cesa_ahash_complete partial hash mismatch\n"); + print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, + 16, 1, + state.digest, digsize, false); + print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, + 16, 1, + creq->state, digsize, false); + } } }