#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
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
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
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