@@ -54,12 +54,6 @@ static void mv_desc_init(struct mv_xor_desc_slot *desc, unsigned long flags)
54
54
hw_desc -> desc_command = (1 << 31 );
55
55
}
56
56
57
- static u32 mv_desc_get_dest_addr (struct mv_xor_desc_slot * desc )
58
- {
59
- struct mv_xor_desc * hw_desc = desc -> hw_desc ;
60
- return hw_desc -> phy_dest_addr ;
61
- }
62
-
63
57
static void mv_desc_set_byte_count (struct mv_xor_desc_slot * desc ,
64
58
u32 byte_count )
65
59
{
@@ -787,7 +781,6 @@ static void mv_xor_issue_pending(struct dma_chan *chan)
787
781
/*
788
782
* Perform a transaction to verify the HW works.
789
783
*/
790
- #define MV_XOR_TEST_SIZE 2000
791
784
792
785
static int mv_xor_memcpy_self_test (struct mv_xor_chan * mv_chan )
793
786
{
@@ -797,20 +790,21 @@ static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan)
797
790
struct dma_chan * dma_chan ;
798
791
dma_cookie_t cookie ;
799
792
struct dma_async_tx_descriptor * tx ;
793
+ struct dmaengine_unmap_data * unmap ;
800
794
int err = 0 ;
801
795
802
- src = kmalloc (sizeof (u8 ) * MV_XOR_TEST_SIZE , GFP_KERNEL );
796
+ src = kmalloc (sizeof (u8 ) * PAGE_SIZE , GFP_KERNEL );
803
797
if (!src )
804
798
return - ENOMEM ;
805
799
806
- dest = kzalloc (sizeof (u8 ) * MV_XOR_TEST_SIZE , GFP_KERNEL );
800
+ dest = kzalloc (sizeof (u8 ) * PAGE_SIZE , GFP_KERNEL );
807
801
if (!dest ) {
808
802
kfree (src );
809
803
return - ENOMEM ;
810
804
}
811
805
812
806
/* Fill in src buffer */
813
- for (i = 0 ; i < MV_XOR_TEST_SIZE ; i ++ )
807
+ for (i = 0 ; i < PAGE_SIZE ; i ++ )
814
808
((u8 * ) src )[i ] = (u8 )i ;
815
809
816
810
dma_chan = & mv_chan -> dmachan ;
@@ -819,14 +813,26 @@ static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan)
819
813
goto out ;
820
814
}
821
815
822
- dest_dma = dma_map_single (dma_chan -> device -> dev , dest ,
823
- MV_XOR_TEST_SIZE , DMA_FROM_DEVICE );
816
+ unmap = dmaengine_get_unmap_data (dma_chan -> device -> dev , 2 , GFP_KERNEL );
817
+ if (!unmap ) {
818
+ err = - ENOMEM ;
819
+ goto free_resources ;
820
+ }
821
+
822
+ src_dma = dma_map_page (dma_chan -> device -> dev , virt_to_page (src ), 0 ,
823
+ PAGE_SIZE , DMA_TO_DEVICE );
824
+ unmap -> to_cnt = 1 ;
825
+ unmap -> addr [0 ] = src_dma ;
824
826
825
- src_dma = dma_map_single (dma_chan -> device -> dev , src ,
826
- MV_XOR_TEST_SIZE , DMA_TO_DEVICE );
827
+ dest_dma = dma_map_page (dma_chan -> device -> dev , virt_to_page (dest ), 0 ,
828
+ PAGE_SIZE , DMA_FROM_DEVICE );
829
+ unmap -> from_cnt = 1 ;
830
+ unmap -> addr [1 ] = dest_dma ;
831
+
832
+ unmap -> len = PAGE_SIZE ;
827
833
828
834
tx = mv_xor_prep_dma_memcpy (dma_chan , dest_dma , src_dma ,
829
- MV_XOR_TEST_SIZE , 0 );
835
+ PAGE_SIZE , 0 );
830
836
cookie = mv_xor_tx_submit (tx );
831
837
mv_xor_issue_pending (dma_chan );
832
838
async_tx_ack (tx );
@@ -841,15 +847,16 @@ static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan)
841
847
}
842
848
843
849
dma_sync_single_for_cpu (dma_chan -> device -> dev , dest_dma ,
844
- MV_XOR_TEST_SIZE , DMA_FROM_DEVICE );
845
- if (memcmp (src , dest , MV_XOR_TEST_SIZE )) {
850
+ PAGE_SIZE , DMA_FROM_DEVICE );
851
+ if (memcmp (src , dest , PAGE_SIZE )) {
846
852
dev_err (dma_chan -> device -> dev ,
847
853
"Self-test copy failed compare, disabling\n" );
848
854
err = - ENODEV ;
849
855
goto free_resources ;
850
856
}
851
857
852
858
free_resources :
859
+ dmaengine_unmap_put (unmap );
853
860
mv_xor_free_chan_resources (dma_chan );
854
861
out :
855
862
kfree (src );
@@ -867,13 +874,15 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan)
867
874
dma_addr_t dma_srcs [MV_XOR_NUM_SRC_TEST ];
868
875
dma_addr_t dest_dma ;
869
876
struct dma_async_tx_descriptor * tx ;
877
+ struct dmaengine_unmap_data * unmap ;
870
878
struct dma_chan * dma_chan ;
871
879
dma_cookie_t cookie ;
872
880
u8 cmp_byte = 0 ;
873
881
u32 cmp_word ;
874
882
int err = 0 ;
883
+ int src_count = MV_XOR_NUM_SRC_TEST ;
875
884
876
- for (src_idx = 0 ; src_idx < MV_XOR_NUM_SRC_TEST ; src_idx ++ ) {
885
+ for (src_idx = 0 ; src_idx < src_count ; src_idx ++ ) {
877
886
xor_srcs [src_idx ] = alloc_page (GFP_KERNEL );
878
887
if (!xor_srcs [src_idx ]) {
879
888
while (src_idx -- )
@@ -890,13 +899,13 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan)
890
899
}
891
900
892
901
/* Fill in src buffers */
893
- for (src_idx = 0 ; src_idx < MV_XOR_NUM_SRC_TEST ; src_idx ++ ) {
902
+ for (src_idx = 0 ; src_idx < src_count ; src_idx ++ ) {
894
903
u8 * ptr = page_address (xor_srcs [src_idx ]);
895
904
for (i = 0 ; i < PAGE_SIZE ; i ++ )
896
905
ptr [i ] = (1 << src_idx );
897
906
}
898
907
899
- for (src_idx = 0 ; src_idx < MV_XOR_NUM_SRC_TEST ; src_idx ++ )
908
+ for (src_idx = 0 ; src_idx < src_count ; src_idx ++ )
900
909
cmp_byte ^= (u8 ) (1 << src_idx );
901
910
902
911
cmp_word = (cmp_byte << 24 ) | (cmp_byte << 16 ) |
@@ -910,16 +919,29 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan)
910
919
goto out ;
911
920
}
912
921
922
+ unmap = dmaengine_get_unmap_data (dma_chan -> device -> dev , src_count + 1 ,
923
+ GFP_KERNEL );
924
+ if (!unmap ) {
925
+ err = - ENOMEM ;
926
+ goto free_resources ;
927
+ }
928
+
913
929
/* test xor */
914
- dest_dma = dma_map_page (dma_chan -> device -> dev , dest , 0 , PAGE_SIZE ,
915
- DMA_FROM_DEVICE );
930
+ for (i = 0 ; i < src_count ; i ++ ) {
931
+ unmap -> addr [i ] = dma_map_page (dma_chan -> device -> dev , xor_srcs [i ],
932
+ 0 , PAGE_SIZE , DMA_TO_DEVICE );
933
+ dma_srcs [i ] = unmap -> addr [i ];
934
+ unmap -> to_cnt ++ ;
935
+ }
916
936
917
- for (i = 0 ; i < MV_XOR_NUM_SRC_TEST ; i ++ )
918
- dma_srcs [i ] = dma_map_page (dma_chan -> device -> dev , xor_srcs [i ],
919
- 0 , PAGE_SIZE , DMA_TO_DEVICE );
937
+ unmap -> addr [src_count ] = dma_map_page (dma_chan -> device -> dev , dest , 0 , PAGE_SIZE ,
938
+ DMA_FROM_DEVICE );
939
+ dest_dma = unmap -> addr [src_count ];
940
+ unmap -> from_cnt = 1 ;
941
+ unmap -> len = PAGE_SIZE ;
920
942
921
943
tx = mv_xor_prep_dma_xor (dma_chan , dest_dma , dma_srcs ,
922
- MV_XOR_NUM_SRC_TEST , PAGE_SIZE , 0 );
944
+ src_count , PAGE_SIZE , 0 );
923
945
924
946
cookie = mv_xor_tx_submit (tx );
925
947
mv_xor_issue_pending (dma_chan );
@@ -948,9 +970,10 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan)
948
970
}
949
971
950
972
free_resources :
973
+ dmaengine_unmap_put (unmap );
951
974
mv_xor_free_chan_resources (dma_chan );
952
975
out :
953
- src_idx = MV_XOR_NUM_SRC_TEST ;
976
+ src_idx = src_count ;
954
977
while (src_idx -- )
955
978
__free_page (xor_srcs [src_idx ]);
956
979
__free_page (dest );
@@ -1176,6 +1199,7 @@ static int mv_xor_probe(struct platform_device *pdev)
1176
1199
int i = 0 ;
1177
1200
1178
1201
for_each_child_of_node (pdev -> dev .of_node , np ) {
1202
+ struct mv_xor_chan * chan ;
1179
1203
dma_cap_mask_t cap_mask ;
1180
1204
int irq ;
1181
1205
@@ -1193,21 +1217,21 @@ static int mv_xor_probe(struct platform_device *pdev)
1193
1217
goto err_channel_add ;
1194
1218
}
1195
1219
1196
- xordev -> channels [i ] =
1197
- mv_xor_channel_add (xordev , pdev , i ,
1198
- cap_mask , irq );
1199
- if (IS_ERR (xordev -> channels [i ])) {
1200
- ret = PTR_ERR (xordev -> channels [i ]);
1201
- xordev -> channels [i ] = NULL ;
1220
+ chan = mv_xor_channel_add (xordev , pdev , i ,
1221
+ cap_mask , irq );
1222
+ if (IS_ERR (chan )) {
1223
+ ret = PTR_ERR (chan );
1202
1224
irq_dispose_mapping (irq );
1203
1225
goto err_channel_add ;
1204
1226
}
1205
1227
1228
+ xordev -> channels [i ] = chan ;
1206
1229
i ++ ;
1207
1230
}
1208
1231
} else if (pdata && pdata -> channels ) {
1209
1232
for (i = 0 ; i < MV_XOR_MAX_CHANNELS ; i ++ ) {
1210
1233
struct mv_xor_channel_data * cd ;
1234
+ struct mv_xor_chan * chan ;
1211
1235
int irq ;
1212
1236
1213
1237
cd = & pdata -> channels [i ];
@@ -1222,13 +1246,14 @@ static int mv_xor_probe(struct platform_device *pdev)
1222
1246
goto err_channel_add ;
1223
1247
}
1224
1248
1225
- xordev -> channels [i ] =
1226
- mv_xor_channel_add (xordev , pdev , i ,
1227
- cd -> cap_mask , irq );
1228
- if (IS_ERR (xordev -> channels [i ])) {
1229
- ret = PTR_ERR (xordev -> channels [i ]);
1249
+ chan = mv_xor_channel_add (xordev , pdev , i ,
1250
+ cd -> cap_mask , irq );
1251
+ if (IS_ERR (chan )) {
1252
+ ret = PTR_ERR (chan );
1230
1253
goto err_channel_add ;
1231
1254
}
1255
+
1256
+ xordev -> channels [i ] = chan ;
1232
1257
}
1233
1258
}
1234
1259
0 commit comments