diff options
-rw-r--r-- | core/riscv-rv32i/atomic.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/core/riscv-rv32i/atomic.h b/core/riscv-rv32i/atomic.h index 7a7431b740..8dec97df48 100644 --- a/core/riscv-rv32i/atomic.h +++ b/core/riscv-rv32i/atomic.h @@ -12,6 +12,9 @@ #include "cpu.h" #include "task.h" +typedef int atomic_t; +typedef atomic_t atomic_val_t; + #define ATOMIC_OP(op, value, addr) \ ({ \ uint32_t tmp; \ @@ -34,38 +37,73 @@ static inline void deprecated_atomic_clear_bits(volatile uint32_t *addr, ATOMIC_OP(and, ~bits, addr); } +static inline void atomic_clear_bits(atomic_t *addr, atomic_val_t bits) +{ + __atomic_fetch_and(addr, ~bits, __ATOMIC_SEQ_CST); +} + static inline void deprecated_atomic_or(volatile uint32_t *addr, uint32_t bits) { ATOMIC_OP(or, bits, addr); } +static inline atomic_val_t atomic_or(atomic_t *addr, atomic_val_t bits) +{ + return __atomic_fetch_or(addr, bits, __ATOMIC_SEQ_CST); +} + static inline void deprecated_atomic_add(volatile uint32_t *addr, uint32_t value) { ATOMIC_OP(add, value, addr); } +static inline atomic_val_t atomic_add(atomic_t *addr, atomic_val_t value) +{ + return __atomic_fetch_add(addr, value, __ATOMIC_SEQ_CST); +} + static inline void deprecated_atomic_sub(volatile uint32_t *addr, uint32_t value) { ATOMIC_OP(add, -value, addr); } +static inline atomic_val_t atomic_sub(atomic_t *addr, atomic_val_t value) +{ + return __atomic_fetch_sub(addr, value, __ATOMIC_SEQ_CST); +} + static inline uint32_t deprecated_atomic_read_clear(volatile uint32_t *addr) { return ATOMIC_OP(and, 0, addr); } +static inline atomic_val_t atomic_read_clear(atomic_t *addr) +{ + return __atomic_exchange_n(addr, 0, __ATOMIC_SEQ_CST); +} + static inline uint32_t deprecated_atomic_read_add(volatile uint32_t *addr, uint32_t value) { return ATOMIC_OP(add, value, addr); } +static inline atomic_val_t atomic_read_add(atomic_t *addr, atomic_val_t value) +{ + return __atomic_fetch_add(addr, value, __ATOMIC_SEQ_CST); +} + static inline uint32_t deprecated_atomic_read_sub(volatile uint32_t *addr, uint32_t value) { return ATOMIC_OP(add, -value, addr); } +static inline atomic_val_t atomic_read_sub(atomic_t *addr, atomic_val_t value) +{ + return __atomic_fetch_sub(addr, value, __ATOMIC_SEQ_CST); +} + #endif /* __CROS_EC_ATOMIC_H */ |