From c1def569fd88c4d1d82d706799d6ddbe356f310b Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=99=88=E6=81=92=E6=98=8E?= Date: Tue, 28 Dec 2010 02:11:27 -0800 Subject: [PATCH] rk29: vpu_mem: add cache clean and invalidate --- arch/arm/mach-rk29/include/mach/vpu_mem.h | 2 ++ arch/arm/mach-rk29/vpu_mem.c | 29 ++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-rk29/include/mach/vpu_mem.h b/arch/arm/mach-rk29/include/mach/vpu_mem.h index bed79647e9cd..909e4c5cdd04 100644 --- a/arch/arm/mach-rk29/include/mach/vpu_mem.h +++ b/arch/arm/mach-rk29/include/mach/vpu_mem.h @@ -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 diff --git a/arch/arm/mach-rk29/vpu_mem.c b/arch/arm/mach-rk29/vpu_mem.c index faa83239412c..03f59f110773 100644 --- a/arch/arm/mach-rk29/vpu_mem.c +++ b/arch/arm/mach-rk29/vpu_mem.c @@ -599,10 +599,10 @@ static int vpu_mem_link(struct file *file, int index) return err; } -void vpu_mem_flush(struct file *file, long index) +void vpu_mem_cache_opt(struct file *file, long index, unsigned int cmd) { struct vpu_mem_data *data; - void *flush_start, *flush_end; + void *start, *end; if (!is_vpu_mem_file(file)) { return; @@ -613,9 +613,24 @@ void vpu_mem_flush(struct file *file, long index) return; down_read(&data->sem); - flush_start = VPU_MEM_START_VADDR(index); - flush_end = VPU_MEM_END_VADDR(index); - dmac_flush_range(flush_start, flush_end); + start = VPU_MEM_START_VADDR(index); + end = VPU_MEM_END_VADDR(index); + switch (cmd) { + case VPU_MEM_CACHE_FLUSH : { + dmac_flush_range(start, end); + break; + } + case VPU_MEM_CACHE_CLEAN : { + dmac_clean_range(start, end); + break; + } + case VPU_MEM_CACHE_INVALID : { + dmac_inv_range(start, end); + break; + } + default : + break; + } up_read(&data->sem); } @@ -793,13 +808,15 @@ static long vpu_mem_ioctl(struct file *file, unsigned int cmd, unsigned long arg break; } case VPU_MEM_CACHE_FLUSH: + case VPU_MEM_CACHE_CLEAN: + case VPU_MEM_CACHE_INVALID: { DLOG("flush\n"); if (copy_from_user(&index, (void __user *)arg, sizeof(index))) return -EFAULT; down_write(&vpu_mem.bitmap_sem); - vpu_mem_flush(file, index); + vpu_mem_cache_opt(file, index, cmd); up_write(&vpu_mem.bitmap_sem); break; } -- 2.34.1