| 
									
										
										
										
											2008-10-22 22:26:29 -07:00
										 |  |  | #ifndef _ASM_X86_EDAC_H
 | 
					
						
							|  |  |  | #define _ASM_X86_EDAC_H
 | 
					
						
							| 
									
										
										
										
											2007-10-15 23:28:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ECC atomic, DMA, SMP and interrupt safe scrub function */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-23 01:02:06 -07:00
										 |  |  | static inline void atomic_scrub(void *va, u32 size) | 
					
						
							| 
									
										
										
										
											2007-10-15 23:28:20 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	u32 i, *virt_addr = va; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Very carefully read and write to memory atomically so we | 
					
						
							|  |  |  | 	 * are interrupt, DMA and SMP safe. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	for (i = 0; i < size / 4; i++, virt_addr++) | 
					
						
							| 
									
										
										
										
											2008-03-23 01:02:06 -07:00
										 |  |  | 		asm volatile("lock; addl $0, %0"::"m" (*virt_addr)); | 
					
						
							| 
									
										
										
										
											2007-10-15 23:28:20 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-22 22:26:29 -07:00
										 |  |  | #endif /* _ASM_X86_EDAC_H */
 |