@@ -66,17 +66,17 @@ struct pci_epf_test {
66
66
};
67
67
68
68
struct pci_epf_test_reg {
69
- u32 magic ;
70
- u32 command ;
71
- u32 status ;
72
- u64 src_addr ;
73
- u64 dst_addr ;
74
- u32 size ;
75
- u32 checksum ;
76
- u32 irq_type ;
77
- u32 irq_number ;
78
- u32 flags ;
79
- u32 caps ;
69
+ __le32 magic ;
70
+ __le32 command ;
71
+ __le32 status ;
72
+ __le64 src_addr ;
73
+ __le64 dst_addr ;
74
+ __le32 size ;
75
+ __le32 checksum ;
76
+ __le32 irq_type ;
77
+ __le32 irq_number ;
78
+ __le32 flags ;
79
+ __le32 caps ;
80
80
} __packed ;
81
81
82
82
static struct pci_epf_header test_header = {
@@ -324,13 +324,17 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
324
324
struct pci_epc * epc = epf -> epc ;
325
325
struct device * dev = & epf -> dev ;
326
326
struct pci_epc_map src_map , dst_map ;
327
- u64 src_addr = reg -> src_addr ;
328
- u64 dst_addr = reg -> dst_addr ;
329
- size_t copy_size = reg -> size ;
327
+ u64 src_addr = le64_to_cpu ( reg -> src_addr ) ;
328
+ u64 dst_addr = le64_to_cpu ( reg -> dst_addr ) ;
329
+ size_t orig_size , copy_size ;
330
330
ssize_t map_size = 0 ;
331
+ u32 flags = le32_to_cpu (reg -> flags );
332
+ u32 status = 0 ;
331
333
void * copy_buf = NULL , * buf ;
332
334
333
- if (reg -> flags & FLAG_USE_DMA ) {
335
+ orig_size = copy_size = le32_to_cpu (reg -> size );
336
+
337
+ if (flags & FLAG_USE_DMA ) {
334
338
if (!dma_has_cap (DMA_MEMCPY , epf_test -> dma_chan_tx -> device -> cap_mask )) {
335
339
dev_err (dev , "DMA controller doesn't support MEMCPY\n" );
336
340
ret = - EINVAL ;
@@ -350,15 +354,15 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
350
354
src_addr , copy_size , & src_map );
351
355
if (ret ) {
352
356
dev_err (dev , "Failed to map source address\n" );
353
- reg -> status = STATUS_SRC_ADDR_INVALID ;
357
+ status = STATUS_SRC_ADDR_INVALID ;
354
358
goto free_buf ;
355
359
}
356
360
357
361
ret = pci_epc_mem_map (epf -> epc , epf -> func_no , epf -> vfunc_no ,
358
362
dst_addr , copy_size , & dst_map );
359
363
if (ret ) {
360
364
dev_err (dev , "Failed to map destination address\n" );
361
- reg -> status = STATUS_DST_ADDR_INVALID ;
365
+ status = STATUS_DST_ADDR_INVALID ;
362
366
pci_epc_mem_unmap (epc , epf -> func_no , epf -> vfunc_no ,
363
367
& src_map );
364
368
goto free_buf ;
@@ -367,7 +371,7 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
367
371
map_size = min_t (size_t , dst_map .pci_size , src_map .pci_size );
368
372
369
373
ktime_get_ts64 (& start );
370
- if (reg -> flags & FLAG_USE_DMA ) {
374
+ if (flags & FLAG_USE_DMA ) {
371
375
ret = pci_epf_test_data_transfer (epf_test ,
372
376
dst_map .phys_addr , src_map .phys_addr ,
373
377
map_size , 0 , DMA_MEM_TO_MEM );
@@ -391,8 +395,8 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
391
395
map_size = 0 ;
392
396
}
393
397
394
- pci_epf_test_print_rate (epf_test , "COPY" , reg -> size , & start ,
395
- & end , reg -> flags & FLAG_USE_DMA );
398
+ pci_epf_test_print_rate (epf_test , "COPY" , orig_size , & start , & end ,
399
+ flags & FLAG_USE_DMA );
396
400
397
401
unmap :
398
402
if (map_size ) {
@@ -405,9 +409,10 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
405
409
406
410
set_status :
407
411
if (!ret )
408
- reg -> status |= STATUS_COPY_SUCCESS ;
412
+ status |= STATUS_COPY_SUCCESS ;
409
413
else
410
- reg -> status |= STATUS_COPY_FAIL ;
414
+ status |= STATUS_COPY_FAIL ;
415
+ reg -> status = cpu_to_le32 (status );
411
416
}
412
417
413
418
static void pci_epf_test_read (struct pci_epf_test * epf_test ,
@@ -423,9 +428,14 @@ static void pci_epf_test_read(struct pci_epf_test *epf_test,
423
428
struct pci_epc * epc = epf -> epc ;
424
429
struct device * dev = & epf -> dev ;
425
430
struct device * dma_dev = epf -> epc -> dev .parent ;
426
- u64 src_addr = reg -> src_addr ;
427
- size_t src_size = reg -> size ;
431
+ u64 src_addr = le64_to_cpu ( reg -> src_addr ) ;
432
+ size_t orig_size , src_size ;
428
433
ssize_t map_size = 0 ;
434
+ u32 flags = le32_to_cpu (reg -> flags );
435
+ u32 checksum = le32_to_cpu (reg -> checksum );
436
+ u32 status = 0 ;
437
+
438
+ orig_size = src_size = le32_to_cpu (reg -> size );
429
439
430
440
src_buf = kzalloc (src_size , GFP_KERNEL );
431
441
if (!src_buf ) {
@@ -439,12 +449,12 @@ static void pci_epf_test_read(struct pci_epf_test *epf_test,
439
449
src_addr , src_size , & map );
440
450
if (ret ) {
441
451
dev_err (dev , "Failed to map address\n" );
442
- reg -> status = STATUS_SRC_ADDR_INVALID ;
452
+ status = STATUS_SRC_ADDR_INVALID ;
443
453
goto free_buf ;
444
454
}
445
455
446
456
map_size = map .pci_size ;
447
- if (reg -> flags & FLAG_USE_DMA ) {
457
+ if (flags & FLAG_USE_DMA ) {
448
458
dst_phys_addr = dma_map_single (dma_dev , buf , map_size ,
449
459
DMA_FROM_DEVICE );
450
460
if (dma_mapping_error (dma_dev , dst_phys_addr )) {
@@ -481,11 +491,11 @@ static void pci_epf_test_read(struct pci_epf_test *epf_test,
481
491
map_size = 0 ;
482
492
}
483
493
484
- pci_epf_test_print_rate (epf_test , "READ" , reg -> size , & start ,
485
- & end , reg -> flags & FLAG_USE_DMA );
494
+ pci_epf_test_print_rate (epf_test , "READ" , orig_size , & start , & end ,
495
+ flags & FLAG_USE_DMA );
486
496
487
- crc32 = crc32_le (~0 , src_buf , reg -> size );
488
- if (crc32 != reg -> checksum )
497
+ crc32 = crc32_le (~0 , src_buf , orig_size );
498
+ if (crc32 != checksum )
489
499
ret = - EIO ;
490
500
491
501
unmap :
@@ -497,9 +507,10 @@ static void pci_epf_test_read(struct pci_epf_test *epf_test,
497
507
498
508
set_status :
499
509
if (!ret )
500
- reg -> status |= STATUS_READ_SUCCESS ;
510
+ status |= STATUS_READ_SUCCESS ;
501
511
else
502
- reg -> status |= STATUS_READ_FAIL ;
512
+ status |= STATUS_READ_FAIL ;
513
+ reg -> status = cpu_to_le32 (status );
503
514
}
504
515
505
516
static void pci_epf_test_write (struct pci_epf_test * epf_test ,
@@ -514,30 +525,34 @@ static void pci_epf_test_write(struct pci_epf_test *epf_test,
514
525
struct pci_epc * epc = epf -> epc ;
515
526
struct device * dev = & epf -> dev ;
516
527
struct device * dma_dev = epf -> epc -> dev .parent ;
517
- u64 dst_addr = reg -> dst_addr ;
518
- size_t dst_size = reg -> size ;
528
+ u64 dst_addr = le64_to_cpu ( reg -> dst_addr ) ;
529
+ size_t orig_size , dst_size ;
519
530
ssize_t map_size = 0 ;
531
+ u32 flags = le32_to_cpu (reg -> flags );
532
+ u32 status = 0 ;
533
+
534
+ orig_size = dst_size = le32_to_cpu (reg -> size );
520
535
521
536
dst_buf = kzalloc (dst_size , GFP_KERNEL );
522
537
if (!dst_buf ) {
523
538
ret = - ENOMEM ;
524
539
goto set_status ;
525
540
}
526
541
get_random_bytes (dst_buf , dst_size );
527
- reg -> checksum = crc32_le (~0 , dst_buf , dst_size );
542
+ reg -> checksum = cpu_to_le32 ( crc32_le (~0 , dst_buf , dst_size ) );
528
543
buf = dst_buf ;
529
544
530
545
while (dst_size ) {
531
546
ret = pci_epc_mem_map (epc , epf -> func_no , epf -> vfunc_no ,
532
547
dst_addr , dst_size , & map );
533
548
if (ret ) {
534
549
dev_err (dev , "Failed to map address\n" );
535
- reg -> status = STATUS_DST_ADDR_INVALID ;
550
+ status = STATUS_DST_ADDR_INVALID ;
536
551
goto free_buf ;
537
552
}
538
553
539
554
map_size = map .pci_size ;
540
- if (reg -> flags & FLAG_USE_DMA ) {
555
+ if (flags & FLAG_USE_DMA ) {
541
556
src_phys_addr = dma_map_single (dma_dev , buf , map_size ,
542
557
DMA_TO_DEVICE );
543
558
if (dma_mapping_error (dma_dev , src_phys_addr )) {
@@ -576,8 +591,8 @@ static void pci_epf_test_write(struct pci_epf_test *epf_test,
576
591
map_size = 0 ;
577
592
}
578
593
579
- pci_epf_test_print_rate (epf_test , "WRITE" , reg -> size , & start ,
580
- & end , reg -> flags & FLAG_USE_DMA );
594
+ pci_epf_test_print_rate (epf_test , "WRITE" , orig_size , & start , & end ,
595
+ flags & FLAG_USE_DMA );
581
596
582
597
/*
583
598
* wait 1ms inorder for the write to complete. Without this delay L3
@@ -594,9 +609,10 @@ static void pci_epf_test_write(struct pci_epf_test *epf_test,
594
609
595
610
set_status :
596
611
if (!ret )
597
- reg -> status |= STATUS_WRITE_SUCCESS ;
612
+ status |= STATUS_WRITE_SUCCESS ;
598
613
else
599
- reg -> status |= STATUS_WRITE_FAIL ;
614
+ status |= STATUS_WRITE_FAIL ;
615
+ reg -> status = cpu_to_le32 (status );
600
616
}
601
617
602
618
static void pci_epf_test_raise_irq (struct pci_epf_test * epf_test ,
@@ -605,39 +621,42 @@ static void pci_epf_test_raise_irq(struct pci_epf_test *epf_test,
605
621
struct pci_epf * epf = epf_test -> epf ;
606
622
struct device * dev = & epf -> dev ;
607
623
struct pci_epc * epc = epf -> epc ;
608
- u32 status = reg -> status | STATUS_IRQ_RAISED ;
624
+ u32 status = le32_to_cpu (reg -> status );
625
+ u32 irq_number = le32_to_cpu (reg -> irq_number );
626
+ u32 irq_type = le32_to_cpu (reg -> irq_type );
609
627
int count ;
610
628
611
629
/*
612
630
* Set the status before raising the IRQ to ensure that the host sees
613
631
* the updated value when it gets the IRQ.
614
632
*/
615
- WRITE_ONCE (reg -> status , status );
633
+ status |= STATUS_IRQ_RAISED ;
634
+ WRITE_ONCE (reg -> status , cpu_to_le32 (status ));
616
635
617
- switch (reg -> irq_type ) {
636
+ switch (irq_type ) {
618
637
case IRQ_TYPE_INTX :
619
638
pci_epc_raise_irq (epc , epf -> func_no , epf -> vfunc_no ,
620
639
PCI_IRQ_INTX , 0 );
621
640
break ;
622
641
case IRQ_TYPE_MSI :
623
642
count = pci_epc_get_msi (epc , epf -> func_no , epf -> vfunc_no );
624
- if (reg -> irq_number > count || count <= 0 ) {
643
+ if (irq_number > count || count <= 0 ) {
625
644
dev_err (dev , "Invalid MSI IRQ number %d / %d\n" ,
626
- reg -> irq_number , count );
645
+ irq_number , count );
627
646
return ;
628
647
}
629
648
pci_epc_raise_irq (epc , epf -> func_no , epf -> vfunc_no ,
630
- PCI_IRQ_MSI , reg -> irq_number );
649
+ PCI_IRQ_MSI , irq_number );
631
650
break ;
632
651
case IRQ_TYPE_MSIX :
633
652
count = pci_epc_get_msix (epc , epf -> func_no , epf -> vfunc_no );
634
- if (reg -> irq_number > count || count <= 0 ) {
653
+ if (irq_number > count || count <= 0 ) {
635
654
dev_err (dev , "Invalid MSIX IRQ number %d / %d\n" ,
636
- reg -> irq_number , count );
655
+ irq_number , count );
637
656
return ;
638
657
}
639
658
pci_epc_raise_irq (epc , epf -> func_no , epf -> vfunc_no ,
640
- PCI_IRQ_MSIX , reg -> irq_number );
659
+ PCI_IRQ_MSIX , irq_number );
641
660
break ;
642
661
default :
643
662
dev_err (dev , "Failed to raise IRQ, unknown type\n" );
@@ -654,21 +673,22 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
654
673
struct device * dev = & epf -> dev ;
655
674
enum pci_barno test_reg_bar = epf_test -> test_reg_bar ;
656
675
struct pci_epf_test_reg * reg = epf_test -> reg [test_reg_bar ];
676
+ u32 irq_type = le32_to_cpu (reg -> irq_type );
657
677
658
- command = READ_ONCE (reg -> command );
678
+ command = le32_to_cpu ( READ_ONCE (reg -> command ) );
659
679
if (!command )
660
680
goto reset_handler ;
661
681
662
682
WRITE_ONCE (reg -> command , 0 );
663
683
WRITE_ONCE (reg -> status , 0 );
664
684
665
- if ((READ_ONCE (reg -> flags ) & FLAG_USE_DMA ) &&
685
+ if ((le32_to_cpu ( READ_ONCE (reg -> flags ) ) & FLAG_USE_DMA ) &&
666
686
!epf_test -> dma_supported ) {
667
687
dev_err (dev , "Cannot transfer data using DMA\n" );
668
688
goto reset_handler ;
669
689
}
670
690
671
- if (reg -> irq_type > IRQ_TYPE_MSIX ) {
691
+ if (irq_type > IRQ_TYPE_MSIX ) {
672
692
dev_err (dev , "Failed to detect IRQ type\n" );
673
693
goto reset_handler ;
674
694
}
0 commit comments