rk29: vpu_mem: add cache clean and invalidate
author陈恒明 <chm@rock-chips.com>
Tue, 28 Dec 2010 10:11:27 +0000 (02:11 -0800)
committer陈恒明 <chm@rock-chips.com>
Tue, 28 Dec 2010 10:11:27 +0000 (02:11 -0800)
arch/arm/mach-rk29/include/mach/vpu_mem.h
arch/arm/mach-rk29/vpu_mem.c

index bed79647e9cd2773830d3315132cabe1a49eec76..909e4c5cdd046d5cd5c2c55c227c718b0b61a312 100644 (file)
@@ -25,6 +25,8 @@
 #define VPU_MEM_CACHE_FLUSH     _IOW(VPU_MEM_IOCTL_MAGIC, 5, unsigned int)
 #define VPU_MEM_DUPLICATE       _IOW(VPU_MEM_IOCTL_MAGIC, 6, unsigned int)
 #define VPU_MEM_LINK            _IOW(VPU_MEM_IOCTL_MAGIC, 7, unsigned int)
+#define VPU_MEM_CACHE_CLEAN     _IOW(VPU_MEM_IOCTL_MAGIC, 8, unsigned int)
+#define VPU_MEM_CACHE_INVALID   _IOW(VPU_MEM_IOCTL_MAGIC, 9, unsigned int)
 
 
 struct vpu_mem_platform_data
index faa83239412c1c4680a2abbcbf9b772c02d42417..03f59f11077354fd8dd43241e924e3bf0991a88c 100644 (file)
@@ -599,10 +599,10 @@ static int vpu_mem_link(struct file *file, int index)
        return err;\r
 }\r
 \r
-void vpu_mem_flush(struct file *file, long index)\r
+void vpu_mem_cache_opt(struct file *file, long index, unsigned int cmd)\r
 {\r
        struct vpu_mem_data *data;\r
-       void *flush_start, *flush_end;\r
+       void *start, *end;\r
 \r
        if (!is_vpu_mem_file(file)) {\r
                return;\r
@@ -613,9 +613,24 @@ void vpu_mem_flush(struct file *file, long index)
                return;\r
 \r
        down_read(&data->sem);\r
-    flush_start = VPU_MEM_START_VADDR(index);\r
-    flush_end   = VPU_MEM_END_VADDR(index);\r
-    dmac_flush_range(flush_start, flush_end);\r
+    start = VPU_MEM_START_VADDR(index);\r
+    end   = VPU_MEM_END_VADDR(index);\r
+    switch (cmd) {\r
+    case VPU_MEM_CACHE_FLUSH : {\r
+        dmac_flush_range(start, end);\r
+        break;\r
+    }\r
+    case VPU_MEM_CACHE_CLEAN : {\r
+        dmac_clean_range(start, end);\r
+        break;\r
+    }\r
+    case VPU_MEM_CACHE_INVALID : {\r
+        dmac_inv_range(start, end);\r
+        break;\r
+    }\r
+    default :\r
+        break;\r
+    }\r
        up_read(&data->sem);\r
 }\r
 \r
@@ -793,13 +808,15 @@ static long vpu_mem_ioctl(struct file *file, unsigned int cmd, unsigned long arg
             break;\r
         }\r
        case VPU_MEM_CACHE_FLUSH:\r
+    case VPU_MEM_CACHE_CLEAN:\r
+    case VPU_MEM_CACHE_INVALID:\r
                {\r
                        DLOG("flush\n");\r
                        if (copy_from_user(&index, (void __user *)arg, sizeof(index)))\r
                                return -EFAULT;\r
 \r
             down_write(&vpu_mem.bitmap_sem);\r
-                       vpu_mem_flush(file, index);\r
+                       vpu_mem_cache_opt(file, index, cmd);\r
             up_write(&vpu_mem.bitmap_sem);\r
                        break;\r
                }\r