aboutsummaryrefslogtreecommitdiff
path: root/kernel/ethosu_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/ethosu_buffer.c')
-rw-r--r--kernel/ethosu_buffer.c26
1 files changed, 12 insertions, 14 deletions
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 @@ static void ethosu_buffer_destroy(struct kref *kref)
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 @@ static int ethosu_buffer_mmap(struct file *file,
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 @@ static loff_t ethosu_buffer_llseek(struct file *file,
*/
switch (whence) {
case SEEK_END:
- return buf->size;
+ return buf->dma_mem->size;
case SEEK_SET:
return 0;
default:
@@ -148,13 +147,13 @@ int ethosu_buffer_create(struct device *dev,
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", &ethosu_buffer_fops, buf,
O_RDWR | O_CLOEXEC);
@@ -168,14 +167,13 @@ int ethosu_buffer_create(struct device *dev,
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));