@@ -769,6 +769,7 @@ struct aead_edesc {
769
769
* @src_nents: number of segments in input s/w scatterlist
770
770
* @dst_nents: number of segments in output s/w scatterlist
771
771
* @iv_dma: dma address of iv for checking continuity and link table
772
+ * @iv_dir: DMA mapping direction for IV
772
773
* @sec4_sg_bytes: length of dma mapped sec4_sg space
773
774
* @sec4_sg_dma: bus physical mapped address of h/w link table
774
775
* @sec4_sg: pointer to h/w link table
@@ -778,6 +779,7 @@ struct ablkcipher_edesc {
778
779
int src_nents ;
779
780
int dst_nents ;
780
781
dma_addr_t iv_dma ;
782
+ enum dma_data_direction iv_dir ;
781
783
int sec4_sg_bytes ;
782
784
dma_addr_t sec4_sg_dma ;
783
785
struct sec4_sg_entry * sec4_sg ;
@@ -787,7 +789,8 @@ struct ablkcipher_edesc {
787
789
static void caam_unmap (struct device * dev , struct scatterlist * src ,
788
790
struct scatterlist * dst , int src_nents ,
789
791
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 ,
791
794
int sec4_sg_bytes )
792
795
{
793
796
if (dst != src ) {
@@ -799,7 +802,7 @@ static void caam_unmap(struct device *dev, struct scatterlist *src,
799
802
}
800
803
801
804
if (iv_dma )
802
- dma_unmap_single (dev , iv_dma , ivsize , DMA_TO_DEVICE );
805
+ dma_unmap_single (dev , iv_dma , ivsize , iv_dir );
803
806
if (sec4_sg_bytes )
804
807
dma_unmap_single (dev , sec4_sg_dma , sec4_sg_bytes ,
805
808
DMA_TO_DEVICE );
@@ -810,7 +813,7 @@ static void aead_unmap(struct device *dev,
810
813
struct aead_request * req )
811
814
{
812
815
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 ,
814
817
edesc -> sec4_sg_dma , edesc -> sec4_sg_bytes );
815
818
}
816
819
@@ -823,7 +826,7 @@ static void ablkcipher_unmap(struct device *dev,
823
826
824
827
caam_unmap (dev , req -> src , req -> dst ,
825
828
edesc -> src_nents , edesc -> dst_nents ,
826
- edesc -> iv_dma , ivsize ,
829
+ edesc -> iv_dma , ivsize , edesc -> iv_dir ,
827
830
edesc -> sec4_sg_dma , edesc -> sec4_sg_bytes );
828
831
}
829
832
@@ -1287,7 +1290,7 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
1287
1290
GFP_DMA | flags );
1288
1291
if (!edesc ) {
1289
1292
caam_unmap (jrdev , req -> src , req -> dst , src_nents , dst_nents , 0 ,
1290
- 0 , 0 , 0 );
1293
+ 0 , DMA_NONE , 0 , 0 );
1291
1294
return ERR_PTR (- ENOMEM );
1292
1295
}
1293
1296
@@ -1550,7 +1553,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
1550
1553
if (dma_mapping_error (jrdev , iv_dma )) {
1551
1554
dev_err (jrdev , "unable to map IV\n" );
1552
1555
caam_unmap (jrdev , req -> src , req -> dst , src_nents , dst_nents , 0 ,
1553
- 0 , 0 , 0 );
1556
+ 0 , DMA_NONE , 0 , 0 );
1554
1557
return ERR_PTR (- ENOMEM );
1555
1558
}
1556
1559
@@ -1572,7 +1575,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
1572
1575
if (!edesc ) {
1573
1576
dev_err (jrdev , "could not allocate extended descriptor\n" );
1574
1577
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 );
1576
1579
return ERR_PTR (- ENOMEM );
1577
1580
}
1578
1581
@@ -1581,6 +1584,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
1581
1584
edesc -> sec4_sg_bytes = sec4_sg_bytes ;
1582
1585
edesc -> sec4_sg = (void * )edesc + sizeof (struct ablkcipher_edesc ) +
1583
1586
desc_bytes ;
1587
+ edesc -> iv_dir = DMA_TO_DEVICE ;
1584
1588
1585
1589
if (!in_contig ) {
1586
1590
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
1598
1602
if (dma_mapping_error (jrdev , edesc -> sec4_sg_dma )) {
1599
1603
dev_err (jrdev , "unable to map S/G table\n" );
1600
1604
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 );
1602
1606
kfree (edesc );
1603
1607
return ERR_PTR (- ENOMEM );
1604
1608
}
@@ -1756,11 +1760,11 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
1756
1760
* Check if iv can be contiguous with source and destination.
1757
1761
* If so, include it. If not, create scatterlist.
1758
1762
*/
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 );
1760
1764
if (dma_mapping_error (jrdev , iv_dma )) {
1761
1765
dev_err (jrdev , "unable to map IV\n" );
1762
1766
caam_unmap (jrdev , req -> src , req -> dst , src_nents , dst_nents , 0 ,
1763
- 0 , 0 , 0 );
1767
+ 0 , DMA_NONE , 0 , 0 );
1764
1768
return ERR_PTR (- ENOMEM );
1765
1769
}
1766
1770
@@ -1781,7 +1785,7 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
1781
1785
if (!edesc ) {
1782
1786
dev_err (jrdev , "could not allocate extended descriptor\n" );
1783
1787
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 );
1785
1789
return ERR_PTR (- ENOMEM );
1786
1790
}
1787
1791
@@ -1790,6 +1794,7 @@ static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
1790
1794
edesc -> sec4_sg_bytes = sec4_sg_bytes ;
1791
1795
edesc -> sec4_sg = (void * )edesc + sizeof (struct ablkcipher_edesc ) +
1792
1796
desc_bytes ;
1797
+ edesc -> iv_dir = DMA_FROM_DEVICE ;
1793
1798
1794
1799
if (mapped_src_nents > 1 )
1795
1800
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(
1807
1812
if (dma_mapping_error (jrdev , edesc -> sec4_sg_dma )) {
1808
1813
dev_err (jrdev , "unable to map S/G table\n" );
1809
1814
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 );
1811
1816
kfree (edesc );
1812
1817
return ERR_PTR (- ENOMEM );
1813
1818
}
0 commit comments