diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2013-01-18 04:42:19 -0500 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2013-02-15 12:45:50 -0500 |
commit | 95d6976d20a25fa1684f849f26cd3387b5ba7150 (patch) | |
tree | f3cd6472578c66dafdc13a791c4ca5d100a9d45c /arch/arc/include/asm/cacheflush.h | |
parent | 55bb9480f9159b229ac3c3454c97b62d1e0a7e80 (diff) |
ARC: Cache Flush Management
* ARC700 has VIPT L1 Caches
* Caches don't snoop and are not coherent
* Given the PAGE_SIZE and Cache associativity, we don't support aliasing
D$ configurations (yet), but do allow aliasing I$ configs
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Diffstat (limited to 'arch/arc/include/asm/cacheflush.h')
-rw-r--r-- | arch/arc/include/asm/cacheflush.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/arch/arc/include/asm/cacheflush.h b/arch/arc/include/asm/cacheflush.h new file mode 100644 index 000000000000..97ee96f26505 --- /dev/null +++ b/arch/arc/include/asm/cacheflush.h | |||
@@ -0,0 +1,67 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * vineetg: May 2011: for Non-aliasing VIPT D-cache following can be NOPs | ||
9 | * -flush_cache_dup_mm (fork) | ||
10 | * -likewise for flush_cache_mm (exit/execve) | ||
11 | * -likewise for flush_cache_{range,page} (munmap, exit, COW-break) | ||
12 | * | ||
13 | * vineetg: April 2008 | ||
14 | * -Added a critical CacheLine flush to copy_to_user_page( ) which | ||
15 | * was causing gdbserver to not setup breakpoints consistently | ||
16 | */ | ||
17 | |||
18 | #ifndef _ASM_CACHEFLUSH_H | ||
19 | #define _ASM_CACHEFLUSH_H | ||
20 | |||
21 | #include <linux/mm.h> | ||
22 | |||
23 | void flush_cache_all(void); | ||
24 | |||
25 | void flush_icache_range(unsigned long start, unsigned long end); | ||
26 | void flush_icache_page(struct vm_area_struct *vma, struct page *page); | ||
27 | void flush_icache_range_vaddr(unsigned long paddr, unsigned long u_vaddr, | ||
28 | int len); | ||
29 | |||
30 | #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1 | ||
31 | |||
32 | void flush_dcache_page(struct page *page); | ||
33 | |||
34 | void dma_cache_wback_inv(unsigned long start, unsigned long sz); | ||
35 | void dma_cache_inv(unsigned long start, unsigned long sz); | ||
36 | void dma_cache_wback(unsigned long start, unsigned long sz); | ||
37 | |||
38 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | ||
39 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | ||
40 | |||
41 | /* TBD: optimize this */ | ||
42 | #define flush_cache_vmap(start, end) flush_cache_all() | ||
43 | #define flush_cache_vunmap(start, end) flush_cache_all() | ||
44 | |||
45 | /* | ||
46 | * VM callbacks when entire/range of user-space V-P mappings are | ||
47 | * torn-down/get-invalidated | ||
48 | * | ||
49 | * Currently we don't support D$ aliasing configs for our VIPT caches | ||
50 | * NOPS for VIPT Cache with non-aliasing D$ configurations only | ||
51 | */ | ||
52 | #define flush_cache_dup_mm(mm) /* called on fork */ | ||
53 | #define flush_cache_mm(mm) /* called on munmap/exit */ | ||
54 | #define flush_cache_range(mm, u_vstart, u_vend) | ||
55 | #define flush_cache_page(vma, u_vaddr, pfn) /* PF handling/COW-break */ | ||
56 | |||
57 | #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ | ||
58 | do { \ | ||
59 | memcpy(dst, src, len); \ | ||
60 | if (vma->vm_flags & VM_EXEC) \ | ||
61 | flush_icache_range_vaddr((unsigned long)(dst), vaddr, len);\ | ||
62 | } while (0) | ||
63 | |||
64 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | ||
65 | memcpy(dst, src, len); \ | ||
66 | |||
67 | #endif | ||