linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch V4 00/31] bitops: add parity functions
@ 2016-05-11  8:25 zengzhaoxiu
  2016-05-11  8:47 ` [patch V4 01/31] " zengzhaoxiu
                   ` (30 more replies)
  0 siblings, 31 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  8:25 UTC (permalink / raw)
  To: akpm, linux, bp, ulrik.debie-os, sam, davem, ddaney.cavm, joe,
	computersforpeace
  Cc: linux-kernel, linux-arch, linux-alpha, adi-buildroot-devel,
	linux-ia64, linux-mips, linux-am33-list, linuxppc-dev,
	sparclinux, qat-linux, linux-crypto, linux-edac, linux-media,
	linux-mtd, netdev, linux-scsi, linux-nfs, linux-mediatek,
	Zhaoxiu Zeng

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

When I do "grep parity -r linux", I found many parity calculations
distributed in many drivers.

This patch series does:
  1. provide generic and architecture-specific parity calculations
  2. remove drivers' local parity calculations, use bitops' parity
     functions instead
  3. replace "hweightN(x) & 1" with "parityN(x)" to improve readability,
     and improve performance on some CPUs that without popcount support

I did not use GCC's __builtin_parity* functions, based on the following reasons:
  1. I don't know where to identify which version of GCC from the beginning
     supported __builtin_parity for the architecture.
  2. For the architecture that doesn't has popcount instruction, GCC instead use
     "call __paritysi2" (__paritydi2 for 64-bits). So if use __builtin_parity, we must
     provide __paritysi2 and __paritydi2 functions for these architectures.
     Additionally, parity4,8,16 might be "__builtin_parity(x & mask)", but the "& mask"
     operation is totally unnecessary.
  3. For the architecture that has popcount instruction, we do the same things as GCC.
  4. For powerpc, sparc, and x86, we do runtime patching to use popcount instruction
     if the CPU support.

I have compiled successfully with x86_64_defconfig, i386_defconfig, pseries_defconfig
and sparc64_defconfig.

Changes to V3:
- Remove "odd" and "even" from documents. The function parityN returns whether an odd
  or even number of bits are on in a N-bit word, does not involve the definition of
  odd/even parity. Is it an odd or even parity checking, depends on the caller's context.
- Replace "hweightN(x) % 2" with "parityN(x)" in crypto/sahara.c and edac/amd64_edac.c
- Use PARITY_MAGIC instead of 0x6996 in powerpc's parity_64.S
- Use PARITY_MAGIC instead of 0x6996 in sparc's parity.S
- Pick up ACKs

Changes to v2:
- X86, remove custom calling convention, use inline asm
- Add constant PARITY_MAGIC (proposals by Sam Ravnborg)
- Add include/asm-generic/bitops/popc-parity.h (proposals by Chris Metcalf)
- Tile uses popc-parity.h directly
- Mips uses popc-parity.h if has usable __builtin_popcount
- Add few comments in powerpc's and sparc's parity.S

Changes to v1:
- Add runtime patching for powerpc, sparc, and x86
- Avr32 use grenric parity too
- Fix error in ssfdc's patch, and add commit message
- Don't change the original code composition of adxrs450.c
- Directly assignement to phy_cap.parity in drivers/scsi/isci/phy.c

Regards,

=== diffstat ===

Zhaoxiu Zeng (31):
  bitops: add parity functions
  bitops: Include generic parity.h in some architectures' bitops.h
  bitops: Add alpha-specific parity functions
  bitops: Add blackfin-specific parity functions
  bitops: Add ia-specific parity functions
  bitops: Tile and MIPS (if has usable __builtin_popcount) use popcount
    parity functions
  bitops: Add powerpc-specific parity functions
  bitops: Add sparc-specific parity functions
  bitops: Add x86-specific parity functions
  sunrpc: use parity8
  mips: use parity functions in cerr-sb1.c
  lib: bch: use parity32
  media: use parity8 in vivid-vbi-gen.c
  media: use parity functions in saa7115
  input: use parity32 in grip_mp
  input: use parity64 in sidewinder
  input: use parity16 in ams_delta_serio
  scsi: use parity32 in isci's phy
  mtd: use parity16 in ssfdc
  mtd: use parity functions in inftlcore
  crypto: use parity functions in qat_hal
  mtd: use parity16 in sm_ftl
  ethernet: use parity8 in sun/niu.c
  input: use parity8 in pcips2
  input: use parity8 in sa1111ps2
  iio: use parity32 in adxrs450
  serial: use parity32 in max3100
  input: use parity8 in elantech
  ethernet: use parity8 in broadcom/tg3.c
  crypto: use parity_long is sahara.c
  edac: use parity8 in amd64_edac.c

 arch/alpha/include/asm/bitops.h              |  27 +++++
 arch/arc/include/asm/bitops.h                |   1 +
 arch/arm/include/asm/bitops.h                |   1 +
 arch/arm64/include/asm/bitops.h              |   1 +
 arch/avr32/include/asm/bitops.h              |   1 +
 arch/blackfin/include/asm/bitops.h           |  31 ++++++
 arch/c6x/include/asm/bitops.h                |   1 +
 arch/cris/include/asm/bitops.h               |   1 +
 arch/frv/include/asm/bitops.h                |   1 +
 arch/h8300/include/asm/bitops.h              |   1 +
 arch/hexagon/include/asm/bitops.h            |   1 +
 arch/ia64/include/asm/bitops.h               |  31 ++++++
 arch/m32r/include/asm/bitops.h               |   1 +
 arch/m68k/include/asm/bitops.h               |   1 +
 arch/metag/include/asm/bitops.h              |   1 +
 arch/mips/include/asm/bitops.h               |   7 ++
 arch/mips/mm/cerr-sb1.c                      |  67 ++++---------
 arch/mn10300/include/asm/bitops.h            |   1 +
 arch/openrisc/include/asm/bitops.h           |   1 +
 arch/parisc/include/asm/bitops.h             |   1 +
 arch/powerpc/include/asm/bitops.h            |  11 +++
 arch/powerpc/lib/Makefile                    |   2 +-
 arch/powerpc/lib/parity_64.S                 | 143 +++++++++++++++++++++++++++
 arch/powerpc/lib/ppc_ksyms.c                 |   5 +
 arch/s390/include/asm/bitops.h               |   1 +
 arch/sh/include/asm/bitops.h                 |   1 +
 arch/sparc/include/asm/bitops_32.h           |   1 +
 arch/sparc/include/asm/bitops_64.h           |  18 ++++
 arch/sparc/kernel/sparc_ksyms_64.c           |   6 ++
 arch/sparc/lib/Makefile                      |   2 +-
 arch/sparc/lib/parity.S                      | 129 ++++++++++++++++++++++++
 arch/tile/include/asm/bitops.h               |   2 +
 arch/x86/include/asm/arch_hweight.h          |   5 +
 arch/x86/include/asm/arch_parity.h           | 117 ++++++++++++++++++++++
 arch/x86/include/asm/bitops.h                |   4 +-
 arch/xtensa/include/asm/bitops.h             |   1 +
 drivers/crypto/qat/qat_common/qat_hal.c      |  32 ++----
 drivers/crypto/sahara.c                      |   2 +-
 drivers/edac/amd64_edac.c                    |   2 +-
 drivers/iio/gyro/adxrs450.c                  |   4 +-
 drivers/input/joystick/grip_mp.c             |  16 +--
 drivers/input/joystick/sidewinder.c          |  24 +----
 drivers/input/mouse/elantech.c               |  10 +-
 drivers/input/mouse/elantech.h               |   1 -
 drivers/input/serio/ams_delta_serio.c        |   8 +-
 drivers/input/serio/pcips2.c                 |   2 +-
 drivers/input/serio/sa1111ps2.c              |   2 +-
 drivers/media/i2c/saa7115.c                  |  17 +---
 drivers/media/platform/vivid/vivid-vbi-gen.c |   9 +-
 drivers/mtd/inftlcore.c                      |  17 +---
 drivers/mtd/sm_ftl.c                         |   5 +-
 drivers/mtd/ssfdc.c                          |  31 ++----
 drivers/net/ethernet/broadcom/tg3.c          |   6 +-
 drivers/net/ethernet/sun/niu.c               |  10 +-
 drivers/scsi/isci/phy.c                      |  15 +--
 drivers/tty/serial/max3100.c                 |   2 +-
 include/asm-generic/bitops.h                 |   1 +
 include/asm-generic/bitops/arch_parity.h     |  39 ++++++++
 include/asm-generic/bitops/const_parity.h    |  36 +++++++
 include/asm-generic/bitops/parity.h          |   7 ++
 include/asm-generic/bitops/popc-parity.h     |  32 ++++++
 include/linux/bitops.h                       |  10 ++
 lib/bch.c                                    |  14 +--
 net/sunrpc/auth_gss/gss_krb5_keys.c          |   6 +-
 64 files changed, 749 insertions(+), 237 deletions(-)
 create mode 100644 arch/powerpc/lib/parity_64.S
 create mode 100644 arch/sparc/lib/parity.S
 create mode 100644 arch/x86/include/asm/arch_parity.h
 create mode 100644 include/asm-generic/bitops/arch_parity.h
 create mode 100644 include/asm-generic/bitops/const_parity.h
 create mode 100644 include/asm-generic/bitops/parity.h
 create mode 100644 include/asm-generic/bitops/popc-parity.h

-- 
2.7.4

^ permalink raw reply	[flat|nested] 55+ messages in thread

* [patch V4 01/31] bitops: add parity functions
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
@ 2016-05-11  8:47 ` zengzhaoxiu
  2016-05-11 14:32   ` Martin Kepplinger
  2016-05-11  9:06 ` [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h zengzhaoxiu
                   ` (29 subsequent siblings)
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  8:47 UTC (permalink / raw)
  To: linux-kernel, linux, ulrik.debie-os
  Cc: Zhaoxiu Zeng, Arnd Bergmann, Martin Kepplinger, Andrew Morton,
	Sasha Levin, Ingo Molnar, Denys Vlasenko, linux-arch

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Add generic parity functions, adapted from
"https://graphics.stanford.edu/~seander/bithacks.html#ParityParallel".

The function parityN returns whether an odd or even number of bits are on
in a N-bit word.

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 include/asm-generic/bitops.h              |  1 +
 include/asm-generic/bitops/arch_parity.h  | 39 +++++++++++++++++++++++++++++++
 include/asm-generic/bitops/const_parity.h | 36 ++++++++++++++++++++++++++++
 include/asm-generic/bitops/parity.h       |  7 ++++++
 include/asm-generic/bitops/popc-parity.h  | 32 +++++++++++++++++++++++++
 include/linux/bitops.h                    | 10 ++++++++
 6 files changed, 125 insertions(+)
 create mode 100644 include/asm-generic/bitops/arch_parity.h
 create mode 100644 include/asm-generic/bitops/const_parity.h
 create mode 100644 include/asm-generic/bitops/parity.h
 create mode 100644 include/asm-generic/bitops/popc-parity.h

diff --git a/include/asm-generic/bitops.h b/include/asm-generic/bitops.h
index dcdcacf..d85722f 100644
--- a/include/asm-generic/bitops.h
+++ b/include/asm-generic/bitops.h
@@ -27,6 +27,7 @@
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/ffs.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 
 #include <asm-generic/bitops/atomic.h>
diff --git a/include/asm-generic/bitops/arch_parity.h b/include/asm-generic/bitops/arch_parity.h
new file mode 100644
index 0000000..813e152
--- /dev/null
+++ b/include/asm-generic/bitops/arch_parity.h
@@ -0,0 +1,39 @@
+#ifndef _ASM_GENERIC_BITOPS_ARCH_PARITY_H_
+#define _ASM_GENERIC_BITOPS_ARCH_PARITY_H_
+
+#include <asm/types.h>
+
+/*
+ * Refrence to 'https://graphics.stanford.edu/~seander/bithacks.html#ParityParallel'.
+ */
+
+static inline unsigned int __arch_parity4(unsigned int w)
+{
+	w &= 0xf;
+	return ((PARITY_MAGIC) >> w) & 1;
+}
+
+static inline unsigned int __arch_parity8(unsigned int w)
+{
+	w ^= w >> 4;
+	return __arch_parity4(w);
+}
+
+static inline unsigned int __arch_parity16(unsigned int w)
+{
+	w ^= w >> 8;
+	return __arch_parity8(w);
+}
+
+static inline unsigned int __arch_parity32(unsigned int w)
+{
+	w ^= w >> 16;
+	return __arch_parity16(w);
+}
+
+static inline unsigned int __arch_parity64(__u64 w)
+{
+	return __arch_parity32((unsigned int)(w >> 32) ^ (unsigned int)w);
+}
+
+#endif /* _ASM_GENERIC_BITOPS_ARCH_PARITY_H_ */
diff --git a/include/asm-generic/bitops/const_parity.h b/include/asm-generic/bitops/const_parity.h
new file mode 100644
index 0000000..3970546
--- /dev/null
+++ b/include/asm-generic/bitops/const_parity.h
@@ -0,0 +1,36 @@
+#ifndef _ASM_GENERIC_BITOPS_CONST_PARITY_H_
+#define _ASM_GENERIC_BITOPS_CONST_PARITY_H_
+
+/*
+ * Compile time versions of __arch_parityN()
+ */
+#define __const_parity4(w)   (((PARITY_MAGIC) >> ((w) & 0xf)) & 1)
+#define __const_parity8(w)   (__const_parity4((w) ^ ((w) >> 4)))
+#define __const_parity16(w)  (__const_parity8((w) ^ ((w) >> 8)))
+#define __const_parity32(w)  (__const_parity16((w) ^ ((w) >> 16)))
+#define __const_parity64(w)  (__const_parity32((w) ^ ((w) >> 32)))
+
+/*
+ * Generic interface.
+ */
+#define parity4(w)   (__builtin_constant_p(w) ? __const_parity4(w)  : __arch_parity4(w))
+#define parity8(w)   (__builtin_constant_p(w) ? __const_parity8(w)  : __arch_parity8(w))
+#define parity16(w)  (__builtin_constant_p(w) ? __const_parity16(w) : __arch_parity16(w))
+#define parity32(w)  (__builtin_constant_p(w) ? __const_parity32(w) : __arch_parity32(w))
+#define parity64(w)  (__builtin_constant_p(w) ? __const_parity64(w) : __arch_parity64(w))
+
+/*
+ * Interface for known constant arguments
+ */
+#define PARITY4(w)   (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity4(w))
+#define PARITY8(w)   (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity8(w))
+#define PARITY16(w)  (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity16(w))
+#define PARITY32(w)  (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity32(w))
+#define PARITY64(w)  (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity64(w))
+
+/*
+ * Type invariant interface to the compile time constant parity functions.
+ */
+#define PARITY(w)    PARITY64((u64)(w))
+
+#endif /* _ASM_GENERIC_BITOPS_CONST_PARITY_H_ */
diff --git a/include/asm-generic/bitops/parity.h b/include/asm-generic/bitops/parity.h
new file mode 100644
index 0000000..a91dce7
--- /dev/null
+++ b/include/asm-generic/bitops/parity.h
@@ -0,0 +1,7 @@
+#ifndef _ASM_GENERIC_BITOPS_PARITY_H_
+#define _ASM_GENERIC_BITOPS_PARITY_H_
+
+#include <asm-generic/bitops/arch_parity.h>
+#include <asm-generic/bitops/const_parity.h>
+
+#endif /* _ASM_GENERIC_BITOPS_PARITY_H_ */
diff --git a/include/asm-generic/bitops/popc-parity.h b/include/asm-generic/bitops/popc-parity.h
new file mode 100644
index 0000000..bf05999
--- /dev/null
+++ b/include/asm-generic/bitops/popc-parity.h
@@ -0,0 +1,32 @@
+#ifndef _ASM_GENERIC_BITOPS_POPC_PARITY_H_
+#define _ASM_GENERIC_BITOPS_POPC_PARITY_H_
+
+#include <asm/types.h>
+
+static inline unsigned int __arch_parity32(unsigned int w)
+{
+	return __builtin_popcount(w) & 1;
+}
+
+static inline unsigned int __arch_parity16(unsigned int w)
+{
+	return __arch_parity32(w & 0xffff);
+}
+
+static inline unsigned int __arch_parity8(unsigned int w)
+{
+	return __arch_parity32(w & 0xff);
+}
+
+static inline unsigned int __arch_parity4(unsigned int w)
+{
+	return __arch_parity32(w & 0xf);
+}
+
+static inline unsigned int __arch_parity64(__u64 w)
+{
+	return (unsigned int)__builtin_popcountll(w) & 1;
+}
+
+#endif
+
diff --git a/include/linux/bitops.h b/include/linux/bitops.h
index defeaac..c3ea19e 100644
--- a/include/linux/bitops.h
+++ b/include/linux/bitops.h
@@ -30,6 +30,11 @@ extern unsigned int __sw_hweight32(unsigned int w);
 extern unsigned long __sw_hweight64(__u64 w);
 
 /*
+ * a miniature 16-bit parity-table of 4-bits number
+ */
+#define	PARITY_MAGIC	0x6996
+
+/*
  * Include this here because some architectures need generic_ffs/fls in
  * scope
  */
@@ -80,6 +85,11 @@ static __always_inline unsigned long hweight_long(unsigned long w)
 	return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
 }
 
