Skip to content

Commit a38acd2

Browse files
horiagherbertx
authored andcommitted
crypto: caam - fix DMA mapping dir for generated IV
In case of GIVCIPHER, IV is generated by the device. Fix the DMA mapping direction. Cc: <stable@vger.kernel.org> # 3.19+ Fixes: 7222d1a ("crypto: caam - add support for givencrypt cbc(aes) and rfc3686(ctr(aes))") Signed-off-by: Horia Geantă <horia.geanta@nxp.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent eea0d3e commit a38acd2

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

drivers/crypto/caam/caamalg.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,7 @@ struct aead_edesc {
769769
* @src_nents: number of segments in input s/w scatterlist
770770
* @dst_nents: number of segments in output s/w scatterlist
771771
* @iv_dma: dma address of iv for checking continuity and link table
772+
* @iv_dir: DMA mapping direction for IV
772773
* @sec4_sg_bytes: length of dma mapped sec4_sg space
773774
* @sec4_sg_dma: bus physical mapped address of h/w link table
774775
* @sec4_sg: pointer to h/w link table
@@ -778,6 +779,7 @@ struct ablkcipher_edesc {
778779
int src_nents;
779780
int dst_nents;
780781
dma_addr_t iv_dma;
782+
enum dma_data_direction iv_dir;
781783
int sec4_sg_bytes;
782784
dma_addr_t sec4_sg_dma;
783785
struct sec4_sg_entry *sec4_sg;
@@ -787,7 +789,8 @@ struct ablkcipher_edesc {
787789
static void caam_unmap(struct device *dev, struct scatterlist *src,
788790
struct scatterlist *dst, int src_nents,
789791
int dst_nents,
790-
dma_addr_t iv_dma, int ivsize, dma_addr_t sec4_sg_dma,
792+
dma_addr_t iv_dma, int ivsize,
793+
enum dma_data_direction iv_dir, dma_addr_t sec4_sg_dma,
791794
int sec4_sg_bytes)
792795
{
793796
if (dst != src) {
@@ -799,7 +802,7 @@ static void caam_unmap(struct device *dev, struct scatterlist *src,
799802
}
800803

801804
if (iv_dma)
802-
dma_unmap_single(dev, iv_dma, ivsize, DMA_TO_DEVICE);
805+
dma_unmap_single(dev, iv_dma, ivsize, iv_dir);
803806
if (sec4_sg_bytes)
804807
dma_unmap_single(dev, sec4_sg_dma, sec4_sg_bytes,
805808
DMA_TO_DEVICE);
@@ -810,7 +813,7 @@ static void aead_unmap(struct device *dev,
810813
struct aead_request *req)
811814
{
812815
caam_unmap(dev, req->src, req->dst,
813-
edesc->src_nents, edesc->dst_nents, 0, 0,
816+
edesc->src_nents, edesc->dst_nents, 0, 0, DMA_NONE,
814817
edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
815818
}
816819

@@ -823,7 +826,7 @@ static void ablkcipher_unmap(struct device *dev,
823826

824827
caam_unmap(dev, req->src, req->dst,
825828
edesc->src_nents, edesc->dst_nents,
826-
edesc->iv_dma, ivsize,
829+
edesc->iv_dma, ivsize, edesc->iv_dir,
827830
edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
828831
}
829832

@@ -1287,7 +1290,7 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
12871290
GFP_DMA | flags);
12881291
if (!edesc) {
12891292
caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
1290-
0, 0, 0);
1293+
0, DMA_NONE, 0, 0);
12911294
return ERR_PTR(-ENOMEM);
12921295
}
12931296

@@ -1550,7 +1553,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
15501553
if (dma_mapping_error(jrdev, iv_dma)) {
15511554
dev_err(jrdev, "unable to map IV\n");
15521555
caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
1553-
0, 0, 0);
1556+
0, DMA_NONE, 0, 0);
15541557
return ERR_PTR(-ENOMEM);
15551558
}
15561559

@@ -1572,7 +1575,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
15721575
if (!edesc) {
15731576
dev_err(jrdev, "could not allocate extended descriptor\n");
15741577
caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents,
1575-
iv_dma, ivsize, 0, 0);
1578+
iv_dma, ivsize, DMA_TO_DEVICE, 0, 0);
15761579
return ERR_PTR(-ENOMEM);
15771580
}
15781581

@@ -1581,6 +1584,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
15811584
edesc->sec4_sg_bytes = sec4_sg_bytes;
15821585
edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) +
15831586
desc_bytes;
1587+
edesc->iv_dir = DMA_TO_DEVICE;
15841588

15851589
if (!in_contig) {
15861590
dma_to_sec4_sg_one(edesc->sec4_sg, iv_dma, ivsize, 0);
@@ -1598,7 +1602,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
15981602
if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
15991603
dev_err(jrdev, "unable to map S/G table\n");
16001604
caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents,
1601-
iv_dma, ivsize, 0, 0);
1605+
iv_dma, ivsize, DMA_TO_DEVICE, 0, 0);
16021606
kfree(edesc);
16031607
return ERR_PTR(-ENOMEM);
16041608
}
@@ -1756,11 +1760,11 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
17561760
* Check if iv can be contiguous with source and destination.
17571761
* If so, include it. If not, create scatterlist.
17581762
*/
1759-
iv_dma = dma_map_single(jrdev, greq->giv, ivsize, DMA_TO_DEVICE);
1763+
iv_dma = dma_map_single(jrdev, greq->giv, ivsize, DMA_FROM_DEVICE);
17601764
if (dma_mapping_error(jrdev, iv_dma)) {
17611765
dev_err(jrdev, "unable to map IV\n");
17621766
caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
1763-
0, 0, 0);
1767+
0, DMA_NONE, 0, 0);
17641768
return ERR_PTR(-ENOMEM);
17651769
}
17661770

@@ -1781,7 +1785,7 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
17811785
if (!edesc) {
17821786
dev_err(jrdev, "could not allocate extended descriptor\n");
17831787
caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents,
1784-
iv_dma, ivsize, 0, 0);
1788+
iv_dma, ivsize, DMA_FROM_DEVICE, 0, 0);
17851789
return ERR_PTR(-ENOMEM);
17861790
}
17871791

@@ -1790,6 +1794,7 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
17901794
edesc->sec4_sg_bytes = sec4_sg_bytes;
17911795
edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) +
17921796
desc_bytes;
1797+
edesc->iv_dir = DMA_FROM_DEVICE;
17931798

17941799
if (mapped_src_nents > 1)
17951800
sg_to_sec4_sg_last(req->src, mapped_src_nents, edesc->sec4_sg,
@@ -1807,7 +1812,7 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
18071812
if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
18081813
dev_err(jrdev, "unable to map S/G table\n");
18091814
caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents,
1810-
iv_dma, ivsize, 0, 0);
1815+
iv_dma, ivsize, DMA_FROM_DEVICE, 0, 0);
18111816
kfree(edesc);
18121817
return ERR_PTR(-ENOMEM);
18131818
}

0 commit comments

Comments
 (0)