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