+static __always_inline unsigned int parity_long(unsigned long w)
+{
+	return sizeof(w) == 4 ? parity32(w) : parity64(w);
+}
+
 /**
  * rol64 - rotate a 64-bit value left
  * @word: value to rotate
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
  2016-05-11  8:47 ` [patch V4 01/31] " zengzhaoxiu
@ 2016-05-11  9:06 ` zengzhaoxiu
  2016-05-11 10:06   ` Jesper Nilsson
                     ` (3 more replies)
  2016-05-11  9:09 ` [patch V4 03/31] bitops: Add alpha-specific parity functions zengzhaoxiu
                   ` (28 subsequent siblings)
  30 siblings, 4 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Vineet Gupta, Russell King, Catalin Marinas,
	Will Deacon, Haavard Skinnemoen, Hans-Christian Egtvedt,
	Mark Salter, Aurelien Jacquiot, Mikael Starvik, Jesper Nilsson,
	Yoshinori Sato, Richard Kuo, Geert Uytterhoeven, James Hogan,
	David Howells, Koichi Yasutake, Jonas Bonn, James E.J. Bottomley,
	Helge Deller, Martin Schwidefsky, Heiko Carstens, Rich Felker,
	Chris Zankel, Max Filippov, Peter Zijlstra (Intel),
	Masahiro Yamada, Thomas Gleixner, Hendrik Brueckner,
	linux-snps-arc, linux-arm-kernel, linux-c6x-dev,
	linux-cris-kernel, uclinux-h8-devel, linux-hexagon, linux-m68k,
	linux-metag, linux-am33-list, linux, linux-parisc, linux-s390,
	linux-sh, linux-xtensa

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Simply use the generic version.

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no> [for avr32]
---
 arch/arc/include/asm/bitops.h      | 1 +
 arch/arm/include/asm/bitops.h      | 1 +
 arch/arm64/include/asm/bitops.h    | 1 +
 arch/avr32/include/asm/bitops.h    | 1 +
 arch/c6x/include/asm/bitops.h      | 1 +
 arch/cris/include/asm/bitops.h     | 1 +
 arch/frv/include/asm/bitops.h      | 1 +
 arch/h8300/include/asm/bitops.h    | 1 +
 arch/hexagon/include/asm/bitops.h  | 1 +
 arch/m32r/include/asm/bitops.h     | 1 +
 arch/m68k/include/asm/bitops.h     | 1 +
 arch/metag/include/asm/bitops.h    | 1 +
 arch/mn10300/include/asm/bitops.h  | 1 +
 arch/openrisc/include/asm/bitops.h | 1 +
 arch/parisc/include/asm/bitops.h   | 1 +
 arch/s390/include/asm/bitops.h     | 1 +
 arch/sh/include/asm/bitops.h       | 1 +
 arch/xtensa/include/asm/bitops.h   | 1 +
 18 files changed, 18 insertions(+)

diff --git a/arch/arc/include/asm/bitops.h b/arch/arc/include/asm/bitops.h
index 0352fb8..7967e47 100644
--- a/arch/arc/include/asm/bitops.h
+++ b/arch/arc/include/asm/bitops.h
@@ -370,6 +370,7 @@ static inline __attribute__ ((const)) int __ffs(unsigned long x)
 #define ffz(x)	__ffs(~(x))
 
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/lock.h>
diff --git a/arch/arm/include/asm/bitops.h b/arch/arm/include/asm/bitops.h
index e943e6c..99f28a6 100644
--- a/arch/arm/include/asm/bitops.h
+++ b/arch/arm/include/asm/bitops.h
@@ -313,6 +313,7 @@ static inline unsigned long __ffs(unsigned long x)
 
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 
 #ifdef __ARMEB__
diff --git a/arch/arm64/include/asm/bitops.h b/arch/arm64/include/asm/bitops.h
index 9c19594..eac4965 100644
--- a/arch/arm64/include/asm/bitops.h
+++ b/arch/arm64/include/asm/bitops.h
@@ -44,6 +44,7 @@ extern int test_and_change_bit(int nr, volatile unsigned long *p);
 
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 
 #include <asm-generic/bitops/non-atomic.h>
diff --git a/arch/avr32/include/asm/bitops.h b/arch/avr32/include/asm/bitops.h
index 910d537..9f4a2ce 100644
--- a/arch/avr32/include/asm/bitops.h
+++ b/arch/avr32/include/asm/bitops.h
@@ -298,6 +298,7 @@ static inline int ffs(unsigned long word)
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 
 extern unsigned long find_next_zero_bit_le(const void *addr,
diff --git a/arch/c6x/include/asm/bitops.h b/arch/c6x/include/asm/bitops.h
index f0ab012..94eb0d1 100644
--- a/arch/c6x/include/asm/bitops.h
+++ b/arch/c6x/include/asm/bitops.h
@@ -87,6 +87,7 @@ static inline int ffs(int x)
 
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 
 #include <asm-generic/bitops/atomic.h>
diff --git a/arch/cris/include/asm/bitops.h b/arch/cris/include/asm/bitops.h
index 8062cb5..06bc246 100644
--- a/arch/cris/include/asm/bitops.h
+++ b/arch/cris/include/asm/bitops.h
@@ -36,6 +36,7 @@
 #include <asm-generic/bitops/__fls.h>
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/lock.h>
 
diff --git a/arch/frv/include/asm/bitops.h b/arch/frv/include/asm/bitops.h
index 0df8e95..f2a7ee8 100644
--- a/arch/frv/include/asm/bitops.h
+++ b/arch/frv/include/asm/bitops.h
@@ -314,6 +314,7 @@ int __ilog2_u64(u64 n)
 
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 
 #include <asm-generic/bitops/le.h>
diff --git a/arch/h8300/include/asm/bitops.h b/arch/h8300/include/asm/bitops.h
index 05999ab..e392db2 100644
--- a/arch/h8300/include/asm/bitops.h
+++ b/arch/h8300/include/asm/bitops.h
@@ -172,6 +172,7 @@ static inline unsigned long __ffs(unsigned long word)
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 #include <asm-generic/bitops/le.h>
 #include <asm-generic/bitops/ext2-atomic.h>
diff --git a/arch/hexagon/include/asm/bitops.h b/arch/hexagon/include/asm/bitops.h
index 5e4a59b..2df614e 100644
--- a/arch/hexagon/include/asm/bitops.h
+++ b/arch/hexagon/include/asm/bitops.h
@@ -290,6 +290,7 @@ static inline unsigned long __fls(unsigned long word)
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 
 #include <asm-generic/bitops/le.h>
 #include <asm-generic/bitops/ext2-atomic.h>
diff --git a/arch/m32r/include/asm/bitops.h b/arch/m32r/include/asm/bitops.h
index 86ba2b4..e3cf46b 100644
--- a/arch/m32r/include/asm/bitops.h
+++ b/arch/m32r/include/asm/bitops.h
@@ -259,6 +259,7 @@ static __inline__ int test_and_change_bit(int nr, volatile void * addr)
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/ffs.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 
 #endif /* __KERNEL__ */
diff --git a/arch/m68k/include/asm/bitops.h b/arch/m68k/include/asm/bitops.h
index b4a9b0d..fd673ea 100644
--- a/arch/m68k/include/asm/bitops.h
+++ b/arch/m68k/include/asm/bitops.h
@@ -519,6 +519,7 @@ static inline int __fls(int x)
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 #endif /* __KERNEL__ */
 
diff --git a/arch/metag/include/asm/bitops.h b/arch/metag/include/asm/bitops.h
index 2671134..ad13087 100644
--- a/arch/metag/include/asm/bitops.h
+++ b/arch/metag/include/asm/bitops.h
@@ -118,6 +118,7 @@ static inline int test_and_change_bit(unsigned int bit,
 #include <asm-generic/bitops/__fls.h>
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/le.h>
diff --git a/arch/mn10300/include/asm/bitops.h b/arch/mn10300/include/asm/bitops.h
index fe6f8e2..60761b7 100644
--- a/arch/mn10300/include/asm/bitops.h
+++ b/arch/mn10300/include/asm/bitops.h
@@ -225,6 +225,7 @@ int ffs(int x)
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/ext2-atomic-setbit.h>
 #include <asm-generic/bitops/le.h>
 
diff --git a/arch/openrisc/include/asm/bitops.h b/arch/openrisc/include/asm/bitops.h
index 3003cda..8c97642 100644
--- a/arch/openrisc/include/asm/bitops.h
+++ b/arch/openrisc/include/asm/bitops.h
@@ -43,6 +43,7 @@
 #include <asm-generic/bitops/sched.h>
 #include <asm/bitops/ffs.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 
 #include <asm-generic/bitops/atomic.h>
diff --git a/arch/parisc/include/asm/bitops.h b/arch/parisc/include/asm/bitops.h
index 3f9406d..867ba10 100644
--- a/arch/parisc/include/asm/bitops.h
+++ b/arch/parisc/include/asm/bitops.h
@@ -211,6 +211,7 @@ static __inline__ int fls(int x)
 #include <asm-generic/bitops/__fls.h>
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 #include <asm-generic/bitops/sched.h>
 
diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h
index 8043f10..198eead 100644
--- a/arch/s390/include/asm/bitops.h
+++ b/arch/s390/include/asm/bitops.h
@@ -460,6 +460,7 @@ static inline int fls(int word)
 #include <asm-generic/bitops/ffz.h>
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/le.h>
 #include <asm-generic/bitops/ext2-atomic-setbit.h>
diff --git a/arch/sh/include/asm/bitops.h b/arch/sh/include/asm/bitops.h
index fc8e652..4bf0c35 100644
--- a/arch/sh/include/asm/bitops.h
+++ b/arch/sh/include/asm/bitops.h
@@ -86,6 +86,7 @@ static inline unsigned long ffz(unsigned long word)
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/ffs.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/le.h>
diff --git a/arch/xtensa/include/asm/bitops.h b/arch/xtensa/include/asm/bitops.h
index 3f44fa2..981fa83 100644
--- a/arch/xtensa/include/asm/bitops.h
+++ b/arch/xtensa/include/asm/bitops.h
@@ -229,6 +229,7 @@ test_and_change_bit(unsigned int bit, volatile unsigned long *p)
 #include <asm-generic/bitops/ext2-atomic-setbit.h>
 
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 #include <asm-generic/bitops/sched.h>
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 03/31] bitops: Add alpha-specific parity functions
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
  2016-05-11  8:47 ` [patch V4 01/31] " zengzhaoxiu
  2016-05-11  9:06 ` [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h zengzhaoxiu
@ 2016-05-11  9:09 ` zengzhaoxiu
  2016-05-11  9:09 ` [patch V4 04/31] bitops: Add blackfin-specific " zengzhaoxiu
                   ` (27 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:09 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Richard Henderson, Ivan Kokshaysky, Matt Turner,
	linux-alpha

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Richard Henderson <rth@twiddle.net>
---
 arch/alpha/include/asm/bitops.h | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/arch/alpha/include/asm/bitops.h b/arch/alpha/include/asm/bitops.h
index 4bdfbd4..95a43fa 100644
--- a/arch/alpha/include/asm/bitops.h
+++ b/arch/alpha/include/asm/bitops.h
@@ -421,11 +421,38 @@ static inline unsigned int __arch_hweight8(unsigned int w)
 {
 	return __arch_hweight64(w & 0xff);
 }
+
+static inline unsigned int __arch_parity64(unsigned long w)
+{
+	return (unsigned int)__kernel_ctpop(w) & 1;
+}
+
+static inline unsigned int __arch_parity32(unsigned int w)
+{
+	return __arch_parity64(w);
+}
+
+static inline unsigned int __arch_parity16(unsigned int w)
+{
+	return __arch_parity64(w & 0xffff);
+}
+
+static inline unsigned int __arch_parity8(unsigned int w)
+{
+	return __arch_parity64(w & 0xff);
+}
+
+static inline unsigned int __arch_parity4(unsigned int w)
+{
+	return __arch_parity64(w & 0xf);
+}
 #else
 #include <asm-generic/bitops/arch_hweight.h>
+#include <asm-generic/bitops/arch_parity.h>
 #endif
 
 #include <asm-generic/bitops/const_hweight.h>
+#include <asm-generic/bitops/const_parity.h>
 
 #endif /* __KERNEL__ */
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 04/31] bitops: Add blackfin-specific parity functions
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (2 preceding siblings ...)
  2016-05-11  9:09 ` [patch V4 03/31] bitops: Add alpha-specific parity functions zengzhaoxiu
@ 2016-05-11  9:09 ` zengzhaoxiu
  2016-05-11  9:10 ` [patch V4 05/31] bitops: Add ia-specific " zengzhaoxiu
                   ` (26 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:09 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Steven Miao, adi-buildroot-devel

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 arch/blackfin/include/asm/bitops.h | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/arch/blackfin/include/asm/bitops.h b/arch/blackfin/include/asm/bitops.h
index b298b65..6609b7e 100644
--- a/arch/blackfin/include/asm/bitops.h
+++ b/arch/blackfin/include/asm/bitops.h
@@ -23,6 +23,7 @@
 #include <asm-generic/bitops/sched.h>
 #include <asm-generic/bitops/ffs.h>
 #include <asm-generic/bitops/const_hweight.h>
+#include <asm-generic/bitops/const_parity.h>
 #include <asm-generic/bitops/lock.h>
 
 #include <asm-generic/bitops/ext2-atomic.h>
@@ -137,4 +138,34 @@ static inline unsigned int __arch_hweight8(unsigned int w)
 	return __arch_hweight32(w & 0xff);
 }
 
+/*
+ * parityN: returns the parity of a N-bit word,
+ * i.e. the number of 1-bits in w modulo 2.
+ */
+
+static inline unsigned int __arch_parity32(unsigned int w)
+{
+	return __arch_hweight32(w) & 1;
+}
+
+static inline unsigned int __arch_parity64(__u64 w)
+{
+	return __arch_parity32((unsigned int)(w >> 32) ^ (unsigned int)w);
+}
+
+static inline unsigned int __arch_parity16(unsigned int w)
+{
+	return __arch_parity32(w & 0xffff);
+}
+
+static inline unsigned int __arch_parity8(unsigned int w)
+{
+	return __arch_parity32(w & 0xff);
+}
+
+static inline unsigned int __arch_parity4(unsigned int w)
+{
+	return __arch_parity32(w & 0xf);
+}
+
 #endif				/* _BLACKFIN_BITOPS_H */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 05/31] bitops: Add ia-specific parity functions
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (3 preceding siblings ...)
  2016-05-11  9:09 ` [patch V4 04/31] bitops: Add blackfin-specific " zengzhaoxiu
@ 2016-05-11  9:10 ` zengzhaoxiu
  2016-06-29 15:15   ` [patch V4 05/31] bitops: Add ia64-specific " zengzhaoxiu
  2016-05-11  9:10 ` [patch V4 06/31] bitops: Tile and MIPS (if has usable __builtin_popcount) use popcount " zengzhaoxiu
                   ` (25 subsequent siblings)
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:10 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Tony Luck, Fenghua Yu, linux-ia64

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 arch/ia64/include/asm/bitops.h | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/arch/ia64/include/asm/bitops.h b/arch/ia64/include/asm/bitops.h
index 71e8145..041d1d6 100644
--- a/arch/ia64/include/asm/bitops.h
+++ b/arch/ia64/include/asm/bitops.h
@@ -439,6 +439,37 @@ static __inline__ unsigned long __arch_hweight64(unsigned long x)
 
 #include <asm-generic/bitops/const_hweight.h>
 
+/*
+ * parityN: returns the parity of a N-bit word,
+ * i.e. the number of 1-bits in x modulo 2.
+ */
+static __inline__ unsigned int __arch_parity64(unsigned long x)
+{
+	return (unsigned int)ia64_popcnt(x) & 1;
+}
+
+static __inline__ unsigned int __arch_parity32(unsigned int x)
+{
+	return __arch_parity64((unsigned long)x << 32);
+}
+
+static __inline__ unsigned int __arch_parity16(unsigned int x)
+{
+	return __arch_parity64((unsigned long)x << 48);
+}
+
+static __inline__ unsigned int __arch_parity8(unsigned int x)
+{
+	return __arch_parity64((unsigned long)x << 56);
+}
+
+static __inline__ unsigned int __arch_parity4(unsigned int x)
+{
+	return __arch_parity64((unsigned long)x << 60);
+}
+
+#include <asm-generic/bitops/const_parity.h>
+
 #endif /* __KERNEL__ */
 
 #include <asm-generic/bitops/find.h>
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 06/31] bitops: Tile and MIPS (if has usable __builtin_popcount) use popcount parity functions
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (4 preceding siblings ...)
  2016-05-11  9:10 ` [patch V4 05/31] bitops: Add ia-specific " zengzhaoxiu
@ 2016-05-11  9:10 ` zengzhaoxiu
  2016-05-11  9:11 ` [patch V4 07/31] bitops: Add powerpc-specific " zengzhaoxiu
                   ` (24 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:10 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Ralf Baechle, Chris Metcalf, Leonid Yegoshin, linux-mips

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Chris Metcalf <cmetcalf@mellanox.com> [for tile]
---
 arch/mips/include/asm/bitops.h | 7 +++++++
 arch/tile/include/asm/bitops.h | 2 ++
 2 files changed, 9 insertions(+)

diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h
index ce9666c..4192068 100644
--- a/arch/mips/include/asm/bitops.h
+++ b/arch/mips/include/asm/bitops.h
@@ -626,6 +626,13 @@ static inline int ffs(int word)
 #include <asm/arch_hweight.h>
 #include <asm-generic/bitops/const_hweight.h>
 
+#ifdef ARCH_HAS_USABLE_BUILTIN_POPCOUNT
+#include <asm-generic/bitops/popc-parity.h>
+#else
+#include <asm-generic/bitops/arch_parity.h>
+#endif
+#include <asm-generic/bitops/const_parity.h>
+
 #include <asm-generic/bitops/le.h>
 #include <asm-generic/bitops/ext2-atomic.h>
 
diff --git a/arch/tile/include/asm/bitops.h b/arch/tile/include/asm/bitops.h
index 20caa34..4dd89d8 100644
--- a/arch/tile/include/asm/bitops.h
+++ b/arch/tile/include/asm/bitops.h
@@ -85,6 +85,8 @@ static inline unsigned long __arch_hweight64(__u64 w)
 #include <asm-generic/bitops/builtin-__fls.h>
 #include <asm-generic/bitops/builtin-ffs.h>
 #include <asm-generic/bitops/const_hweight.h>
+#include <asm-generic/bitops/popc-parity.h>
+#include <asm-generic/bitops/const_parity.h>
 #include <asm-generic/bitops/lock.h>
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/sched.h>
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 07/31] bitops: Add powerpc-specific parity functions
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (5 preceding siblings ...)
  2016-05-11  9:10 ` [patch V4 06/31] bitops: Tile and MIPS (if has usable __builtin_popcount) use popcount " zengzhaoxiu
@ 2016-05-11  9:11 ` zengzhaoxiu
  2016-05-11  9:13 ` [patch V4 08/31] bitops: Add sparc-specific " zengzhaoxiu
                   ` (23 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:11 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Benjamin Herrenschmidt, Paul Mackerras,
	Michael Ellerman, Anton Blanchard, Scott Wood, Torsten Duwe,
	Christophe Leroy, linuxppc-dev

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Use runtime patching for ppc64, lifted from hweight_64

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 arch/powerpc/include/asm/bitops.h |  11 +++
 arch/powerpc/lib/Makefile         |   2 +-
 arch/powerpc/lib/parity_64.S      | 143 ++++++++++++++++++++++++++++++++++++++
 arch/powerpc/lib/ppc_ksyms.c      |   5 ++
 4 files changed, 160 insertions(+), 1 deletion(-)
 create mode 100644 arch/powerpc/lib/parity_64.S

diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h
index 59abc62..cd34030 100644
--- a/arch/powerpc/include/asm/bitops.h
+++ b/arch/powerpc/include/asm/bitops.h
@@ -269,8 +269,19 @@ unsigned int __arch_hweight16(unsigned int w);
 unsigned int __arch_hweight32(unsigned int w);
 unsigned long __arch_hweight64(__u64 w);
 #include <asm-generic/bitops/const_hweight.h>
+static inline unsigned int __arch_parity4(unsigned int w)
+{
+	w &= 0xf;
+	return ((PARITY_MAGIC) >> w) & 1;
+}
+unsigned int __arch_parity8(unsigned int w);
+unsigned int __arch_parity16(unsigned int w);
+unsigned int __arch_parity32(unsigned int w);
+unsigned int __arch_parity64(__u64 w);
+#include <asm-generic/bitops/const_parity.h>
 #else
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #endif
 
 #include <asm-generic/bitops/find.h>
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
index ba21be1..cae2e7f 100644
--- a/arch/powerpc/lib/Makefile
+++ b/arch/powerpc/lib/Makefile
@@ -16,7 +16,7 @@ obj-$(CONFIG_PPC32)	+= div64.o copy_32.o
 
 obj64-y	+= copypage_64.o copyuser_64.o usercopy_64.o mem_64.o hweight_64.o \
 	   copyuser_power7.o string_64.o copypage_power7.o memcpy_power7.o \
-	   memcpy_64.o memcmp_64.o
+	   memcpy_64.o memcmp_64.o parity_64.o
 
 obj64-$(CONFIG_SMP)	+= locks.o
 obj64-$(CONFIG_ALTIVEC)	+= vmx-helper.o
diff --git a/arch/powerpc/lib/parity_64.S b/arch/powerpc/lib/parity_64.S
new file mode 100644
index 0000000..3586a39
--- /dev/null
+++ b/arch/powerpc/lib/parity_64.S
@@ -0,0 +1,143 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <asm/processor.h>
+#include <asm/ppc_asm.h>
+
+/*
+ * This file contains the generic code to calculate the parity
+ * of N-bits number, and the POPCNT feature sections.
+ *
+ * Note: This code relies on -mminimal-toc
+ */
+
+#define PARITY_MAGIC 0x6996
+
+/*
+ * unsigned int __arch_parity8(unsigned int w)
+ */
+_GLOBAL(__arch_parity8)
+BEGIN_FTR_SECTION
+	srdi	r4,r3,4
+	xor	r3,r3,r4
+	clrldi	r3,r3,64-4
+	li	r4,PARITY_MAGIC
+	srd	r3,r4,r3
+	clrldi	r3,r3,64-1
+	blr
+FTR_SECTION_ELSE
+	PPC_POPCNTB(R3,R3)
+	clrldi  r3,r3,64-1
+	blr
+ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
+
+/*
+ * unsigned int __arch_parity16(unsigned int w)
+ */
+_GLOBAL(__arch_parity16)
+BEGIN_FTR_SECTION
+	srdi	r4,r3,8
+	xor	r3,r3,r4
+	srdi	r4,r3,4
+	xor	r3,r3,r4
+	clrldi	r3,r3,64-4
+	li	r4,PARITY_MAGIC
+	srd	r3,r4,r3
+	clrldi	r3,r3,64-1
+	blr
+FTR_SECTION_ELSE
+  BEGIN_FTR_SECTION_NESTED(50)
+	PPC_POPCNTB(R3,R3)
+	srdi	r4,r3,8
+	add	r3,r4,r3
+	clrldi	r3,r3,64-1
+	blr
+  FTR_SECTION_ELSE_NESTED(50)
+	clrlwi  r3,r3,16
+	PPC_POPCNTW(R3,R3)
+	clrldi	r3,r3,64-1
+	blr
+  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50)
+ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
+
+/*
+ * unsigned int __arch_parity32(unsigned int w)
+ */
+_GLOBAL(__arch_parity32)
+BEGIN_FTR_SECTION
+	srdi	r4,r3,16
+	xor	r3,r3,r4
+	srdi	r4,r3,8
+	xor	r3,r3,r4
+	srdi	r4,r3,4
+	xor	r3,r3,r4
+	clrldi	r3,r3,64-4
+	li	r4,PARITY_MAGIC
+	srd	r3,r4,r3
+	clrldi	r3,r3,64-1
+	blr
+FTR_SECTION_ELSE
+  BEGIN_FTR_SECTION_NESTED(51)
+	PPC_POPCNTB(R3,R3)
+	srdi	r4,r3,16
+	add	r3,r4,r3
+	srdi	r4,r3,8
+	add	r3,r4,r3
+	clrldi	r3,r3,64-1
+	blr
+  FTR_SECTION_ELSE_NESTED(51)
+	PPC_POPCNTW(R3,R3)
+	clrldi	r3,r3,64-1
+	blr
+  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51)
+ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
+
+/*
+ * unsigned int __arch_parity64(__u64 w)
+ */
+_GLOBAL(__arch_parity64)
+BEGIN_FTR_SECTION
+	srdi	r4,r3,32
+	xor	r3,r3,r4
+	srdi	r4,r3,16
+	xor	r3,r3,r4
+	srdi	r4,r3,8
+	xor	r3,r3,r4
+	srdi	r4,r3,4
+	xor	r3,r3,r4
+	clrldi	r3,r3,64-4
+	li	r4,PARITY_MAGIC
+	srd	r3,r4,r3
+	clrldi	r3,r3,64-1
+	blr
+FTR_SECTION_ELSE
+  BEGIN_FTR_SECTION_NESTED(52)
+	PPC_POPCNTB(R3,R3)
+	srdi	r4,r3,32
+	add	r3,r4,r3
+	srdi	r4,r3,16
+	add	r3,r4,r3
+	srdi	r4,r3,8
+	add	r3,r4,r3
+	clrldi	r3,r3,64-1
+	blr
+  FTR_SECTION_ELSE_NESTED(52)
+	PPC_POPCNTD(R3,R3)
+	clrldi	r3,r3,64-1
+	blr
+  ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52)
+ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
diff --git a/arch/powerpc/lib/ppc_ksyms.c b/arch/powerpc/lib/ppc_ksyms.c
index c422812..1ccfc29 100644
--- a/arch/powerpc/lib/ppc_ksyms.c
+++ b/arch/powerpc/lib/ppc_ksyms.c
@@ -30,4 +30,9 @@ EXPORT_SYMBOL(__arch_hweight8);
 EXPORT_SYMBOL(__arch_hweight16);
 EXPORT_SYMBOL(__arch_hweight32);
 EXPORT_SYMBOL(__arch_hweight64);
