]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: omap - switch from scatter_walk to plain offset
authorEric Biggers <ebiggers@google.com>
Sun, 5 Jan 2025 19:23:37 +0000 (11:23 -0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 14 Jan 2025 03:38:32 +0000 (11:38 +0800)
The omap driver was using struct scatter_walk, but only to maintain an
offset, rather than iterating through the virtual addresses of the data
contained in the scatterlist which is what scatter_walk is intended for.
Make it just use a plain offset instead.  This is simpler and avoids
using struct scatter_walk in a way that is not well supported.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/omap-aes.c
drivers/crypto/omap-aes.h
drivers/crypto/omap-des.c

index e27b8461674393a8bb106a2b103bc96f7c5ed68d..551dd32a8db0cf923535fd279eacd4102fdef3b7 100644 (file)
@@ -18,7 +18,6 @@
 #include <crypto/internal/aead.h>
 #include <crypto/internal/engine.h>
 #include <crypto/internal/skcipher.h>
-#include <crypto/scatterwalk.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
 #include <linux/err.h>
@@ -272,9 +271,9 @@ static int omap_aes_crypt_dma(struct omap_aes_dev *dd,
        int ret;
 
        if (dd->pio_only) {
-               scatterwalk_start(&dd->in_walk, dd->in_sg);
+               dd->in_sg_offset = 0;
                if (out_sg_len)
-                       scatterwalk_start(&dd->out_walk, dd->out_sg);
+                       dd->out_sg_offset = 0;
 
                /* Enable DATAIN interrupt and let it take
                   care of the rest */
@@ -871,21 +870,18 @@ static irqreturn_t omap_aes_irq(int irq, void *dev_id)
 
                BUG_ON(!dd->in_sg);
 
-               BUG_ON(_calc_walked(in) > dd->in_sg->length);
+               BUG_ON(dd->in_sg_offset > dd->in_sg->length);
 
-               src = sg_virt(dd->in_sg) + _calc_walked(in);
+               src = sg_virt(dd->in_sg) + dd->in_sg_offset;
 
                for (i = 0; i < AES_BLOCK_WORDS; i++) {
                        omap_aes_write(dd, AES_REG_DATA_N(dd, i), *src);
-
-                       scatterwalk_advance(&dd->in_walk, 4);
-                       if (dd->in_sg->length == _calc_walked(in)) {
+                       dd->in_sg_offset += 4;
+                       if (dd->in_sg_offset == dd->in_sg->length) {
                                dd->in_sg = sg_next(dd->in_sg);
                                if (dd->in_sg) {
-                                       scatterwalk_start(&dd->in_walk,
-                                                         dd->in_sg);
-                                       src = sg_virt(dd->in_sg) +
-                                             _calc_walked(in);
+                                       dd->in_sg_offset = 0;
+                                       src = sg_virt(dd->in_sg);
                                }
                        } else {
                                src++;
@@ -904,20 +900,18 @@ static irqreturn_t omap_aes_irq(int irq, void *dev_id)
 
                BUG_ON(!dd->out_sg);
 
-               BUG_ON(_calc_walked(out) > dd->out_sg->length);
+               BUG_ON(dd->out_sg_offset > dd->out_sg->length);
 
-               dst = sg_virt(dd->out_sg) + _calc_walked(out);
+               dst = sg_virt(dd->out_sg) + dd->out_sg_offset;
 
                for (i = 0; i < AES_BLOCK_WORDS; i++) {
                        *dst = omap_aes_read(dd, AES_REG_DATA_N(dd, i));
-                       scatterwalk_advance(&dd->out_walk, 4);
-                       if (dd->out_sg->length == _calc_walked(out)) {
+                       dd->out_sg_offset += 4;
+                       if (dd->out_sg_offset == dd->out_sg->length) {
                                dd->out_sg = sg_next(dd->out_sg);
                                if (dd->out_sg) {
-                                       scatterwalk_start(&dd->out_walk,
-                                                         dd->out_sg);
-                                       dst = sg_virt(dd->out_sg) +
-                                             _calc_walked(out);
+                                       dd->out_sg_offset = 0;
+                                       dst = sg_virt(dd->out_sg);
                                }
                        } else {
                                dst++;
index 0f35c91647648533fd4e00af94cdfdfdcaa83a36..41d67780fd45d5b603373fd2aac019158792522c 100644 (file)
@@ -14,8 +14,6 @@
 #define DST_MAXBURST                   4
 #define DMA_MIN                                (DST_MAXBURST * sizeof(u32))
 
-#define _calc_walked(inout) (dd->inout##_walk.offset - dd->inout##_sg->offset)
-
 /*
  * OMAP TRM gives bitfields as start:end, where start is the higher bit
  * number. For example 7:0
@@ -186,8 +184,8 @@ struct omap_aes_dev {
        struct scatterlist              out_sgl;
        struct scatterlist              *orig_out;
 
-       struct scatter_walk             in_walk;
-       struct scatter_walk             out_walk;
+       unsigned int            in_sg_offset;
+       unsigned int            out_sg_offset;
        struct dma_chan         *dma_lch_in;
        struct dma_chan         *dma_lch_out;
        int                     in_sg_len;
index 498cbd585ed1da97af296f7dd8e85fc53fb9a218..a099460d5f215631061b9e57ef38adbf5de66b1f 100644 (file)
@@ -19,7 +19,6 @@
 #include <crypto/engine.h>
 #include <crypto/internal/des.h>
 #include <crypto/internal/skcipher.h>
-#include <crypto/scatterwalk.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
 #include <linux/err.h>
@@ -40,8 +39,6 @@
 
 #define DES_BLOCK_WORDS                (DES_BLOCK_SIZE >> 2)
 
-#define _calc_walked(inout) (dd->inout##_walk.offset - dd->inout##_sg->offset)
-
 #define DES_REG_KEY(dd, x)             ((dd)->pdata->key_ofs - \
                                                ((x ^ 0x01) * 0x04))
 
@@ -152,8 +149,8 @@ struct omap_des_dev {
        struct scatterlist              out_sgl;
        struct scatterlist              *orig_out;
 
-       struct scatter_walk             in_walk;
-       struct scatter_walk             out_walk;
+       unsigned int            in_sg_offset;
+       unsigned int            out_sg_offset;
        struct dma_chan         *dma_lch_in;
        struct dma_chan         *dma_lch_out;
        int                     in_sg_len;
@@ -379,8 +376,8 @@ static int omap_des_crypt_dma(struct crypto_tfm *tfm,
        int ret;
 
        if (dd->pio_only) {
-               scatterwalk_start(&dd->in_walk, dd->in_sg);
-               scatterwalk_start(&dd->out_walk, dd->out_sg);
+               dd->in_sg_offset = 0;
+               dd->out_sg_offset = 0;
 
                /* Enable DATAIN interrupt and let it take
                   care of the rest */
@@ -836,21 +833,18 @@ static irqreturn_t omap_des_irq(int irq, void *dev_id)
 
                BUG_ON(!dd->in_sg);
 
-               BUG_ON(_calc_walked(in) > dd->in_sg->length);
+               BUG_ON(dd->in_sg_offset > dd->in_sg->length);
 
-               src = sg_virt(dd->in_sg) + _calc_walked(in);
+               src = sg_virt(dd->in_sg) + dd->in_sg_offset;
 
                for (i = 0; i < DES_BLOCK_WORDS; i++) {
                        omap_des_write(dd, DES_REG_DATA_N(dd, i), *src);
-
-                       scatterwalk_advance(&dd->in_walk, 4);
-                       if (dd->in_sg->length == _calc_walked(in)) {
+                       dd->in_sg_offset += 4;
+                       if (dd->in_sg_offset == dd->in_sg->length) {
                                dd->in_sg = sg_next(dd->in_sg);
                                if (dd->in_sg) {
-                                       scatterwalk_start(&dd->in_walk,
-                                                         dd->in_sg);
-                                       src = sg_virt(dd->in_sg) +
-                                             _calc_walked(in);
+                                       dd->in_sg_offset = 0;
+                                       src = sg_virt(dd->in_sg);
                                }
                        } else {
                                src++;
@@ -869,20 +863,18 @@ static irqreturn_t omap_des_irq(int irq, void *dev_id)
 
                BUG_ON(!dd->out_sg);
 
-               BUG_ON(_calc_walked(out) > dd->out_sg->length);
+               BUG_ON(dd->out_sg_offset > dd->out_sg->length);
 
-               dst = sg_virt(dd->out_sg) + _calc_walked(out);
+               dst = sg_virt(dd->out_sg) + dd->out_sg_offset;
 
                for (i = 0; i < DES_BLOCK_WORDS; i++) {
                        *dst = omap_des_read(dd, DES_REG_DATA_N(dd, i));
-                       scatterwalk_advance(&dd->out_walk, 4);
-                       if (dd->out_sg->length == _calc_walked(out)) {
+                       dd->out_sg_offset += 4;
+                       if (dd->out_sg_offset == dd->out_sg->length) {
                                dd->out_sg = sg_next(dd->out_sg);
                                if (dd->out_sg) {
-                                       scatterwalk_start(&dd->out_walk,
-                                                         dd->out_sg);
-                                       dst = sg_virt(dd->out_sg) +
-                                             _calc_walked(out);
+                                       dd->out_sg_offset = 0;
+                                       dst = sg_virt(dd->out_sg);
                                }
                        } else {
                                dst++;