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