@@ -60,7 +60,7 @@ MODULE_PARM_DESC(sg_buffers,
60
60
static unsigned int dmatest ;
61
61
module_param (dmatest , uint , S_IRUGO | S_IWUSR );
62
62
MODULE_PARM_DESC (dmatest ,
63
- "dmatest 0-memcpy 1-slave_sg (default: 0)" );
63
+ "dmatest 0-memcpy 1-slave_sg 2-memset (default: 0)" );
64
64
65
65
static unsigned int xor_sources = 3 ;
66
66
module_param (xor_sources , uint , S_IRUGO | S_IWUSR );
@@ -158,6 +158,7 @@ MODULE_PARM_DESC(run, "Run the test (default: false)");
158
158
#define PATTERN_COPY 0x40
159
159
#define PATTERN_OVERWRITE 0x20
160
160
#define PATTERN_COUNT_MASK 0x1f
161
+ #define PATTERN_MEMSET_IDX 0x01
161
162
162
163
struct dmatest_thread {
163
164
struct list_head node ;
@@ -239,46 +240,62 @@ static unsigned long dmatest_random(void)
239
240
return buf ;
240
241
}
241
242
243
+ static inline u8 gen_inv_idx (u8 index , bool is_memset )
244
+ {
245
+ u8 val = is_memset ? PATTERN_MEMSET_IDX : index ;
246
+
247
+ return ~val & PATTERN_COUNT_MASK ;
248
+ }
249
+
250
+ static inline u8 gen_src_value (u8 index , bool is_memset )
251
+ {
252
+ return PATTERN_SRC | gen_inv_idx (index , is_memset );
253
+ }
254
+
255
+ static inline u8 gen_dst_value (u8 index , bool is_memset )
256
+ {
257
+ return PATTERN_DST | gen_inv_idx (index , is_memset );
258
+ }
259
+
242
260
static void dmatest_init_srcs (u8 * * bufs , unsigned int start , unsigned int len ,
243
- unsigned int buf_size )
261
+ unsigned int buf_size , bool is_memset )
244
262
{
245
263
unsigned int i ;
246
264
u8 * buf ;
247
265
248
266
for (; (buf = * bufs ); bufs ++ ) {
249
267
for (i = 0 ; i < start ; i ++ )
250
- buf [i ] = PATTERN_SRC | (~ i & PATTERN_COUNT_MASK );
268
+ buf [i ] = gen_src_value ( i , is_memset );
251
269
for ( ; i < start + len ; i ++ )
252
- buf [i ] = PATTERN_SRC | PATTERN_COPY
253
- | (~i & PATTERN_COUNT_MASK );
270
+ buf [i ] = gen_src_value (i , is_memset ) | PATTERN_COPY ;
254
271
for ( ; i < buf_size ; i ++ )
255
- buf [i ] = PATTERN_SRC | (~ i & PATTERN_COUNT_MASK );
272
+ buf [i ] = gen_src_value ( i , is_memset );
256
273
buf ++ ;
257
274
}
258
275
}
259
276
260
277
static void dmatest_init_dsts (u8 * * bufs , unsigned int start , unsigned int len ,
261
- unsigned int buf_size )
278
+ unsigned int buf_size , bool is_memset )
262
279
{
263
280
unsigned int i ;
264
281
u8 * buf ;
265
282
266
283
for (; (buf = * bufs ); bufs ++ ) {
267
284
for (i = 0 ; i < start ; i ++ )
268
- buf [i ] = PATTERN_DST | (~ i & PATTERN_COUNT_MASK );
285
+ buf [i ] = gen_dst_value ( i , is_memset );
269
286
for ( ; i < start + len ; i ++ )
270
- buf [i ] = PATTERN_DST | PATTERN_OVERWRITE
271
- | (~ i & PATTERN_COUNT_MASK ) ;
287
+ buf [i ] = gen_dst_value ( i , is_memset ) |
288
+ PATTERN_OVERWRITE ;
272
289
for ( ; i < buf_size ; i ++ )
273
- buf [i ] = PATTERN_DST | (~ i & PATTERN_COUNT_MASK );
290
+ buf [i ] = gen_dst_value ( i , is_memset );
274
291
}
275
292
}
276
293
277
294
static void dmatest_mismatch (u8 actual , u8 pattern , unsigned int index ,
278
- unsigned int counter , bool is_srcbuf )
295
+ unsigned int counter , bool is_srcbuf , bool is_memset )
279
296
{
280
297
u8 diff = actual ^ pattern ;
281
- u8 expected = pattern | (~ counter & PATTERN_COUNT_MASK );
298
+ u8 expected = pattern | gen_inv_idx ( counter , is_memset );
282
299
const char * thread_name = current -> comm ;
283
300
284
301
if (is_srcbuf )
@@ -298,7 +315,7 @@ static void dmatest_mismatch(u8 actual, u8 pattern, unsigned int index,
298
315
299
316
static unsigned int dmatest_verify (u8 * * bufs , unsigned int start ,
300
317
unsigned int end , unsigned int counter , u8 pattern ,
301
- bool is_srcbuf )
318
+ bool is_srcbuf , bool is_memset )
302
319
{
303
320
unsigned int i ;
304
321
unsigned int error_count = 0 ;
@@ -311,11 +328,12 @@ static unsigned int dmatest_verify(u8 **bufs, unsigned int start,
311
328
counter = counter_orig ;
312
329
for (i = start ; i < end ; i ++ ) {
313
330
actual = buf [i ];
314
- expected = pattern | (~ counter & PATTERN_COUNT_MASK );
331
+ expected = pattern | gen_inv_idx ( counter , is_memset );
315
332
if (actual != expected ) {
316
333
if (error_count < MAX_ERROR_COUNT )
317
334
dmatest_mismatch (actual , pattern , i ,
318
- counter , is_srcbuf );
335
+ counter , is_srcbuf ,
336
+ is_memset );
319
337
error_count ++ ;
320
338
}
321
339
counter ++ ;
@@ -435,6 +453,7 @@ static int dmatest_func(void *data)
435
453
s64 runtime = 0 ;
436
454
unsigned long long total_len = 0 ;
437
455
u8 align = 0 ;
456
+ bool is_memset = false;
438
457
439
458
set_freezable ();
440
459
@@ -448,6 +467,10 @@ static int dmatest_func(void *data)
448
467
if (thread -> type == DMA_MEMCPY ) {
449
468
align = dev -> copy_align ;
450
469
src_cnt = dst_cnt = 1 ;
470
+ } else if (thread -> type == DMA_MEMSET ) {
471
+ align = dev -> fill_align ;
472
+ src_cnt = dst_cnt = 1 ;
473
+ is_memset = true;
451
474
} else if (thread -> type == DMA_SG ) {
452
475
align = dev -> copy_align ;
453
476
src_cnt = dst_cnt = sg_buffers ;
@@ -571,9 +594,9 @@ static int dmatest_func(void *data)
571
594
dst_off = (dst_off >> align ) << align ;
572
595
573
596
dmatest_init_srcs (thread -> srcs , src_off , len ,
574
- params -> buf_size );
597
+ params -> buf_size , is_memset );
575
598
dmatest_init_dsts (thread -> dsts , dst_off , len ,
576
- params -> buf_size );
599
+ params -> buf_size , is_memset );
577
600
578
601
diff = ktime_sub (ktime_get (), start );
579
602
filltime = ktime_add (filltime , diff );
@@ -640,6 +663,11 @@ static int dmatest_func(void *data)
640
663
tx = dev -> device_prep_dma_memcpy (chan ,
641
664
dsts [0 ] + dst_off ,
642
665
srcs [0 ], len , flags );
666
+ else if (thread -> type == DMA_MEMSET )
667
+ tx = dev -> device_prep_dma_memset (chan ,
668
+ dsts [0 ] + dst_off ,
669
+ * (thread -> srcs [0 ] + src_off ),
670
+ len , flags );
643
671
else if (thread -> type == DMA_SG )
644
672
tx = dev -> device_prep_dma_sg (chan , tx_sg , src_cnt ,
645
673
rx_sg , src_cnt , flags );
@@ -722,23 +750,25 @@ static int dmatest_func(void *data)
722
750
start = ktime_get ();
723
751
pr_debug ("%s: verifying source buffer...\n" , current -> comm );
724
752
error_count = dmatest_verify (thread -> srcs , 0 , src_off ,
725
- 0 , PATTERN_SRC , true);
753
+ 0 , PATTERN_SRC , true, is_memset );
726
754
error_count += dmatest_verify (thread -> srcs , src_off ,
727
755
src_off + len , src_off ,
728
- PATTERN_SRC | PATTERN_COPY , true);
756
+ PATTERN_SRC | PATTERN_COPY , true, is_memset );
729
757
error_count += dmatest_verify (thread -> srcs , src_off + len ,
730
758
params -> buf_size , src_off + len ,
731
- PATTERN_SRC , true);
759
+ PATTERN_SRC , true, is_memset );
732
760
733
761
pr_debug ("%s: verifying dest buffer...\n" , current -> comm );
734
762
error_count += dmatest_verify (thread -> dsts , 0 , dst_off ,
735
- 0 , PATTERN_DST , false);
763
+ 0 , PATTERN_DST , false, is_memset );
764
+
736
765
error_count += dmatest_verify (thread -> dsts , dst_off ,
737
766
dst_off + len , src_off ,
738
- PATTERN_SRC | PATTERN_COPY , false);
767
+ PATTERN_SRC | PATTERN_COPY , false, is_memset );
768
+
739
769
error_count += dmatest_verify (thread -> dsts , dst_off + len ,
740
770
params -> buf_size , dst_off + len ,
741
- PATTERN_DST , false);
771
+ PATTERN_DST , false, is_memset );
742
772
743
773
diff = ktime_sub (ktime_get (), start );
744
774
comparetime = ktime_add (comparetime , diff );
@@ -821,6 +851,8 @@ static int dmatest_add_threads(struct dmatest_info *info,
821
851
822
852
if (type == DMA_MEMCPY )
823
853
op = "copy" ;
854
+ else if (type == DMA_MEMSET )
855
+ op = "set" ;
824
856
else if (type == DMA_SG )
825
857
op = "sg" ;
826
858
else if (type == DMA_XOR )
@@ -883,6 +915,13 @@ static int dmatest_add_channel(struct dmatest_info *info,
883
915
}
884
916
}
885
917
918
+ if (dma_has_cap (DMA_MEMSET , dma_dev -> cap_mask )) {
919
+ if (dmatest == 2 ) {
920
+ cnt = dmatest_add_threads (info , dtc , DMA_MEMSET );
921
+ thread_count += cnt > 0 ? cnt : 0 ;
922
+ }
923
+ }
924
+
886
925
if (dma_has_cap (DMA_SG , dma_dev -> cap_mask )) {
887
926
if (dmatest == 1 ) {
888
927
cnt = dmatest_add_threads (info , dtc , DMA_SG );
@@ -961,6 +1000,7 @@ static void run_threaded_test(struct dmatest_info *info)
961
1000
params -> noverify = noverify ;
962
1001
963
1002
request_channels (info , DMA_MEMCPY );
1003
+ request_channels (info , DMA_MEMSET );
964
1004
request_channels (info , DMA_XOR );
965
1005
request_channels (info , DMA_SG );
966
1006
request_channels (info , DMA_PQ );
0 commit comments