Thread (105 messages) 105 messages, 14 authors, 2017-11-22

Re: [PATCH 13/31] nds32: DMA mapping API

From: Greentime Hu <hidden>
Date: 2017-11-09 07:12:48
Also in: linux-arch, lkml

2017-11-08 17:09 GMT+08:00 Arnd Bergmann [off-list ref]:
On Wed, Nov 8, 2017 at 6:55 AM, Greentime Hu [off-list ref] wrote:
quoted
+static void consistent_sync(void *vaddr, size_t size, int direction)
+{
+       unsigned long start = (unsigned long)vaddr;
+       unsigned long end = start + size;
+
+       switch (direction) {
+       case DMA_FROM_DEVICE:   /* invalidate only */
+               cpu_dma_inval_range(start, end);
+               break;
+       case DMA_TO_DEVICE:     /* writeback only */
+               cpu_dma_wb_range(start, end);
+               break;
+       case DMA_BIDIRECTIONAL: /* writeback and invalidate */
+               cpu_dma_wbinval_range(start, end);
+               break;
+       default:
+               BUG();
+       }
+}
quoted
+
+static void
+nds32_dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle,
+                             size_t size, enum dma_data_direction dir)
+{
+       consistent_sync((void *)dma_to_virt(dev, handle), size, dir);
+}
+
+static void
+nds32_dma_sync_single_for_device(struct device *dev, dma_addr_t handle,
+                                size_t size, enum dma_data_direction dir)
+{
+       consistent_sync((void *)dma_to_virt(dev, handle), size, dir);
+}
You do the same cache operations for _to_cpu and _to_device, which
usually works,
but is more expensive than you need. It's better to take the ownership into
account and only do what you need.
Thanks.

Like this?

static void
nds32_dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle,
                              size_t size, enum dma_data_direction dir)
{
        consistent_sync((void *)dma_to_virt(dev, handle), size,
DMA_FROM_DEVICE);
}

static void
nds32_dma_sync_single_for_device(struct device *dev, dma_addr_t handle,
                                 size_t size, enum dma_data_direction dir)
{
        consistent_sync((void *)dma_to_virt(dev, handle), size,
DMA_TO_DEVICE);
}
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help