Move ACCESS_ONCE() to <linux/compiler.h>
[linux-2.6/openmoko-kernel/knife-kernel.git] / include / asm-powerpc / edac.h
blob6ead88bbfbb8e71a76b03836a06b9214e091b837
1 /*
2 * PPC EDAC common defs
4 * Author: Dave Jiang <djiang@mvista.com>
6 * 2007 (c) MontaVista Software, Inc. This file is licensed under
7 * the terms of the GNU General Public License version 2. This program
8 * is licensed "as is" without any warranty of any kind, whether express
9 * or implied.
11 #ifndef ASM_EDAC_H
12 #define ASM_EDAC_H
14 * ECC atomic, DMA, SMP and interrupt safe scrub function.
15 * Implements the per arch atomic_scrub() that EDAC use for software
16 * ECC scrubbing. It reads memory and then writes back the original
17 * value, allowing the hardware to detect and correct memory errors.
19 static __inline__ void atomic_scrub(void *va, u32 size)
21 unsigned int *virt_addr = va;
22 unsigned int temp;
23 unsigned int i;
25 for (i = 0; i < size / sizeof(*virt_addr); i++, virt_addr++) {
26 /* Very carefully read and write to memory atomically
27 * so we are interrupt, DMA and SMP safe.
29 __asm__ __volatile__ ("\n\
30 1: lwarx %0,0,%1\n\
31 stwcx. %0,0,%1\n\
32 bne- 1b\n\
33 isync"
34 : "=&r"(temp)
35 : "r"(virt_addr)
36 : "cr0", "memory");
40 #endif