+
+EXPORT_SYMBOL(__arch_parity8);
+EXPORT_SYMBOL(__arch_parity16);
+EXPORT_SYMBOL(__arch_parity32);
+EXPORT_SYMBOL(__arch_parity64);
 #endif
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 08/31] bitops: Add sparc-specific parity functions
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (6 preceding siblings ...)
  2016-05-11  9:11 ` [patch V4 07/31] bitops: Add powerpc-specific " zengzhaoxiu
@ 2016-05-11  9:13 ` zengzhaoxiu
  2016-05-11 23:59   ` David Miller
  2016-05-11  9:16 ` [patch V4 09/31] bitops: Add x86-specific " zengzhaoxiu
                   ` (22 subsequent siblings)
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:13 UTC (permalink / raw)
  To: linux-kernel, sam
  Cc: Zhaoxiu Zeng, David S. Miller, wim.coekaerts, Guenter Roeck,
	Julian Calaby, sparclinux

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Use runtime patching for sparc64, lifted from hweight

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 arch/sparc/include/asm/bitops_32.h |   1 +
 arch/sparc/include/asm/bitops_64.h |  18 ++++++
 arch/sparc/kernel/sparc_ksyms_64.c |   6 ++
 arch/sparc/lib/Makefile            |   2 +-
 arch/sparc/lib/parity.S            | 129 +++++++++++++++++++++++++++++++++++++
 5 files changed, 155 insertions(+), 1 deletion(-)
 create mode 100644 arch/sparc/lib/parity.S

diff --git a/arch/sparc/include/asm/bitops_32.h b/arch/sparc/include/asm/bitops_32.h
index 600ed1d..8c41896 100644
--- a/arch/sparc/include/asm/bitops_32.h
+++ b/arch/sparc/include/asm/bitops_32.h
@@ -98,6 +98,7 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr)
 #include <asm-generic/bitops/__fls.h>
 #include <asm-generic/bitops/fls64.h>
 #include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/parity.h>
 #include <asm-generic/bitops/lock.h>
 #include <asm-generic/bitops/find.h>
 #include <asm-generic/bitops/le.h>
diff --git a/arch/sparc/include/asm/bitops_64.h b/arch/sparc/include/asm/bitops_64.h
index 2d52240..999d504 100644
--- a/arch/sparc/include/asm/bitops_64.h
+++ b/arch/sparc/include/asm/bitops_64.h
@@ -47,6 +47,24 @@ unsigned int __arch_hweight16(unsigned int w);
 unsigned int __arch_hweight8(unsigned int w);
 
 #include <asm-generic/bitops/const_hweight.h>
+
+/*
+ * parityN: returns the parity of a N-bit word,
+ * i.e. the number of 1-bits in w modulo 2.
+ */
+
+static inline unsigned int __arch_parity4(unsigned int w)
+{
+	w &= 0xf;
+	return ((PARITY_MAGIC) >> w) & 1;
+}
+unsigned int __arch_parity8(unsigned int w);
+unsigned int __arch_parity16(unsigned int w);
+unsigned int __arch_parity32(unsigned int w);
+unsigned int __arch_parity64(__u64 w);
+
+#include <asm-generic/bitops/const_parity.h>
+
 #include <asm-generic/bitops/lock.h>
 #endif /* __KERNEL__ */
 
diff --git a/arch/sparc/kernel/sparc_ksyms_64.c b/arch/sparc/kernel/sparc_ksyms_64.c
index 9e034f2..7ee0818 100644
--- a/arch/sparc/kernel/sparc_ksyms_64.c
+++ b/arch/sparc/kernel/sparc_ksyms_64.c
@@ -45,6 +45,12 @@ EXPORT_SYMBOL(__arch_hweight16);
 EXPORT_SYMBOL(__arch_hweight32);
 EXPORT_SYMBOL(__arch_hweight64);
 
+/* from parity.S */
+EXPORT_SYMBOL(__arch_parity8);
+EXPORT_SYMBOL(__arch_parity16);
+EXPORT_SYMBOL(__arch_parity32);
+EXPORT_SYMBOL(__arch_parity64);
+
 /* from ffs_ffz.S */
 EXPORT_SYMBOL(ffs);
 EXPORT_SYMBOL(__ffs);
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile
index 3269b02..2dbbcb1 100644
--- a/arch/sparc/lib/Makefile
+++ b/arch/sparc/lib/Makefile
@@ -39,7 +39,7 @@ lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o
 lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o
 
 lib-$(CONFIG_SPARC64) += copy_in_user.o user_fixup.o memmove.o
-lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o ffs.o
+lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o ffs.o parity.o
 
 obj-$(CONFIG_SPARC64) += iomap.o
 obj-$(CONFIG_SPARC32) += atomic32.o ucmpdi2.o
diff --git a/arch/sparc/lib/parity.S b/arch/sparc/lib/parity.S
new file mode 100644
index 0000000..ddfba96
--- /dev/null
+++ b/arch/sparc/lib/parity.S
@@ -0,0 +1,129 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <linux/linkage.h>
+
+/*
+ * This file contains the generic code to calculate the parity
+ * of N-bits number, and the popc-patches.
+ */
+
+	.text
+	.align	32
+
+#define PARITY_MAGIC 0x6996
+
+/*
+ * unsigned int __arch_parity8(unsigned int w)
+ */
+ENTRY(__arch_parity8)
+	srl		%o0, 4, %g1
+	xor		%o0, %g1, %o0
+	and		%o0, 0xf, %o0
+	sethi		%hi(PARITY_MAGIC), %g1
+	or		%g1, %lo(PARITY_MAGIC), %g1
+	srl		%g1, %o0, %o0
+	retl
+	 and		%o0, 1, %o0
+ENDPROC(__arch_parity8)
+	.section	.popc_6insn_patch, "ax"
+	.word		__arch_parity8
+	sllx		%o0, 64-8, %g1
+	popc		%g1, %o0
+	retl
+	 and		%o0, 1, %o0
+	nop
+	nop
+	.previous
+
+/*
+ * unsigned int __arch_parity16(unsigned int w)
+ */
+ENTRY(__arch_parity16)
+	srl		%o0, 8, %g1
+	xor		%o0, %g1, %o0
+	srl		%o0, 4, %g1
+	xor		%o0, %g1, %o0
+	and		%o0, 0xf, %o0
+	sethi		%hi(PARITY_MAGIC), %g1
+	or		%g1, %lo(PARITY_MAGIC), %g1
+	srl		%g1, %o0, %o0
+	retl
+	 and		%o0, 1, %o0
+ENDPROC(__arch_parity16)
+	.section	.popc_6insn_patch, "ax"
+	.word		__arch_parity16
+	sllx		%o0, 64-16, %g1
+	popc		%g1, %o0
+	retl
+	 and		%o0, 1, %o0
+	nop
+	nop
+	.previous
+
+/*
+ * unsigned int __arch_parity32(unsigned int w)
+ */
+ENTRY(__arch_parity32)
+	srl		%o0, 16, %g1
+	xor		%o0, %g1, %o0
+	srl		%o0, 8, %g1
+	xor		%o0, %g1, %o0
+	srl		%o0, 4, %g1
+	xor		%o0, %g1, %o0
+	and		%o0, 0xf, %o0
+	sethi		%hi(PARITY_MAGIC), %g1
+	or		%g1, %lo(PARITY_MAGIC), %g1
+	srl		%g1, %o0, %o0
+	retl
+	 and		%o0, 1, %o0
+ENDPROC(__arch_parity32)
+	.section	.popc_6insn_patch, "ax"
+	.word		__arch_parity32
+	sllx		%o0, 64-32, %g1
+	popc		%g1, %o0
+	retl
+	 and		%o0, 1, %o0
+	nop
+	nop
+	.previous
+
+/*
+ * unsigned int __arch_parity64(__u64 w)
+ */
+ENTRY(__arch_parity64)
+	srlx	%o0, 32, %g1
+	xor		%o0, %g1, %o0
+	srl		%o0, 16, %g1
+	xor		%o0, %g1, %o0
+	srl		%o0, 8, %g1
+	xor		%o0, %g1, %o0
+	srl		%o0, 4, %g1
+	xor		%o0, %g1, %o0
+	and		%o0, 0xf, %o0
+	sethi		%hi(PARITY_MAGIC), %g1
+	or		%g1, %lo(PARITY_MAGIC), %g1
+	srl		%g1, %o0, %o0
+	retl
+	 and		%o0, 1, %o0
+ENDPROC(__arch_parity64)
+	.section	.popc_3insn_patch, "ax"
+	.word		__arch_parity64
+	popc		%o0, %o0
+	retl
+	 and		%o0, 1, %o0
+	.previous
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (7 preceding siblings ...)
  2016-05-11  9:13 ` [patch V4 08/31] bitops: Add sparc-specific " zengzhaoxiu
@ 2016-05-11  9:16 ` zengzhaoxiu
  2016-05-11  9:31   ` Peter Zijlstra
  2016-05-11  9:17 ` [patch V4 10/31] sunrpc: use parity8 zengzhaoxiu
                   ` (21 subsequent siblings)
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:16 UTC (permalink / raw)
  To: linux-kernel, bp, gnomes, andi, dvyukov
  Cc: Zhaoxiu Zeng, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86,
	Denys Vlasenko

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Use alternatives, lifted from arch_hweight

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 arch/x86/include/asm/arch_hweight.h |   5 ++
 arch/x86/include/asm/arch_parity.h  | 117 ++++++++++++++++++++++++++++++++++++
 arch/x86/include/asm/bitops.h       |   4 +-
 3 files changed, 125 insertions(+), 1 deletion(-)
 create mode 100644 arch/x86/include/asm/arch_parity.h

diff --git a/arch/x86/include/asm/arch_hweight.h b/arch/x86/include/asm/arch_hweight.h
index 02e799f..c79d50d 100644
--- a/arch/x86/include/asm/arch_hweight.h
+++ b/arch/x86/include/asm/arch_hweight.h
@@ -63,4 +63,9 @@ static __always_inline unsigned long __arch_hweight64(__u64 w)
 }
 #endif /* CONFIG_X86_32 */
 
+#undef POPCNT32
+#undef POPCNT64
+#undef REG_IN
+#undef REG_OUT
+
 #endif
diff --git a/arch/x86/include/asm/arch_parity.h b/arch/x86/include/asm/arch_parity.h
new file mode 100644
index 0000000..38fde0f
--- /dev/null
+++ b/arch/x86/include/asm/arch_parity.h
@@ -0,0 +1,117 @@
+#ifndef _ASM_X86_PARITY_H
+#define _ASM_X86_PARITY_H
+
+#include <asm/cpufeatures.h>
+
+/*
+ * the generic version use the Parity Flag directly
+ *
+ * Parity flag - Set if the least-significant byte of the
+ *               result contains an even number of 1 bits;
+ *               cleared otherwise.
+ */
+
+static inline unsigned int __arch_parity4(unsigned int w)
+{
+	unsigned int res = 0;
+
+	asm("test $0xf, %1; setpo %b0"
+		: "+q" (res)
+		: "r" (w)
+		: "cc");
+
+	return res;
+}
+
+static inline unsigned int __arch_parity8(unsigned int w)
+{
+	unsigned int res = 0;
+
+	asm("test %1, %1; setpo %b0"
+		: "+q" (res)
+		: "r" (w)
+		: "cc");
+
+	return res;
+}
+
+static inline unsigned int __arch_parity16(unsigned int w)
+{
+	unsigned int res = 0;
+
+	asm("xor %h1, %b1; setpo %b0"
+		: "+q" (res), "+q" (w)
+		: : "cc");
+
+	return res;
+}
+
+#ifdef CONFIG_64BIT
+/* popcnt %eax, %eax -- redundant REX prefix for alignment */
+#define POPCNT32 ".byte 0xf3,0x40,0x0f,0xb8,0xc0"
+/* popcnt %rax, %rax */
+#define POPCNT64 ".byte 0xf3,0x48,0x0f,0xb8,0xc0"
+#else
+/* popcnt %eax, %eax */
+#define POPCNT32 ".byte 0xf3,0x0f,0xb8,0xc0"
+#endif
+
+static __always_inline unsigned int __arch_parity32(unsigned int w)
+{
+	unsigned int res;
+	unsigned int tmp;
+
+	asm(ALTERNATIVE(
+		"	mov	%%eax, %1	\n"
+		"	shr	$16, %%eax	\n"
+		"	xor	%1, %%eax	\n"
+		"	xor	%%ah, %%al	\n"
+		"	mov	$0, %%eax	\n"
+		"	setpo	%%al	\n",
+		POPCNT32 "			\n"
+		"	and	$1, %%eax	\n",
+		X86_FEATURE_POPCNT)
+		: "=a" (res), "=&r" (tmp)
+		: "a" (w)
+		: "cc");
+
+	return res;
+}
+
+#ifdef CONFIG_X86_32
+static inline unsigned int __arch_parity64(__u64 w)
+{
+	return __arch_parity32((unsigned int)(w >> 32) ^ (unsigned int)w);
+}
+#else
+static __always_inline unsigned int __arch_parity64(__u64 w)
+{
+	unsigned int res;
+	__u64 tmp;
+
+	asm(ALTERNATIVE(
+		"	mov	%%rax, %1	\n"
+		"	shr	$32, %%rax	\n"
+		"	xor	%k1, %%eax	\n"
+		"	mov	%%eax, %k1	\n"
+		"	shr	$16, %%eax	\n"
+		"	xor	%k1, %%eax 	\n"
+		"	xor	%%ah, %%al	\n"
+		"	mov	$0, %%eax	\n"
+		"	setpo	%%al	\n",
+		POPCNT64 "			\n"
+		"	and	$1, %%eax	\n",
+		X86_FEATURE_POPCNT)
+		: "=a" (res), "=&r" (tmp)
+		: "a" (w)
+		: "cc");
+
+	return res;
+}
+#endif /* CONFIG_X86_32 */
+
+#undef POPCNT32
+#undef POPCNT64
+
+#endif
+
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h
index 7766d1c..f5b0122 100644
--- a/arch/x86/include/asm/bitops.h
+++ b/arch/x86/include/asm/bitops.h
@@ -498,9 +498,11 @@ static __always_inline int fls64(__u64 x)
 #include <asm-generic/bitops/sched.h>
 
 #include <asm/arch_hweight.h>
