1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ASM_SH_UNCACHED_H
3 #define __ASM_SH_UNCACHED_H
4 
5 #include <linux/bug.h>
6 
7 #ifdef CONFIG_UNCACHED_MAPPING
8 extern unsigned long cached_to_uncached;
9 extern unsigned long uncached_size;
10 extern unsigned long uncached_start, uncached_end;
11 
12 extern int virt_addr_uncached(unsigned long kaddr);
13 extern void uncached_init(void);
14 extern void uncached_resize(unsigned long size);
15 
16 /*
17  * Jump to uncached area.
18  * When handling TLB or caches, we need to do it from an uncached area.
19  */
20 #define jump_to_uncached()			\
21 do {						\
22 	unsigned long __dummy;			\
23 						\
24 	__asm__ __volatile__(			\
25 		"mova	1f, %0\n\t"		\
26 		"add	%1, %0\n\t"		\
27 		"jmp	@%0\n\t"		\
28 		" nop\n\t"			\
29 		".balign 4\n"			\
30 		"1:"				\
31 		: "=&z" (__dummy)		\
32 		: "r" (cached_to_uncached));	\
33 } while (0)
34 
35 /*
36  * Back to cached area.
37  */
38 #define back_to_cached()				\
39 do {							\
40 	unsigned long __dummy;				\
41 	ctrl_barrier();					\
42 	__asm__ __volatile__(				\
43 		"mov.l	1f, %0\n\t"			\
44 		"jmp	@%0\n\t"			\
45 		" nop\n\t"				\
46 		".balign 4\n"				\
47 		"1:	.long 2f\n"			\
48 		"2:"					\
49 		: "=&r" (__dummy));			\
50 } while (0)
51 #else
52 #define virt_addr_uncached(kaddr)	(0)
53 #define uncached_init()			do { } while (0)
54 #define uncached_resize(size)		BUG()
55 #define jump_to_uncached()		do { } while (0)
56 #define back_to_cached()		do { } while (0)
57 #endif
58 
59 #endif /* __ASM_SH_UNCACHED_H */
60