lib: sbi: Fix __atomic_op_bit_ord and comments
authorXiang W <wxjstz@126.com>
Wed, 15 Nov 2023 14:59:21 +0000 (22:59 +0800)
committerAnup Patel <anup@brainfault.org>
Fri, 8 Dec 2023 08:17:31 +0000 (13:47 +0530)
The original code returns the value of the word before modification.
When modifying the upper 32 bits under RV64, the value returned via
int return will have no meaning. Corrected to return the value of the
bit. And modify the function description.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
include/sbi/riscv_atomic.h
lib/sbi/riscv_atomic.c

index 3972e0b727c0817b09831a712349ccdab633a5fd..c5aa05e4134a14efecbbf5b886008825cd69f932 100644 (file)
@@ -39,14 +39,14 @@ unsigned int atomic_raw_xchg_uint(volatile unsigned int *ptr,
 unsigned long atomic_raw_xchg_ulong(volatile unsigned long *ptr,
                                    unsigned long newval);
 /**
- * Set a bit in an atomic variable and return the new value.
+ * Set a bit in an atomic variable and return the value of bit before modify.
  * @nr : Bit to set.
  * @atom: atomic variable to modify
  */
 int atomic_set_bit(int nr, atomic_t *atom);
 
 /**
- * Clear a bit in an atomic variable and return the new value.
+ * Clear a bit in an atomic variable and return the value of bit before modify.
  * @nr : Bit to set.
  * @atom: atomic variable to modify
  */
@@ -54,14 +54,14 @@ int atomic_set_bit(int nr, atomic_t *atom);
 int atomic_clear_bit(int nr, atomic_t *atom);
 
 /**
- * Set a bit in any address and return the new value .
+ * Set a bit in any address and return the value of bit before modify.
  * @nr : Bit to set.
  * @addr: Address to modify
  */
 int atomic_raw_set_bit(int nr, volatile unsigned long *addr);
 
 /**
- * Clear a bit in any address and return the new value .
+ * Clear a bit in any address and return the value of bit before modify.
  * @nr : Bit to set.
  * @addr: Address to modify
  */
index a143218317857ad39220278103a9bb4889b5215a..4d14bc56e18b6d3dd7351f8fd49853858ab38846 100644 (file)
@@ -124,7 +124,7 @@ unsigned long atomic_raw_xchg_ulong(volatile unsigned long *ptr,
                                     : "=r"(__res), "+A"(addr[BIT_WORD(nr)]) \
                                     : "r"(mod(__mask))                      \
                                     : "memory");                            \
-               __res;                                                       \
+               __res & __mask ? 1 : 0;                                      \
        })
 
 #define __atomic_op_bit(op, mod, nr, addr) \
@@ -134,22 +134,22 @@ unsigned long atomic_raw_xchg_ulong(volatile unsigned long *ptr,
 #define __NOP(x) (x)
 #define __NOT(x) (~(x))
 
-inline int atomic_raw_set_bit(int nr, volatile unsigned long *addr)
+int atomic_raw_set_bit(int nr, volatile unsigned long *addr)
 {
        return __atomic_op_bit(or, __NOP, nr, addr);
 }
 
-inline int atomic_raw_clear_bit(int nr, volatile unsigned long *addr)
+int atomic_raw_clear_bit(int nr, volatile unsigned long *addr)
 {
        return __atomic_op_bit(and, __NOT, nr, addr);
 }
 
-inline int atomic_set_bit(int nr, atomic_t *atom)
+int atomic_set_bit(int nr, atomic_t *atom)
 {
        return atomic_raw_set_bit(nr, (unsigned long *)&atom->counter);
 }
 
-inline int atomic_clear_bit(int nr, atomic_t *atom)
+int atomic_clear_bit(int nr, atomic_t *atom)
 {
        return atomic_raw_clear_bit(nr, (unsigned long *)&atom->counter);
 }