| 
									
										
										
										
											2010-02-18 18:13:51 +09:00
										 |  |  | #ifndef __ASM_SH_UNCACHED_H
 | 
					
						
							|  |  |  | #define __ASM_SH_UNCACHED_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/bug.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_UNCACHED_MAPPING
 | 
					
						
							| 
									
										
										
										
											2010-11-04 12:46:19 +09:00
										 |  |  | extern unsigned long cached_to_uncached; | 
					
						
							|  |  |  | extern unsigned long uncached_size; | 
					
						
							| 
									
										
										
										
											2010-02-18 18:13:51 +09:00
										 |  |  | extern unsigned long uncached_start, uncached_end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int virt_addr_uncached(unsigned long kaddr); | 
					
						
							|  |  |  | extern void uncached_init(void); | 
					
						
							|  |  |  | extern void uncached_resize(unsigned long size); | 
					
						
							| 
									
										
										
										
											2010-11-04 12:46:19 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Jump to uncached area. | 
					
						
							|  |  |  |  * When handling TLB or caches, we need to do it from an uncached area. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define jump_to_uncached()			\
 | 
					
						
							|  |  |  | do {						\ | 
					
						
							|  |  |  | 	unsigned long __dummy;			\ | 
					
						
							|  |  |  | 						\ | 
					
						
							|  |  |  | 	__asm__ __volatile__(			\ | 
					
						
							|  |  |  | 		"mova	1f, %0\n\t"		\ | 
					
						
							|  |  |  | 		"add	%1, %0\n\t"		\ | 
					
						
							|  |  |  | 		"jmp	@%0\n\t"		\ | 
					
						
							|  |  |  | 		" nop\n\t"			\ | 
					
						
							|  |  |  | 		".balign 4\n"			\ | 
					
						
							|  |  |  | 		"1:"				\ | 
					
						
							|  |  |  | 		: "=&z" (__dummy)		\ | 
					
						
							|  |  |  | 		: "r" (cached_to_uncached));	\ | 
					
						
							|  |  |  | } while (0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Back to cached area. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define back_to_cached()				\
 | 
					
						
							|  |  |  | do {							\ | 
					
						
							|  |  |  | 	unsigned long __dummy;				\ | 
					
						
							|  |  |  | 	ctrl_barrier();					\ | 
					
						
							|  |  |  | 	__asm__ __volatile__(				\ | 
					
						
							|  |  |  | 		"mov.l	1f, %0\n\t"			\ | 
					
						
							|  |  |  | 		"jmp	@%0\n\t"			\ | 
					
						
							|  |  |  | 		" nop\n\t"				\ | 
					
						
							|  |  |  | 		".balign 4\n"				\ | 
					
						
							|  |  |  | 		"1:	.long 2f\n"			\ | 
					
						
							|  |  |  | 		"2:"					\ | 
					
						
							|  |  |  | 		: "=&r" (__dummy));			\ | 
					
						
							|  |  |  | } while (0) | 
					
						
							| 
									
										
										
										
											2010-02-18 18:13:51 +09:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define virt_addr_uncached(kaddr)	(0)
 | 
					
						
							|  |  |  | #define uncached_init()			do { } while (0)
 | 
					
						
							|  |  |  | #define uncached_resize(size)		BUG()
 | 
					
						
							| 
									
										
										
										
											2010-11-04 12:46:19 +09:00
										 |  |  | #define jump_to_uncached()		do { } while (0)
 | 
					
						
							|  |  |  | #define back_to_cached()		do { } while (0)
 | 
					
						
							| 
									
										
										
										
											2010-02-18 18:13:51 +09:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* __ASM_SH_UNCACHED_H */
 |