diff options
Diffstat (limited to 'kernel/ethosu_buffer.c')
-rw-r--r-- | kernel/ethosu_buffer.c | 26 |
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", ðosu_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)); |