-
 #include <asm-generic/bitops/const_hweight.h>
 
+#include <asm/arch_parity.h>
+#include <asm-generic/bitops/const_parity.h>
+
 #include <asm-generic/bitops/le.h>
 
 #include <asm-generic/bitops/ext2-atomic-setbit.h>
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 10/31] sunrpc: use parity8
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (8 preceding siblings ...)
  2016-05-11  9:16 ` [patch V4 09/31] bitops: Add x86-specific " zengzhaoxiu
@ 2016-05-11  9:17 ` zengzhaoxiu
  2016-05-11  9:17 ` [patch V4 11/31] mips: use parity functions in cerr-sb1.c zengzhaoxiu
                   ` (20 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:17 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, J. Bruce Fields, Jeff Layton, Trond Myklebust,
	Anna Schumaker, David S. Miller, Herbert Xu, linux-nfs, netdev

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 net/sunrpc/auth_gss/gss_krb5_keys.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/net/sunrpc/auth_gss/gss_krb5_keys.c b/net/sunrpc/auth_gss/gss_krb5_keys.c
index 8701331..c41b389 100644
--- a/net/sunrpc/auth_gss/gss_krb5_keys.c
+++ b/net/sunrpc/auth_gss/gss_krb5_keys.c
@@ -243,16 +243,12 @@ err_return:
 	return ret;
 }
 
-#define smask(step) ((1<<step)-1)
-#define pstep(x, step) (((x)&smask(step))^(((x)>>step)&smask(step)))
-#define parity_char(x) pstep(pstep(pstep((x), 4), 2), 1)
-
 static void mit_des_fixup_key_parity(u8 key[8])
 {
 	int i;
 	for (i = 0; i < 8; i++) {
 		key[i] &= 0xfe;
-		key[i] |= 1^parity_char(key[i]);
+		key[i] |= !parity8(key[i]);
 	}
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 11/31] mips: use parity functions in cerr-sb1.c
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (9 preceding siblings ...)
  2016-05-11  9:17 ` [patch V4 10/31] sunrpc: use parity8 zengzhaoxiu
@ 2016-05-11  9:17 ` zengzhaoxiu
  2016-05-11  9:18 ` [patch V4 12/31] lib: bch: use parity32 zengzhaoxiu
                   ` (19 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:17 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Ralf Baechle, linux-mips

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 arch/mips/mm/cerr-sb1.c | 67 +++++++++++++------------------------------------
 1 file changed, 17 insertions(+), 50 deletions(-)

diff --git a/arch/mips/mm/cerr-sb1.c b/arch/mips/mm/cerr-sb1.c
index ee5c1ff..2e7d660 100644
--- a/arch/mips/mm/cerr-sb1.c
+++ b/arch/mips/mm/cerr-sb1.c
@@ -264,27 +264,6 @@ asmlinkage void sb1_cache_error(void)
 #endif
 }
 
