blob: c909b05695a268c88de416e9438d897cb85db55b [file] [log] [blame]
/*
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* vineetg: May 2011: for Non-aliasing VIPT D-cache following can be NOPs
* -flush_cache_dup_mm (fork)
* -likewise for flush_cache_mm (exit/execve)
* -likewise for flush_cache_{range,page} (munmap, exit, COW-break)
*
* vineetg: April 2008
* -Added a critical CacheLine flush to copy_to_user_page( ) which
* was causing gdbserver to not setup breakpoints consistently
*/
#ifndef _ASM_CACHEFLUSH_H
#define _ASM_CACHEFLUSH_H
#define flush_dcache_mmap_lock(mapping) do { } while (0)
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
#define flush_cache_vmap(start, end) flush_cache_all()
#define flush_cache_vunmap(start, end) flush_cache_all()
/* NOPS for VIPT Cache with non-aliasing D$ configurations only */
/* called during fork */
#define flush_cache_dup_mm(mm)
/* called during execve/exit */
#define flush_cache_mm(mm)
/* flush_cache_range( ): Flush the Cache lines for @u_vstart .. @u_vend
* 1) Called when a range of user-space V-P mappings are torn-down:
* because of munmap() or exit().
* 2) For VIPT, Non-aliasing D-Cache, flush_cache_range() can be a NOP.
* For now, ARC Linux doesn't support such ARC700 hardware configs, hence
* it can safely be a NOP
* If and when we do, this would have to be properly implemented
* -ASID doesn't have any role to play here
* -don't flush the entire I/D$, but iterate thru mappings, and
* for v-pages with backing phy-frame, flush the page from cache.
*
*/
#define flush_cache_range(mm, u_vstart, u_vend)
/* flush_cache_page( ): Flush Cache-lines for @u_vaddr mapped to @pfn
* Cousin of flush_cache_range( ) called mainly during page fault handling
* COW etc. Again per above, for now it can be a NOP.
*/
#define flush_cache_page(vma, u_vaddr, pfn)
#ifdef CONFIG_ARC700_CACHE
#ifdef CONFIG_SMP
#error "Caching not yet supported in SMP"
#error "remove CONFIG_ARC700_USE_ICACHE and CONFIG_ARC700_USE_DCACHE"
#endif
extern void flush_cache_all(void);
#else
#define flush_cache_all() do { } while (0)
#endif /* CONFIG_ARC_CACHE */
#ifdef CONFIG_ARC700_USE_ICACHE
extern void flush_icache_all(void);
extern void flush_icache_range(unsigned long start, unsigned long end);
extern void flush_icache_range_vaddr(unsigned long paddr, unsigned long u_vaddr,
int len);
extern void flush_icache_page(struct vm_area_struct *vma,struct page *page);
#else
#define flush_icache_all() do { } while (0)
#define flush_icache_range(start,end) do { } while (0)
#define flush_icache_range_vaddr(p,uv,len) do { } while (0)
#define flush_icache_page(vma,page) do { } while (0)
#endif /*CONFIG_ARC700_USE_ICACHE*/
#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
#ifdef CONFIG_ARC700_USE_DCACHE
extern void flush_dcache_page(struct page *page);
extern void flush_dcache_page_virt(unsigned long *page);
extern void flush_dcache_range(unsigned long start,unsigned long end);
extern void flush_dcache_all(void);
extern void inv_dcache_all(void);
extern void flush_and_inv_dcache_range(unsigned long start, unsigned long end);
extern void inv_dcache_range(unsigned long start, unsigned long end);
void flush_and_inv_dcache_all(void);
#define dma_cache_wback_inv(start,size) flush_and_inv_dcache_range(start, start + size)
#define dma_cache_wback(start,size) flush_dcache_range(start, start + size)
#define dma_cache_inv(start,size) inv_dcache_range(start, start + size)
#else
#define flush_dcache_range(start,end) do { } while (0)
#define flush_dcache_page(page) do { } while (0)
#define flush_dcache_page_virt(page) do { } while (0)
#define flush_dcache_all(start,size) do { } while (0)
#define inv_dcache_all() do { } while (0)
#define inv_dcache_range(start,size) do { } while (0)
#define flush_and_inv_dcache_all() do { } while (0)
#define flush_and_inv_dcache_range(start, end) do { } while (0)
#define dma_cache_wback_inv(start,size) do { } while (0)
#define dma_cache_wback(start,size) do { } while (0)
#define dma_cache_inv(start,size) do { } while (0)
#endif /*CONFIG_ARC700_USE_DCACHE*/
/*
* Copy user data from/to a page which is mapped into a different
* 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); \
if (vma->vm_flags & VM_EXEC ) { \
flush_icache_range_vaddr((unsigned long)(dst), \
vaddr, len); \
} \
} while (0)
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
do { \
memcpy(dst, src, len); \
} while (0)
#include <asm/arcregs.h>
extern struct cpuinfo_arc cpuinfo_arc700[];
#endif