]>
Commit | Line | Data |
---|---|---|
d01447b3 PM |
1 | #ifndef __ASM_SH_UNCACHED_H |
2 | #define __ASM_SH_UNCACHED_H | |
3 | ||
4 | #include <linux/bug.h> | |
5 | ||
6 | #ifdef CONFIG_UNCACHED_MAPPING | |
edc9a958 PM |
7 | extern unsigned long cached_to_uncached; |
8 | extern unsigned long uncached_size; | |
d01447b3 PM |
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); | |
edc9a958 PM |
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) | |
d01447b3 PM |
50 | #else |
51 | #define virt_addr_uncached(kaddr) (0) | |
52 | #define uncached_init() do { } while (0) | |
53 | #define uncached_resize(size) BUG() | |
edc9a958 PM |
54 | #define jump_to_uncached() do { } while (0) |
55 | #define back_to_cached() do { } while (0) | |
d01447b3 PM |
56 | #endif |
57 | ||
58 | #endif /* __ASM_SH_UNCACHED_H */ |