Skip to content

Commit 0a121f9

Browse files
kishonLorenzo Pieralisi
authored andcommitted
misc: pci_endpoint_test: Use streaming DMA APIs for buffer allocation
Use streaming DMA APIs (dma_map_single/dma_unmap_single) for buffers transmitted/received by the endpoint device instead of allocating a coherent memory. Also add default_data to set the alignment to 4KB since dma_map_single might not return a 4KB aligned address. Signed-off-by: Kishon Vijay Abraham I <[email protected]> Signed-off-by: Sekhar Nori <[email protected]> Signed-off-by: Lorenzo Pieralisi <[email protected]> Tested-by: Alan Mikhak <[email protected]>
1 parent 5893c2e commit 0a121f9

File tree

1 file changed

+79
-21
lines changed

1 file changed

+79
-21
lines changed

drivers/misc/pci_endpoint_test.c

Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -341,14 +341,22 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
341341
goto err;
342342
}
343343

344-
orig_src_addr = dma_alloc_coherent(dev, size + alignment,
345-
&orig_src_phys_addr, GFP_KERNEL);
344+
orig_src_addr = kzalloc(size + alignment, GFP_KERNEL);
346345
if (!orig_src_addr) {
347346
dev_err(dev, "Failed to allocate source buffer\n");
348347
ret = false;
349348
goto err;
350349
}
351350

351+
get_random_bytes(orig_src_addr, size + alignment);
352+
orig_src_phys_addr = dma_map_single(dev, orig_src_addr,
353+
size + alignment, DMA_TO_DEVICE);
354+
if (dma_mapping_error(dev, orig_src_phys_addr)) {
355+
dev_err(dev, "failed to map source buffer address\n");
356+
ret = false;
357+
goto err_src_phys_addr;
358+
}
359+
352360
if (alignment && !IS_ALIGNED(orig_src_phys_addr, alignment)) {
353361
src_phys_addr = PTR_ALIGN(orig_src_phys_addr, alignment);
354362
offset = src_phys_addr - orig_src_phys_addr;
@@ -364,15 +372,21 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
364372
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
365373
upper_32_bits(src_phys_addr));
366374

367-
get_random_bytes(src_addr, size);
368375
src_crc32 = crc32_le(~0, src_addr, size);
369376

370-
orig_dst_addr = dma_alloc_coherent(dev, size + alignment,
371-
&orig_dst_phys_addr, GFP_KERNEL);
377+
orig_dst_addr = kzalloc(size + alignment, GFP_KERNEL);
372378
if (!orig_dst_addr) {
373379
dev_err(dev, "Failed to allocate destination address\n");
374380
ret = false;
375-
goto err_orig_src_addr;
381+
goto err_dst_addr;
382+
}
383+
384+
orig_dst_phys_addr = dma_map_single(dev, orig_dst_addr,
385+
size + alignment, DMA_FROM_DEVICE);
386+
if (dma_mapping_error(dev, orig_dst_phys_addr)) {
387+
dev_err(dev, "failed to map destination buffer address\n");
388+
ret = false;
389+
goto err_dst_phys_addr;
376390
}
377391

378392
if (alignment && !IS_ALIGNED(orig_dst_phys_addr, alignment)) {
@@ -399,16 +413,22 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
399413

400414
wait_for_completion(&test->irq_raised);
401415

416+
dma_unmap_single(dev, orig_dst_phys_addr, size + alignment,
417+
DMA_FROM_DEVICE);
418+
402419
dst_crc32 = crc32_le(~0, dst_addr, size);
403420
if (dst_crc32 == src_crc32)
404421
ret = true;
405422

406-
dma_free_coherent(dev, size + alignment, orig_dst_addr,
407-
orig_dst_phys_addr);
423+
err_dst_phys_addr:
424+
kfree(orig_dst_addr);
408425

409-
err_orig_src_addr:
410-
dma_free_coherent(dev, size + alignment, orig_src_addr,
411-
orig_src_phys_addr);
426+
err_dst_addr:
427+
dma_unmap_single(dev, orig_src_phys_addr, size + alignment,
428+
DMA_TO_DEVICE);
429+
430+
err_src_phys_addr:
431+
kfree(orig_src_addr);
412432

413433
err:
414434
return ret;
@@ -436,14 +456,23 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
436456
goto err;
437457
}
438458

439-
orig_addr = dma_alloc_coherent(dev, size + alignment, &orig_phys_addr,
440-
GFP_KERNEL);
459+
orig_addr = kzalloc(size + alignment, GFP_KERNEL);
441460
if (!orig_addr) {
442461
dev_err(dev, "Failed to allocate address\n");
443462
ret = false;
444463
goto err;
445464
}
446465

