1#ifndef __ASM_METAG_CMPXCHG_LNKGET_H 2#define __ASM_METAG_CMPXCHG_LNKGET_H 3 4static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val) 5{ 6 int temp, old; 7 8 smp_mb(); 9 10 asm volatile ( 11 "1: LNKGETD %1, [%2]\n" 12 " LNKSETD [%2], %3\n" 13 " DEFR %0, TXSTAT\n" 14 " ANDT %0, %0, #HI(0x3f000000)\n" 15 " CMPT %0, #HI(0x02000000)\n" 16 " BNZ 1b\n" 17#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE 18 " DCACHE [%2], %0\n" 19#endif 20 : "=&d" (temp), "=&d" (old) 21 : "da" (m), "da" (val) 22 : "cc" 23 ); 24 25 smp_mb(); 26 27 return old; 28} 29 30static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val) 31{ 32 int temp, old; 33 34 smp_mb(); 35 36 asm volatile ( 37 "1: LNKGETD %1, [%2]\n" 38 " LNKSETD [%2], %3\n" 39 " DEFR %0, TXSTAT\n" 40 " ANDT %0, %0, #HI(0x3f000000)\n" 41 " CMPT %0, #HI(0x02000000)\n" 42 " BNZ 1b\n" 43#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE 44 " DCACHE [%2], %0\n" 45#endif 46 : "=&d" (temp), "=&d" (old) 47 : "da" (m), "da" (val & 0xff) 48 : "cc" 49 ); 50 51 smp_mb(); 52 53 return old; 54} 55 56static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, 57 unsigned long new) 58{ 59 __u32 retval, temp; 60 61 smp_mb(); 62 63 asm volatile ( 64 "1: LNKGETD %1, [%2]\n" 65 " CMP %1, %3\n" 66 " LNKSETDEQ [%2], %4\n" 67 " BNE 2f\n" 68 " DEFR %0, TXSTAT\n" 69 " ANDT %0, %0, #HI(0x3f000000)\n" 70 " CMPT %0, #HI(0x02000000)\n" 71 " BNZ 1b\n" 72#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE 73 " DCACHE [%2], %0\n" 74#endif 75 "2:\n" 76 : "=&d" (temp), "=&da" (retval) 77 : "da" (m), "bd" (old), "da" (new) 78 : "cc" 79 ); 80 81 smp_mb(); 82 83 return retval; 84} 85 86#endif /* __ASM_METAG_CMPXCHG_LNKGET_H */ 87