| 
									
										
										
										
											2010-11-09 14:27:50 +10:00
										 |  |  | /***************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2011-03-30 22:57:33 -03:00
										 |  |  |  *	cache.c -- general ColdFire Cache maintenance code | 
					
						
							| 
									
										
										
										
											2010-11-09 14:27:50 +10:00
										 |  |  |  * | 
					
						
							|  |  |  |  *	Copyright (C) 2010, Greg Ungerer (gerg@snapgear.com) | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /***************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <asm/coldfire.h>
 | 
					
						
							|  |  |  | #include <asm/mcfsim.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /***************************************************************************/ | 
					
						
							|  |  |  | #ifdef CACHE_PUSH
 | 
					
						
							|  |  |  | /***************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  *	Use cpushl to push all dirty cache lines back to memory. | 
					
						
							|  |  |  |  *	Older versions of GAS don't seem to know how to generate the | 
					
						
							|  |  |  |  *	ColdFire cpushl instruction... Oh well, bit stuff it for now. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void mcf_cache_push(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	__asm__ __volatile__ ( | 
					
						
							|  |  |  | 		"clrl	%%d0\n\t" | 
					
						
							|  |  |  | 		"1:\n\t" | 
					
						
							|  |  |  | 		"movel	%%d0,%%a0\n\t" | 
					
						
							|  |  |  | 		"2:\n\t" | 
					
						
							|  |  |  | 		".word	0xf468\n\t" | 
					
						
							|  |  |  | 		"addl	%0,%%a0\n\t" | 
					
						
							|  |  |  | 		"cmpl	%1,%%a0\n\t" | 
					
						
							|  |  |  | 		"blt	2b\n\t" | 
					
						
							|  |  |  | 		"addql	#1,%%d0\n\t" | 
					
						
							|  |  |  | 		"cmpil	%2,%%d0\n\t" | 
					
						
							|  |  |  | 		"bne	1b\n\t" | 
					
						
							|  |  |  | 		: /* No output */ | 
					
						
							|  |  |  | 		: "i" (CACHE_LINE_SIZE), | 
					
						
							|  |  |  | 		  "i" (DCACHE_SIZE / CACHE_WAYS), | 
					
						
							|  |  |  | 		  "i" (CACHE_WAYS) | 
					
						
							|  |  |  | 		: "d0", "a0" ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /***************************************************************************/ | 
					
						
							|  |  |  | #endif /* CACHE_PUSH */
 | 
					
						
							|  |  |  | /***************************************************************************/ |