466+
get_random_bytes(orig_addr, size + alignment);
467+
468+
orig_phys_addr = dma_map_single(dev, orig_addr, size + alignment,
469+
DMA_TO_DEVICE);
470+
if (dma_mapping_error(dev, orig_phys_addr)) {
471+
dev_err(dev, "failed to map source buffer address\n");
472+
ret = false;
473+
goto err_phys_addr;
474+
}
475+
447476
if (alignment && !IS_ALIGNED(orig_phys_addr, alignment)) {
448477
phys_addr = PTR_ALIGN(orig_phys_addr, alignment);
449478
offset = phys_addr - orig_phys_addr;
@@ -453,8 +482,6 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
453482
addr = orig_addr;
454483
}
455484

456-
get_random_bytes(addr, size);
457-
458485
crc32 = crc32_le(~0, addr, size);
459486
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM,
460487
crc32);
@@ -477,7 +504,11 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
477504
if (reg & STATUS_READ_SUCCESS)
478505
ret = true;
479506

480-
dma_free_coherent(dev, size + alignment, orig_addr, orig_phys_addr);
507+
dma_unmap_single(dev, orig_phys_addr, size + alignment,
508+
DMA_TO_DEVICE);
509+
510+
err_phys_addr:
511+
kfree(orig_addr);
481512

482513
err:
483514
return ret;
@@ -504,14 +535,21 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size)
504535
goto err;
505536
}
506537

507-
orig_addr = dma_alloc_coherent(dev, size + alignment, &orig_phys_addr,
508-
GFP_KERNEL);
538+
orig_addr = kzalloc(size + alignment, GFP_KERNEL);
509539
if (!orig_addr) {
510540
dev_err(dev, "Failed to allocate destination address\n");
511541
ret = false;
512542
goto err;
513543
}
514544

545+
orig_phys_addr = dma_map_single(dev, orig_addr, size + alignment,
546+
DMA_FROM_DEVICE);
547+
if (dma_mapping_error(dev, orig_phys_addr)) {
548+
dev_err(dev, "failed to map source buffer address\n");
549+
ret = false;
550+
goto err_phys_addr;
551+
}
552+
515553
if (alignment && !IS_ALIGNED(orig_phys_addr, alignment)) {
516554
phys_addr = PTR_ALIGN(orig_phys_addr, alignment);
517555
offset = phys_addr - orig_phys_addr;
@@ -535,11 +573,15 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size)
535573

536574
wait_for_completion(&test->irq_raised);
537575

576+
dma_unmap_single(dev, orig_phys_addr, size + alignment,
577+
DMA_FROM_DEVICE);
578+
538579
crc32 = crc32_le(~0, addr, size);
539580
if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM))
540581
ret = true;
541582

542-
dma_free_coherent(dev, size + alignment, orig_addr, orig_phys_addr);
583+
err_phys_addr:
584+
kfree(orig_addr);
543585
err:
544586
return ret;
545587
}
@@ -667,6 +709,12 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
667709
init_completion(&test->irq_raised);
668710
mutex_init(&test->mutex);
669711

712+
if ((dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(48)) != 0) &&
713+
dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)) != 0) {
714+
dev_err(dev, "Cannot set DMA mask\n");
715+
return -EINVAL;
716+
}
717+
670718
err = pci_enable_device(pdev);
671719
if (err) {
672720
dev_err(dev, "Cannot enable PCI device\n");
@@ -783,15 +831,25 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev)
783831
pci_disable_device(pdev);
784832
}
785833

834+
static const struct pci_endpoint_test_data default_data = {
835+
.test_reg_bar = BAR_0,
836+
.alignment = SZ_4K,
837+
.irq_type = IRQ_TYPE_MSI,
838+
};
839+
786840
static const struct pci_endpoint_test_data am654_data = {
787841
.test_reg_bar = BAR_2,
788842
.alignment = SZ_64K,
789843
.irq_type = IRQ_TYPE_MSI,
790844
};
791845

792846
static const struct pci_device_id pci_endpoint_test_tbl[] = {
793-
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA74x) },
794-
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA72x) },
847+
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA74x),
848+
.driver_data = (kernel_ulong_t)&default_data,
849+
},
850+
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA72x),
851+
.driver_data = (kernel_ulong_t)&default_data,
852+
},
795853
{ PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x81c0) },
796854
{ PCI_DEVICE_DATA(SYNOPSYS, EDDA, NULL) },
797855
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_AM654),

0 commit comments

Comments
 (0)