18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _H8300_BITOPS_H 38c2ecf20Sopenharmony_ci#define _H8300_BITOPS_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci/* 68c2ecf20Sopenharmony_ci * Copyright 1992, Linus Torvalds. 78c2ecf20Sopenharmony_ci * Copyright 2002, Yoshinori Sato 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/compiler.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#ifdef __KERNEL__ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#ifndef _LINUX_BITOPS_H 158c2ecf20Sopenharmony_ci#error only <linux/bitops.h> can be included directly 168c2ecf20Sopenharmony_ci#endif 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci/* 198c2ecf20Sopenharmony_ci * Function prototypes to keep gcc -Wall happy 208c2ecf20Sopenharmony_ci */ 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci/* 238c2ecf20Sopenharmony_ci * ffz = Find First Zero in word. Undefined if no zero exists, 248c2ecf20Sopenharmony_ci * so code should check against ~0UL first.. 258c2ecf20Sopenharmony_ci */ 268c2ecf20Sopenharmony_cistatic inline unsigned long ffz(unsigned long word) 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci unsigned long result; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci result = -1; 318c2ecf20Sopenharmony_ci __asm__("1:\n\t" 328c2ecf20Sopenharmony_ci "shlr.l %1\n\t" 338c2ecf20Sopenharmony_ci "adds #1,%0\n\t" 348c2ecf20Sopenharmony_ci "bcs 1b" 358c2ecf20Sopenharmony_ci : "=r"(result),"=r"(word) 368c2ecf20Sopenharmony_ci : "0"(result), "1"(word)); 378c2ecf20Sopenharmony_ci return result; 388c2ecf20Sopenharmony_ci} 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#define H8300_GEN_BITOP(FNAME, OP) \ 418c2ecf20Sopenharmony_cistatic inline void FNAME(int nr, volatile unsigned long *addr) \ 428c2ecf20Sopenharmony_ci{ \ 438c2ecf20Sopenharmony_ci unsigned char *b_addr; \ 448c2ecf20Sopenharmony_ci unsigned char bit = nr & 7; \ 458c2ecf20Sopenharmony_ci \ 468c2ecf20Sopenharmony_ci b_addr = (unsigned char *)addr + ((nr >> 3) ^ 3); \ 478c2ecf20Sopenharmony_ci if (__builtin_constant_p(nr)) { \ 488c2ecf20Sopenharmony_ci __asm__(OP " %1,%0" : "+WU"(*b_addr) : "i"(nr & 7)); \ 498c2ecf20Sopenharmony_ci } else { \ 508c2ecf20Sopenharmony_ci __asm__(OP " %s1,%0" : "+WU"(*b_addr) : "r"(bit)); \ 518c2ecf20Sopenharmony_ci } \ 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ciH8300_GEN_BITOP(set_bit, "bset") 558c2ecf20Sopenharmony_ciH8300_GEN_BITOP(clear_bit, "bclr") 568c2ecf20Sopenharmony_ciH8300_GEN_BITOP(change_bit, "bnot") 578c2ecf20Sopenharmony_ci#define __set_bit(nr, addr) set_bit((nr), (addr)) 588c2ecf20Sopenharmony_ci#define __clear_bit(nr, addr) clear_bit((nr), (addr)) 598c2ecf20Sopenharmony_ci#define __change_bit(nr, addr) change_bit((nr), (addr)) 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#undef H8300_GEN_BITOP 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistatic inline int test_bit(int nr, const volatile unsigned long *addr) 648c2ecf20Sopenharmony_ci{ 658c2ecf20Sopenharmony_ci int ret = 0; 668c2ecf20Sopenharmony_ci unsigned char *b_addr; 678c2ecf20Sopenharmony_ci unsigned char bit = nr & 7; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci b_addr = (unsigned char *)addr + ((nr >> 3) ^ 3); 708c2ecf20Sopenharmony_ci if (__builtin_constant_p(nr)) { 718c2ecf20Sopenharmony_ci __asm__("bld %Z2,%1\n\t" 728c2ecf20Sopenharmony_ci "rotxl %0\n\t" 738c2ecf20Sopenharmony_ci : "=r"(ret) 748c2ecf20Sopenharmony_ci : "WU"(*b_addr), "i"(nr & 7), "0"(ret) : "cc"); 758c2ecf20Sopenharmony_ci } else { 768c2ecf20Sopenharmony_ci __asm__("btst %w2,%1\n\t" 778c2ecf20Sopenharmony_ci "beq 1f\n\t" 788c2ecf20Sopenharmony_ci "inc.l #1,%0\n" 798c2ecf20Sopenharmony_ci "1:" 808c2ecf20Sopenharmony_ci : "=r"(ret) 818c2ecf20Sopenharmony_ci : "WU"(*b_addr), "r"(bit), "0"(ret) : "cc"); 828c2ecf20Sopenharmony_ci } 838c2ecf20Sopenharmony_ci return ret; 848c2ecf20Sopenharmony_ci} 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci#define __test_bit(nr, addr) test_bit(nr, addr) 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci#define H8300_GEN_TEST_BITOP(FNNAME, OP) \ 898c2ecf20Sopenharmony_cistatic inline int FNNAME(int nr, void *addr) \ 908c2ecf20Sopenharmony_ci{ \ 918c2ecf20Sopenharmony_ci int retval = 0; \ 928c2ecf20Sopenharmony_ci char ccrsave; \ 938c2ecf20Sopenharmony_ci unsigned char *b_addr; \ 948c2ecf20Sopenharmony_ci unsigned char bit = nr & 7; \ 958c2ecf20Sopenharmony_ci \ 968c2ecf20Sopenharmony_ci b_addr = (unsigned char *)addr + ((nr >> 3) ^ 3); \ 978c2ecf20Sopenharmony_ci if (__builtin_constant_p(nr)) { \ 988c2ecf20Sopenharmony_ci __asm__("stc ccr,%s2\n\t" \ 998c2ecf20Sopenharmony_ci "orc #0x80,ccr\n\t" \ 1008c2ecf20Sopenharmony_ci "bld %4,%1\n\t" \ 1018c2ecf20Sopenharmony_ci OP " %4,%1\n\t" \ 1028c2ecf20Sopenharmony_ci "rotxl.l %0\n\t" \ 1038c2ecf20Sopenharmony_ci "ldc %s2,ccr" \ 1048c2ecf20Sopenharmony_ci : "=r"(retval), "+WU" (*b_addr), "=&r"(ccrsave) \ 1058c2ecf20Sopenharmony_ci : "0"(retval), "i"(nr & 7) : "cc"); \ 1068c2ecf20Sopenharmony_ci } else { \ 1078c2ecf20Sopenharmony_ci __asm__("stc ccr,%t3\n\t" \ 1088c2ecf20Sopenharmony_ci "orc #0x80,ccr\n\t" \ 1098c2ecf20Sopenharmony_ci "btst %s3,%1\n\t" \ 1108c2ecf20Sopenharmony_ci OP " %s3,%1\n\t" \ 1118c2ecf20Sopenharmony_ci "beq 1f\n\t" \ 1128c2ecf20Sopenharmony_ci "inc.l #1,%0\n\t" \ 1138c2ecf20Sopenharmony_ci "1:\n" \ 1148c2ecf20Sopenharmony_ci "ldc %t3,ccr" \ 1158c2ecf20Sopenharmony_ci : "=r"(retval), "+WU" (*b_addr) \ 1168c2ecf20Sopenharmony_ci : "0" (retval), "r"(bit) : "cc"); \ 1178c2ecf20Sopenharmony_ci } \ 1188c2ecf20Sopenharmony_ci return retval; \ 1198c2ecf20Sopenharmony_ci} \ 1208c2ecf20Sopenharmony_ci \ 1218c2ecf20Sopenharmony_cistatic inline int __ ## FNNAME(int nr, void *addr) \ 1228c2ecf20Sopenharmony_ci{ \ 1238c2ecf20Sopenharmony_ci int retval = 0; \ 1248c2ecf20Sopenharmony_ci unsigned char *b_addr; \ 1258c2ecf20Sopenharmony_ci unsigned char bit = nr & 7; \ 1268c2ecf20Sopenharmony_ci \ 1278c2ecf20Sopenharmony_ci b_addr = (unsigned char *)addr + ((nr >> 3) ^ 3); \ 1288c2ecf20Sopenharmony_ci if (__builtin_constant_p(nr)) { \ 1298c2ecf20Sopenharmony_ci __asm__("bld %3,%1\n\t" \ 1308c2ecf20Sopenharmony_ci OP " %3,%1\n\t" \ 1318c2ecf20Sopenharmony_ci "rotxl.l %0\n\t" \ 1328c2ecf20Sopenharmony_ci : "=r"(retval), "+WU"(*b_addr) \ 1338c2ecf20Sopenharmony_ci : "0" (retval), "i"(nr & 7)); \ 1348c2ecf20Sopenharmony_ci } else { \ 1358c2ecf20Sopenharmony_ci __asm__("btst %s3,%1\n\t" \ 1368c2ecf20Sopenharmony_ci OP " %s3,%1\n\t" \ 1378c2ecf20Sopenharmony_ci "beq 1f\n\t" \ 1388c2ecf20Sopenharmony_ci "inc.l #1,%0\n\t" \ 1398c2ecf20Sopenharmony_ci "1:" \ 1408c2ecf20Sopenharmony_ci : "=r"(retval), "+WU"(*b_addr) \ 1418c2ecf20Sopenharmony_ci : "0" (retval), "r"(bit)); \ 1428c2ecf20Sopenharmony_ci } \ 1438c2ecf20Sopenharmony_ci return retval; \ 1448c2ecf20Sopenharmony_ci} 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ciH8300_GEN_TEST_BITOP(test_and_set_bit, "bset") 1478c2ecf20Sopenharmony_ciH8300_GEN_TEST_BITOP(test_and_clear_bit, "bclr") 1488c2ecf20Sopenharmony_ciH8300_GEN_TEST_BITOP(test_and_change_bit, "bnot") 1498c2ecf20Sopenharmony_ci#undef H8300_GEN_TEST_BITOP 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci#include <asm-generic/bitops/ffs.h> 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cistatic inline unsigned long __ffs(unsigned long word) 1548c2ecf20Sopenharmony_ci{ 1558c2ecf20Sopenharmony_ci unsigned long result; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci result = -1; 1588c2ecf20Sopenharmony_ci __asm__("1:\n\t" 1598c2ecf20Sopenharmony_ci "shlr.l %1\n\t" 1608c2ecf20Sopenharmony_ci "adds #1,%0\n\t" 1618c2ecf20Sopenharmony_ci "bcc 1b" 1628c2ecf20Sopenharmony_ci : "=r" (result),"=r"(word) 1638c2ecf20Sopenharmony_ci : "0"(result), "1"(word)); 1648c2ecf20Sopenharmony_ci return result; 1658c2ecf20Sopenharmony_ci} 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci#include <asm-generic/bitops/find.h> 1688c2ecf20Sopenharmony_ci#include <asm-generic/bitops/sched.h> 1698c2ecf20Sopenharmony_ci#include <asm-generic/bitops/hweight.h> 1708c2ecf20Sopenharmony_ci#include <asm-generic/bitops/lock.h> 1718c2ecf20Sopenharmony_ci#include <asm-generic/bitops/le.h> 1728c2ecf20Sopenharmony_ci#include <asm-generic/bitops/ext2-atomic.h> 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci#endif /* __KERNEL__ */ 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci#include <asm-generic/bitops/fls.h> 1778c2ecf20Sopenharmony_ci#include <asm-generic/bitops/__fls.h> 1788c2ecf20Sopenharmony_ci#include <asm-generic/bitops/fls64.h> 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci#endif /* _H8300_BITOPS_H */ 181