aboutsummaryrefslogtreecommitdiffstats
path: root/meta-rcar-gen3-adas/recipes-kernel/kernel-module-mmngr/files/0003-kernelheap-cached-support.patch
blob: 171eac1c1936bb580bdd654a9951fd5c0c1291f8 (plain)
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