diff options
Diffstat (limited to 'arch/arm/include/asm/cacheflush.h')
| -rw-r--r-- | arch/arm/include/asm/cacheflush.h | 69 | 
1 files changed, 23 insertions, 46 deletions
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index c77d2fa1f6e..72da7e045c6 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h @@ -42,7 +42,8 @@  #endif  #if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \ -    defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) +    defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \ +    defined(CONFIG_CPU_ARM1026)  # define MULTI_CACHE 1  #endif @@ -196,21 +197,6 @@   *	DMA Cache Coherency   *	===================   * - *	dma_inv_range(start, end) - * - *		Invalidate (discard) the specified virtual address range. - *		May not write back any entries.  If 'start' or 'end' - *		are not cache line aligned, those lines must be written - *		back. - *		- start  - virtual start address - *		- end    - virtual end address - * - *	dma_clean_range(start, end) - * - *		Clean (write back) the specified virtual address range. - *		- start  - virtual start address - *		- end    - virtual end address - *   *	dma_flush_range(start, end)   *   *		Clean and invalidate the specified virtual address range. @@ -227,8 +213,9 @@ struct cpu_cache_fns {  	void (*coherent_user_range)(unsigned long, unsigned long);  	void (*flush_kern_dcache_area)(void *, size_t); -	void (*dma_inv_range)(const void *, const void *); -	void (*dma_clean_range)(const void *, const void *); +	void (*dma_map_area)(const void *, size_t, int); +	void (*dma_unmap_area)(const void *, size_t, int); +  	void (*dma_flush_range)(const void *, const void *);  }; @@ -258,8 +245,8 @@ extern struct cpu_cache_fns cpu_cache;   * is visible to DMA, or data written by DMA to system memory is   * visible to the CPU.   */ -#define dmac_inv_range			cpu_cache.dma_inv_range -#define dmac_clean_range		cpu_cache.dma_clean_range +#define dmac_map_area			cpu_cache.dma_map_area +#define dmac_unmap_area		cpu_cache.dma_unmap_area  #define dmac_flush_range		cpu_cache.dma_flush_range  #else @@ -284,12 +271,12 @@ extern void __cpuc_flush_dcache_area(void *, size_t);   * is visible to DMA, or data written by DMA to system memory is   * visible to the CPU.   */ -#define dmac_inv_range			__glue(_CACHE,_dma_inv_range) -#define dmac_clean_range		__glue(_CACHE,_dma_clean_range) +#define dmac_map_area			__glue(_CACHE,_dma_map_area) +#define dmac_unmap_area		__glue(_CACHE,_dma_unmap_area)  #define dmac_flush_range		__glue(_CACHE,_dma_flush_range) -extern void dmac_inv_range(const void *, const void *); -extern void dmac_clean_range(const void *, const void *); +extern void dmac_map_area(const void *, size_t, int); +extern void dmac_unmap_area(const void *, size_t, int);  extern void dmac_flush_range(const void *, const void *);  #endif @@ -330,12 +317,8 @@ static inline void outer_flush_range(unsigned long start, unsigned long end)   * processes address space.  Really, we want to allow our "user   * space" model to handle this.   */ -#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ -	do {							\ -		memcpy(dst, src, len);				\ -		flush_ptrace_access(vma, page, vaddr, dst, len, 1);\ -	} while (0) - +extern void copy_to_user_page(struct vm_area_struct *, struct page *, +	unsigned long, void *, const void *, unsigned long);  #define copy_from_user_page(vma, page, vaddr, dst, src, len) \  	do {							\  		memcpy(dst, src, len);				\ @@ -369,17 +352,6 @@ vivt_flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsig  	}  } -static inline void -vivt_flush_ptrace_access(struct vm_area_struct *vma, struct page *page, -			 unsigned long uaddr, void *kaddr, -			 unsigned long len, int write) -{ -	if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { -		unsigned long addr = (unsigned long)kaddr; -		__cpuc_coherent_kern_range(addr, addr + len); -	} -} -  #ifndef CONFIG_CPU_CACHE_VIPT  #define flush_cache_mm(mm) \  		vivt_flush_cache_mm(mm) @@ -387,15 +359,10 @@ vivt_flush_ptrace_access(struct vm_area_struct *vma, struct page *page,  		vivt_flush_cache_range(vma,start,end)  #define flush_cache_page(vma,addr,pfn) \  		vivt_flush_cache_page(vma,addr,pfn) -#define flush_ptrace_access(vma,page,ua,ka,len,write) \ -		vivt_flush_ptrace_access(vma,page,ua,ka,len,write)  #else  extern void flush_cache_mm(struct mm_struct *mm);  extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);  extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn); -extern void flush_ptrace_access(struct vm_area_struct *vma, struct page *page, -				unsigned long uaddr, void *kaddr, -				unsigned long len, int write);  #endif  #define flush_cache_dup_mm(mm) flush_cache_mm(mm) @@ -446,6 +413,16 @@ static inline void __flush_icache_all(void)  	    : "r" (0));  #endif  } +static inline void flush_kernel_vmap_range(void *addr, int size) +{ +	if ((cache_is_vivt() || cache_is_vipt_aliasing())) +	  __cpuc_flush_dcache_area(addr, (size_t)size); +} +static inline void invalidate_kernel_vmap_range(void *addr, int size) +{ +	if ((cache_is_vivt() || cache_is_vipt_aliasing())) +	  __cpuc_flush_dcache_area(addr, (size_t)size); +}  #define ARCH_HAS_FLUSH_ANON_PAGE  static inline void flush_anon_page(struct vm_area_struct *vma,  |