Commit cc212550 authored by Eli Billauer's avatar Eli Billauer Committed by Greg Kroah-Hartman

staging: xillybus: Open Firmware driver supporting coherent DMA

If the "dma-coherent" property is present in the device tree, the driver will
not perform cache invalidations. This feature significantly improves data
throughput and reduces CPU load.
Signed-off-by: default avatarEli Billauer <eli.billauer@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 24b33c90
...@@ -54,6 +54,13 @@ static void xilly_dma_sync_single_for_device_of(struct xilly_endpoint *ep, ...@@ -54,6 +54,13 @@ static void xilly_dma_sync_single_for_device_of(struct xilly_endpoint *ep,
dma_sync_single_for_device(ep->dev, dma_handle, size, direction); dma_sync_single_for_device(ep->dev, dma_handle, size, direction);
} }
static void xilly_dma_sync_single_nop(struct xilly_endpoint *ep,
dma_addr_t dma_handle,
size_t size,
int direction)
{
}
static dma_addr_t xilly_map_single_of(struct xilly_cleanup *mem, static dma_addr_t xilly_map_single_of(struct xilly_cleanup *mem,
struct xilly_endpoint *ep, struct xilly_endpoint *ep,
void *ptr, void *ptr,
...@@ -102,14 +109,26 @@ static struct xilly_endpoint_hardware of_hw = { ...@@ -102,14 +109,26 @@ static struct xilly_endpoint_hardware of_hw = {
.unmap_single = xilly_unmap_single_of .unmap_single = xilly_unmap_single_of
}; };
static struct xilly_endpoint_hardware of_hw_coherent = {
.owner = THIS_MODULE,
.hw_sync_sgl_for_cpu = xilly_dma_sync_single_nop,
.hw_sync_sgl_for_device = xilly_dma_sync_single_nop,
.map_single = xilly_map_single_of,
.unmap_single = xilly_unmap_single_of
};
static int xilly_drv_probe(struct platform_device *op) static int xilly_drv_probe(struct platform_device *op)
{ {
struct device *dev = &op->dev; struct device *dev = &op->dev;
struct xilly_endpoint *endpoint; struct xilly_endpoint *endpoint;
int rc = 0; int rc = 0;
int irq; int irq;
struct xilly_endpoint_hardware *ephw = &of_hw;
if (of_property_read_bool(dev->of_node, "dma-coherent"))
ephw = &of_hw_coherent;
endpoint = xillybus_init_endpoint(NULL, dev, &of_hw); endpoint = xillybus_init_endpoint(NULL, dev, ephw);
if (!endpoint) if (!endpoint)
return -ENOMEM; return -ENOMEM;
......
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