diff options
Diffstat (limited to 'arch/arm/include/asm/atomic.h')
| -rw-r--r-- | arch/arm/include/asm/atomic.h | 24 | 
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index c79f61faa3a..da1c77d3932 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h @@ -243,6 +243,29 @@ typedef struct {  #define ATOMIC64_INIT(i) { (i) } +#ifdef CONFIG_ARM_LPAE +static inline u64 atomic64_read(const atomic64_t *v) +{ +	u64 result; + +	__asm__ __volatile__("@ atomic64_read\n" +"	ldrd	%0, %H0, [%1]" +	: "=&r" (result) +	: "r" (&v->counter), "Qo" (v->counter) +	); + +	return result; +} + +static inline void atomic64_set(atomic64_t *v, u64 i) +{ +	__asm__ __volatile__("@ atomic64_set\n" +"	strd	%2, %H2, [%1]" +	: "=Qo" (v->counter) +	: "r" (&v->counter), "r" (i) +	); +} +#else  static inline u64 atomic64_read(const atomic64_t *v)  {  	u64 result; @@ -269,6 +292,7 @@ static inline void atomic64_set(atomic64_t *v, u64 i)  	: "r" (&v->counter), "r" (i)  	: "cc");  } +#endif  static inline void atomic64_add(u64 i, atomic64_t *v)  {  |