Merge tag 'v3.3.7' into 3.3/master
[zen-stable.git] / arch / sh / include / asm / uncached.h
blob6f8816b79cf152091b1fc08e6cd4dc5d4390bfe2
1 #ifndef __ASM_SH_UNCACHED_H
2 #define __ASM_SH_UNCACHED_H
4 #include <linux/bug.h>
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;
11 extern int virt_addr_uncached(unsigned long kaddr);
12 extern void uncached_init(void);
13 extern void uncached_resize(unsigned long size);
16 * Jump to uncached area.
17 * When handling TLB or caches, we need to do it from an uncached area.
19 #define jump_to_uncached() \
20 do { \
21 unsigned long __dummy; \
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)
35 * Back to cached area.
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
58 #endif /* __ASM_SH_UNCACHED_H */