crypto: omap - switch from scatter_walk to plain offset

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>
This commit is contained in:
Eric Biggers 2025-01-05 11:23:37 -08:00 committed by Herbert Xu
parent ee3c9c7e27
commit 42c5675c2f
3 changed files with 32 additions and 48 deletions

View file

@ -18,7 +18,6 @@
#include <crypto/internal/aead.h> #include <crypto/internal/aead.h>
#include <crypto/internal/engine.h> #include <crypto/internal/engine.h>
#include <crypto/internal/skcipher.h> #include <crypto/internal/skcipher.h>
#include <crypto/scatterwalk.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/err.h> #include <linux/err.h>
@ -272,9 +271,9 @@ static int omap_aes_crypt_dma(struct omap_aes_dev *dd,
int ret; int ret;
if (dd->pio_only) { if (dd->pio_only) {
scatterwalk_start(&dd->in_walk, dd->in_sg); dd->in_sg_offset = 0;
if (out_sg_len) if (out_sg_len)
scatterwalk_start(&dd->out_walk, dd->out_sg); dd->out_sg_offset = 0;
/* Enable DATAIN interrupt and let it take /* Enable DATAIN interrupt and let it take
care of the rest */ 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(!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++) { for (i = 0; i < AES_BLOCK_WORDS; i++) {
omap_aes_write(dd, AES_REG_DATA_N(dd, i), *src); omap_aes_write(dd, AES_REG_DATA_N(dd, i), *src);
dd->in_sg_offset += 4;
scatterwalk_advance(&dd->in_walk, 4); if (dd->in_sg_offset == dd->in_sg->length) {
if (dd->in_sg->length == _calc_walked(in)) {
dd->in_sg = sg_next(dd->in_sg); dd->in_sg = sg_next(dd->in_sg);
if (dd->in_sg) { if (dd->in_sg) {
scatterwalk_start(&dd->in_walk, dd->in_sg_offset = 0;
dd->in_sg); src = sg_virt(dd->in_sg);
src = sg_virt(dd->in_sg) +
_calc_walked(in);
} }
} else { } else {
src++; src++;
@ -904,20 +900,18 @@ static irqreturn_t omap_aes_irq(int irq, void *dev_id)
BUG_ON(!dd->out_sg); 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++) { for (i = 0; i < AES_BLOCK_WORDS; i++) {
*dst = omap_aes_read(dd, AES_REG_DATA_N(dd, i)); *dst = omap_aes_read(dd, AES_REG_DATA_N(dd, i));
scatterwalk_advance(&dd->out_walk, 4); dd->out_sg_offset += 4;
if (dd->out_sg->length == _calc_walked(out)) { if (dd->out_sg_offset == dd->out_sg->length) {
dd->out_sg = sg_next(dd->out_sg); dd->out_sg = sg_next(dd->out_sg);
if (dd->out_sg) { if (dd->out_sg) {
scatterwalk_start(&dd->out_walk, dd->out_sg_offset = 0;
dd->out_sg); dst = sg_virt(dd->out_sg);
dst = sg_virt(dd->out_sg) +
_calc_walked(out);
} }
} else { } else {
dst++; dst++;

View file

@ -14,8 +14,6 @@
#define DST_MAXBURST 4 #define DST_MAXBURST 4
#define DMA_MIN (DST_MAXBURST * sizeof(u32)) #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 * OMAP TRM gives bitfields as start:end, where start is the higher bit
* number. For example 7:0 * number. For example 7:0
@ -186,8 +184,8 @@ struct omap_aes_dev {
struct scatterlist out_sgl; struct scatterlist out_sgl;
struct scatterlist *orig_out; struct scatterlist *orig_out;
struct scatter_walk in_walk; unsigned int in_sg_offset;
struct scatter_walk out_walk; unsigned int out_sg_offset;
struct dma_chan *dma_lch_in; struct dma_chan *dma_lch_in;
struct dma_chan *dma_lch_out; struct dma_chan *dma_lch_out;
int in_sg_len; int in_sg_len;

View file

@ -19,7 +19,6 @@
#include <crypto/engine.h> #include <crypto/engine.h>
#include <crypto/internal/des.h> #include <crypto/internal/des.h>
#include <crypto/internal/skcipher.h> #include <crypto/internal/skcipher.h>
#include <crypto/scatterwalk.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/err.h> #include <linux/err.h>
@ -40,8 +39,6 @@
#define DES_BLOCK_WORDS (DES_BLOCK_SIZE >> 2) #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 - \ #define DES_REG_KEY(dd, x) ((dd)->pdata->key_ofs - \
((x ^ 0x01) * 0x04)) ((x ^ 0x01) * 0x04))
@ -152,8 +149,8 @@ struct omap_des_dev {
struct scatterlist out_sgl; struct scatterlist out_sgl;
struct scatterlist *orig_out; struct scatterlist *orig_out;
struct scatter_walk in_walk; unsigned int in_sg_offset;
struct scatter_walk out_walk; unsigned int out_sg_offset;
struct dma_chan *dma_lch_in; struct dma_chan *dma_lch_in;
struct dma_chan *dma_lch_out; struct dma_chan *dma_lch_out;
int in_sg_len; int in_sg_len;
@ -379,8 +376,8 @@ static int omap_des_crypt_dma(struct crypto_tfm *tfm,
int ret; int ret;
if (dd->pio_only) { if (dd->pio_only) {
scatterwalk_start(&dd->in_walk, dd->in_sg); dd->in_sg_offset = 0;
scatterwalk_start(&dd->out_walk, dd->out_sg); dd->out_sg_offset = 0;
/* Enable DATAIN interrupt and let it take /* Enable DATAIN interrupt and let it take
care of the rest */ 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(!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++) { for (i = 0; i < DES_BLOCK_WORDS; i++) {
omap_des_write(dd, DES_REG_DATA_N(dd, i), *src); omap_des_write(dd, DES_REG_DATA_N(dd, i), *src);
dd->in_sg_offset += 4;
scatterwalk_advance(&dd->in_walk, 4); if (dd->in_sg_offset == dd->in_sg->length) {
if (dd->in_sg->length == _calc_walked(in)) {
dd->in_sg = sg_next(dd->in_sg); dd->in_sg = sg_next(dd->in_sg);
if (dd->in_sg) { if (dd->in_sg) {
scatterwalk_start(&dd->in_walk, dd->in_sg_offset = 0;
dd->in_sg); src = sg_virt(dd->in_sg);
src = sg_virt(dd->in_sg) +
_calc_walked(in);
} }
} else { } else {
src++; src++;
@ -869,20 +863,18 @@ static irqreturn_t omap_des_irq(int irq, void *dev_id)
BUG_ON(!dd->out_sg); 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++) { for (i = 0; i < DES_BLOCK_WORDS; i++) {
*dst = omap_des_read(dd, DES_REG_DATA_N(dd, i)); *dst = omap_des_read(dd, DES_REG_DATA_N(dd, i));
scatterwalk_advance(&dd->out_walk, 4); dd->out_sg_offset += 4;
if (dd->out_sg->length == _calc_walked(out)) { if (dd->out_sg_offset == dd->out_sg->length) {
dd->out_sg = sg_next(dd->out_sg); dd->out_sg = sg_next(dd->out_sg);
if (dd->out_sg) { if (dd->out_sg) {
scatterwalk_start(&dd->out_walk, dd->out_sg_offset = 0;
dd->out_sg); dst = sg_virt(dd->out_sg);
dst = sg_virt(dd->out_sg) +
_calc_walked(out);
} }
} else { } else {
dst++; dst++;