xref: /linux-6.15/arch/mips/include/asm/cacheflush.h (revision 384740dc)
1*384740dcSRalf Baechle /*
2*384740dcSRalf Baechle  * This file is subject to the terms and conditions of the GNU General Public
3*384740dcSRalf Baechle  * License.  See the file "COPYING" in the main directory of this archive
4*384740dcSRalf Baechle  * for more details.
5*384740dcSRalf Baechle  *
6*384740dcSRalf Baechle  * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000, 01, 02, 03 by Ralf Baechle
7*384740dcSRalf Baechle  * Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc.
8*384740dcSRalf Baechle  */
9*384740dcSRalf Baechle #ifndef _ASM_CACHEFLUSH_H
10*384740dcSRalf Baechle #define _ASM_CACHEFLUSH_H
11*384740dcSRalf Baechle 
12*384740dcSRalf Baechle /* Keep includes the same across arches.  */
13*384740dcSRalf Baechle #include <linux/mm.h>
14*384740dcSRalf Baechle #include <asm/cpu-features.h>
15*384740dcSRalf Baechle 
16*384740dcSRalf Baechle /* Cache flushing:
17*384740dcSRalf Baechle  *
18*384740dcSRalf Baechle  *  - flush_cache_all() flushes entire cache
19*384740dcSRalf Baechle  *  - flush_cache_mm(mm) flushes the specified mm context's cache lines
20*384740dcSRalf Baechle  *  - flush_cache_dup mm(mm) handles cache flushing when forking
21*384740dcSRalf Baechle  *  - flush_cache_page(mm, vmaddr, pfn) flushes a single page
22*384740dcSRalf Baechle  *  - flush_cache_range(vma, start, end) flushes a range of pages
23*384740dcSRalf Baechle  *  - flush_icache_range(start, end) flush a range of instructions
24*384740dcSRalf Baechle  *  - flush_dcache_page(pg) flushes(wback&invalidates) a page for dcache
25*384740dcSRalf Baechle  *
26*384740dcSRalf Baechle  * MIPS specific flush operations:
27*384740dcSRalf Baechle  *
28*384740dcSRalf Baechle  *  - flush_cache_sigtramp() flush signal trampoline
29*384740dcSRalf Baechle  *  - flush_icache_all() flush the entire instruction cache
30*384740dcSRalf Baechle  *  - flush_data_cache_page() flushes a page from the data cache
31*384740dcSRalf Baechle  */
32*384740dcSRalf Baechle extern void (*flush_cache_all)(void);
33*384740dcSRalf Baechle extern void (*__flush_cache_all)(void);
34*384740dcSRalf Baechle extern void (*flush_cache_mm)(struct mm_struct *mm);
35*384740dcSRalf Baechle #define flush_cache_dup_mm(mm)	do { (void) (mm); } while (0)
36*384740dcSRalf Baechle extern void (*flush_cache_range)(struct vm_area_struct *vma,
37*384740dcSRalf Baechle 	unsigned long start, unsigned long end);
38*384740dcSRalf Baechle extern void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn);
39*384740dcSRalf Baechle extern void __flush_dcache_page(struct page *page);
40*384740dcSRalf Baechle 
41*384740dcSRalf Baechle static inline void flush_dcache_page(struct page *page)
42*384740dcSRalf Baechle {
43*384740dcSRalf Baechle 	if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc)
44*384740dcSRalf Baechle 		__flush_dcache_page(page);
45*384740dcSRalf Baechle 
46*384740dcSRalf Baechle }
47*384740dcSRalf Baechle 
48*384740dcSRalf Baechle #define flush_dcache_mmap_lock(mapping)		do { } while (0)
49*384740dcSRalf Baechle #define flush_dcache_mmap_unlock(mapping)	do { } while (0)
50*384740dcSRalf Baechle 
51*384740dcSRalf Baechle #define ARCH_HAS_FLUSH_ANON_PAGE
52*384740dcSRalf Baechle extern void __flush_anon_page(struct page *, unsigned long);
53*384740dcSRalf Baechle static inline void flush_anon_page(struct vm_area_struct *vma,
54*384740dcSRalf Baechle 	struct page *page, unsigned long vmaddr)
55*384740dcSRalf Baechle {
56*384740dcSRalf Baechle 	if (cpu_has_dc_aliases && PageAnon(page))
57*384740dcSRalf Baechle 		__flush_anon_page(page, vmaddr);
58*384740dcSRalf Baechle }
59*384740dcSRalf Baechle 
60*384740dcSRalf Baechle static inline void flush_icache_page(struct vm_area_struct *vma,
61*384740dcSRalf Baechle 	struct page *page)
62*384740dcSRalf Baechle {
63*384740dcSRalf Baechle }
64*384740dcSRalf Baechle 
65*384740dcSRalf Baechle extern void (*flush_icache_range)(unsigned long start, unsigned long end);
66*384740dcSRalf Baechle extern void (*local_flush_icache_range)(unsigned long start, unsigned long end);
67*384740dcSRalf Baechle 
68*384740dcSRalf Baechle extern void (*__flush_cache_vmap)(void);
69*384740dcSRalf Baechle 
70*384740dcSRalf Baechle static inline void flush_cache_vmap(unsigned long start, unsigned long end)
71*384740dcSRalf Baechle {
72*384740dcSRalf Baechle 	if (cpu_has_dc_aliases)
73*384740dcSRalf Baechle 		__flush_cache_vmap();
74*384740dcSRalf Baechle }
75*384740dcSRalf Baechle 
76*384740dcSRalf Baechle extern void (*__flush_cache_vunmap)(void);
77*384740dcSRalf Baechle 
78*384740dcSRalf Baechle static inline void flush_cache_vunmap(unsigned long start, unsigned long end)
79*384740dcSRalf Baechle {
80*384740dcSRalf Baechle 	if (cpu_has_dc_aliases)
81*384740dcSRalf Baechle 		__flush_cache_vunmap();
82*384740dcSRalf Baechle }
83*384740dcSRalf Baechle 
84*384740dcSRalf Baechle extern void copy_to_user_page(struct vm_area_struct *vma,
85*384740dcSRalf Baechle 	struct page *page, unsigned long vaddr, void *dst, const void *src,
86*384740dcSRalf Baechle 	unsigned long len);
87*384740dcSRalf Baechle 
88*384740dcSRalf Baechle extern void copy_from_user_page(struct vm_area_struct *vma,
89*384740dcSRalf Baechle 	struct page *page, unsigned long vaddr, void *dst, const void *src,
90*384740dcSRalf Baechle 	unsigned long len);
91*384740dcSRalf Baechle 
92*384740dcSRalf Baechle extern void (*flush_cache_sigtramp)(unsigned long addr);
93*384740dcSRalf Baechle extern void (*flush_icache_all)(void);
94*384740dcSRalf Baechle extern void (*local_flush_data_cache_page)(void * addr);
95*384740dcSRalf Baechle extern void (*flush_data_cache_page)(unsigned long addr);
96*384740dcSRalf Baechle 
97*384740dcSRalf Baechle /*
98*384740dcSRalf Baechle  * This flag is used to indicate that the page pointed to by a pte
99*384740dcSRalf Baechle  * is dirty and requires cleaning before returning it to the user.
100*384740dcSRalf Baechle  */
101*384740dcSRalf Baechle #define PG_dcache_dirty			PG_arch_1
102*384740dcSRalf Baechle 
103*384740dcSRalf Baechle #define Page_dcache_dirty(page)		\
104*384740dcSRalf Baechle 	test_bit(PG_dcache_dirty, &(page)->flags)
105*384740dcSRalf Baechle #define SetPageDcacheDirty(page)	\
106*384740dcSRalf Baechle 	set_bit(PG_dcache_dirty, &(page)->flags)
107*384740dcSRalf Baechle #define ClearPageDcacheDirty(page)	\
108*384740dcSRalf Baechle 	clear_bit(PG_dcache_dirty, &(page)->flags)
109*384740dcSRalf Baechle 
110*384740dcSRalf Baechle /* Run kernel code uncached, useful for cache probing functions. */
111*384740dcSRalf Baechle unsigned long run_uncached(void *func);
112*384740dcSRalf Baechle 
113*384740dcSRalf Baechle extern void *kmap_coherent(struct page *page, unsigned long addr);
114*384740dcSRalf Baechle extern void kunmap_coherent(void);
115*384740dcSRalf Baechle 
116*384740dcSRalf Baechle #endif /* _ASM_CACHEFLUSH_H */
117