1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2a439fe51SSam Ravnborg /* 3a439fe51SSam Ravnborg * bitops.h: Bit string operations on the Sparc. 4a439fe51SSam Ravnborg * 5a439fe51SSam Ravnborg * Copyright 1995 David S. Miller (davem@caip.rutgers.edu) 6a439fe51SSam Ravnborg * Copyright 1996 Eddie C. Dost (ecd@skynet.be) 7a439fe51SSam Ravnborg * Copyright 2001 Anton Blanchard (anton@samba.org) 8a439fe51SSam Ravnborg */ 9a439fe51SSam Ravnborg 10a439fe51SSam Ravnborg #ifndef _SPARC_BITOPS_H 11a439fe51SSam Ravnborg #define _SPARC_BITOPS_H 12a439fe51SSam Ravnborg 13a439fe51SSam Ravnborg #include <linux/compiler.h> 14a439fe51SSam Ravnborg #include <asm/byteorder.h> 15a439fe51SSam Ravnborg 16a439fe51SSam Ravnborg #ifdef __KERNEL__ 17a439fe51SSam Ravnborg 18a439fe51SSam Ravnborg #ifndef _LINUX_BITOPS_H 19a439fe51SSam Ravnborg #error only <linux/bitops.h> can be included directly 20a439fe51SSam Ravnborg #endif 21a439fe51SSam Ravnborg 22*e69eb9c4SAlexander Lobakin unsigned long sp32___set_bit(unsigned long *addr, unsigned long mask); 23*e69eb9c4SAlexander Lobakin unsigned long sp32___clear_bit(unsigned long *addr, unsigned long mask); 24*e69eb9c4SAlexander Lobakin unsigned long sp32___change_bit(unsigned long *addr, unsigned long mask); 25a439fe51SSam Ravnborg 26a439fe51SSam Ravnborg /* 27a439fe51SSam Ravnborg * Set bit 'nr' in 32-bit quantity at address 'addr' where bit '0' 28a439fe51SSam Ravnborg * is in the highest of the four bytes and bit '31' is the high bit 29a439fe51SSam Ravnborg * within the first byte. Sparc is BIG-Endian. Unless noted otherwise 30a439fe51SSam Ravnborg * all bit-ops return 0 if bit was previously clear and != 0 otherwise. 31a439fe51SSam Ravnborg */ 32a439fe51SSam Ravnborg static inline int test_and_set_bit(unsigned long nr, volatile unsigned long *addr) 33a439fe51SSam Ravnborg { 34a439fe51SSam Ravnborg unsigned long *ADDR, mask; 35a439fe51SSam Ravnborg 36a439fe51SSam Ravnborg ADDR = ((unsigned long *) addr) + (nr >> 5); 37a439fe51SSam Ravnborg mask = 1 << (nr & 31); 38a439fe51SSam Ravnborg 39*e69eb9c4SAlexander Lobakin return sp32___set_bit(ADDR, mask) != 0; 40a439fe51SSam Ravnborg } 41a439fe51SSam Ravnborg 42a439fe51SSam Ravnborg static inline void set_bit(unsigned long nr, volatile unsigned long *addr) 43a439fe51SSam Ravnborg { 44a439fe51SSam Ravnborg unsigned long *ADDR, mask; 45a439fe51SSam Ravnborg 46a439fe51SSam Ravnborg ADDR = ((unsigned long *) addr) + (nr >> 5); 47a439fe51SSam Ravnborg mask = 1 << (nr & 31); 48a439fe51SSam Ravnborg 49*e69eb9c4SAlexander Lobakin (void) sp32___set_bit(ADDR, mask); 50a439fe51SSam Ravnborg } 51a439fe51SSam Ravnborg 52a439fe51SSam Ravnborg static inline int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr) 53a439fe51SSam Ravnborg { 54a439fe51SSam Ravnborg unsigned long *ADDR, mask; 55a439fe51SSam Ravnborg 56a439fe51SSam Ravnborg ADDR = ((unsigned long *) addr) + (nr >> 5); 57a439fe51SSam Ravnborg mask = 1 << (nr & 31); 58a439fe51SSam Ravnborg 59*e69eb9c4SAlexander Lobakin return sp32___clear_bit(ADDR, mask) != 0; 60a439fe51SSam Ravnborg } 61a439fe51SSam Ravnborg 62a439fe51SSam Ravnborg static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) 63a439fe51SSam Ravnborg { 64a439fe51SSam Ravnborg unsigned long *ADDR, mask; 65a439fe51SSam Ravnborg 66a439fe51SSam Ravnborg ADDR = ((unsigned long *) addr) + (nr >> 5); 67a439fe51SSam Ravnborg mask = 1 << (nr & 31); 68a439fe51SSam Ravnborg 69*e69eb9c4SAlexander Lobakin (void) sp32___clear_bit(ADDR, mask); 70a439fe51SSam Ravnborg } 71a439fe51SSam Ravnborg 72a439fe51SSam Ravnborg static inline int test_and_change_bit(unsigned long nr, volatile unsigned long *addr) 73a439fe51SSam Ravnborg { 74a439fe51SSam Ravnborg unsigned long *ADDR, mask; 75a439fe51SSam Ravnborg 76a439fe51SSam Ravnborg ADDR = ((unsigned long *) addr) + (nr >> 5); 77a439fe51SSam Ravnborg mask = 1 << (nr & 31); 78a439fe51SSam Ravnborg 79*e69eb9c4SAlexander Lobakin return sp32___change_bit(ADDR, mask) != 0; 80a439fe51SSam Ravnborg } 81a439fe51SSam Ravnborg 82a439fe51SSam Ravnborg static inline void change_bit(unsigned long nr, volatile unsigned long *addr) 83a439fe51SSam Ravnborg { 84a439fe51SSam Ravnborg unsigned long *ADDR, mask; 85a439fe51SSam Ravnborg 86a439fe51SSam Ravnborg ADDR = ((unsigned long *) addr) + (nr >> 5); 87a439fe51SSam Ravnborg mask = 1 << (nr & 31); 88a439fe51SSam Ravnborg 89*e69eb9c4SAlexander Lobakin (void) sp32___change_bit(ADDR, mask); 90a439fe51SSam Ravnborg } 91a439fe51SSam Ravnborg 92a439fe51SSam Ravnborg #include <asm-generic/bitops/non-atomic.h> 93a439fe51SSam Ravnborg 94a439fe51SSam Ravnborg #include <asm-generic/bitops/ffz.h> 95a439fe51SSam Ravnborg #include <asm-generic/bitops/__ffs.h> 96a439fe51SSam Ravnborg #include <asm-generic/bitops/sched.h> 97a439fe51SSam Ravnborg #include <asm-generic/bitops/ffs.h> 98a439fe51SSam Ravnborg #include <asm-generic/bitops/fls.h> 99e8e8e80eSRusty Russell #include <asm-generic/bitops/__fls.h> 100a439fe51SSam Ravnborg #include <asm-generic/bitops/fls64.h> 101a439fe51SSam Ravnborg #include <asm-generic/bitops/hweight.h> 102a439fe51SSam Ravnborg #include <asm-generic/bitops/lock.h> 103861b5ae7SAkinobu Mita #include <asm-generic/bitops/le.h> 104a439fe51SSam Ravnborg #include <asm-generic/bitops/ext2-atomic.h> 105a439fe51SSam Ravnborg 106a439fe51SSam Ravnborg #endif /* __KERNEL__ */ 107a439fe51SSam Ravnborg 108a439fe51SSam Ravnborg #endif /* defined(_SPARC_BITOPS_H) */ 109