crypto: starfive - Use fallback for unaligned dma access
authorJia Jie Ho <jiajie.ho@starfivetech.com>
Mon, 29 Apr 2024 06:06:40 +0000 (14:06 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 10 May 2024 09:15:24 +0000 (17:15 +0800)
Dma address mapping fails on unaligned scatterlist offset. Use sw
fallback for these cases.

Signed-off-by: Jia Jie Ho <jiajie.ho@starfivetech.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/starfive/jh7110-aes.c

index 9d6e2f936f03939f250d8c9ecb7ef2569ba3ea9b..86a1a1fa9f8f9f54c52d81aa91ced854d6aea7b8 100644 (file)
@@ -314,7 +314,7 @@ static int starfive_aes_read_authtag(struct starfive_cryp_ctx *ctx)
                                         cryp->total_in, cryp->authsize, 1);
        } else {
                if (crypto_memneq(cryp->tag_in, cryp->tag_out, cryp->authsize))
-                       return dev_err_probe(cryp->dev, -EBADMSG, "Failed tag verification\n");
+                       return -EBADMSG;
        }
 
        return 0;
@@ -753,14 +753,16 @@ static bool starfive_aes_check_unaligned(struct starfive_cryp_dev *cryp,
        int i;
 
        for_each_sg(src, tsg, sg_nents(src), i)
-               if (!IS_ALIGNED(tsg->length, AES_BLOCK_SIZE) &&
-                   !sg_is_last(tsg))
+               if (!IS_ALIGNED(tsg->offset, sizeof(u32)) ||
+                   (!IS_ALIGNED(tsg->length, AES_BLOCK_SIZE) &&
+                    !sg_is_last(tsg)))
                        return true;
 
        if (src != dst)
                for_each_sg(dst, tsg, sg_nents(dst), i)
-                       if (!IS_ALIGNED(tsg->length, AES_BLOCK_SIZE) &&
-                           !sg_is_last(tsg))
+                       if (!IS_ALIGNED(tsg->offset, sizeof(u32)) ||
+                           (!IS_ALIGNED(tsg->length, AES_BLOCK_SIZE) &&
+                            !sg_is_last(tsg)))
                                return true;
 
        return false;