1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
From d20b6893f3d22abd12ffb5421292fcee4820de33 Mon Sep 17 00:00:00 2001
From: Andrey Dolnikov <andrey.dolnikov@cogentembedded.com>
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
|