1#ifndef __ASM_SH_UNCACHED_H 2#define __ASM_SH_UNCACHED_H 3 4#include <linux/bug.h> 5 6#ifdef CONFIG_UNCACHED_MAPPING 7extern unsigned long cached_to_uncached; 8extern unsigned long uncached_size; 9extern unsigned long uncached_start, uncached_end; 10 11extern int virt_addr_uncached(unsigned long kaddr); 12extern void uncached_init(void); 13extern 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() \ 20do { \ 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() \ 38do { \ 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