Patchwork [U-Boot,v2,5/7] lib: import bitrev library from the linux kernel

login
register
mail settings
Submitter Mike Dunn
Date April 11, 2013, 12:45 a.m.
Message ID <1365641128-15812-6-git-send-email-mikedunn@newsguy.com>
Download mbox | patch
Permalink /patch/235527/
State Superseded
Delegated to: Marek Vasut
Headers show

Comments

Mike Dunn - April 11, 2013, 12:45 a.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.

[port from linux kernel 2.6.20 commit a5cfc1ec58a07074dacb6aa8c79eff864c966d12]

Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
---
 include/linux/bitrev.h |   23 ++++++++++++++++++
 lib/Makefile           |    1 +
 lib/bitrev.c           |   59 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/bitrev.h
 create mode 100644 lib/bitrev.c
Marek Vasut - April 11, 2013, 7:19 p.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.
> 
> [port from linux kernel 2.6.20 commit
> a5cfc1ec58a07074dacb6aa8c79eff864c966d12]

Why did you port it from such an ancient kernel? Newer version is not an option?

Best regards,
Marek Vasut
Mike Dunn - April 12, 2013, 12:01 p.m.
On 04/11/2013 12:19 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.
>>
>> [port from linux kernel 2.6.20 commit
>> a5cfc1ec58a07074dacb6aa8c79eff864c966d12]
> 
> Why did you port it from such an ancient kernel? Newer version is not an option?


Maybe I misunderstood and gave the wrong information (probably, now that I think
about it).  I took it fom the latest kernel, but reported the commit that added
it to the kernel.

In this case, it's a simple algorithm and only a couple trivial changes were
made since it was first added to the kernel, so the error is probably
inconsequential, but I'll resubmit, reporting the HEAD of the kernel I took it
from if you like.

BTW, I did the same for the docg4 driver, but I did the u-boot port a while ago,
so in that case it's correct, at least practically.  Since I did the port, the
kernel docg4 driver had some enhancements (reliable mode) that still need to be
brought into u-boot.

Thanks Marek,
Mike
Marek Vasut - April 12, 2013, 5:28 p.m.
Dear Mike Dunn,

> On 04/11/2013 12:19 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.
> >> 
> >> [port from linux kernel 2.6.20 commit
> >> a5cfc1ec58a07074dacb6aa8c79eff864c966d12]
> > 
> > Why did you port it from such an ancient kernel? Newer version is not an
> > option?
> 
> Maybe I misunderstood and gave the wrong information (probably, now that I
> think about it).  I took it fom the latest kernel, but reported the commit
> that added it to the kernel.
> 
> In this case, it's a simple algorithm and only a couple trivial changes
> were made since it was first added to the kernel, so the error is probably
> inconsequential, but I'll resubmit, reporting the HEAD of the kernel I
> took it from if you like.
> 
> BTW, I did the same for the docg4 driver, but I did the u-boot port a while
> ago, so in that case it's correct, at least practically.  Since I did the
> port, the kernel docg4 driver had some enhancements (reliable mode) that

Knowing which tag in linux-stable you pulled it from is a good information too, 
yes.

Best regards,
Marek Vasut
Wolfgang Denk - April 13, 2013, 7:27 p.m.
Dear Mike Dunn,

In message <5167F7B4.3070007@newsguy.com> you wrote:
>
> In this case, it's a simple algorithm and only a couple trivial changes were
> made since it was first added to the kernel, so the error is probably
> inconsequential, but I'll resubmit, reporting the HEAD of the kernel I took it
> from if you like.

Please use the git commit ID of the exact kernel version which you
used to copy the code from, not any older nor any more recent version.

Thanks.

Best regards,

Wolfgang Denk

Patch

diff --git a/include/linux/bitrev.h b/include/linux/bitrev.h
new file mode 100644
index 0000000..a61d956
--- /dev/null
+++ b/include/linux/bitrev.h
@@ -0,0 +1,23 @@ 
+/*
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ *
+ * Based on bitrev from the Linux kernel, by Akinobu Mita
+ */
+
+#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];
+}
+
+u16 bitrev16(u16 in);
+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..160021a
--- /dev/null
+++ b/lib/bitrev.c
@@ -0,0 +1,59 @@ 
+/*
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+ *
+ * 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);
+}