|
|
@@ -358,14 +358,22 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- orig_src_addr = dma_alloc_coherent(dev, size + alignment,
|
|
|
- &orig_src_phys_addr, GFP_KERNEL);
|
|
|
+ orig_src_addr = kzalloc(size + alignment, GFP_KERNEL);
|
|
|
if (!orig_src_addr) {
|
|
|
dev_err(dev, "Failed to allocate source buffer\n");
|
|
|
ret = false;
|
|
|
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)) {
|
|
|
src_phys_addr = PTR_ALIGN(orig_src_phys_addr, alignment);
|
|
|
offset = src_phys_addr - orig_src_phys_addr;
|
|
|
@@ -381,15 +389,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,
|
|
|
upper_32_bits(src_phys_addr));
|
|
|
|
|
|
- get_random_bytes(src_addr, size);
|
|
|
src_crc32 = crc32_le(~0, src_addr, size);
|
|
|
|
|
|
- orig_dst_addr = dma_alloc_coherent(dev, size + alignment,
|
|
|
- &orig_dst_phys_addr, GFP_KERNEL);
|
|
|
+ orig_dst_addr = kzalloc(size + alignment, GFP_KERNEL);
|
|
|
if (!orig_dst_addr) {
|
|
|
dev_err(dev, "Failed to allocate destination address\n");
|
|
|
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)) {
|
|
|
@@ -416,16 +430,22 @@ static bool pci_endpoint_test_copy(struct pci_endpoint_test *test, size_t size)
|
|
|
|
|
|
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);
|
|
|
if (dst_crc32 == src_crc32)
|
|
|
ret = true;
|
|
|
|
|
|
- dma_free_coherent(dev, size + alignment, orig_dst_addr,
|
|
|
- orig_dst_phys_addr);
|
|
|
+err_dst_phys_addr:
|
|
|
+ kfree(orig_dst_addr);
|
|
|
|
|
|
-err_orig_src_addr:
|
|
|
- dma_free_coherent(dev, size + alignment, orig_src_addr,
|
|
|
- orig_src_phys_addr);
|
|
|
+err_dst_addr:
|
|
|
+ dma_unmap_single(dev, orig_src_phys_addr, size + alignment,
|
|
|
+ DMA_TO_DEVICE);
|
|
|
+
|
|
|
+err_src_phys_addr:
|
|
|
+ kfree(orig_src_addr);
|
|
|
|
|
|
err:
|
|
|
return ret;
|
|
|
@@ -453,14 +473,23 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- orig_addr = dma_alloc_coherent(dev, size + alignment, &orig_phys_addr,
|
|
|
- GFP_KERNEL);
|
|
|
+ orig_addr = kzalloc(size + alignment, GFP_KERNEL);
|
|
|
if (!orig_addr) {
|
|
|
dev_err(dev, "Failed to allocate address\n");
|
|
|
ret = false;
|
|
|
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)) {
|
|
|
phys_addr = PTR_ALIGN(orig_phys_addr, alignment);
|
|
|
offset = phys_addr - orig_phys_addr;
|
|
|
@@ -470,8 +499,6 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
|
|
|
addr = orig_addr;
|
|
|
}
|
|
|
|
|
|
- get_random_bytes(addr, size);
|
|
|
-
|
|
|
crc32 = crc32_le(~0, addr, size);
|
|
|
pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM,
|
|
|
crc32);
|
|
|
@@ -494,7 +521,11 @@ static bool pci_endpoint_test_write(struct pci_endpoint_test *test, size_t size)
|
|
|
if (reg & STATUS_READ_SUCCESS)
|
|
|
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:
|
|
|
return ret;
|
|
|
@@ -521,14 +552,21 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size)
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- orig_addr = dma_alloc_coherent(dev, size + alignment, &orig_phys_addr,
|
|
|
- GFP_KERNEL);
|
|
|
+ orig_addr = kzalloc(size + alignment, GFP_KERNEL);
|
|
|
if (!orig_addr) {
|
|
|
dev_err(dev, "Failed to allocate destination address\n");
|
|
|
ret = false;
|
|
|
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)) {
|
|
|
phys_addr = PTR_ALIGN(orig_phys_addr, alignment);
|
|
|
offset = phys_addr - orig_phys_addr;
|
|
|
@@ -552,11 +590,15 @@ static bool pci_endpoint_test_read(struct pci_endpoint_test *test, size_t size)
|
|
|
|
|
|
wait_for_completion(&test->irq_raised);
|
|
|
|
|
|
+ dma_unmap_single(dev, orig_phys_addr, size + alignment,
|
|
|
+ DMA_FROM_DEVICE);
|
|
|
+
|
|
|
crc32 = crc32_le(~0, addr, size);
|
|
|
if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM))
|
|
|
ret = true;
|
|
|
|
|
|
- dma_free_coherent(dev, size + alignment, orig_addr, orig_phys_addr);
|
|
|
+err_phys_addr:
|
|
|
+ kfree(orig_addr);
|
|
|
err:
|
|
|
return ret;
|
|
|
}
|
|
|
@@ -707,6 +749,12 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
|
|
|
init_completion(&test->irq_raised);
|
|
|
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);
|
|
|
if (err) {
|
|
|
dev_err(dev, "Cannot enable PCI device\n");
|
|
|
@@ -829,6 +877,11 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev)
|
|
|
pci_disable_device(pdev);
|
|
|
}
|
|
|
|
|
|
+static const struct pci_endpoint_test_data default_data = {
|
|
|
+ .test_reg_bar = BAR_0,
|
|
|
+ .alignment = SZ_4K,
|
|
|
+};
|
|
|
+
|
|
|
static const struct pci_endpoint_test_data am654_data = {
|
|
|
.test_reg_bar = BAR_2,
|
|
|
.alignment = SZ_64K,
|
|
|
@@ -840,9 +893,13 @@ static const struct pci_endpoint_test_data k2g_data = {
|
|
|
};
|
|
|
|
|
|
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_DRA72x) },
|
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, 0xedda) },
|
|
|
+ { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA74x),
|
|
|
+ .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_TI, PCI_DEVICE_ID_TI_AM654),
|
|
|
.driver_data = (kernel_ulong_t)&am654_data
|
|
|
},
|