-
-/* Parity lookup table. */
-static const uint8_t parity[256] = {
-	0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-	1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-	1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-	0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-	1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-	0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-	0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-	1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-	1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-	0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-	0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-	1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-	0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
-	1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-	1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
-	0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0
-};
-
 /* Masks to select bits for Hamming parity, mask_72_64[i] for bit[i] */
 static const uint64_t mask_72_64[8] = {
 	0x0738C808099264FFULL,
@@ -298,34 +277,28 @@ static const uint64_t mask_72_64[8] = {
 };
 
 /* Calculate the parity on a range of bits */
-static char range_parity(uint64_t dword, int max, int min)
+static inline char range_parity(uint64_t dword, int max, int min)
 {
-	char parity = 0;
-	int i;
-	dword >>= min;
-	for (i=max-min; i>=0; i--) {
-		if (dword & 0x1)
-			parity = !parity;
-		dword >>= 1;
+	int n = max - min + 1;
+	if (__builtin_constant_p(n)) {
+		if (n <= 8)
+			return parity8((unsigned int)(dword >> min) & ((1U << n) - 1));
+		if (n <= 16)
+			return parity16((unsigned int)(dword >> min) & ((1U << n) - 1));
+		if (n <= 32)
+			return parity32((unsigned int)(dword >> min) & ((1U << n) - 1));
 	}
-	return parity;
+	return parity64((dword >> min) & ((1ULL << n) - 1));
 }
 
 /* Calculate the 4-bit even byte-parity for an instruction */
-static unsigned char inst_parity(uint32_t word)
+static inline unsigned char inst_parity(uint32_t word)
 {
-	int i, j;
-	char parity = 0;
-	for (j=0; j<4; j++) {
-		char byte_parity = 0;
-		for (i=0; i<8; i++) {
-			if (word & 0x80000000)
-				byte_parity = !byte_parity;
-			word <<= 1;
-		}
-		parity <<= 1;
-		parity |= byte_parity;
-	}
+	char parity;
+	parity  = parity8(word >> 24) << 3;
+	parity |= parity8(word >> 16) << 2;
+	parity |= parity8(word >> 8) << 1;
+	parity |= parity8(word);
 	return parity;
 }
 
@@ -436,7 +409,6 @@ static uint32_t extract_ic(unsigned short addr, int data)
 static uint8_t dc_ecc(uint64_t dword)
 {
 	uint64_t t;
-	uint32_t w;
 	uint8_t	 p;
 	int	 i;
 
@@ -445,12 +417,7 @@ static uint8_t dc_ecc(uint64_t dword)
 	{
 		p <<= 1;
 		t = dword & mask_72_64[i];
-		w = (uint32_t)(t >> 32);
-		p ^= (parity[w>>24] ^ parity[(w>>16) & 0xFF]
-		      ^ parity[(w>>8) & 0xFF] ^ parity[w & 0xFF]);
-		w = (uint32_t)(t & 0xFFFFFFFF);
-		p ^= (parity[w>>24] ^ parity[(w>>16) & 0xFF]
-		      ^ parity[(w>>8) & 0xFF] ^ parity[w & 0xFF]);
+		p |= parity64(t);
 	}
 	return p;
 }
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 12/31] lib: bch: use parity32
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (10 preceding siblings ...)
  2016-05-11  9:17 ` [patch V4 11/31] mips: use parity functions in cerr-sb1.c zengzhaoxiu
@ 2016-05-11  9:18 ` zengzhaoxiu
  2016-05-11  9:18 ` [patch V4 13/31] media: use parity8 in vivid-vbi-gen.c zengzhaoxiu
                   ` (18 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:18 UTC (permalink / raw)
  To: linux-kernel, akpm; +Cc: Zhaoxiu Zeng

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 lib/bch.c | 14 +-------------
 1 file changed, 1 insertion(+), 13 deletions(-)

diff --git a/lib/bch.c b/lib/bch.c
index bc89dfe4..6c6e8d4 100644
--- a/lib/bch.c
+++ b/lib/bch.c
@@ -278,18 +278,6 @@ static inline int deg(unsigned int poly)
 	return fls(poly)-1;
 }
 
-static inline int parity(unsigned int x)
-{
-	/*
-	 * public domain code snippet, lifted from
-	 * http://www-graphics.stanford.edu/~seander/bithacks.html
-	 */
-	x ^= x >> 1;
-	x ^= x >> 2;
-	x = (x & 0x11111111U) * 0x11111111U;
-	return (x >> 28) & 1;
-}
-
 /* Galois field basic operations: multiply, divide, inverse, etc. */
 
 static inline unsigned int gf_mul(struct bch_control *bch, unsigned int a,
@@ -494,7 +482,7 @@ static int solve_linear_system(struct bch_control *bch, unsigned int *rows,
 		tmp = 0;
 		for (r = m-1; r >= 0; r--) {
 			mask = rows[r] & (tmp|1);
-			tmp |= parity(mask) << (m-r);
+			tmp |= parity32(mask) << (m-r);
 		}
 		sol[p] = tmp >> 1;
 	}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 13/31] media: use parity8 in vivid-vbi-gen.c
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (11 preceding siblings ...)
  2016-05-11  9:18 ` [patch V4 12/31] lib: bch: use parity32 zengzhaoxiu
@ 2016-05-11  9:18 ` zengzhaoxiu
  2016-05-11  9:19 ` [patch V4 14/31] media: use parity functions in saa7115 zengzhaoxiu
                   ` (17 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:18 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Hans Verkuil, Mauro Carvalho Chehab, linux-media

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/media/platform/vivid/vivid-vbi-gen.c | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/drivers/media/platform/vivid/vivid-vbi-gen.c b/drivers/media/platform/vivid/vivid-vbi-gen.c
index a2159de..d5ba0fc 100644
--- a/drivers/media/platform/vivid/vivid-vbi-gen.c
+++ b/drivers/media/platform/vivid/vivid-vbi-gen.c
@@ -175,14 +175,9 @@ static const u8 vivid_cc_sequence2[30] = {
 	0x14, 0x2f,	/* End of Caption */
 };
 
-static u8 calc_parity(u8 val)
+static inline u8 calc_parity(u8 val)
 {
-	unsigned i;
-	unsigned tot = 0;
-
-	for (i = 0; i < 7; i++)
-		tot += (val & (1 << i)) ? 1 : 0;
-	return val | ((tot & 1) ? 0 : 0x80);
+	return (!parity8(val) << 7) | val;
 }
 
 static void vivid_vbi_gen_set_time_of_day(u8 *packet)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 14/31] media: use parity functions in saa7115
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (12 preceding siblings ...)
  2016-05-11  9:18 ` [patch V4 13/31] media: use parity8 in vivid-vbi-gen.c zengzhaoxiu
@ 2016-05-11  9:19 ` zengzhaoxiu
  2016-07-01 11:53   ` Hans Verkuil
  2016-05-11  9:19 ` [patch V4 15/31] input: use parity32 in grip_mp zengzhaoxiu
                   ` (16 subsequent siblings)
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Mauro Carvalho Chehab, Krzysztof Kozlowski,
	Arnd Bergmann, linux-media

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/media/i2c/saa7115.c | 17 ++---------------
 1 file changed, 2 insertions(+), 15 deletions(-)

diff --git a/drivers/media/i2c/saa7115.c b/drivers/media/i2c/saa7115.c
index d2a1ce2..4c22df8 100644
--- a/drivers/media/i2c/saa7115.c
+++ b/drivers/media/i2c/saa7115.c
@@ -672,15 +672,6 @@ static const unsigned char saa7115_init_misc[] = {
 	0x00, 0x00
 };
 
-static int saa711x_odd_parity(u8 c)
-{
-	c ^= (c >> 4);
-	c ^= (c >> 2);
-	c ^= (c >> 1);
-
-	return c & 1;
-}
-
 static int saa711x_decode_vps(u8 *dst, u8 *p)
 {
 	static const u8 biphase_tbl[] = {
@@ -733,7 +724,6 @@ static int saa711x_decode_wss(u8 *p)
 	static const int wss_bits[8] = {
 		0, 0, 0, 1, 0, 1, 1, 1
 	};
-	unsigned char parity;
 	int wss = 0;
 	int i;
 
@@ -745,11 +735,8 @@ static int saa711x_decode_wss(u8 *p)
 			return -1;
 		wss |= b2 << i;
 	}
-	parity = wss & 15;
-	parity ^= parity >> 2;
-	parity ^= parity >> 1;
 
-	if (!(parity & 1))
+	if (!parity4(wss))
 		return -1;
 
 	return wss;
@@ -1235,7 +1222,7 @@ static int saa711x_decode_vbi_line(struct v4l2_subdev *sd, struct v4l2_decode_vb
 		vbi->type = V4L2_SLICED_TELETEXT_B;
 		break;
 	case 4:
-		if (!saa711x_odd_parity(p[0]) || !saa711x_odd_parity(p[1]))
+		if (!parity8(p[0]) || !parity8(p[1]))
 			return 0;
 		vbi->type = V4L2_SLICED_CAPTION_525;
 		break;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 15/31] input: use parity32 in grip_mp
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (13 preceding siblings ...)
  2016-05-11  9:19 ` [patch V4 14/31] media: use parity functions in saa7115 zengzhaoxiu
@ 2016-05-11  9:19 ` zengzhaoxiu
  2016-05-11  9:19 ` [patch V4 16/31] input: use parity64 in sidewinder zengzhaoxiu
                   ` (15 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:19 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Dmitry Torokhov, linux-input

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/joystick/grip_mp.c | 16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/drivers/input/joystick/grip_mp.c b/drivers/input/joystick/grip_mp.c
index 573191d..3e29eb1 100644
--- a/drivers/input/joystick/grip_mp.c
+++ b/drivers/input/joystick/grip_mp.c
@@ -112,20 +112,6 @@ static const int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5
 static int register_slot(int i, struct grip_mp *grip);
 
 /*
- * Returns whether an odd or even number of bits are on in pkt.
- */
-
-static int bit_parity(u32 pkt)
-{
-	int x = pkt ^ (pkt >> 16);
-	x ^= x >> 8;
-	x ^= x >> 4;
-	x ^= x >> 2;
-	x ^= x >> 1;
-	return x & 1;
-}
-
-/*
  * Poll gameport; return true if all bits set in 'onbits' are on and
  * all bits set in 'offbits' are off.
  */
@@ -235,7 +221,7 @@ static int mp_io(struct gameport* gameport, int sendflags, int sendcode, u32 *pa
 		pkt = (pkt >> 2) | 0xf0000000;
 	}
 
-	if (bit_parity(pkt) == 1)
+	if (parity32(pkt))
 		return IO_RESET;
 
 	/* Acknowledge packet receipt */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 16/31] input: use parity64 in sidewinder
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (14 preceding siblings ...)
  2016-05-11  9:19 ` [patch V4 15/31] input: use parity32 in grip_mp zengzhaoxiu
@ 2016-05-11  9:19 ` zengzhaoxiu
  2016-05-11  9:19 ` [patch V4 17/31] input: use parity16 in ams_delta_serio zengzhaoxiu
                   ` (14 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:19 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Dmitry Torokhov, linux-input

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/joystick/sidewinder.c | 24 ++++--------------------
 1 file changed, 4 insertions(+), 20 deletions(-)

diff --git a/drivers/input/joystick/sidewinder.c b/drivers/input/joystick/sidewinder.c
index 4a95b22..7ea486e 100644
--- a/drivers/input/joystick/sidewinder.c
+++ b/drivers/input/joystick/sidewinder.c
@@ -259,22 +259,6 @@ static void sw_init_digital(struct gameport *gameport)
 }
 
 /*
- * sw_parity() computes parity of __u64
- */
-
-static int sw_parity(__u64 t)
-{
-	int x = t ^ (t >> 32);
-
-	x ^= x >> 16;
-	x ^= x >> 8;
-	x ^= x >> 4;
-	x ^= x >> 2;
-	x ^= x >> 1;
-	return x & 1;
-}
-
-/*
  * sw_ccheck() checks synchronization bits and computes checksum of nibbles.
  */
 
@@ -334,7 +318,7 @@ static int sw_parse(unsigned char *buf, struct sw *sw)
 
 			for (i = 0; i < sw->number; i ++) {
 
-				if (sw_parity(GB(i*15,15)))
+				if (parity64(GB(i*15,15)))
 					return -1;
 
 				input_report_abs(sw->dev[i], ABS_X, GB(i*15+3,1) - GB(i*15+2,1));
@@ -351,7 +335,7 @@ static int sw_parse(unsigned char *buf, struct sw *sw)
 		case SW_ID_PP:
 		case SW_ID_FFP:
 
-			if (!sw_parity(GB(0,48)) || (hat = GB(42,4)) > 8)
+			if (!parity64(GB(0,48)) || (hat = GB(42,4)) > 8)
 				return -1;
 
 			dev = sw->dev[0];
@@ -372,7 +356,7 @@ static int sw_parse(unsigned char *buf, struct sw *sw)
 
 		case SW_ID_FSP:
 
-			if (!sw_parity(GB(0,43)) || (hat = GB(28,4)) > 8)
+			if (!parity64(GB(0,43)) || (hat = GB(28,4)) > 8)
 				return -1;
 
 			dev = sw->dev[0];
@@ -397,7 +381,7 @@ static int sw_parse(unsigned char *buf, struct sw *sw)
 
 		case SW_ID_FFW:
 
-			if (!sw_parity(GB(0,33)))
+			if (!parity64(GB(0,33)))
 				return -1;
 
 			dev = sw->dev[0];
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 17/31] input: use parity16 in ams_delta_serio
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (15 preceding siblings ...)
  2016-05-11  9:19 ` [patch V4 16/31] input: use parity64 in sidewinder zengzhaoxiu
@ 2016-05-11  9:19 ` zengzhaoxiu
  2016-05-11  9:19 ` [patch V4 18/31] scsi: use parity32 in isci's phy zengzhaoxiu
                   ` (13 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:19 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Dmitry Torokhov, linux-input

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/serio/ams_delta_serio.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/drivers/input/serio/ams_delta_serio.c b/drivers/input/serio/ams_delta_serio.c
index 45887e3..85459b3 100644
--- a/drivers/input/serio/ams_delta_serio.c
+++ b/drivers/input/serio/ams_delta_serio.c
@@ -48,13 +48,9 @@ static int check_data(int data)
 				data);
 		return SERIO_FRAME;
 	}
-	/* calculate the parity */
-	for (i = 1; i < 10; i++) {
-		if (data & (1 << i))
-			parity++;
-	}
 	/* it should be odd */
-	if (!(parity & 0x01)) {
+	parity = parity16(data & 0x3fe);
+	if (!parity) {
 		dev_warn(&ams_delta_serio->dev,
 				"paritiy check failed, data=0x%X parity=0x%X\n",
 				data, parity);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 18/31] scsi: use parity32 in isci's phy
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (16 preceding siblings ...)
  2016-05-11  9:19 ` [patch V4 17/31] input: use parity16 in ams_delta_serio zengzhaoxiu
@ 2016-05-11  9:19 ` zengzhaoxiu
  2016-05-11  9:20 ` [patch V4 19/31] mtd: use parity16 in ssfdc zengzhaoxiu
                   ` (12 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:19 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Intel SCU Linux support, Artur Paszkiewicz,
	James E.J. Bottomley, Martin K. Petersen, linux-scsi

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/scsi/isci/phy.c | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/drivers/scsi/isci/phy.c b/drivers/scsi/isci/phy.c
index cb87b2e..a06aff6 100644
--- a/drivers/scsi/isci/phy.c
+++ b/drivers/scsi/isci/phy.c
@@ -122,8 +122,6 @@ sci_phy_link_layer_initialization(struct isci_phy *iphy,
 	int phy_idx = iphy->phy_index;
 	struct sci_phy_cap phy_cap;
 	u32 phy_configuration;
-	u32 parity_check = 0;
-	u32 parity_count = 0;
 	u32 llctl, link_rate;
 	u32 clksm_value = 0;
 	u32 sp_timeouts = 0;
@@ -225,18 +223,7 @@ sci_phy_link_layer_initialization(struct isci_phy *iphy,
 	/* The SAS specification indicates that the phy_capabilities that
 	 * are transmitted shall have an even parity.  Calculate the parity.
 	 */
-	parity_check = phy_cap.all;
-	while (parity_check != 0) {
-		if (parity_check & 0x1)
-			parity_count++;
-		parity_check >>= 1;
-	}
-
-	/* If parity indicates there are an odd number of bits set, then
-	 * set the parity bit to 1 in the phy capabilities.
-	 */
-	if ((parity_count % 2) != 0)
-		phy_cap.parity = 1;
+	phy_cap.parity = parity32(phy_cap.all);
 
 	writel(phy_cap.all, &llr->phy_capabilities);
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 19/31] mtd: use parity16 in ssfdc
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (17 preceding siblings ...)
  2016-05-11  9:19 ` [patch V4 18/31] scsi: use parity32 in isci's phy zengzhaoxiu
@ 2016-05-11  9:20 ` zengzhaoxiu
  2016-05-11  9:21 ` [patch V4 20/31] mtd: use parity functions in inftlcore zengzhaoxiu
                   ` (11 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:20 UTC (permalink / raw)
  To: linux-kernel, computersforpeace; +Cc: Zhaoxiu Zeng, David Woodhouse, linux-mtd

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Use parity16 to do the odd parity checking, and rearrange the code.

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/mtd/ssfdc.c | 31 ++++++++-----------------------
 1 file changed, 8 insertions(+), 23 deletions(-)

diff --git a/drivers/mtd/ssfdc.c b/drivers/mtd/ssfdc.c
index daf82ba..1d55f15 100644
--- a/drivers/mtd/ssfdc.c
+++ b/drivers/mtd/ssfdc.c
@@ -182,24 +182,10 @@ static int read_raw_oob(struct mtd_info *mtd, loff_t offs, uint8_t *buf)
 	return 0;
 }
 
-/* Parity calculator on a word of n bit size */
-static int get_parity(int number, int size)
-{
- 	int k;
-	int parity;
-
-	parity = 1;
-	for (k = 0; k < size; k++) {
-		parity += (number >> k);
-		parity &= 1;
-	}
-	return parity;
-}
-
 /* Read and validate the logical block address field stored in the OOB */
 static int get_logical_address(uint8_t *oob_buf)
 {
-	int block_address, parity;
+	int block_address;
 	int offset[2] = {6, 11}; /* offset of the 2 address fields within OOB */
 	int j;
 	int ok = 0;
@@ -215,18 +201,17 @@ static int get_logical_address(uint8_t *oob_buf)
 
 		/* Check for the signature bits in the address field (MSBits) */
 		if ((block_address & ~0x7FF) == 0x1000) {
-			parity = block_address & 0x01;
 			block_address &= 0x7FF;
-			block_address >>= 1;
 
-			if (get_parity(block_address, 10) != parity) {
-				pr_debug("SSFDC_RO: logical address field%d"
-					"parity error(0x%04X)\n", j+1,
-					block_address);
-			} else {
-				ok = 1;
+			ok = parity16(block_address);
+			if (ok) {
+				block_address >>= 1;
 				break;
 			}
+
+			pr_debug("SSFDC_RO: logical address field%d"
+				"parity error(0x%04X)\n", j+1,
+				block_address);
 		}
 	}
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 20/31] mtd: use parity functions in inftlcore
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (18 preceding siblings ...)
  2016-05-11  9:20 ` [patch V4 19/31] mtd: use parity16 in ssfdc zengzhaoxiu
@ 2016-05-11  9:21 ` zengzhaoxiu
  2016-05-11  9:21 ` [patch V4 21/31] crypto: use parity functions in qat_hal zengzhaoxiu
                   ` (10 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:21 UTC (permalink / raw)
  To: linux-kernel, computersforpeace; +Cc: Zhaoxiu Zeng, David Woodhouse, linux-mtd

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/mtd/inftlcore.c | 17 ++++-------------
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/drivers/mtd/inftlcore.c b/drivers/mtd/inftlcore.c
index b66b541..8c9457b 100644
--- a/drivers/mtd/inftlcore.c
+++ b/drivers/mtd/inftlcore.c
@@ -457,15 +457,6 @@ static u16 INFTL_makefreeblock(struct INFTLrecord *inftl, unsigned pendingblock)
 	return INFTL_foldchain(inftl, LongestChain, pendingblock);
 }
 
-static int nrbits(unsigned int val, int bitcount)
-{
-	int i, total = 0;
-
-	for (i = 0; (i < bitcount); i++)
-		total += (((0x1 << i) & val) ? 1 : 0);
-	return total;
-}
-
 /*
  * INFTL_findwriteunit: Return the unit number into which we can write
  *                      for this block. Make it available if it isn't already.
@@ -593,10 +584,10 @@ hitused:
 		if (prev_block < inftl->nb_blocks)
 			prev_block -= inftl->firstEUN;
 
-		parity = (nrbits(thisVUC, 16) & 0x1) ? 0x1 : 0;
-		parity |= (nrbits(prev_block, 16) & 0x1) ? 0x2 : 0;
-		parity |= (nrbits(anac, 8) & 0x1) ? 0x4 : 0;
-		parity |= (nrbits(nacs, 8) & 0x1) ? 0x8 : 0;
+		parity  = parity16(thisVUC);
+		parity |= parity16(prev_block) << 1;
+		parity |= parity8(anac) << 2;
+		parity |= parity8(nacs) << 3;
 
 		oob.u.a.virtualUnitNo = cpu_to_le16(thisVUC);
 		oob.u.a.prevUnitNo = cpu_to_le16(prev_block);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 21/31] crypto: use parity functions in qat_hal
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (19 preceding siblings ...)
  2016-05-11  9:21 ` [patch V4 20/31] mtd: use parity functions in inftlcore zengzhaoxiu
@ 2016-05-11  9:21 ` zengzhaoxiu
  2016-05-11  9:22 ` [patch V4 22/31] mtd: use parity16 in sm_ftl zengzhaoxiu
                   ` (9 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:21 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Tadeusz Struk, Herbert Xu, David S. Miller,
	Pingchao Yang, Bruce Allan, qat-linux, linux-crypto

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/crypto/qat/qat_common/qat_hal.c | 32 ++++++++++----------------------
 1 file changed, 10 insertions(+), 22 deletions(-)

diff --git a/drivers/crypto/qat/qat_common/qat_hal.c b/drivers/crypto/qat/qat_common/qat_hal.c
index 1e480f1..318558f 100644
--- a/drivers/crypto/qat/qat_common/qat_hal.c
+++ b/drivers/crypto/qat/qat_common/qat_hal.c
@@ -546,17 +546,6 @@ static void qat_hal_disable_ctx(struct icp_qat_fw_loader_handle *handle,
 	qat_hal_wr_ae_csr(handle, ae, CTX_ENABLES, ctx);
 }
 
-static uint64_t qat_hal_parity_64bit(uint64_t word)
-{
-	word ^= word >> 1;
-	word ^= word >> 2;
-	word ^= word >> 4;
-	word ^= word >> 8;
-	word ^= word >> 16;
-	word ^= word >> 32;
-	return word & 1;
-}
-
 static uint64_t qat_hal_set_uword_ecc(uint64_t uword)
 {
 	uint64_t bit0_mask = 0xff800007fffULL, bit1_mask = 0x1f801ff801fULL,
@@ -566,13 +555,13 @@ static uint64_t qat_hal_set_uword_ecc(uint64_t uword)
 
 	/* clear the ecc bits */
 	uword &= ~(0x7fULL << 0x2C);
-	uword |= qat_hal_parity_64bit(bit0_mask & uword) << 0x2C;
-	uword |= qat_hal_parity_64bit(bit1_mask & uword) << 0x2D;
-	uword |= qat_hal_parity_64bit(bit2_mask & uword) << 0x2E;
-	uword |= qat_hal_parity_64bit(bit3_mask & uword) << 0x2F;
-	uword |= qat_hal_parity_64bit(bit4_mask & uword) << 0x30;
-	uword |= qat_hal_parity_64bit(bit5_mask & uword) << 0x31;
-	uword |= qat_hal_parity_64bit(bit6_mask & uword) << 0x32;
+	uword |= (uint64_t)parity64(bit0_mask & uword) << 0x2C;
+	uword |= (uint64_t)parity64(bit1_mask & uword) << 0x2D;
+	uword |= (uint64_t)parity64(bit2_mask & uword) << 0x2E;
+	uword |= (uint64_t)parity64(bit3_mask & uword) << 0x2F;
+	uword |= (uint64_t)parity64(bit4_mask & uword) << 0x30;
+	uword |= (uint64_t)parity64(bit5_mask & uword) << 0x31;
+	uword |= (uint64_t)parity64(bit6_mask & uword) << 0x32;
 	return uword;
 }
 
@@ -853,15 +842,14 @@ void qat_hal_wr_umem(struct icp_qat_fw_loader_handle *handle,
 	uaddr |= UA_ECS;
 	qat_hal_wr_ae_csr(handle, ae, USTORE_ADDRESS, uaddr);
 	for (i = 0; i < words_num; i++) {
-		unsigned int uwrd_lo, uwrd_hi, tmp;
+		unsigned int uwrd_lo, uwrd_hi;
 
 		uwrd_lo = ((data[i] & 0xfff0000) << 4) | (0x3 << 18) |
 			  ((data[i] & 0xff00) << 2) |
 			  (0x3 << 8) | (data[i] & 0xff);
 		uwrd_hi = (0xf << 4) | ((data[i] & 0xf0000000) >> 28);
-		uwrd_hi |= (hweight32(data[i] & 0xffff) & 0x1) << 8;
-		tmp = ((data[i] >> 0x10) & 0xffff);
-		uwrd_hi |= (hweight32(tmp) & 0x1) << 9;
+		uwrd_hi |= parity16(data[i]) << 8;
+		uwrd_hi |= parity16(data[i] >> 16) << 9;
 		qat_hal_wr_ae_csr(handle, ae, USTORE_DATA_LOWER, uwrd_lo);
 		qat_hal_wr_ae_csr(handle, ae, USTORE_DATA_UPPER, uwrd_hi);
 	}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 22/31] mtd: use parity16 in sm_ftl
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (20 preceding siblings ...)
  2016-05-11  9:21 ` [patch V4 21/31] crypto: use parity functions in qat_hal zengzhaoxiu
@ 2016-05-11  9:22 ` zengzhaoxiu
  2016-05-11  9:22 ` [patch V4 23/31] ethernet: use parity8 in sun/niu.c zengzhaoxiu
                   ` (8 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:22 UTC (permalink / raw)
  To: linux-kernel, computersforpeace; +Cc: Zhaoxiu Zeng, David Woodhouse, linux-mtd

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/mtd/sm_ftl.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c
index b096f8b..345ff1a 100644
--- a/drivers/mtd/sm_ftl.c
+++ b/drivers/mtd/sm_ftl.c
@@ -136,7 +136,7 @@ static int sm_get_lba(uint8_t *lba)
 		return -2;
 
 	/* check parity - endianness doesn't matter */
-	if (hweight16(*(uint16_t *)lba) & 1)
+	if (parity16(*(uint16_t *)lba))
 		return -2;
 
 	return (lba[1] >> 1) | ((lba[0] & 0x07) << 7);
@@ -183,8 +183,7 @@ static void sm_write_lba(struct sm_oob *oob, uint16_t lba)
 	tmp[0] = 0x10 | ((lba >> 7) & 0x07);
 	tmp[1] = (lba << 1) & 0xFF;
 
-	if (hweight16(*(uint16_t *)tmp) & 0x01)
-		tmp[1] |= 1;
+	tmp[1] |= parity16(*(uint16_t *)tmp);
 
 	oob->lba_copy1[0] = oob->lba_copy2[0] = tmp[0];
 	oob->lba_copy1[1] = oob->lba_copy2[1] = tmp[1];
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 23/31] ethernet: use parity8 in sun/niu.c
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (21 preceding siblings ...)
  2016-05-11  9:22 ` [patch V4 22/31] mtd: use parity16 in sm_ftl zengzhaoxiu
@ 2016-05-11  9:22 ` zengzhaoxiu
  2016-05-11 23:59   ` David Miller
  2016-05-11  9:22 ` [patch V4 24/31] input: use parity8 in pcips2 zengzhaoxiu
                   ` (7 subsequent siblings)
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Michal Nazarewicz, Joonsoo Kim, Andrew Morton,
	Vlastimil Babka, Jiri Pirko, netdev

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Michal Nazarewicz <mina86@mina86.com>
---
 drivers/net/ethernet/sun/niu.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
index 9cc4564..8c344ef 100644
--- a/drivers/net/ethernet/sun/niu.c
+++ b/drivers/net/ethernet/sun/niu.c
@@ -2742,18 +2742,12 @@ static int niu_set_alt_mac_rdc_table(struct niu *np, int idx,
 
 static u64 vlan_entry_set_parity(u64 reg_val)
 {
-	u64 port01_mask;
-	u64 port23_mask;
-
-	port01_mask = 0x00ff;
-	port23_mask = 0xff00;
-
-	if (hweight64(reg_val & port01_mask) & 1)
+	if (parity8(reg_val))
 		reg_val |= ENET_VLAN_TBL_PARITY0;
 	else
 		reg_val &= ~ENET_VLAN_TBL_PARITY0;
 
-	if (hweight64(reg_val & port23_mask) & 1)
+	if (parity8((unsigned int)reg_val >> 8))
 		reg_val |= ENET_VLAN_TBL_PARITY1;
 	else
 		reg_val &= ~ENET_VLAN_TBL_PARITY1;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 24/31] input: use parity8 in pcips2
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (22 preceding siblings ...)
  2016-05-11  9:22 ` [patch V4 23/31] ethernet: use parity8 in sun/niu.c zengzhaoxiu
@ 2016-05-11  9:22 ` zengzhaoxiu
  2016-05-11  9:22 ` [patch V4 25/31] input: use parity8 in sa1111ps2 zengzhaoxiu
                   ` (6 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:22 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Dmitry Torokhov, linux-input

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/serio/pcips2.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/input/serio/pcips2.c b/drivers/input/serio/pcips2.c
index e862c6e..a51e7f0 100644
--- a/drivers/input/serio/pcips2.c
+++ b/drivers/input/serio/pcips2.c
@@ -77,7 +77,7 @@ static irqreturn_t pcips2_interrupt(int irq, void *devid)
 
 		flag = (status & PS2_STAT_PARITY) ? 0 : SERIO_PARITY;
 
-		if (hweight8(scancode) & 1)
+		if (parity8(scancode))
 			flag ^= SERIO_PARITY;
 
 		serio_interrupt(ps2if->io, scancode, flag);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 25/31] input: use parity8 in sa1111ps2
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (23 preceding siblings ...)
  2016-05-11  9:22 ` [patch V4 24/31] input: use parity8 in pcips2 zengzhaoxiu
@ 2016-05-11  9:22 ` zengzhaoxiu
  2016-05-11  9:22 ` [patch V4 26/31] iio: use parity32 in adxrs450 zengzhaoxiu
                   ` (5 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:22 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Dmitry Torokhov, linux-input

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/serio/sa1111ps2.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/input/serio/sa1111ps2.c b/drivers/input/serio/sa1111ps2.c
index b3e6889..324b193 100644
--- a/drivers/input/serio/sa1111ps2.c
+++ b/drivers/input/serio/sa1111ps2.c
@@ -74,7 +74,7 @@ static irqreturn_t ps2_rxint(int irq, void *dev_id)
 
 		scancode = sa1111_readl(ps2if->base + PS2DATA) & 0xff;
 
-		if (hweight8(scancode) & 1)
+		if (parity8(scancode))
 			flag ^= SERIO_PARITY;
 
 		serio_interrupt(ps2if->io, scancode, flag);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 26/31] iio: use parity32 in adxrs450
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (24 preceding siblings ...)
  2016-05-11  9:22 ` [patch V4 25/31] input: use parity8 in sa1111ps2 zengzhaoxiu
@ 2016-05-11  9:22 ` zengzhaoxiu
  2016-05-11  9:23 ` [patch V4 27/31] serial: use parity32 in max3100 zengzhaoxiu
                   ` (4 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Lars-Peter Clausen, Michael Hennerich,
	Jonathan Cameron, Hartmut Knaack, Peter Meerwald, linux-iio

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Jonathan Cameron <jic23@kernel.org>
---
 drivers/iio/gyro/adxrs450.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/gyro/adxrs450.c b/drivers/iio/gyro/adxrs450.c
index a330d42..307f55b 100644
--- a/drivers/iio/gyro/adxrs450.c
+++ b/drivers/iio/gyro/adxrs450.c
@@ -109,7 +109,7 @@ static int adxrs450_spi_read_reg_16(struct iio_dev *indio_dev,
 	mutex_lock(&st->buf_lock);
 	tx = ADXRS450_READ_DATA | (reg_address << 17);
 
-	if (!(hweight32(tx) & 1))
+	if (!parity32(tx))
 		tx |= ADXRS450_P;
 
 	st->tx = cpu_to_be32(tx);
@@ -145,7 +145,7 @@ static int adxrs450_spi_write_reg_16(struct iio_dev *indio_dev,
 	mutex_lock(&st->buf_lock);
 	tx = ADXRS450_WRITE_DATA | (reg_address << 17) | (val << 1);
 
-	if (!(hweight32(tx) & 1))
+	if (!parity32(tx))
 		tx |= ADXRS450_P;
 
 	st->tx = cpu_to_be32(tx);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 27/31] serial: use parity32 in max3100
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (25 preceding siblings ...)
  2016-05-11  9:22 ` [patch V4 26/31] iio: use parity32 in adxrs450 zengzhaoxiu
@ 2016-05-11  9:23 ` zengzhaoxiu
  2016-06-25 17:25   ` Greg Kroah-Hartman
  2016-05-11  9:24 ` [patch V4 28/31] input: use parity8 in elantech zengzhaoxiu
                   ` (3 subsequent siblings)
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:23 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Greg Kroah-Hartman, Jiri Slaby, linux-serial

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 drivers/tty/serial/max3100.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c
index 5c4c280..a0cc84a 100644
--- a/drivers/tty/serial/max3100.c
+++ b/drivers/tty/serial/max3100.c
@@ -155,7 +155,7 @@ static int max3100_do_parity(struct max3100_port *s, u16 c)
 	else
 		c &= 0xff;
 
-	parity = parity ^ (hweight8(c) & 1);
+	parity ^= parity8(c);
 	return parity;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 28/31] input: use parity8 in elantech
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (26 preceding siblings ...)
  2016-05-11  9:23 ` [patch V4 27/31] serial: use parity32 in max3100 zengzhaoxiu
@ 2016-05-11  9:24 ` zengzhaoxiu
  2016-05-11  9:24 ` [patch V4 29/31] ethernet: use parity8 in broadcom/tg3.c zengzhaoxiu
                   ` (2 subsequent siblings)
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Dmitry Torokhov, Benjamin Tissoires, Hans de Goede,
	Takashi Iwai, Peter Hutterer, Duson Lin, Ulrik De Bie,
	linux-input

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Remove the parity lookup table, use parity8 instead.

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/mouse/elantech.c | 10 +++-------
 drivers/input/mouse/elantech.h |  1 -
 2 files changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index 78f93cf..bbb4aa6 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -693,9 +693,9 @@ static int elantech_packet_check_v1(struct psmouse *psmouse)
 
 	p3 = (packet[0] & 0x04) >> 2;
 
-	return etd->parity[packet[1]] == p1 &&
-	       etd->parity[packet[2]] == p2 &&
-	       etd->parity[packet[3]] == p3;
+	return parity8(packet[1]) != p1 &&
+	       parity8(packet[2]) != p2 &&
+	       parity8(packet[3]) != p3;
 }
 
 static int elantech_debounce_check_v2(struct psmouse *psmouse)
@@ -1635,10 +1635,6 @@ int elantech_init(struct psmouse *psmouse)
 
 	psmouse_reset(psmouse);
 
-	etd->parity[0] = 1;
-	for (i = 1; i < 256; i++)
-		etd->parity[i] = etd->parity[i & (i - 1)] ^ 1;
-
 	/*
 	 * Do the version query again so we can store the result
 	 */
diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h
index e1cbf40..542c5d9 100644
--- a/drivers/input/mouse/elantech.h
+++ b/drivers/input/mouse/elantech.h
@@ -141,7 +141,6 @@ struct elantech_data {
 	unsigned int y_max;
 	unsigned int width;
 	struct finger_pos mt[ETP_MAX_FINGERS];
-	unsigned char parity[256];
 	int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param);
 	void (*original_set_rate)(struct psmouse *psmouse, unsigned int rate);
 };
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 29/31] ethernet: use parity8 in broadcom/tg3.c
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (27 preceding siblings ...)
  2016-05-11  9:24 ` [patch V4 28/31] input: use parity8 in elantech zengzhaoxiu
@ 2016-05-11  9:24 ` zengzhaoxiu
  2016-05-11 23:59   ` David Miller
  2016-05-11  9:24 ` [patch V4 30/31] crypto: use parity_long is sahara.c zengzhaoxiu
  2016-05-11  9:24 ` [patch V4 31/31] edac: use parity8 in amd64_edac.c zengzhaoxiu
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Siva Reddy Kallam, Prashant Sreedharan,
	Michael Chan, netdev

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Siva Reddy Kallam <siva.kallam@broadcom.com>
---
 drivers/net/ethernet/broadcom/tg3.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index 3010080..802a429 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -12939,11 +12939,7 @@ static int tg3_test_nvram(struct tg3 *tp)
 
 		err = -EIO;
 		for (i = 0; i < NVRAM_SELFBOOT_DATA_SIZE; i++) {
-			u8 hw8 = hweight8(data[i]);
-
-			if ((hw8 & 0x1) && parity[i])
-				goto out;
-			else if (!(hw8 & 0x1) && !parity[i])
+			if (parity8(data[i]) == !!parity[i])
 				goto out;
 		}
 		err = 0;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 30/31] crypto: use parity_long is sahara.c
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (28 preceding siblings ...)
  2016-05-11  9:24 ` [patch V4 29/31] ethernet: use parity8 in broadcom/tg3.c zengzhaoxiu
@ 2016-05-11  9:24 ` zengzhaoxiu
  2016-06-29 15:18   ` [patch V4 30/31] crypto: use parity_long in sahara.c zengzhaoxiu
  2016-05-11  9:24 ` [patch V4 31/31] edac: use parity8 in amd64_edac.c zengzhaoxiu
  30 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:24 UTC (permalink / raw)
  To: linux-kernel; +Cc: Zhaoxiu Zeng, Herbert Xu, David S. Miller, linux-crypto

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/crypto/sahara.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/crypto/sahara.c b/drivers/crypto/sahara.c
index c3f3d89..5c44a15 100644
--- a/drivers/crypto/sahara.c
+++ b/drivers/crypto/sahara.c
@@ -783,7 +783,7 @@ static u32 sahara_sha_init_hdr(struct sahara_dev *dev,
 	if (rctx->last)
 		hdr |= SAHARA_HDR_MDHA_PDATA;
 
-	if (hweight_long(hdr) % 2 == 0)
+	if (!parity_long(hdr))
 		hdr |= SAHARA_HDR_PARITY_BIT;
 
 	return hdr;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 31/31] edac: use parity8 in amd64_edac.c
  2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
                   ` (29 preceding siblings ...)
  2016-05-11  9:24 ` [patch V4 30/31] crypto: use parity_long is sahara.c zengzhaoxiu
@ 2016-05-11  9:24 ` zengzhaoxiu
  30 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-05-11  9:24 UTC (permalink / raw)
  To: linux-kernel
  Cc: Zhaoxiu Zeng, Doug Thompson, Borislav Petkov,
	Mauro Carvalho Chehab, linux-edac

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/edac/amd64_edac.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
index d87a475..8727ae5 100644
--- a/drivers/edac/amd64_edac.c
+++ b/drivers/edac/amd64_edac.c
@@ -1430,7 +1430,7 @@ static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
 
 		if (intlv_addr & 0x2) {
 			u8 shift = intlv_addr & 0x1 ? 9 : 6;
-			u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) % 2;
+			u8 temp = parity8((sys_addr >> 16) & 0x1F);
 
 			return ((sys_addr >> shift) & 1) ^ temp;
 		}
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* Re: [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-11  9:16 ` [patch V4 09/31] bitops: Add x86-specific " zengzhaoxiu
@ 2016-05-11  9:31   ` Peter Zijlstra
  2016-05-11  9:52     ` Borislav Petkov
                       ` (2 more replies)
  0 siblings, 3 replies; 55+ messages in thread
From: Peter Zijlstra @ 2016-05-11  9:31 UTC (permalink / raw)
  To: zengzhaoxiu
  Cc: linux-kernel, bp, gnomes, andi, dvyukov, Zhaoxiu Zeng,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86,
	Denys Vlasenko

On Wed, May 11, 2016 at 05:16:38PM +0800, zengzhaoxiu@163.com wrote:

> +static inline unsigned int __arch_parity4(unsigned int w)
> +{
> +	unsigned int res = 0;
> +
> +	asm("test $0xf, %1; setpo %b0"
> +		: "+q" (res)
> +		: "r" (w)
> +		: "cc");
> +
> +	return res;
> +}
> +
> +static inline unsigned int __arch_parity8(unsigned int w)
> +{
> +	unsigned int res = 0;
> +
> +	asm("test %1, %1; setpo %b0"
> +		: "+q" (res)
> +		: "r" (w)
> +		: "cc");
> +
> +	return res;
> +}
> +
> +static inline unsigned int __arch_parity16(unsigned int w)
> +{
> +	unsigned int res = 0;
> +
> +	asm("xor %h1, %b1; setpo %b0"
> +		: "+q" (res), "+q" (w)
> +		: : "cc");
> +
> +	return res;
> +}

Please use the GEN_*_RMWcc() stuff to avoid the setpo where possible.

> +
> +#ifdef CONFIG_64BIT
> +/* popcnt %eax, %eax -- redundant REX prefix for alignment */
> +#define POPCNT32 ".byte 0xf3,0x40,0x0f,0xb8,0xc0"
> +/* popcnt %rax, %rax */
> +#define POPCNT64 ".byte 0xf3,0x48,0x0f,0xb8,0xc0"
> +#else
> +/* popcnt %eax, %eax */
> +#define POPCNT32 ".byte 0xf3,0x0f,0xb8,0xc0"
> +#endif

Yuck, please don't duplicate stuff like this.

> +
> +static __always_inline unsigned int __arch_parity32(unsigned int w)
> +{
> +	unsigned int res;
> +	unsigned int tmp;
> +
> +	asm(ALTERNATIVE(
> +		"	mov	%%eax, %1	\n"
> +		"	shr	$16, %%eax	\n"
> +		"	xor	%1, %%eax	\n"
> +		"	xor	%%ah, %%al	\n"
> +		"	mov	$0, %%eax	\n"
> +		"	setpo	%%al	\n",
> +		POPCNT32 "			\n"
> +		"	and	$1, %%eax	\n",
> +		X86_FEATURE_POPCNT)
> +		: "=a" (res), "=&r" (tmp)
> +		: "a" (w)
> +		: "cc");
> +
> +	return res;
> +}

How many bytes does that end up being? Should we make it a call?

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-11  9:31   ` Peter Zijlstra
@ 2016-05-11  9:52     ` Borislav Petkov
  2016-05-16 15:49     ` Zhaoxiu Zeng
  2016-05-16 19:19     ` H. Peter Anvin
  2 siblings, 0 replies; 55+ messages in thread
From: Borislav Petkov @ 2016-05-11  9:52 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: zengzhaoxiu, linux-kernel, gnomes, andi, dvyukov, Zhaoxiu Zeng,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86,
	Denys Vlasenko

On Wed, May 11, 2016 at 11:31:39AM +0200, Peter Zijlstra wrote:
> How many bytes does that end up being? Should we make it a call?

Those should call __arch_hweight* anyway - no need for the duplication
at all.

-- 
Regards/Gruss,
    Boris.

SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
-- 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h
  2016-05-11  9:06 ` [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h zengzhaoxiu
@ 2016-05-11 10:06   ` Jesper Nilsson
  2016-05-11 10:42   ` Catalin Marinas
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 55+ messages in thread
From: Jesper Nilsson @ 2016-05-11 10:06 UTC (permalink / raw)
  To: zengzhaoxiu
  Cc: linux-kernel, Zhaoxiu Zeng, Vineet Gupta, Russell King,
	Catalin Marinas, Will Deacon, Haavard Skinnemoen,
	Hans-Christian Egtvedt, Mark Salter, Aurelien Jacquiot,
	Mikael Starvik, Jesper Nilsson, Yoshinori Sato, Richard Kuo,
	Geert Uytterhoeven, James Hogan, David Howells, Koichi Yasutake,
	Jonas Bonn, James E.J. Bottomley, Helge Deller,
	Martin Schwidefsky, Heiko Carstens, Rich Felker, Chris Zankel,
	Max Filippov, Peter Zijlstra (Intel),
	Masahiro Yamada, Thomas Gleixner, Hendrik Brueckner,
	linux-snps-arc, linux-arm-kernel, linux-c6x-dev,
	linux-cris-kernel, uclinux-h8-devel, linux-hexagon, linux-m68k,
	linux-metag, linux-am33-list, linux, linux-parisc, linux-s390,
	linux-sh, linux-xtensa

On Wed, May 11, 2016 at 05:06:17PM +0800, zengzhaoxiu@163.com wrote:
> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Simply use the generic version.
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no> [for avr32]

For the CRIS part:

Acked-by: Jesper Nilsson <jesper.nilsson@axis.com>

/^JN - Jesper Nilsson
-- 
               Jesper Nilsson -- jesper.nilsson@axis.com

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h
  2016-05-11  9:06 ` [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h zengzhaoxiu
  2016-05-11 10:06   ` Jesper Nilsson
@ 2016-05-11 10:42   ` Catalin Marinas
  2016-05-11 13:52   ` Vineet Gupta
  2016-05-11 15:24   ` Mark Salter
  3 siblings, 0 replies; 55+ messages in thread
From: Catalin Marinas @ 2016-05-11 10:42 UTC (permalink / raw)
  To: zengzhaoxiu
  Cc: linux-kernel, Rich Felker, Aurelien Jacquiot,
	Peter Zijlstra (Intel),
	Will Deacon, James E.J. Bottomley, David Howells, Max Filippov,
	Hendrik Brueckner, linux, Hans-Christian Egtvedt, Jonas Bonn,
	linux-s390, Jesper Nilsson, linux-am33-list, linux-c6x-dev,
	Yoshinori Sato, linux-hexagon, Helge Deller, linux-sh,
	Russell King, Geert Uytterhoeven, Mark Salter, linux-snps-arc,
	Haavard Skinnemoen, uclinux-h8-devel, linux-xtensa, James Hogan,
	Heiko Carstens, Mikael Starvik, linux-m68k, Zhaoxiu Zeng,
	Thomas Gleixner, linux-metag, linux-arm-kernel, Chris Zankel,
	linux-parisc, linux-cris-kernel, Masahiro Yamada, Vineet Gupta,
	Richard Kuo, Martin Schwidefsky, Koichi Yasutake

On Wed, May 11, 2016 at 05:06:17PM +0800, zengzhaoxiu@163.com wrote:
> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Simply use the generic version.
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no> [for avr32]
> ---
>  arch/arc/include/asm/bitops.h      | 1 +
>  arch/arm/include/asm/bitops.h      | 1 +
>  arch/arm64/include/asm/bitops.h    | 1 +
>  arch/avr32/include/asm/bitops.h    | 1 +
>  arch/c6x/include/asm/bitops.h      | 1 +
>  arch/cris/include/asm/bitops.h     | 1 +
>  arch/frv/include/asm/bitops.h      | 1 +
>  arch/h8300/include/asm/bitops.h    | 1 +
>  arch/hexagon/include/asm/bitops.h  | 1 +
>  arch/m32r/include/asm/bitops.h     | 1 +
>  arch/m68k/include/asm/bitops.h     | 1 +
>  arch/metag/include/asm/bitops.h    | 1 +
>  arch/mn10300/include/asm/bitops.h  | 1 +
>  arch/openrisc/include/asm/bitops.h | 1 +
>  arch/parisc/include/asm/bitops.h   | 1 +
>  arch/s390/include/asm/bitops.h     | 1 +
>  arch/sh/include/asm/bitops.h       | 1 +
>  arch/xtensa/include/asm/bitops.h   | 1 +

For arm64:

Acked-by: Catalin Marinas <catalin.marinas@arm.com>

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h
  2016-05-11  9:06 ` [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h zengzhaoxiu
  2016-05-11 10:06   ` Jesper Nilsson
  2016-05-11 10:42   ` Catalin Marinas
@ 2016-05-11 13:52   ` Vineet Gupta
  2016-05-11 15:24   ` Mark Salter
  3 siblings, 0 replies; 55+ messages in thread
From: Vineet Gupta @ 2016-05-11 13:52 UTC (permalink / raw)
  To: zengzhaoxiu, linux-kernel
  Cc: Rich Felker, Aurelien Jacquiot, Peter Zijlstra (Intel),
	Catalin Marinas, Will Deacon, James E.J. Bottomley,
	David Howells, Max Filippov, Hendrik Brueckner, linux,
	Hans-Christian Egtvedt, Jonas Bonn, linux-s390, Jesper Nilsson,
	linux-am33-list, linux-c6x-dev, Yoshinori Sato, linux-hexagon,
	Helge Deller, linux-sh, Russell King, Geert Uytterhoeven,
	Mark Salter, linux-snps-arc

On Wednesday 11 May 2016 02:36 PM, zengzhaoxiu@163.com wrote:
> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Simply use the generic version.
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no> [for avr32]

Acked-by: Vineet Gupta <vgupta@synopsys.com>  # for arch/arc

Thx,
-Vineet

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 01/31] bitops: add parity functions
  2016-05-11  8:47 ` [patch V4 01/31] " zengzhaoxiu
@ 2016-05-11 14:32   ` Martin Kepplinger
  0 siblings, 0 replies; 55+ messages in thread
From: Martin Kepplinger @ 2016-05-11 14:32 UTC (permalink / raw)
  To: zengzhaoxiu, linux-kernel, linux, ulrik.debie-os
  Cc: Zhaoxiu Zeng, Arnd Bergmann, Andrew Morton, Sasha Levin,
	Ingo Molnar, Denys Vlasenko, linux-arch

Am 2016-05-11 um 10:47 schrieb zengzhaoxiu@163.com:
> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Add generic parity functions, adapted from
> "https://graphics.stanford.edu/~seander/bithacks.html#ParityParallel".
> 
> The function parityN returns whether an odd or even number of bits are on
> in a N-bit word.
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> ---

This won't be up to me, but I'd appreciate to see all 31 patches
together without having to look for them; I guess I'm not alone.

thanks
                        martin

>  include/asm-generic/bitops.h              |  1 +
>  include/asm-generic/bitops/arch_parity.h  | 39 +++++++++++++++++++++++++++++++
>  include/asm-generic/bitops/const_parity.h | 36 ++++++++++++++++++++++++++++
>  include/asm-generic/bitops/parity.h       |  7 ++++++
>  include/asm-generic/bitops/popc-parity.h  | 32 +++++++++++++++++++++++++
>  include/linux/bitops.h                    | 10 ++++++++
>  6 files changed, 125 insertions(+)
>  create mode 100644 include/asm-generic/bitops/arch_parity.h
>  create mode 100644 include/asm-generic/bitops/const_parity.h
>  create mode 100644 include/asm-generic/bitops/parity.h
>  create mode 100644 include/asm-generic/bitops/popc-parity.h
> 
> diff --git a/include/asm-generic/bitops.h b/include/asm-generic/bitops.h
> index dcdcacf..d85722f 100644
> --- a/include/asm-generic/bitops.h
> +++ b/include/asm-generic/bitops.h
> @@ -27,6 +27,7 @@
>  #include <asm-generic/bitops/sched.h>
>  #include <asm-generic/bitops/ffs.h>
>  #include <asm-generic/bitops/hweight.h>
> +#include <asm-generic/bitops/parity.h>
>  #include <asm-generic/bitops/lock.h>
>  
>  #include <asm-generic/bitops/atomic.h>
> diff --git a/include/asm-generic/bitops/arch_parity.h b/include/asm-generic/bitops/arch_parity.h
> new file mode 100644
> index 0000000..813e152
> --- /dev/null
> +++ b/include/asm-generic/bitops/arch_parity.h
> @@ -0,0 +1,39 @@
> +#ifndef _ASM_GENERIC_BITOPS_ARCH_PARITY_H_
> +#define _ASM_GENERIC_BITOPS_ARCH_PARITY_H_
> +
> +#include <asm/types.h>
> +
> +/*
> + * Refrence to 'https://graphics.stanford.edu/~seander/bithacks.html#ParityParallel'.
> + */
> +
> +static inline unsigned int __arch_parity4(unsigned int w)
> +{
> +	w &= 0xf;
> +	return ((PARITY_MAGIC) >> w) & 1;
> +}
> +
> +static inline unsigned int __arch_parity8(unsigned int w)
> +{
> +	w ^= w >> 4;
> +	return __arch_parity4(w);
> +}
> +
> +static inline unsigned int __arch_parity16(unsigned int w)
> +{
> +	w ^= w >> 8;
> +	return __arch_parity8(w);
> +}
> +
> +static inline unsigned int __arch_parity32(unsigned int w)
> +{
> +	w ^= w >> 16;
> +	return __arch_parity16(w);
> +}
> +
> +static inline unsigned int __arch_parity64(__u64 w)
> +{
> +	return __arch_parity32((unsigned int)(w >> 32) ^ (unsigned int)w);
> +}
> +
> +#endif /* _ASM_GENERIC_BITOPS_ARCH_PARITY_H_ */
> diff --git a/include/asm-generic/bitops/const_parity.h b/include/asm-generic/bitops/const_parity.h
> new file mode 100644
> index 0000000..3970546
> --- /dev/null
> +++ b/include/asm-generic/bitops/const_parity.h
> @@ -0,0 +1,36 @@
> +#ifndef _ASM_GENERIC_BITOPS_CONST_PARITY_H_
> +#define _ASM_GENERIC_BITOPS_CONST_PARITY_H_
> +
> +/*
> + * Compile time versions of __arch_parityN()
> + */
> +#define __const_parity4(w)   (((PARITY_MAGIC) >> ((w) & 0xf)) & 1)
> +#define __const_parity8(w)   (__const_parity4((w) ^ ((w) >> 4)))
> +#define __const_parity16(w)  (__const_parity8((w) ^ ((w) >> 8)))
> +#define __const_parity32(w)  (__const_parity16((w) ^ ((w) >> 16)))
> +#define __const_parity64(w)  (__const_parity32((w) ^ ((w) >> 32)))
> +
> +/*
> + * Generic interface.
> + */
> +#define parity4(w)   (__builtin_constant_p(w) ? __const_parity4(w)  : __arch_parity4(w))
> +#define parity8(w)   (__builtin_constant_p(w) ? __const_parity8(w)  : __arch_parity8(w))
> +#define parity16(w)  (__builtin_constant_p(w) ? __const_parity16(w) : __arch_parity16(w))
> +#define parity32(w)  (__builtin_constant_p(w) ? __const_parity32(w) : __arch_parity32(w))
> +#define parity64(w)  (__builtin_constant_p(w) ? __const_parity64(w) : __arch_parity64(w))
> +
> +/*
> + * Interface for known constant arguments
> + */
> +#define PARITY4(w)   (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity4(w))
> +#define PARITY8(w)   (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity8(w))
> +#define PARITY16(w)  (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity16(w))
> +#define PARITY32(w)  (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity32(w))
> +#define PARITY64(w)  (BUILD_BUG_ON_ZERO(!__builtin_constant_p(w)) + __const_parity64(w))
> +
> +/*
> + * Type invariant interface to the compile time constant parity functions.
> + */
> +#define PARITY(w)    PARITY64((u64)(w))
> +
> +#endif /* _ASM_GENERIC_BITOPS_CONST_PARITY_H_ */
> diff --git a/include/asm-generic/bitops/parity.h b/include/asm-generic/bitops/parity.h
> new file mode 100644
> index 0000000..a91dce7
> --- /dev/null
> +++ b/include/asm-generic/bitops/parity.h
> @@ -0,0 +1,7 @@
> +#ifndef _ASM_GENERIC_BITOPS_PARITY_H_
> +#define _ASM_GENERIC_BITOPS_PARITY_H_
> +
> +#include <asm-generic/bitops/arch_parity.h>
> +#include <asm-generic/bitops/const_parity.h>
> +
> +#endif /* _ASM_GENERIC_BITOPS_PARITY_H_ */
> diff --git a/include/asm-generic/bitops/popc-parity.h b/include/asm-generic/bitops/popc-parity.h
> new file mode 100644
> index 0000000..bf05999
> --- /dev/null
> +++ b/include/asm-generic/bitops/popc-parity.h
> @@ -0,0 +1,32 @@
> +#ifndef _ASM_GENERIC_BITOPS_POPC_PARITY_H_
> +#define _ASM_GENERIC_BITOPS_POPC_PARITY_H_
> +
> +#include <asm/types.h>
> +
> +static inline unsigned int __arch_parity32(unsigned int w)
> +{
> +	return __builtin_popcount(w) & 1;
> +}
> +
> +static inline unsigned int __arch_parity16(unsigned int w)
> +{
> +	return __arch_parity32(w & 0xffff);
> +}
> +
> +static inline unsigned int __arch_parity8(unsigned int w)
> +{
> +	return __arch_parity32(w & 0xff);
> +}
> +
> +static inline unsigned int __arch_parity4(unsigned int w)
> +{
> +	return __arch_parity32(w & 0xf);
> +}
> +
> +static inline unsigned int __arch_parity64(__u64 w)
> +{
> +	return (unsigned int)__builtin_popcountll(w) & 1;
> +}
> +
> +#endif
> +
> diff --git a/include/linux/bitops.h b/include/linux/bitops.h
> index defeaac..c3ea19e 100644
> --- a/include/linux/bitops.h
> +++ b/include/linux/bitops.h
> @@ -30,6 +30,11 @@ extern unsigned int __sw_hweight32(unsigned int w);
>  extern unsigned long __sw_hweight64(__u64 w);
>  
>  /*
> + * a miniature 16-bit parity-table of 4-bits number
> + */
> +#define	PARITY_MAGIC	0x6996
> +
> +/*
>   * Include this here because some architectures need generic_ffs/fls in
>   * scope
>   */
> @@ -80,6 +85,11 @@ static __always_inline unsigned long hweight_long(unsigned long w)
>  	return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
>  }
>  
> +static __always_inline unsigned int parity_long(unsigned long w)
> +{
> +	return sizeof(w) == 4 ? parity32(w) : parity64(w);
> +}
> +
>  /**
>   * rol64 - rotate a 64-bit value left
>   * @word: value to rotate
> 

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h
  2016-05-11  9:06 ` [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h zengzhaoxiu
                     ` (2 preceding siblings ...)
  2016-05-11 13:52   ` Vineet Gupta
@ 2016-05-11 15:24   ` Mark Salter
  3 siblings, 0 replies; 55+ messages in thread
From: Mark Salter @ 2016-05-11 15:24 UTC (permalink / raw)
  To: zengzhaoxiu, linux-kernel
  Cc: Zhaoxiu Zeng, Vineet Gupta, Russell King, Catalin Marinas,
	Will Deacon, Haavard Skinnemoen, Hans-Christian Egtvedt,
	Aurelien Jacquiot, Mikael Starvik, Jesper Nilsson,
	Yoshinori Sato, Richard Kuo, Geert Uytterhoeven, James Hogan,
	David Howells, Koichi Yasutake, Jonas Bonn, James E.J. Bottomley,
	Helge Deller, Martin Schwidefsky, Heiko Carstens, Rich Felker,
	Chris Zankel, Max Filippov, Peter Zijlstra (Intel),
	Masahiro Yamada, Thomas Gleixner, Hendrik Brueckner,
	linux-snps-arc, linux-arm-kernel, linux-c6x-dev,
	linux-cris-kernel, uclinux-h8-devel, linux-hexagon, linux-m68k,
	linux-metag, linux-am33-list, linux, linux-parisc, linux-s390,
	linux-sh, linux-xtensa

On Wed, 2016-05-11 at 17:06 +0800, zengzhaoxiu@163.com wrote:
> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Simply use the generic version.
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> Acked-by: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no> [for avr32]
> ---

For c6x:

Acked-by: Mark Salter <msalter@redhat.com>

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 08/31] bitops: Add sparc-specific parity functions
  2016-05-11  9:13 ` [patch V4 08/31] bitops: Add sparc-specific " zengzhaoxiu
@ 2016-05-11 23:59   ` David Miller
  0 siblings, 0 replies; 55+ messages in thread
From: David Miller @ 2016-05-11 23:59 UTC (permalink / raw)
  To: zengzhaoxiu
  Cc: linux-kernel, sam, zhaoxiu.zeng, wim.coekaerts, linux,
	julian.calaby, sparclinux

From: zengzhaoxiu@163.com
Date: Wed, 11 May 2016 17:13:18 +0800

> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Use runtime patching for sparc64, lifted from hweight
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Acked-by: David S. Miller <davem@davemloft.net>

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 29/31] ethernet: use parity8 in broadcom/tg3.c
  2016-05-11  9:24 ` [patch V4 29/31] ethernet: use parity8 in broadcom/tg3.c zengzhaoxiu
@ 2016-05-11 23:59   ` David Miller
  0 siblings, 0 replies; 55+ messages in thread
From: David Miller @ 2016-05-11 23:59 UTC (permalink / raw)
  To: zengzhaoxiu
  Cc: linux-kernel, zhaoxiu.zeng, siva.kallam, prashant, mchan, netdev

From: zengzhaoxiu@163.com
Date: Wed, 11 May 2016 17:24:33 +0800

> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> Acked-by: Siva Reddy Kallam <siva.kallam@broadcom.com>

Acked-by: David S. Miller <davem@davemloft.net>

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 23/31] ethernet: use parity8 in sun/niu.c
  2016-05-11  9:22 ` [patch V4 23/31] ethernet: use parity8 in sun/niu.c zengzhaoxiu
@ 2016-05-11 23:59   ` David Miller
  0 siblings, 0 replies; 55+ messages in thread
From: David Miller @ 2016-05-11 23:59 UTC (permalink / raw)
  To: zengzhaoxiu
  Cc: linux-kernel, zhaoxiu.zeng, mina86, iamjoonsoo.kim, akpm, vbabka,
	jiri, netdev

From: zengzhaoxiu@163.com
Date: Wed, 11 May 2016 17:22:17 +0800

> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> Acked-by: Michal Nazarewicz <mina86@mina86.com>

Acked-by: David S. Miller <davem@davemloft.net>

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-11  9:31   ` Peter Zijlstra
  2016-05-11  9:52     ` Borislav Petkov
@ 2016-05-16 15:49     ` Zhaoxiu Zeng
  2016-05-16 17:06       ` Peter Zijlstra
  2016-05-16 19:19     ` H. Peter Anvin
  2 siblings, 1 reply; 55+ messages in thread
From: Zhaoxiu Zeng @ 2016-05-16 15:49 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: linux-kernel, bp, gnomes, andi, dvyukov, Zhaoxiu Zeng,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86,
	Denys Vlasenko

On 2016/5/11 17:31, Peter Zijlstra wrote:
> Please use the GEN_*_RMWcc() stuff to avoid the setpo where possible.

Setpo is better.
In most cases, we need to store the parity, or compare it with other variables.

For example, in drivers/net/ethernet/broadcom/tg3.c,

static int tg3_test_nvram(struct tg3 *tp)
{
	......
	if (parity8(data[i]) == !!parity[i])
		goto out;
	......
}

If use GEN_BINARY_RMWcc stuff,

static inline unsigned int __arch_parity8(unsigned int w)
{
	GEN_BINARY_RMWcc("testb", w, "er", 0xff, "%0", "po");
}

gcc's output:
   1c2fe:	0f b6 54 05 a0       	movzbl -0x60(%rbp,%rax,1),%edx
   1c303:	89 55 9c             	mov    %edx,-0x64(%rbp)
   1c306:	f6 45 9c ff          	testb  $0xff,-0x64(%rbp)
   1c30a:	7b 2c                	jnp    1c338 <tg3_self_test+0xf98>
   1c30c:	31 c9                	xor    %ecx,%ecx
   1c30e:	31 d2                	xor    %edx,%edx
   1c310:	80 7c 05 bc 00       	cmpb   $0x0,-0x44(%rbp,%rax,1)
   1c315:	0f 95 c2             	setne  %dl
   1c318:	39 ca                	cmp    %ecx,%edx
   1c31a:	75 d8                	jne    1c2f4 <tg3_self_test+0xf54>
   ......
   1c338:	b9 01 00 00 00       	mov    $0x1,%ecx
   1c33d:	eb cf                	jmp    1c30e <tg3_self_test+0xf6e>


Else if use setpo,

static inline unsigned int __arch_parity8(unsigned int w)
{
	u8 res;
	asm("test $0xff, %1; setpo %0" : "=qm" (res) : "rm" (w) : "memory");
	return res;
}

gcc's output:
   1c2fe:	31 c9                	xor    %ecx,%ecx
   1c300:	0f b6 44 15 a0       	movzbl -0x60(%rbp,%rdx,1),%eax
   1c305:	a9 ff 00 00 00       	test   $0xff,%eax
   1c30a:	0f 9b c0             	setnp  %al
   1c30d:	80 7c 15 bc 00       	cmpb   $0x0,-0x44(%rbp,%rdx,1)
   1c312:	0f b6 c0             	movzbl %al,%eax
   1c315:	0f 95 c1             	setne  %cl
   1c318:	39 c8                	cmp    %ecx,%eax
   1c31a:	75 d8                	jne    1c2f4 <tg3_self_test+0xf54>

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-16 15:49     ` Zhaoxiu Zeng
@ 2016-05-16 17:06       ` Peter Zijlstra
  2016-05-16 19:22         ` H. Peter Anvin
  0 siblings, 1 reply; 55+ messages in thread
From: Peter Zijlstra @ 2016-05-16 17:06 UTC (permalink / raw)
  To: Zhaoxiu Zeng
  Cc: linux-kernel, bp, gnomes, andi, dvyukov, Zhaoxiu Zeng,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86,
	Denys Vlasenko

On Mon, May 16, 2016 at 11:49:05PM +0800, Zhaoxiu Zeng wrote:
> On 2016/5/11 17:31, Peter Zijlstra wrote:
> > Please use the GEN_*_RMWcc() stuff to avoid the setpo where possible.
> 
> Setpo is better.
> In most cases, we need to store the parity, or compare it with other variables.
> 
> For example, in drivers/net/ethernet/broadcom/tg3.c,
> 
> static int tg3_test_nvram(struct tg3 *tp)
> {
> 	......
> 	if (parity8(data[i]) == !!parity[i])
> 		goto out;
> 	......
> }
> 
> If use GEN_BINARY_RMWcc stuff,
> 
> static inline unsigned int __arch_parity8(unsigned int w)
> {
> 	GEN_BINARY_RMWcc("testb", w, "er", 0xff, "%0", "po");
> }

blergh; GCC does indeed make a mess of that. It looks we'll need the
cc-output stuff for this in order for GCC to generates sane code for
that :/

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-11  9:31   ` Peter Zijlstra
  2016-05-11  9:52     ` Borislav Petkov
  2016-05-16 15:49     ` Zhaoxiu Zeng
@ 2016-05-16 19:19     ` H. Peter Anvin
  2016-06-29 15:04       ` zengzhaoxiu
  2 siblings, 1 reply; 55+ messages in thread
From: H. Peter Anvin @ 2016-05-16 19:19 UTC (permalink / raw)
  To: Peter Zijlstra, zengzhaoxiu
  Cc: linux-kernel, bp, gnomes, andi, dvyukov, Zhaoxiu Zeng,
	Thomas Gleixner, Ingo Molnar, x86, Denys Vlasenko

On May 11, 2016 2:31:39 AM PDT, Peter Zijlstra <peterz@infradead.org> wrote:
>On Wed, May 11, 2016 at 05:16:38PM +0800, zengzhaoxiu@163.com wrote:
>
>> +static inline unsigned int __arch_parity4(unsigned int w)
>> +{
>> +	unsigned int res = 0;
>> +
>> +	asm("test $0xf, %1; setpo %b0"
>> +		: "+q" (res)
>> +		: "r" (w)
>> +		: "cc");
>> +
>> +	return res;
>> +}
>> +
>> +static inline unsigned int __arch_parity8(unsigned int w)
>> +{
>> +	unsigned int res = 0;
>> +
>> +	asm("test %1, %1; setpo %b0"
>> +		: "+q" (res)
>> +		: "r" (w)
>> +		: "cc");
>> +
>> +	return res;
>> +}
>> +
>> +static inline unsigned int __arch_parity16(unsigned int w)
>> +{
>> +	unsigned int res = 0;
>> +
>> +	asm("xor %h1, %b1; setpo %b0"
>> +		: "+q" (res), "+q" (w)
>> +		: : "cc");
>> +
>> +	return res;
>> +}
>
>Please use the GEN_*_RMWcc() stuff to avoid the setpo where possible.
>
>> +
>> +#ifdef CONFIG_64BIT
>> +/* popcnt %eax, %eax -- redundant REX prefix for alignment */
>> +#define POPCNT32 ".byte 0xf3,0x40,0x0f,0xb8,0xc0"
>> +/* popcnt %rax, %rax */
>> +#define POPCNT64 ".byte 0xf3,0x48,0x0f,0xb8,0xc0"
>> +#else
>> +/* popcnt %eax, %eax */
>> +#define POPCNT32 ".byte 0xf3,0x0f,0xb8,0xc0"
>> +#endif
>
>Yuck, please don't duplicate stuff like this.
>
>> +
>> +static __always_inline unsigned int __arch_parity32(unsigned int w)
>> +{
>> +	unsigned int res;
>> +	unsigned int tmp;
>> +
>> +	asm(ALTERNATIVE(
>> +		"	mov	%%eax, %1	\n"
>> +		"	shr	$16, %%eax	\n"
>> +		"	xor	%1, %%eax	\n"
>> +		"	xor	%%ah, %%al	\n"
>> +		"	mov	$0, %%eax	\n"
>> +		"	setpo	%%al	\n",
>> +		POPCNT32 "			\n"
>> +		"	and	$1, %%eax	\n",
>> +		X86_FEATURE_POPCNT)
>> +		: "=a" (res), "=&r" (tmp)
>> +		: "a" (w)
>> +		: "cc");
>> +
>> +	return res;
>> +}
>
>How many bytes does that end up being? Should we make it a call?

Also, setxx is used with a "bool" or "u8", not " unsigned int"!!!!
-- 
Sent from my Android device with K-9 Mail. Please excuse brevity and formatting.

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-16 17:06       ` Peter Zijlstra
@ 2016-05-16 19:22         ` H. Peter Anvin
  2016-05-17 11:22           ` Peter Zijlstra
  0 siblings, 1 reply; 55+ messages in thread
From: H. Peter Anvin @ 2016-05-16 19:22 UTC (permalink / raw)
  To: Peter Zijlstra, Zhaoxiu Zeng
  Cc: linux-kernel, bp, gnomes, andi, dvyukov, Zhaoxiu Zeng,
	Thomas Gleixner, Ingo Molnar, x86, Denys Vlasenko

On May 16, 2016 10:06:08 AM PDT, Peter Zijlstra <peterz@infradead.org> wrote:
>On Mon, May 16, 2016 at 11:49:05PM +0800, Zhaoxiu Zeng wrote:
>> On 2016/5/11 17:31, Peter Zijlstra wrote:
>> > Please use the GEN_*_RMWcc() stuff to avoid the setpo where
>possible.
>> 
>> Setpo is better.
>> In most cases, we need to store the parity, or compare it with other
>variables.
>> 
>> For example, in drivers/net/ethernet/broadcom/tg3.c,
>> 
>> static int tg3_test_nvram(struct tg3 *tp)
>> {
>> 	......
>> 	if (parity8(data[i]) == !!parity[i])
>> 		goto out;
>> 	......
>> }
>> 
>> If use GEN_BINARY_RMWcc stuff,
>> 
>> static inline unsigned int __arch_parity8(unsigned int w)
>> {
>> 	GEN_BINARY_RMWcc("testb", w, "er", 0xff, "%0", "po");
>> }
>
>blergh; GCC does indeed make a mess of that. It looks we'll need the
>cc-output stuff for this in order for GCC to generates sane code for
>that :/

For what it's worth, I have a patchset for cc out just about ready to post.  It is in gcc 6.1.
-- 
Sent from my Android device with K-9 Mail. Please excuse brevity and formatting.

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-16 19:22         ` H. Peter Anvin
@ 2016-05-17 11:22           ` Peter Zijlstra
  0 siblings, 0 replies; 55+ messages in thread
From: Peter Zijlstra @ 2016-05-17 11:22 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Zhaoxiu Zeng, linux-kernel, bp, gnomes, andi, dvyukov,
	Zhaoxiu Zeng, Thomas Gleixner, Ingo Molnar, x86, Denys Vlasenko

On Mon, May 16, 2016 at 12:22:05PM -0700, H. Peter Anvin wrote:
> On May 16, 2016 10:06:08 AM PDT, Peter Zijlstra <peterz@infradead.org> wrote:

> >blergh; GCC does indeed make a mess of that. It looks we'll need the
> >cc-output stuff for this in order for GCC to generates sane code for
> >that :/
> 
> For what it's worth, I have a patchset for cc out just about ready to post.  It is in gcc 6.1.

Nice, looking fwd to play with that. Thanks!

^ permalink raw reply	[flat|nested] 55+ messages in thread

* Re: [patch V4 27/31] serial: use parity32 in max3100
  2016-05-11  9:23 ` [patch V4 27/31] serial: use parity32 in max3100 zengzhaoxiu
@ 2016-06-25 17:25   ` Greg Kroah-Hartman
  2016-06-29 14:57     ` [patch V4 27/31] serial: use parity8 " zengzhaoxiu
  0 siblings, 1 reply; 55+ messages in thread
From: Greg Kroah-Hartman @ 2016-06-25 17:25 UTC (permalink / raw)
  To: zengzhaoxiu; +Cc: linux-kernel, Zhaoxiu Zeng, Jiri Slaby, linux-serial

On Wed, May 11, 2016 at 05:23:07PM +0800, zengzhaoxiu@163.com wrote:
> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> ---
>  drivers/tty/serial/max3100.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c
> index 5c4c280..a0cc84a 100644
> --- a/drivers/tty/serial/max3100.c
> +++ b/drivers/tty/serial/max3100.c
> @@ -155,7 +155,7 @@ static int max3100_do_parity(struct max3100_port *s, u16 c)
>  	else
>  		c &= 0xff;
>  
> -	parity = parity ^ (hweight8(c) & 1);
> +	parity ^= parity8(c);

Your subject does not match the patch, and there is no changelog text so
I can't take it :(

Please fix up.

greg k-h

^ permalink raw reply	[flat|nested] 55+ messages in thread

* [patch V4 27/31] serial: use parity8 in max3100
  2016-06-25 17:25   ` Greg Kroah-Hartman
@ 2016-06-29 14:57     ` zengzhaoxiu
  2016-06-29 16:43       ` Greg KH
  0 siblings, 1 reply; 55+ messages in thread
From: zengzhaoxiu @ 2016-06-29 14:57 UTC (permalink / raw)
  To: gregkh, jslaby, linux-serial, linux-kernel; +Cc: Zhaoxiu Zeng

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 drivers/tty/serial/max3100.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c
index 5c4c280..a0cc84a 100644
--- a/drivers/tty/serial/max3100.c
+++ b/drivers/tty/serial/max3100.c
@@ -155,7 +155,7 @@ static int max3100_do_parity(struct max3100_port *s, u16 c)
 	else
 		c &= 0xff;
 
-	parity = parity ^ (hweight8(c) & 1);
+	parity ^= parity8(c);
 	return parity;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 09/31] bitops: Add x86-specific parity functions
  2016-05-16 19:19     ` H. Peter Anvin
@ 2016-06-29 15:04       ` zengzhaoxiu
  0 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-06-29 15:04 UTC (permalink / raw)
  To: hpa, peterz, bp, gnomes, andi, dvyukov, tglx, mingo, dvlasenk,
	x86, linux-kernel
  Cc: Zhaoxiu Zeng

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 arch/x86/include/asm/arch_parity.h | 60 ++++++++++++++++++++++++++++++++++++++
 arch/x86/include/asm/bitops.h      |  4 ++-
 2 files changed, 63 insertions(+), 1 deletion(-)
 create mode 100644 arch/x86/include/asm/arch_parity.h

diff --git a/arch/x86/include/asm/arch_parity.h b/arch/x86/include/asm/arch_parity.h
new file mode 100644
index 0000000..c7027f8
--- /dev/null
+++ b/arch/x86/include/asm/arch_parity.h
@@ -0,0 +1,60 @@
+#ifndef _ASM_X86_PARITY_H
+#define _ASM_X86_PARITY_H
+
+#include <asm/arch_parity.h>
+
+/*
+ * parity4,8,16 use the Parity Flag directly
+ *
+ * Parity flag - Set if the least-significant byte of the
+ *               result contains an even number of 1 bits;
+ *               cleared otherwise.
+ */
+
+static inline unsigned int __arch_parity4(unsigned int w)
+{
+	u8 res;
+
+	asm("test $0xf, %1; setpo %b0"
+		: "=qm" (res)
+		: "rm" (w)
+		: "cc");
+
+	return res;
+}
+
+static inline unsigned int __arch_parity8(unsigned int w)
+{
+	u8 res;
+
+	asm("test $0xff, %1; setpo %b0"
+		: "=qm" (res)
+		: "rm" (w)
+		: "cc");
+
+	return res;
+}
+
+static inline unsigned int __arch_parity16(unsigned int w)
+{
+	u8 res;
+
+	asm("xor %h1, %b1; setpo %b0"
+		: "=qm" (res), "+q" (w)
+		: : "cc");
+
+	return res;
+}
+
+static inline unsigned int __arch_parity32(unsigned int w)
+{
+	return __arch_hweight32(w) & 1;
+}
+
+static inline unsigned int __arch_parity64(__u64 w)
+{
+	return __arch_hweight64(w) & 1;
+}
+
+#endif
+
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h
index 7766d1c..f5b0122 100644
--- a/arch/x86/include/asm/bitops.h
+++ b/arch/x86/include/asm/bitops.h
@@ -498,9 +498,11 @@ static __always_inline int fls64(__u64 x)
 #include <asm-generic/bitops/sched.h>
 
 #include <asm/arch_hweight.h>
-
 #include <asm-generic/bitops/const_hweight.h>
 
+#include <asm/arch_parity.h>
+#include <asm-generic/bitops/const_parity.h>
+
 #include <asm-generic/bitops/le.h>
 
 #include <asm-generic/bitops/ext2-atomic-setbit.h>
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 05/31] bitops: Add ia64-specific parity functions
  2016-05-11  9:10 ` [patch V4 05/31] bitops: Add ia-specific " zengzhaoxiu
@ 2016-06-29 15:15   ` zengzhaoxiu
  0 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-06-29 15:15 UTC (permalink / raw)
  To: linux-kernel; +Cc: tony.luck, fenghua.yu, linux-ia64, Zhaoxiu Zeng

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 arch/ia64/include/asm/bitops.h | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/arch/ia64/include/asm/bitops.h b/arch/ia64/include/asm/bitops.h
index 71e8145..041d1d6 100644
--- a/arch/ia64/include/asm/bitops.h
+++ b/arch/ia64/include/asm/bitops.h
@@ -439,6 +439,37 @@ static __inline__ unsigned long __arch_hweight64(unsigned long x)
 
 #include <asm-generic/bitops/const_hweight.h>
 
+/*
+ * parityN: returns the parity of a N-bit word,
+ * i.e. the number of 1-bits in x modulo 2.
+ */
+static __inline__ unsigned int __arch_parity64(unsigned long x)
+{
+	return (unsigned int)ia64_popcnt(x) & 1;
+}
+
+static __inline__ unsigned int __arch_parity32(unsigned int x)
+{
+	return __arch_parity64((unsigned long)x << 32);
+}
+
+static __inline__ unsigned int __arch_parity16(unsigned int x)
+{
+	return __arch_parity64((unsigned long)x << 48);
+}
+
+static __inline__ unsigned int __arch_parity8(unsigned int x)
+{
+	return __arch_parity64((unsigned long)x << 56);
+}
+
+static __inline__ unsigned int __arch_parity4(unsigned int x)
+{
+	return __arch_parity64((unsigned long)x << 60);
+}
+
+#include <asm-generic/bitops/const_parity.h>
+
 #endif /* __KERNEL__ */
 
 #include <asm-generic/bitops/find.h>
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* [patch V4 30/31] crypto: use parity_long in sahara.c
  2016-05-11  9:24 ` [patch V4 30/31] crypto: use parity_long is sahara.c zengzhaoxiu
@ 2016-06-29 15:18   ` zengzhaoxiu
  0 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-06-29 15:18 UTC (permalink / raw)
  To: linux-kernel; +Cc: herbert, davem, linux-crypto, Zhaoxiu Zeng

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/crypto/sahara.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/crypto/sahara.c b/drivers/crypto/sahara.c
index c3f3d89..5c44a15 100644
--- a/drivers/crypto/sahara.c
+++ b/drivers/crypto/sahara.c
@@ -783,7 +783,7 @@ static u32 sahara_sha_init_hdr(struct sahara_dev *dev,
 	if (rctx->last)
 		hdr |= SAHARA_HDR_MDHA_PDATA;
 
-	if (hweight_long(hdr) % 2 == 0)
+	if (!parity_long(hdr))
 		hdr |= SAHARA_HDR_PARITY_BIT;
 
 	return hdr;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* Re: [patch V4 27/31] serial: use parity8 in max3100
  2016-06-29 14:57     ` [patch V4 27/31] serial: use parity8 " zengzhaoxiu
@ 2016-06-29 16:43       ` Greg KH
  2016-06-29 17:25         ` zengzhaoxiu
  0 siblings, 1 reply; 55+ messages in thread
From: Greg KH @ 2016-06-29 16:43 UTC (permalink / raw)
  To: zengzhaoxiu; +Cc: jslaby, linux-serial, linux-kernel, Zhaoxiu Zeng

On Wed, Jun 29, 2016 at 10:57:08PM +0800, zengzhaoxiu@163.com wrote:
> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

I acked this?  I don't remember doing that...

Again, I can't take patches without any changelog text, sorry.  Please
take my ack off of this patch.

greg k-h

^ permalink raw reply	[flat|nested] 55+ messages in thread

* [patch V4 27/31] serial: use parity8 in max3100
  2016-06-29 16:43       ` Greg KH
@ 2016-06-29 17:25         ` zengzhaoxiu
  0 siblings, 0 replies; 55+ messages in thread
From: zengzhaoxiu @ 2016-06-29 17:25 UTC (permalink / raw)
  To: gregkh, jslaby, linux-serial, linux-kernel; +Cc: Zhaoxiu Zeng

From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Use parity8(c) instead "hweight8(c) & 1" to improve readability,
and improve performance on some CPUs that without popcount support.

Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
---
 drivers/tty/serial/max3100.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c
index 5c4c280..a0cc84a 100644
--- a/drivers/tty/serial/max3100.c
+++ b/drivers/tty/serial/max3100.c
@@ -155,7 +155,7 @@ static int max3100_do_parity(struct max3100_port *s, u16 c)
 	else
 		c &= 0xff;
 
-	parity = parity ^ (hweight8(c) & 1);
+	parity ^= parity8(c);
 	return parity;
 }
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 55+ messages in thread

* Re: [patch V4 14/31] media: use parity functions in saa7115
  2016-05-11  9:19 ` [patch V4 14/31] media: use parity functions in saa7115 zengzhaoxiu
@ 2016-07-01 11:53   ` Hans Verkuil
  0 siblings, 0 replies; 55+ messages in thread
From: Hans Verkuil @ 2016-07-01 11:53 UTC (permalink / raw)
  To: zengzhaoxiu, linux-kernel
  Cc: Zhaoxiu Zeng, Mauro Carvalho Chehab, Krzysztof Kozlowski,
	Arnd Bergmann, linux-media

On 05/11/2016 11:19 AM, zengzhaoxiu@163.com wrote:
> From: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>
> 
> Signed-off-by: Zhaoxiu Zeng <zhaoxiu.zeng@gmail.com>

Acked-by: Hans Verkuil <hans.verkuil@cisco.com>

Thanks,

	Hans

> ---
>  drivers/media/i2c/saa7115.c | 17 ++---------------
>  1 file changed, 2 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/media/i2c/saa7115.c b/drivers/media/i2c/saa7115.c
> index d2a1ce2..4c22df8 100644
> --- a/drivers/media/i2c/saa7115.c
> +++ b/drivers/media/i2c/saa7115.c
> @@ -672,15 +672,6 @@ static const unsigned char saa7115_init_misc[] = {
>  	0x00, 0x00
>  };
>  
> -static int saa711x_odd_parity(u8 c)
> -{
> -	c ^= (c >> 4);
> -	c ^= (c >> 2);
> -	c ^= (c >> 1);
> -
> -	return c & 1;
> -}
> -
>  static int saa711x_decode_vps(u8 *dst, u8 *p)
>  {
>  	static const u8 biphase_tbl[] = {
> @@ -733,7 +724,6 @@ static int saa711x_decode_wss(u8 *p)
>  	static const int wss_bits[8] = {
>  		0, 0, 0, 1, 0, 1, 1, 1
>  	};
> -	unsigned char parity;
>  	int wss = 0;
>  	int i;
>  
> @@ -745,11 +735,8 @@ static int saa711x_decode_wss(u8 *p)
>  			return -1;
>  		wss |= b2 << i;
>  	}
> -	parity = wss & 15;
> -	parity ^= parity >> 2;
> -	parity ^= parity >> 1;
>  
> -	if (!(parity & 1))
> +	if (!parity4(wss))
>  		return -1;
>  
>  	return wss;
> @@ -1235,7 +1222,7 @@ static int saa711x_decode_vbi_line(struct v4l2_subdev *sd, struct v4l2_decode_vb
>  		vbi->type = V4L2_SLICED_TELETEXT_B;
>  		break;
>  	case 4:
> -		if (!saa711x_odd_parity(p[0]) || !saa711x_odd_parity(p[1]))
> +		if (!parity8(p[0]) || !parity8(p[1]))
>  			return 0;
>  		vbi->type = V4L2_SLICED_CAPTION_525;
>  		break;
> 

^ permalink raw reply	[flat|nested] 55+ messages in thread

end of thread, other threads:[~2016-07-01 11:56 UTC | newest]

Thread overview: 55+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-11  8:25 [patch V4 00/31] bitops: add parity functions zengzhaoxiu
2016-05-11  8:47 ` [patch V4 01/31] " zengzhaoxiu
2016-05-11 14:32   ` Martin Kepplinger
2016-05-11  9:06 ` [patch V4 02/31] bitops: Include generic parity.h in some architectures' bitops.h zengzhaoxiu
2016-05-11 10:06   ` Jesper Nilsson
2016-05-11 10:42   ` Catalin Marinas
2016-05-11 13:52   ` Vineet Gupta
2016-05-11 15:24   ` Mark Salter
2016-05-11  9:09 ` [patch V4 03/31] bitops: Add alpha-specific parity functions zengzhaoxiu
2016-05-11  9:09 ` [patch V4 04/31] bitops: Add blackfin-specific " zengzhaoxiu
2016-05-11  9:10 ` [patch V4 05/31] bitops: Add ia-specific " zengzhaoxiu
2016-06-29 15:15   ` [patch V4 05/31] bitops: Add ia64-specific " zengzhaoxiu
2016-05-11  9:10 ` [patch V4 06/31] bitops: Tile and MIPS (if has usable __builtin_popcount) use popcount " zengzhaoxiu
2016-05-11  9:11 ` [patch V4 07/31] bitops: Add powerpc-specific " zengzhaoxiu
2016-05-11  9:13 ` [patch V4 08/31] bitops: Add sparc-specific " zengzhaoxiu
2016-05-11 23:59   ` David Miller
2016-05-11  9:16 ` [patch V4 09/31] bitops: Add x86-specific " zengzhaoxiu
2016-05-11  9:31   ` Peter Zijlstra
2016-05-11  9:52     ` Borislav Petkov
2016-05-16 15:49     ` Zhaoxiu Zeng
2016-05-16 17:06       ` Peter Zijlstra
2016-05-16 19:22         ` H. Peter Anvin
2016-05-17 11:22           ` Peter Zijlstra
2016-05-16 19:19     ` H. Peter Anvin
2016-06-29 15:04       ` zengzhaoxiu
2016-05-11  9:17 ` [patch V4 10/31] sunrpc: use parity8 zengzhaoxiu
2016-05-11  9:17 ` [patch V4 11/31] mips: use parity functions in cerr-sb1.c zengzhaoxiu
2016-05-11  9:18 ` [patch V4 12/31] lib: bch: use parity32 zengzhaoxiu
2016-05-11  9:18 ` [patch V4 13/31] media: use parity8 in vivid-vbi-gen.c zengzhaoxiu
2016-05-11  9:19 ` [patch V4 14/31] media: use parity functions in saa7115 zengzhaoxiu
2016-07-01 11:53   ` Hans Verkuil
2016-05-11  9:19 ` [patch V4 15/31] input: use parity32 in grip_mp zengzhaoxiu
2016-05-11  9:19 ` [patch V4 16/31] input: use parity64 in sidewinder zengzhaoxiu
2016-05-11  9:19 ` [patch V4 17/31] input: use parity16 in ams_delta_serio zengzhaoxiu
2016-05-11  9:19 ` [patch V4 18/31] scsi: use parity32 in isci's phy zengzhaoxiu
2016-05-11  9:20 ` [patch V4 19/31] mtd: use parity16 in ssfdc zengzhaoxiu
2016-05-11  9:21 ` [patch V4 20/31] mtd: use parity functions in inftlcore zengzhaoxiu
2016-05-11  9:21 ` [patch V4 21/31] crypto: use parity functions in qat_hal zengzhaoxiu
2016-05-11  9:22 ` [patch V4 22/31] mtd: use parity16 in sm_ftl zengzhaoxiu
2016-05-11  9:22 ` [patch V4 23/31] ethernet: use parity8 in sun/niu.c zengzhaoxiu
2016-05-11 23:59   ` David Miller
2016-05-11  9:22 ` [patch V4 24/31] input: use parity8 in pcips2 zengzhaoxiu
2016-05-11  9:22 ` [patch V4 25/31] input: use parity8 in sa1111ps2 zengzhaoxiu
2016-05-11  9:22 ` [patch V4 26/31] iio: use parity32 in adxrs450 zengzhaoxiu
2016-05-11  9:23 ` [patch V4 27/31] serial: use parity32 in max3100 zengzhaoxiu
2016-06-25 17:25   ` Greg Kroah-Hartman
2016-06-29 14:57     ` [patch V4 27/31] serial: use parity8 " zengzhaoxiu
2016-06-29 16:43       ` Greg KH
2016-06-29 17:25         ` zengzhaoxiu
2016-05-11  9:24 ` [patch V4 28/31] input: use parity8 in elantech zengzhaoxiu
2016-05-11  9:24 ` [patch V4 29/31] ethernet: use parity8 in broadcom/tg3.c zengzhaoxiu
2016-05-11 23:59   ` David Miller
2016-05-11  9:24 ` [patch V4 30/31] crypto: use parity_long is sahara.c zengzhaoxiu
2016-06-29 15:18   ` [patch V4 30/31] crypto: use parity_long in sahara.c zengzhaoxiu
2016-05-11  9:24 ` [patch V4 31/31] edac: use parity8 in amd64_edac.c zengzhaoxiu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).