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