| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* | 
					
						
							|  |  |  |  * vDSO provided cache flush routines | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
 | 
					
						
							|  |  |  |  *                    IBM Corp. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or
 | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version
 | 
					
						
							|  |  |  |  * 2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #include <asm/processor.h> | 
					
						
							|  |  |  | #include <asm/ppc_asm.h> | 
					
						
							|  |  |  | #include <asm/vdso.h> | 
					
						
							| 
									
										
										
										
											2005-09-09 20:57:26 +02:00
										 |  |  | #include <asm/asm-offsets.h> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * Default "generic" version of __kernel_sync_dicache. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * void __kernel_sync_dicache(unsigned long start, unsigned long end) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Flushes the data cache & invalidate the instruction cache for the | 
					
						
							|  |  |  |  * provided range [start, end[ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | V_FUNCTION_BEGIN(__kernel_sync_dicache) | 
					
						
							|  |  |  |   .cfi_startproc | 
					
						
							| 
									
										
										
										
											2007-11-20 12:24:45 +11:00
										 |  |  | 	mflr	r12 | 
					
						
							|  |  |  |   .cfi_register lr,r12 | 
					
						
							|  |  |  | 	mr	r11,r3 | 
					
						
							|  |  |  | 	bl	__get_datapage@local
 | 
					
						
							|  |  |  | 	mtlr	r12 | 
					
						
							|  |  |  | 	mr	r10,r3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	lwz	r7,CFG_DCACHE_BLOCKSZ(r10) | 
					
						
							|  |  |  | 	addi	r5,r7,-1 | 
					
						
							|  |  |  | 	andc	r6,r11,r5		/* round low to line bdy */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	subf	r8,r6,r4		/* compute length */ | 
					
						
							|  |  |  | 	add	r8,r8,r5		/* ensure we get enough */ | 
					
						
							| 
									
										
										
										
											2007-11-20 12:24:45 +11:00
										 |  |  | 	lwz	r9,CFG_DCACHE_LOGBLOCKSZ(r10) | 
					
						
							|  |  |  | 	srw.	r8,r8,r9		/* compute line count */ | 
					
						
							| 
									
										
										
										
											2005-11-16 13:54:32 +11:00
										 |  |  | 	crclr	cr0*4+so | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	beqlr				/* nothing to do? */ | 
					
						
							|  |  |  | 	mtctr	r8 | 
					
						
							| 
									
										
										
										
											2007-11-20 12:24:45 +11:00
										 |  |  | 1:	dcbst	0,r6 | 
					
						
							|  |  |  | 	add	r6,r6,r7 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	bdnz	1b | 
					
						
							|  |  |  | 	sync | 
					
						
							| 
									
										
										
										
											2007-11-20 12:24:45 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Now invalidate the instruction cache */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	lwz	r7,CFG_ICACHE_BLOCKSZ(r10) | 
					
						
							|  |  |  | 	addi	r5,r7,-1 | 
					
						
							|  |  |  | 	andc	r6,r11,r5		/* round low to line bdy */ | 
					
						
							|  |  |  | 	subf	r8,r6,r4		/* compute length */ | 
					
						
							|  |  |  | 	add	r8,r8,r5 | 
					
						
							|  |  |  | 	lwz	r9,CFG_ICACHE_LOGBLOCKSZ(r10) | 
					
						
							|  |  |  | 	srw.	r8,r8,r9		/* compute line count */ | 
					
						
							|  |  |  | 	crclr	cr0*4+so | 
					
						
							|  |  |  | 	beqlr				/* nothing to do? */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	mtctr	r8 | 
					
						
							| 
									
										
										
										
											2007-11-20 12:24:45 +11:00
										 |  |  | 2:	icbi	0,r6 | 
					
						
							|  |  |  | 	add	r6,r6,r7 | 
					
						
							|  |  |  | 	bdnz	2b | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	isync | 
					
						
							| 
									
										
										
										
											2005-04-27 18:04:45 -07:00
										 |  |  | 	li	r3,0 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	blr | 
					
						
							|  |  |  |   .cfi_endproc | 
					
						
							|  |  |  | V_FUNCTION_END(__kernel_sync_dicache) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * POWER5 version of __kernel_sync_dicache | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | V_FUNCTION_BEGIN(__kernel_sync_dicache_p5) | 
					
						
							|  |  |  |   .cfi_startproc | 
					
						
							| 
									
										
										
										
											2005-11-16 13:54:32 +11:00
										 |  |  | 	crclr	cr0*4+so | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							| 
									
										
										
										
											2005-04-27 18:04:45 -07:00
										 |  |  | 	li	r3,0 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	blr | 
					
						
							|  |  |  |   .cfi_endproc | 
					
						
							|  |  |  | V_FUNCTION_END(__kernel_sync_dicache_p5) | 
					
						
							|  |  |  | 
 |