16006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan#ifndef __ASM_METAG_CMPXCHG_LOCK1_H 26006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan#define __ASM_METAG_CMPXCHG_LOCK1_H 36006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 46006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan#include <asm/global_lock.h> 56006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 66006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan/* Use LOCK2 as these have to be atomic w.r.t. ordinary accesses. */ 76006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 86006c0d8ce9441dd1363bf14f18a8e28d3588460James Hoganstatic inline unsigned long xchg_u32(volatile u32 *m, unsigned long val) 96006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan{ 106006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan unsigned long flags, retval; 116006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 126006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan __global_lock2(flags); 136006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan fence(); 146006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan retval = *m; 156006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan *m = val; 166006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan __global_unlock2(flags); 176006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan return retval; 186006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan} 196006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 206006c0d8ce9441dd1363bf14f18a8e28d3588460James Hoganstatic inline unsigned long xchg_u8(volatile u8 *m, unsigned long val) 216006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan{ 226006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan unsigned long flags, retval; 236006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 246006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan __global_lock2(flags); 256006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan fence(); 266006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan retval = *m; 276006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan *m = val & 0xff; 286006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan __global_unlock2(flags); 296006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan return retval; 306006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan} 316006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 326006c0d8ce9441dd1363bf14f18a8e28d3588460James Hoganstatic inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, 336006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan unsigned long new) 346006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan{ 356006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan __u32 retval; 366006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan unsigned long flags; 376006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 386006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan __global_lock2(flags); 396006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan retval = *m; 406006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan if (retval == old) { 416006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan fence(); 426006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan *m = new; 436006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan } 446006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan __global_unlock2(flags); 456006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan return retval; 466006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan} 476006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan 486006c0d8ce9441dd1363bf14f18a8e28d3588460James Hogan#endif /* __ASM_METAG_CMPXCHG_LOCK1_H */ 49