Blame view

include/asm-frv/cacheflush.h 3.01 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  /* cacheflush.h: FRV cache flushing routines
   *
   * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
   * Written by David Howells (dhowells@redhat.com)
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version
   * 2 of the License, or (at your option) any later version.
   */
  
  #ifndef _ASM_CACHEFLUSH_H
  #define _ASM_CACHEFLUSH_H
  
  /* Keep includes the same across arches.  */
  #include <linux/mm.h>
  
  /*
   * virtually-indexed cache management (our cache is physically indexed)
   */
  #define flush_cache_all()			do {} while(0)
  #define flush_cache_mm(mm)			do {} while(0)
ec8c0446b   Ralf Baechle   [PATCH] Optimize ...
23
  #define flush_cache_dup_mm(mm)			do {} while(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
  #define flush_cache_range(mm, start, end)	do {} while(0)
  #define flush_cache_page(vma, vmaddr, pfn)	do {} while(0)
  #define flush_cache_vmap(start, end)		do {} while(0)
  #define flush_cache_vunmap(start, end)		do {} while(0)
  #define flush_dcache_mmap_lock(mapping)		do {} while(0)
  #define flush_dcache_mmap_unlock(mapping)	do {} while(0)
  
  /*
62018b5b5   Joe Perches   include/asm-frv/:...
32
   * physically-indexed cache management
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
   * - see arch/frv/lib/cache.S
   */
  extern void frv_dcache_writeback(unsigned long start, unsigned long size);
  extern void frv_cache_invalidate(unsigned long start, unsigned long size);
  extern void frv_icache_invalidate(unsigned long start, unsigned long size);
  extern void frv_cache_wback_inv(unsigned long start, unsigned long size);
  
  static inline void __flush_cache_all(void)
  {
  	asm volatile("	dcef	@(gr0,gr0),#1	
  "
  		     "	icei	@(gr0,gr0),#1	
  "
  		     "	membar			
  "
  		     : : : "memory"
  		     );
  }
  
  /* dcache/icache coherency... */
  #ifdef CONFIG_MMU
  extern void flush_dcache_page(struct page *page);
  #else
  static inline void flush_dcache_page(struct page *page)
  {
  	unsigned long addr = page_to_phys(page);
  	frv_dcache_writeback(addr, addr + PAGE_SIZE);
  }
  #endif
  
  static inline void flush_page_to_ram(struct page *page)
  {
  	flush_dcache_page(page);
  }
  
  static inline void flush_icache(void)
  {
  	__flush_cache_all();
  }
  
  static inline void flush_icache_range(unsigned long start, unsigned long end)
  {
  	frv_cache_wback_inv(start, end);
  }
  
  #ifdef CONFIG_MMU
  extern void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
  				    unsigned long start, unsigned long len);
  #else
  static inline void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
  					   unsigned long start, unsigned long len)
  {
  	frv_cache_wback_inv(start, start + len);
  }
  #endif
  
  static inline void flush_icache_page(struct vm_area_struct *vma, struct page *page)
  {
  	flush_icache_user_range(vma, page, page_to_phys(page), PAGE_SIZE);
  }
68f624fc8   David Howells   [PATCH] FRV: Misc...
93
94
95
96
97
98
99
100
101
102
103
104
  /*
   * permit ptrace to access another process's address space through the icache
   * and the dcache
   */
  #define copy_to_user_page(vma, page, vaddr, dst, src, len)	\
  do {								\
  	memcpy((dst), (src), (len));				\
  	flush_icache_user_range((vma), (page), (vaddr), (len));	\
  } while(0)
  
  #define copy_from_user_page(vma, page, vaddr, dst, src, len)	\
  	memcpy((dst), (src), (len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
  
  #endif /* _ASM_CACHEFLUSH_H */