18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#ifndef __ASM_CSKY_BITOPS_H 58c2ecf20Sopenharmony_ci#define __ASM_CSKY_BITOPS_H 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/compiler.h> 88c2ecf20Sopenharmony_ci#include <asm/barrier.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* 118c2ecf20Sopenharmony_ci * asm-generic/bitops/ffs.h 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_cistatic inline int ffs(int x) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci if (!x) 168c2ecf20Sopenharmony_ci return 0; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci asm volatile ( 198c2ecf20Sopenharmony_ci "brev %0\n" 208c2ecf20Sopenharmony_ci "ff1 %0\n" 218c2ecf20Sopenharmony_ci "addi %0, 1\n" 228c2ecf20Sopenharmony_ci : "=&r"(x) 238c2ecf20Sopenharmony_ci : "0"(x)); 248c2ecf20Sopenharmony_ci return x; 258c2ecf20Sopenharmony_ci} 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* 288c2ecf20Sopenharmony_ci * asm-generic/bitops/__ffs.h 298c2ecf20Sopenharmony_ci */ 308c2ecf20Sopenharmony_cistatic __always_inline unsigned long __ffs(unsigned long x) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci asm volatile ( 338c2ecf20Sopenharmony_ci "brev %0\n" 348c2ecf20Sopenharmony_ci "ff1 %0\n" 358c2ecf20Sopenharmony_ci : "=&r"(x) 368c2ecf20Sopenharmony_ci : "0"(x)); 378c2ecf20Sopenharmony_ci return x; 388c2ecf20Sopenharmony_ci} 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci/* 418c2ecf20Sopenharmony_ci * asm-generic/bitops/fls.h 428c2ecf20Sopenharmony_ci */ 438c2ecf20Sopenharmony_cistatic __always_inline int fls(unsigned int x) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci asm volatile( 468c2ecf20Sopenharmony_ci "ff1 %0\n" 478c2ecf20Sopenharmony_ci : "=&r"(x) 488c2ecf20Sopenharmony_ci : "0"(x)); 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci return (32 - x); 518c2ecf20Sopenharmony_ci} 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* 548c2ecf20Sopenharmony_ci * asm-generic/bitops/__fls.h 558c2ecf20Sopenharmony_ci */ 568c2ecf20Sopenharmony_cistatic __always_inline unsigned long __fls(unsigned long x) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci return fls(x) - 1; 598c2ecf20Sopenharmony_ci} 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#include <asm-generic/bitops/ffz.h> 628c2ecf20Sopenharmony_ci#include <asm-generic/bitops/fls64.h> 638c2ecf20Sopenharmony_ci#include <asm-generic/bitops/find.h> 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci#ifndef _LINUX_BITOPS_H 668c2ecf20Sopenharmony_ci#error only <linux/bitops.h> can be included directly 678c2ecf20Sopenharmony_ci#endif 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci#include <asm-generic/bitops/sched.h> 708c2ecf20Sopenharmony_ci#include <asm-generic/bitops/hweight.h> 718c2ecf20Sopenharmony_ci#include <asm-generic/bitops/lock.h> 728c2ecf20Sopenharmony_ci#include <asm-generic/bitops/atomic.h> 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* 758c2ecf20Sopenharmony_ci * bug fix, why only could use atomic!!!! 768c2ecf20Sopenharmony_ci */ 778c2ecf20Sopenharmony_ci#include <asm-generic/bitops/non-atomic.h> 788c2ecf20Sopenharmony_ci#define __clear_bit(nr, vaddr) clear_bit(nr, vaddr) 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci#include <asm-generic/bitops/le.h> 818c2ecf20Sopenharmony_ci#include <asm-generic/bitops/ext2-atomic.h> 828c2ecf20Sopenharmony_ci#endif /* __ASM_CSKY_BITOPS_H */ 83