From 7051d448e4589b74ec69ba56910e4cfbf1c86877 Mon Sep 17 00:00:00 2001 From: Andrey Dolnikov Date: Wed, 14 Feb 2018 12:03:23 +0300 Subject: MMNGR: Add cached buffers support. --- .../files/0003-kernelheap-cached-support.patch | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 meta-rcar-gen3-adas/recipes-kernel/kernel-module-mmngr/files/0003-kernelheap-cached-support.patch (limited to 'meta-rcar-gen3-adas/recipes-kernel/kernel-module-mmngr/files') diff --git a/meta-rcar-gen3-adas/recipes-kernel/kernel-module-mmngr/files/0003-kernelheap-cached-support.patch b/meta-rcar-gen3-adas/recipes-kernel/kernel-module-mmngr/files/0003-kernelheap-cached-support.patch new file mode 100644 index 0000000..171eac1 --- /dev/null +++ b/meta-rcar-gen3-adas/recipes-kernel/kernel-module-mmngr/files/0003-kernelheap-cached-support.patch @@ -0,0 +1,102 @@ +From d20b6893f3d22abd12ffb5421292fcee4820de33 Mon Sep 17 00:00:00 2001 +From: Andrey Dolnikov +Date: Wed, 14 Feb 2018 17:12:01 +0300 +Subject: [PATCH] mmngr: Add kernelheap cached buffers support. + +--- + .../mmngr/mmngr-module/files/mmngr/drv/mmngr_drv.c | 20 ++++++++++++++++---- + .../files/mmngr/include/mmngr_private_cmn.h | 7 +++++++ + .../files/mmngr/include/mmngr_public_cmn.h | 1 + + 4 files changed, 29 insertions(+), 4 deletions(-) + +diff --git a/mmngr_drv/mmngr/mmngr-module/files/mmngr/drv/mmngr_drv.c b/mmngr_drv/mmngr/mmngr-module/files/mmngr/drv/mmngr_drv.c +index cd797f5..c38329d 100644 +--- a/mmngr_drv/mmngr/mmngr-module/files/mmngr/drv/mmngr_drv.c ++++ b/mmngr_drv/mmngr/mmngr-module/files/mmngr/drv/mmngr_drv.c +@@ -736,7 +736,7 @@ static int close(struct inode *inode, struct file *file) + int entry = 0; + + if (p) { +- if ((p->flag == MM_KERNELHEAP) ++ if ((p->flag == MM_KERNELHEAP || p->flag == MM_KERNELHEAP_CACHED) + && (p->kernel_virt_addr != 0)) { + pr_err("MMD close kernelheap\n"); + mm_dev = mm_drvdata->mm_dev; +@@ -779,6 +779,7 @@ static long ioctl(struct file *file, unsigned int cmd, unsigned long arg) + int ercd; + int ret; + struct MM_PARAM *p = file->private_data; ++ struct MM_CACHE_PARAM *cachep; + struct device *mm_dev; + + mm_dev = mm_drvdata->mm_dev; +@@ -830,6 +831,14 @@ static long ioctl(struct file *file, unsigned int cmd, unsigned long arg) + goto exit; + } + break; ++ case MM_IOC_FLUSH: ++ cachep = (struct MM_CACHE_PARAM *) arg; ++ dma_sync_single_for_device(mm_dev, p->hard_addr + cachep->offset, cachep->len, DMA_FROM_DEVICE); ++ break; ++ case MM_IOC_INVAL: ++ cachep = (struct MM_CACHE_PARAM *) arg; ++ dma_sync_single_for_cpu(mm_dev, p->hard_addr + cachep->offset, cachep->len, DMA_TO_DEVICE); ++ break; + default: + pr_err("MMD CMD EFAULT\n"); + ret = -EFAULT; +@@ -954,9 +963,12 @@ static int mmap(struct file *filp, struct vm_area_struct *vma) + off += start; + vma->vm_pgoff = off >> PAGE_SHIFT; + +- vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); +- +- vma->vm_flags |= (VM_IO | VM_DONTEXPAND | VM_DONTDUMP); ++ if (p->flag != MM_KERNELHEAP_CACHED) { ++ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); ++ vma->vm_flags |= (VM_IO | VM_DONTEXPAND | VM_DONTDUMP); ++ } else { ++ vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP); ++ } + + if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, + vma->vm_end - vma->vm_start, vma->vm_page_prot)) +diff --git a/mmngr_drv/mmngr/mmngr-module/files/mmngr/include/mmngr_private_cmn.h b/mmngr_drv/mmngr/mmngr-module/files/mmngr/include/mmngr_private_cmn.h +index f731ab6..5f137c6 100644 +--- a/mmngr_drv/mmngr/mmngr-module/files/mmngr/include/mmngr_private_cmn.h ++++ b/mmngr_drv/mmngr/mmngr-module/files/mmngr/include/mmngr_private_cmn.h +@@ -72,6 +72,11 @@ struct MM_PARAM { + unsigned int flag; + }; + ++struct MM_CACHE_PARAM { ++ size_t offset; ++ size_t len; ++}; ++ + #define MM_IOC_MAGIC 'm' + #define MM_IOC_ALLOC _IOWR(MM_IOC_MAGIC, 0, struct MM_PARAM) + #define MM_IOC_FREE _IOWR(MM_IOC_MAGIC, 1, struct MM_PARAM) +@@ -80,5 +85,7 @@ struct MM_PARAM { + #define MM_IOC_ALLOC_CO _IOWR(MM_IOC_MAGIC, 4, struct MM_PARAM) + #define MM_IOC_FREE_CO _IOWR(MM_IOC_MAGIC, 5, struct MM_PARAM) + #define MM_IOC_SHARE _IOWR(MM_IOC_MAGIC, 6, struct MM_PARAM) ++#define MM_IOC_FLUSH _IOWR(MM_IOC_MAGIC, 7, struct MM_CACHE_PARAM) ++#define MM_IOC_INVAL _IOWR(MM_IOC_MAGIC, 8, struct MM_CACHE_PARAM) + + #endif /* __MMNGR_PRIVATE_CMN_H__ */ +diff --git a/mmngr_drv/mmngr/mmngr-module/files/mmngr/include/mmngr_public_cmn.h b/mmngr_drv/mmngr/mmngr-module/files/mmngr/include/mmngr_public_cmn.h +index dce81a1..a668019 100644 +--- a/mmngr_drv/mmngr/mmngr-module/files/mmngr/include/mmngr_public_cmn.h ++++ b/mmngr_drv/mmngr/mmngr-module/files/mmngr/include/mmngr_public_cmn.h +@@ -62,6 +62,7 @@ + #define __MMNGR_PUBLIC_CMN_H__ + + #define MM_KERNELHEAP 0 ++#define MM_KERNELHEAP_CACHED 5 + #define MM_CARVEOUT 1 + #define MM_CARVEOUT_SSP 3 + #define MM_CARVEOUT_LOSSY 4 +-- +2.7.4 + -- cgit 1.2.3-korg