Commit 0a121f9b authored by Kishon Vijay Abraham I's avatar Kishon Vijay Abraham I Committed by Lorenzo Pieralisi

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: default avatarKishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: default avatarSekhar Nori <nsekhar@ti.com>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tested-by: default avatarAlan Mikhak <alan.mikhak@sifive.com>
parent 5893c2e5
...@@ -341,14 +341,22 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size) ...@@ -341,14 +341,22 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
goto err; goto err;
} }
orig_src_addr = dma_alloc_coherent(dev, size + alignment, orig_src_addr = kzalloc(size + alignment, GFP_KERNEL);
&orig_src_phys_addr, GFP_KERNEL);
if (!orig_src_addr) { if (!orig_src_addr) {
dev_err(dev, "Failed to allocate source buffer\n"); dev_err(dev, "Failed to allocate source buffer\n");
ret = false; ret = false;
goto err; goto err;
} }
get_random_bytes(orig_src_addr, size + alignment);
orig_src_phys_addr = dma_map_single(dev, orig_src_addr,
size + alignment, DMA_TO_DEVICE);
if (dma_mapping_error(dev, orig_src_phys_addr)) {
dev_err(dev, "failed to map source buffer address\n");
ret = false;
goto err_src_phys_addr;
}
if (alignment && !IS_ALIGNED(orig_src_phys_addr, alignment)) { if (alignment && !IS_ALIGNED(orig_src_phys_addr, alignment)) {
src_phys_addr = PTR_ALIGN(orig_src_phys_addr, alignment); src_phys_addr = PTR_ALIGN(orig_src_phys_addr, alignment);
offset = src_phys_addr - orig_src_phys_addr; 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) ...@@ -364,15 +372,21 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR, pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
upper_32_bits(src_phys_addr)); upper_32_bits(src_phys_addr));
get_random_bytes(src_addr, size);
src_crc32 = crc32_le(~0, src_addr, size); src_crc32 = crc32_le(~0, src_addr, size);
orig_dst_addr = dma_alloc_coherent(dev, size + alignment, orig_dst_addr = kzalloc(size + alignment, GFP_KERNEL);
&orig_dst_phys_addr, GFP_KERNEL);
if (!orig_dst_addr) { if (!orig_dst_addr) {
dev_err(dev, "Failed to allocate destination address\n"); dev_err(dev, "Failed to allocate destination address\n");
ret = false; ret = false;
goto err_orig_src_addr; goto err_dst_addr;
}
orig_dst_phys_addr = dma_map_single(dev, orig_dst_addr,
size + alignment, DMA_FROM_DEVICE);
if (dma_mapping_error(dev, orig_dst_phys_addr)) {
dev_err(dev, "failed to map destination buffer address\n");
ret = false;
goto err_dst_phys_addr;
} }
if (alignment && !IS_ALIGNED(orig_dst_phys_addr, alignment)) { 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) ...@@ -399,16 +413,22 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
wait_for_completion(&test->irq_raised); wait_for_completion(&test->irq_raised);
dma_unmap_single(dev, orig_dst_phys_addr, size + alignment,
DMA_FROM_DEVICE);
dst_crc32 = crc32_le(~0, dst_addr, size); dst_crc32 = crc32_le(~0, dst_addr, size);
if (dst_crc32 == src_crc32) if (dst_crc32 == src_crc32)
ret = true; ret = true;
dma_free_coherent(dev, size + alignment, orig_dst_addr, err_dst_phys_addr:
orig_dst_phys_addr); kfree(orig_dst_addr);
err_orig_src_addr: err_dst_addr:
dma_free_coherent(dev, size + alignment, orig_src_addr, dma_unmap_single(dev, orig_src_phys_addr, size + alignment,
orig_src_phys_addr); DMA_TO_DEVICE);
err_src_phys_addr:
kfree(orig_src_addr);
err: err:
return ret; return ret;
...@@ -436,14 +456,23 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size) ...@@ -436,14 +456,23 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
goto err; goto err;
} }
orig_addr = dma_alloc_coherent(dev, size + alignment, &orig_phys_addr, orig_addr = kzalloc(size + alignment, GFP_KERNEL);
GFP_KERNEL);
if (!orig_addr) { if (!orig_addr) {
dev_err(dev, "Failed to allocate address\n"); dev_err(dev, "Failed to allocate address\n");
ret = false; ret = false;
goto err; goto err;
} }
get_random_bytes(orig_addr, size + alignment);
orig_phys_addr = dma_map_single(dev, orig_addr, size + alignment,
DMA_TO_DEVICE);
if (dma_mapping_error(dev, orig_phys_addr)) {
dev_err(dev, "failed to map source buffer address\n");
ret = false;
goto err_phys_addr;
}
if (alignment && !IS_ALIGNED(orig_phys_addr, alignment)) { if (alignment && !IS_ALIGNED(orig_phys_addr, alignment)) {
phys_addr = PTR_ALIGN(orig_phys_addr, alignment); phys_addr = PTR_ALIGN(orig_phys_addr, alignment);
offset = phys_addr - orig_phys_addr; offset = phys_addr - orig_phys_addr;
...@@ -453,8 +482,6 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size) ...@@ -453,8 +482,6 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
addr = orig_addr; addr = orig_addr;
} }
get_random_bytes(addr, size);
crc32 = crc32_le(~0, addr, size); crc32 = crc32_le(~0, addr, size);
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM, pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM,
crc32); crc32);
...@@ -477,7 +504,11 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size) ...@@ -477,7 +504,11 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
if (reg & STATUS_READ_SUCCESS) if (reg & STATUS_READ_SUCCESS)
ret = true; ret = true;
dma_free_coherent(dev, size + alignment, orig_addr, orig_phys_addr); dma_unmap_single(dev, orig_phys_addr, size + alignment,
DMA_TO_DEVICE);
err_phys_addr:
kfree(orig_addr);
err: err:
return ret; return ret;
...@@ -504,14 +535,21 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size) ...@@ -504,14 +535,21 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size)
goto err; goto err;
} }
orig_addr = dma_alloc_coherent(dev, size + alignment, &orig_phys_addr, orig_addr = kzalloc(size + alignment, GFP_KERNEL);
GFP_KERNEL);
if (!orig_addr) { if (!orig_addr) {
dev_err(dev, "Failed to allocate destination address\n"); dev_err(dev, "Failed to allocate destination address\n");
ret = false; ret = false;
goto err; goto err;
} }
orig_phys_addr = dma_map_single(dev, orig_addr, size + alignment,
DMA_FROM_DEVICE);
if (dma_mapping_error(dev, orig_phys_addr)) {
dev_err(dev, "failed to map source buffer address\n");
ret = false;
goto err_phys_addr;
}
if (alignment && !IS_ALIGNED(orig_phys_addr, alignment)) { if (alignment && !IS_ALIGNED(orig_phys_addr, alignment)) {
phys_addr = PTR_ALIGN(orig_phys_addr, alignment); phys_addr = PTR_ALIGN(orig_phys_addr, alignment);
offset = phys_addr - orig_phys_addr; offset = phys_addr - orig_phys_addr;
...@@ -535,11 +573,15 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size) ...@@ -535,11 +573,15 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size)
wait_for_completion(&test->irq_raised); wait_for_completion(&test->irq_raised);
dma_unmap_single(dev, orig_phys_addr, size + alignment,
DMA_FROM_DEVICE);
crc32 = crc32_le(~0, addr, size); crc32 = crc32_le(~0, addr, size);
if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM)) if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM))
ret = true; ret = true;
dma_free_coherent(dev, size + alignment, orig_addr, orig_phys_addr); err_phys_addr:
kfree(orig_addr);
err: err:
return ret; return ret;
} }
...@@ -667,6 +709,12 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev, ...@@ -667,6 +709,12 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
init_completion(&test->irq_raised); init_completion(&test->irq_raised);
mutex_init(&test->mutex); mutex_init(&test->mutex);
if ((dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(48)) != 0) &&
dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)) != 0) {
dev_err(dev, "Cannot set DMA mask\n");
return -EINVAL;
}
err = pci_enable_device(pdev); err = pci_enable_device(pdev);
if (err) { if (err) {
dev_err(dev, "Cannot enable PCI device\n"); dev_err(dev, "Cannot enable PCI device\n");
...@@ -783,6 +831,12 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev) ...@@ -783,6 +831,12 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev)
pci_disable_device(pdev); pci_disable_device(pdev);
} }
static const struct pci_endpoint_test_data default_data = {
.test_reg_bar = BAR_0,
.alignment = SZ_4K,
.irq_type = IRQ_TYPE_MSI,
};
static const struct pci_endpoint_test_data am654_data = { static const struct pci_endpoint_test_data am654_data = {
.test_reg_bar = BAR_2, .test_reg_bar = BAR_2,
.alignment = SZ_64K, .alignment = SZ_64K,
...@@ -790,8 +844,12 @@ static const struct pci_endpoint_test_data am654_data = { ...@@ -790,8 +844,12 @@ static const struct pci_endpoint_test_data am654_data = {
}; };
static const struct pci_device_id pci_endpoint_test_tbl[] = { static const struct pci_device_id pci_endpoint_test_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA74x) }, { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA74x),
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA72x) }, .driver_data = (kernel_ulong_t)&default_data,
},
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA72x),
.driver_data = (kernel_ulong_t)&default_data,
},
{ PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x81c0) }, { PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x81c0) },
{ PCI_DEVICE_DATA(SYNOPSYS, EDDA, NULL) }, { PCI_DEVICE_DATA(SYNOPSYS, EDDA, NULL) },
{ PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_AM654), { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_AM654),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment