@@ -190,6 +190,36 @@ static void pci_epf_test_clean_dma_chan(struct pci_epf_test *epf_test)
190
190
epf_test -> dma_chan = NULL ;
191
191
}
192
192
193
+ static void pci_epf_test_print_rate (const char * ops , u64 size ,
194
+ struct timespec64 * start ,
195
+ struct timespec64 * end , bool dma )
196
+ {
197
+ struct timespec64 ts ;
198
+ u64 rate , ns ;
199
+
200
+ ts = timespec64_sub (* end , * start );
201
+
202
+ /* convert both size (stored in 'rate') and time in terms of 'ns' */
203
+ ns = timespec64_to_ns (& ts );
204
+ rate = size * NSEC_PER_SEC ;
205
+
206
+ /* Divide both size (stored in 'rate') and ns by a common factor */
207
+ while (ns > UINT_MAX ) {
208
+ rate >>= 1 ;
209
+ ns >>= 1 ;
210
+ }
211
+
212
+ if (!ns )
213
+ return ;
214
+
215
+ /* calculate the rate */
216
+ do_div (rate , (uint32_t )ns );
217
+
218
+ pr_info ("\n%s => Size: %llu bytes\t DMA: %s\t Time: %llu.%09u seconds\t"
219
+ "Rate: %llu KB/s\n" , ops , size , dma ? "YES" : "NO" ,
220
+ (u64 )ts .tv_sec , (u32 )ts .tv_nsec , rate / 1024 );
221
+ }
222
+
193
223
static int pci_epf_test_copy (struct pci_epf_test * epf_test )
194
224
{
195
225
int ret ;
@@ -198,6 +228,7 @@ static int pci_epf_test_copy(struct pci_epf_test *epf_test)
198
228
void __iomem * dst_addr ;
199
229
phys_addr_t src_phys_addr ;
200
230
phys_addr_t dst_phys_addr ;
231
+ struct timespec64 start , end ;
201
232
struct pci_epf * epf = epf_test -> epf ;
202
233
struct device * dev = & epf -> dev ;
203
234
struct pci_epc * epc = epf -> epc ;
@@ -236,6 +267,7 @@ static int pci_epf_test_copy(struct pci_epf_test *epf_test)
236
267
goto err_dst_addr ;
237
268
}
238
269
270
+ ktime_get_ts64 (& start );
239
271
use_dma = !!(reg -> flags & FLAG_USE_DMA );
240
272
if (use_dma ) {
241
273
if (!epf_test -> dma_supported ) {
@@ -251,6 +283,8 @@ static int pci_epf_test_copy(struct pci_epf_test *epf_test)
251
283
} else {
252
284
memcpy (dst_addr , src_addr , reg -> size );
253
285
}
286
+ ktime_get_ts64 (& end );
287
+ pci_epf_test_print_rate ("COPY" , reg -> size , & start , & end , use_dma );
254
288
255
289
err_map_addr :
256
290
pci_epc_unmap_addr (epc , epf -> func_no , dst_phys_addr );
@@ -277,6 +311,7 @@ static int pci_epf_test_read(struct pci_epf_test *epf_test)
277
311
bool use_dma ;
278
312
phys_addr_t phys_addr ;
279
313
phys_addr_t dst_phys_addr ;
314
+ struct timespec64 start , end ;
280
315
struct pci_epf * epf = epf_test -> epf ;
281
316
struct device * dev = & epf -> dev ;
282
317
struct pci_epc * epc = epf -> epc ;
@@ -322,17 +357,23 @@ static int pci_epf_test_read(struct pci_epf_test *epf_test)
322
357
goto err_dma_map ;
323
358
}
324
359
360
+ ktime_get_ts64 (& start );
325
361
ret = pci_epf_test_data_transfer (epf_test , dst_phys_addr ,
326
362
phys_addr , reg -> size );
327
363
if (ret )
328
364
dev_err (dev , "Data transfer failed\n" );
365
+ ktime_get_ts64 (& end );
329
366
330
367
dma_unmap_single (dma_dev , dst_phys_addr , reg -> size ,
331
368
DMA_FROM_DEVICE );
332
369
} else {
370
+ ktime_get_ts64 (& start );
333
371
memcpy_fromio (buf , src_addr , reg -> size );
372
+ ktime_get_ts64 (& end );
334
373
}
335
374
375
+ pci_epf_test_print_rate ("READ" , reg -> size , & start , & end , use_dma );
376
+
336
377
crc32 = crc32_le (~0 , buf , reg -> size );
337
378
if (crc32 != reg -> checksum )
338
379
ret = - EIO ;
@@ -358,6 +399,7 @@ static int pci_epf_test_write(struct pci_epf_test *epf_test)
358
399
bool use_dma ;
359
400
phys_addr_t phys_addr ;
360
401
phys_addr_t src_phys_addr ;
402
+ struct timespec64 start , end ;
361
403
struct pci_epf * epf = epf_test -> epf ;
362
404
struct device * dev = & epf -> dev ;
363
405
struct pci_epc * epc = epf -> epc ;
@@ -406,17 +448,23 @@ static int pci_epf_test_write(struct pci_epf_test *epf_test)
406
448
goto err_dma_map ;
407
449
}
408
450
451
+ ktime_get_ts64 (& start );
409
452
ret = pci_epf_test_data_transfer (epf_test , phys_addr ,
410
453
src_phys_addr , reg -> size );
411
454
if (ret )
412
455
dev_err (dev , "Data transfer failed\n" );
456
+ ktime_get_ts64 (& end );
413
457
414
458
dma_unmap_single (dma_dev , src_phys_addr , reg -> size ,
415
459
DMA_TO_DEVICE );
416
460
} else {
461
+ ktime_get_ts64 (& start );
417
462
memcpy_toio (dst_addr , buf , reg -> size );
463
+ ktime_get_ts64 (& end );
418
464
}
419
465
466
+ pci_epf_test_print_rate ("WRITE" , reg -> size , & start , & end , use_dma );
467
+
420
468
/*
421
469
* wait 1ms inorder for the write to complete. Without this delay L3
422
470
* error in observed in the host system.
0 commit comments