1*819833afSPeter Tyser #ifndef __ASM_SH_CACHE_H 2*819833afSPeter Tyser #define __ASM_SH_CACHE_H 3*819833afSPeter Tyser 4*819833afSPeter Tyser #if defined(CONFIG_SH4) || defined(CONFIG_SH4A) 5*819833afSPeter Tyser 6*819833afSPeter Tyser int cache_control(unsigned int cmd); 7*819833afSPeter Tyser 8*819833afSPeter Tyser #define L1_CACHE_BYTES 32 9*819833afSPeter Tyser struct __large_struct { unsigned long buf[100]; }; 10*819833afSPeter Tyser #define __m(x) (*(struct __large_struct *)(x)) 11*819833afSPeter Tyser 12*819833afSPeter Tyser void dcache_wback_range(u32 start, u32 end) 13*819833afSPeter Tyser { 14*819833afSPeter Tyser u32 v; 15*819833afSPeter Tyser 16*819833afSPeter Tyser start &= ~(L1_CACHE_BYTES - 1); 17*819833afSPeter Tyser for (v = start; v < end; v += L1_CACHE_BYTES) { 18*819833afSPeter Tyser asm volatile ("ocbwb %0" : /* no output */ 19*819833afSPeter Tyser : "m" (__m(v))); 20*819833afSPeter Tyser } 21*819833afSPeter Tyser } 22*819833afSPeter Tyser 23*819833afSPeter Tyser void dcache_invalid_range(u32 start, u32 end) 24*819833afSPeter Tyser { 25*819833afSPeter Tyser u32 v; 26*819833afSPeter Tyser 27*819833afSPeter Tyser start &= ~(L1_CACHE_BYTES - 1); 28*819833afSPeter Tyser for (v = start; v < end; v += L1_CACHE_BYTES) { 29*819833afSPeter Tyser asm volatile ("ocbi %0" : /* no output */ 30*819833afSPeter Tyser : "m" (__m(v))); 31*819833afSPeter Tyser } 32*819833afSPeter Tyser } 33*819833afSPeter Tyser #endif /* CONFIG_SH4 || CONFIG_SH4A */ 34*819833afSPeter Tyser 35*819833afSPeter Tyser #endif /* __ASM_SH_CACHE_H */ 36