arch/riscv: Add generic_ffs() func supported [1/1]
PD#SWPL-93083
Problem:
Add generic_ffs() func supported
Solution:
Add generic_ffs() func supported
Verify:
N/A
Change-Id: I9db78fd3ed521dad5e70286c055c9bd9671988bd
Signed-off-by: xiaohu.huang <xiaohu.huang@amlogic.com>
diff --git a/common.h b/common.h
index 1616750..601cf33 100644
--- a/common.h
+++ b/common.h
@@ -31,6 +31,36 @@
REG32((unsigned long)addr) = _v; \
} while (0)
+static inline int generic_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)) {
+ x >>= 1;
+ r += 1;
+ }
+ return r;
+}
+#define ffs(x) generic_ffs(x)
+
#ifndef FIELD_PREP
#define FIELD_PREP(_mask, _val) (((typeof(_mask))(_val) << (ffs(_mask) - 1)) & (_mask))
#endif