Split DMA memory and buffer setup in kernel driver
To allow the NPU kernel driver to allocate and use DMA memory internally
without creating a buffer instance, the DMA memory management has been
split out from the buffer code.
Change-Id: I46fdeee51b5ef786a54b8e7c866d137d91222724
Signed-off-by: Mikael Olsson <mikael.olsson@arm.com>
diff --git a/kernel/ethosu_buffer.c b/kernel/ethosu_buffer.c
index bf7d745..69b5007 100644
--- a/kernel/ethosu_buffer.c
+++ b/kernel/ethosu_buffer.c
@@ -24,6 +24,7 @@
#include "ethosu_buffer.h"
#include "ethosu_device.h"
+#include "ethosu_dma_mem.h"
#include "uapi/ethosu.h"
#include <linux/anon_inodes.h>
@@ -71,9 +72,7 @@
dev_dbg(dev, "Buffer destroy. buf=0x%pK", buf);
- memset(buf->cpu_addr, 0, buf->size);
- dma_free_coherent(dev, buf->size, buf->cpu_addr,
- buf->dma_addr);
+ ethosu_dma_mem_free(&buf->dma_mem);
memset(buf, 0, sizeof(*buf));
devm_kfree(dev, buf);
@@ -103,8 +102,8 @@
dev_dbg(dev, "Buffer mmap. file=0x%pK, buf=0x%pK\n",
file, buf);
- ret = dma_mmap_coherent(dev, vma, buf->cpu_addr,
- buf->dma_addr, buf->size);
+ ret = dma_mmap_coherent(dev, vma, buf->dma_mem->cpu_addr,
+ buf->dma_mem->dma_addr, buf->dma_mem->size);
return ret;
}
@@ -126,7 +125,7 @@
*/
switch (whence) {
case SEEK_END:
- return buf->size;
+ return buf->dma_mem->size;
case SEEK_SET:
return 0;
default:
@@ -148,13 +147,13 @@
return -ENOMEM;
buf->dev = dev;
- buf->size = size;
kref_init(&buf->kref);
- buf->cpu_addr = dma_alloc_coherent(dev, size, &buf->dma_addr,
- GFP_KERNEL);
- if (!buf->cpu_addr)
+ buf->dma_mem = ethosu_dma_mem_alloc(dev, size);
+ if (IS_ERR(buf->dma_mem)) {
+ ret = PTR_ERR(buf->dma_mem);
goto free_buf;
+ }
ret = anon_inode_getfd("ethosu-buffer", ðosu_buffer_fops, buf,
O_RDWR | O_CLOEXEC);
@@ -168,14 +167,13 @@
dev_dbg(dev,
"Buffer create. file=0x%pK, fd=%d, buf=0x%pK, size=%zu, cpu_addr=0x%pK, dma_addr=0x%llx, phys_addr=0x%llx\n",
- buf->file, ret, buf, size, buf->cpu_addr, buf->dma_addr,
- virt_to_phys(buf->cpu_addr));
+ buf->file, ret, buf, size, buf->dma_mem->cpu_addr,
+ buf->dma_mem->dma_addr, virt_to_phys(buf->dma_mem->cpu_addr));
return ret;
free_dma:
- dma_free_coherent(dev, buf->size, buf->cpu_addr,
- buf->dma_addr);
+ ethosu_dma_mem_free(&buf->dma_mem);
free_buf:
memset(buf, 0, sizeof(*buf));