[PATCH 2/6] lib/bitrev: Introduce GENERIC_BITREVERSE and cleanup Kconfig

Yury Norov
2026-04-30T21:14:06Z

From: Jinjie Ruan <ruanjinjie@huawei.com>

Currently, the bit reversal lookup table is controlled by
!HAVE_ARCH_BITREVERSE. This makes it difficult for architectures to
provide a hardware-accelerated implementation while still falling
back to the generic table for specific configurations.

Introduce CONFIG_GENERIC_BITREVERSE to explicitly manage the generic
lookup table implementation. By using 'def_bool !HAVE_ARCH_BITREVERSE'
with a dependency on 'BITREVERSE', we ensure that:

1. The table is only compiled when needed.
2. The .config is not polluted with useless options when BITREVERSE
is disabled.
3. Avoids bloating the .data section for architectures that have
full hardware bit-reverse support and don't need the table.

Update lib/bitrev.c to use CONFIG_GENERIC_BITREVERSE instead of
checking the absence of HAVE_ARCH_BITREVERSE. This provides a
cleaner interface for architectures like RISC-V that may want to
selectively use the generic implementation as a fallback.

Suggested-by: David Laight <David.Laight@ACULAB.COM>
Suggested-by: Yury Norov <ynorov@nvidia.com>
Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
Signed-off-by: Yury Norov <ynorov@nvidia.com>
---
lib/Kconfig | 18 ++++++++++++++++++
lib/bitrev.c | 4 ++--
2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/lib/Kconfig b/lib/Kconfig
index 00a9509636c1..3ac12308eb76 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -62,6 +62,24 @@ config HAVE_ARCH_BITREVERSE
This option enables the use of hardware bit-reversal instructions on
architectures which support such operations.

+config GENERIC_BITREVERSE
+ def_bool !HAVE_ARCH_BITREVERSE
+ depends on BITREVERSE
+ help
+ This option provides the standard software-based bit reversal
+ implementation using a lookup table.
+
+ Architecture-specific implementations (HAVE_ARCH_BITREVERSE)
+ and this generic version are not necessarily mutually exclusive
+ at the configuration level, but selecting this ensures that
+ the generic `bitrev8/16/32` functions are available when the
+ CPU does not provide native instructions (like RISC-V's ZBKB
+ extension).
+
+ If you are an architecture maintainer and your CPU has native
+ bit-reversal instructions, you should select HAVE_ARCH_BITREVERSE
+ to skip this table-based implementation.
+
config ARCH_HAS_STRNCPY_FROM_USER
bool

diff --git a/lib/bitrev.c b/lib/bitrev.c
index 81b56e0a7f32..3a53ff67aeba 100644
--- a/lib/bitrev.c
+++ b/lib/bitrev.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-#ifndef CONFIG_HAVE_ARCH_BITREVERSE
+#ifdef CONFIG_GENERIC_BITREVERSE
#include <linux/types.h>
#include <linux/module.h>
#include <linux/bitrev.h>
@@ -44,4 +44,4 @@ const u8 byte_rev_table[256] = {
};
EXPORT_SYMBOL_GPL(byte_rev_table);

-#endif /* CONFIG_HAVE_ARCH_BITREVERSE */
+#endif /* CONFIG_GENERIC_BITREVERSE */
--
2.51.0