(((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
/**
- * ffs - Find first bit set
- * @x: the word to search
- *
- * This is defined the same way as
- * the libc and compiler builtin ffs routines, therefore
- * differs in spirit from the above ffz (man ffs).
- */
-static inline int ffs(int x)
-{
- int r = 1;
-
- if (!x)
- return 0;
- if (!(x & 0xffff)) {
- x >>= 16;
- r += 16;
- }
- if (!(x & 0xff)) {
- x >>= 8;
- r += 8;
- }
- if (!(x & 0xf)) {
- x >>= 4;
- r += 4;
- }
- if (!(x & 3)) {
- x >>= 2;
- r += 2;
- }
- if (!(x & 1))
- r += 1;
- return r;
-}
-
-/**
- * __ffs - find first bit in word.
+ * sbi_ffs - find first (less-significant) set bit in a long word.
* @word: The word to search
*
* Undefined if no bit exists, so code should check against 0 first.
*/
-static inline int __ffs(unsigned long word)
+static inline int sbi_ffs(unsigned long word)
{
int num = 0;
}
/*
- * ffz - find first zero in word.
+ * sbi_ffz - find first zero in word.
* @word: The word to search
*
* Undefined if no zero exists, so code should check against ~0UL first.
*/
-#define ffz(x) __ffs(~(x))
-
-/**
- * fls - find last (most-significant) bit set
- * @x: the word to search
- *
- * This is defined the same way as ffs.
- * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
- */
-
-static inline int fls(int x)
-{
- int r = 32;
-
- if (!x)
- return 0;
- if (!(x & 0xffff0000u)) {
- x <<= 16;
- r -= 16;
- }
- if (!(x & 0xff000000u)) {
- x <<= 8;
- r -= 8;
- }
- if (!(x & 0xf0000000u)) {
- x <<= 4;
- r -= 4;
- }
- if (!(x & 0xc0000000u)) {
- x <<= 2;
- r -= 2;
- }
- if (!(x & 0x80000000u))
- r -= 1;
- return r;
-}
+#define sbi_ffz(x) sbi_ffs(~(x))
/**
- * __fls - find last (most-significant) set bit in a long word
+ * sbi_fls - find last (most-significant) set bit in a long word
* @word: the word to search
*
* Undefined if no set bit exists, so code should check against 0 first.
*/
-static inline unsigned long __fls(unsigned long word)
+static inline unsigned long sbi_fls(unsigned long word)
{
int num = BITS_PER_LONG - 1;
if (tmp == 0UL) /* Are any bits set? */
return result + size; /* Nope. */
found:
- return result + __ffs(tmp);
+ return result + sbi_ffs(tmp);
}
/**
if (tmp == ~0UL) /* Are any bits zero? */
return result + size; /* Nope. */
found:
- return result + ffz(tmp);
+ return result + sbi_ffz(tmp);
}
/**
tmp = addr[--words];
if (tmp) {
found:
- return words * BITS_PER_LONG + __fls(tmp);
+ return words * BITS_PER_LONG + sbi_fls(tmp);
}
}
if (tmp == 0UL) /* Are any bits set? */
return result + size; /* Nope. */
found_middle:
- return result + __ffs(tmp);
+ return result + sbi_ffs(tmp);
}
/**
if (tmp == ~0UL) /* Are any bits zero? */
return result + size; /* Nope. */
found_middle:
- return result + ffz(tmp);
+ return result + sbi_ffz(tmp);
}
if (trap.cause)
return 0;
}
- num_bits = __fls(val) + 1;
+ num_bits = sbi_fls(val) + 1;
#if __riscv_xlen == 32
csr_write_allowed(CSR_MHPMCOUNTER3H, (ulong)&trap, val);
if (!trap.cause) {
if (trap.cause)
return num_bits;
}
- num_bits += __fls(val) + 1;
+ num_bits += sbi_fls(val) + 1;
#endif
*/
val = hart_pmp_get_allowed_addr();
if (val) {
- hfeatures->pmp_gran = 1 << (__ffs(val) + 2);
- hfeatures->pmp_addr_bits = __fls(val) + 1;
+ hfeatures->pmp_gran = 1 << (sbi_ffs(val) + 2);
+ hfeatures->pmp_addr_bits = sbi_fls(val) + 1;
/* Detect number of PMP regions. At least PMPADDR0 should be implemented*/
__check_csr_64(CSR_PMPADDR0, 0, val, pmp_count, __pmp_skip);
}
int ret = SBI_EINVAL;
bool bUpdate = FALSE;
- if (__fls(ctr_mask) >= total_ctrs)
+ if (sbi_fls(ctr_mask) >= total_ctrs)
return ret;
if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)
uint32_t event_code;
unsigned long ctr_mask = cmask << cbase;
- if (__fls(ctr_mask) >= total_ctrs)
+ if (sbi_fls(ctr_mask) >= total_ctrs)
return SBI_EINVAL;
for_each_set_bit_from(cbase, &ctr_mask, total_ctrs) {
unsigned long tmp = cidx_mask << cidx_base;
/* Do a basic sanity check of counter base & mask */
- if (__fls(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
+ if (sbi_fls(tmp) >= total_ctrs || event_type >= SBI_PMU_EVENT_TYPE_MAX)
return SBI_EINVAL;
if (flags & SBI_PMU_CFG_FLAG_SKIP_MATCH) {
while (pos < end) {
rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1);
if (rsize)
- rsize = 1UL << __ffs(pos);
+ rsize = 1UL << sbi_ffs(pos);
else
rsize = ((end - pos) < MTIMER_ADD_REGION_ALIGN) ?
(end - pos) : MTIMER_ADD_REGION_ALIGN;