mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
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:
parent
ee3c9c7e27
commit
42c5675c2f
3 changed files with 32 additions and 48 deletions
|
@ -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++;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
Loading…
Add table
Reference in a new issue