Patchwork [U-Boot,6/8] lib: import bitrev library from linux kernel

login
register
mail settings
Submitter Mike Dunn
Date April 7, 2013, 4:41 p.m.
Message ID <1365352865-2137-7-git-send-email-mikedunn@newsguy.com>
Download mbox | patch
Permalink /patch/234523/
State Superseded
Delegated to: Albert ARIBAUD
Headers show

Comments

Mike Dunn - April 7, 2013, 4:41 p.m.
This patch adds the bitrev library from the linux kernel.  This is a simple
algorithm that uses an 8 bit look-up table to reverse the bits in data types of
8, 16, or 32 bit widths.  The docg4 nand flash driver uses it.

Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
---
 include/linux/bitrev.h |   16 +++++++++++++
 lib/Makefile           |    1 +
 lib/bitrev.c           |   56 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 73 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/bitrev.h
 create mode 100644 lib/bitrev.c
Marek Vasut - April 8, 2013, 6:23 a.m.
Dear Mike Dunn,

> This patch adds the bitrev library from the linux kernel.  This is a simple
> algorithm that uses an 8 bit look-up table to reverse the bits in data
> types of 8, 16, or 32 bit widths.  The docg4 nand flash driver uses it.
> 
> Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
> ---
>  include/linux/bitrev.h |   16 +++++++++++++
>  lib/Makefile           |    1 +
>  lib/bitrev.c           |   56
> ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73
> insertions(+), 0 deletions(-)
>  create mode 100644 include/linux/bitrev.h
>  create mode 100644 lib/bitrev.c
> 
> diff --git a/include/linux/bitrev.h b/include/linux/bitrev.h
> new file mode 100644
> index 0000000..7ffe03f
> --- /dev/null
> +++ b/include/linux/bitrev.h
> @@ -0,0 +1,16 @@
> +#ifndef _LINUX_BITREV_H
> +#define _LINUX_BITREV_H
> +
> +#include <linux/types.h>
> +
> +extern u8 const byte_rev_table[256];
> +
> +static inline u8 bitrev8(u8 byte)
> +{
> +	return byte_rev_table[byte];
> +}
> +
> +extern u16 bitrev16(u16 in);
> +extern u32 bitrev32(u32 in);

Do we really need to expose the array and use so many externs here?

[...]
Wolfgang Denk - April 8, 2013, 7:38 a.m.
Dear Mike Dunn,

In message <1365352865-2137-7-git-send-email-mikedunn@newsguy.com> you wrote:
> This patch adds the bitrev library from the linux kernel.  This is a simple
-------------------------------------^^^^^^^^^^^^^^^^^^^^^^

Please read bullet # 4 at
http://www.denx.de/wiki/view/U-Boot/Patches#Attributing_Code_Copyrights_Sign
and provide exact reference.

Best regards,

Wolfgang Denk
Mike Dunn - April 8, 2013, 4:46 p.m.
On 04/07/2013 11:23 PM, Marek Vasut wrote:
> Dear Mike Dunn,
> 
>> This patch adds the bitrev library from the linux kernel.  This is a simple
>> algorithm that uses an 8 bit look-up table to reverse the bits in data
>> types of 8, 16, or 32 bit widths.  The docg4 nand flash driver uses it.
>>
>> Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
>> ---
>>  include/linux/bitrev.h |   16 +++++++++++++
>>  lib/Makefile           |    1 +
>>  lib/bitrev.c           |   56
>> ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73
>> insertions(+), 0 deletions(-)
>>  create mode 100644 include/linux/bitrev.h
>>  create mode 100644 lib/bitrev.c
>>
>> diff --git a/include/linux/bitrev.h b/include/linux/bitrev.h
>> new file mode 100644
>> index 0000000..7ffe03f
>> --- /dev/null
>> +++ b/include/linux/bitrev.h
>> @@ -0,0 +1,16 @@
>> +#ifndef _LINUX_BITREV_H
>> +#define _LINUX_BITREV_H
>> +
>> +#include <linux/types.h>
>> +
>> +extern u8 const byte_rev_table[256];
>> +
>> +static inline u8 bitrev8(u8 byte)
>> +{
>> +	return byte_rev_table[byte];
>> +}
>> +
>> +extern u16 bitrev16(u16 in);
>> +extern u32 bitrev32(u32 in);
> 
> Do we really need to expose the array and use so many externs here?



Yeah, I don't know why the function prototypes were given the 'extern'
specifier.  This is how it is in the kernel.  They aren't necessary.

As for the table... if the bitrev8() function is moved to bitrev.c, the table
need not be extern.  But if I'm not mistaken, bitrev8() is in the header so that
it can be inlined by the compiler.  So for the sake of performance I think the
extern is appropriate for the table.

Thanks Marek,
Mike

Patch

diff --git a/include/linux/bitrev.h b/include/linux/bitrev.h
new file mode 100644
index 0000000..7ffe03f
--- /dev/null
+++ b/include/linux/bitrev.h
@@ -0,0 +1,16 @@ 
+#ifndef _LINUX_BITREV_H
+#define _LINUX_BITREV_H
+
+#include <linux/types.h>
+
+extern u8 const byte_rev_table[256];
+
+static inline u8 bitrev8(u8 byte)
+{
+	return byte_rev_table[byte];
+}
+
+extern u16 bitrev16(u16 in);
+extern u32 bitrev32(u32 in);
+
+#endif /* _LINUX_BITREV_H */
diff --git a/lib/Makefile b/lib/Makefile
index 1bfd3ee..b4aaae9 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -55,6 +55,7 @@  COBJS-$(CONFIG_SHA1) += sha1.o
 COBJS-$(CONFIG_SHA256) += sha256.o
 COBJS-y	+= strmhz.o
 COBJS-$(CONFIG_RBTREE)	+= rbtree.o
+COBJS-$(CONFIG_BITREVERSE) += bitrev.o
 endif
 
 ifdef CONFIG_SPL_BUILD
diff --git a/lib/bitrev.c b/lib/bitrev.c
new file mode 100644
index 0000000..3448e3f
--- /dev/null
+++ b/lib/bitrev.c
@@ -0,0 +1,56 @@ 
+/*
+ * Based on bitrev from the Linux kernel, by Akinobu Mita
+ */
+
+
+#include <linux/types.h>
+#include <linux/bitrev.h>
+
+const u8 byte_rev_table[256] = {
+	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+	0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+	0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+	0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+	0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+	0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+	0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+	0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+	0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+	0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+	0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+	0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+	0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+	0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+	0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+	0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+	0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+	0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+	0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+	0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+	0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+	0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+	0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+	0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+	0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+	0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+	0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+	0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+	0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+	0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+	0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
+};
+
+u16 bitrev16(u16 x)
+{
+	return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8);
+}
+
+/**
+ * bitrev32 - reverse the order of bits in a u32 value
+ * @x: value to be bit-reversed
+ */
+u32 bitrev32(u32 x)
+{
+	return (bitrev16(x & 0xffff) << 16) | bitrev16(x >> 16);
+}