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