* [PATCH 07/31] Add mips-specific parity functions [not found] <1458788612-4367-1-git-send-email-zhaoxiu.zeng@gmail.com> @ 2016-03-27 6:06 ` zhaoxiu.zeng 2016-03-28 17:25 ` David Daney 2016-03-27 6:55 ` [PATCH 13/31] mips: use parity functions in cerr-sb1.c zhaoxiu.zeng 1 sibling, 1 reply; 4+ messages in thread From: zhaoxiu.zeng @ 2016-03-27 6:06 UTC (permalink / raw) To: Ralf Baechle, Leonid Yegoshin, Maciej W. Rozycki; +Cc: linux-kernel, linux-mips From: Zeng Zhaoxiu <zhaoxiu.zeng@gmail.com> Signed-off-by: Zeng Zhaoxiu <zhaoxiu.zeng@gmail.com> --- arch/mips/include/asm/arch_parity.h | 44 +++++++++++++++++++++++++++++++++++++ arch/mips/include/asm/bitops.h | 3 +++ 2 files changed, 47 insertions(+) create mode 100644 arch/mips/include/asm/arch_parity.h diff --git a/arch/mips/include/asm/arch_parity.h b/arch/mips/include/asm/arch_parity.h new file mode 100644 index 0000000..23b3c23 --- /dev/null +++ b/arch/mips/include/asm/arch_parity.h @@ -0,0 +1,44 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + */ +#ifndef _ASM_ARCH_PARITY_H +#define _ASM_ARCH_PARITY_H + +#ifdef ARCH_HAS_USABLE_BUILTIN_POPCOUNT + +#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; +} + +#else +#include <asm-generic/bitops/arch_hweight.h> +#include <asm-generic/bitops/arch_parity.h> +#endif + +#endif /* _ASM_ARCH_PARITY_H */ diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h index ce9666c..0b87734 100644 --- a/arch/mips/include/asm/bitops.h +++ b/arch/mips/include/asm/bitops.h @@ -626,6 +626,9 @@ static inline int ffs(int word) #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.h> -- 2.5.5 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 07/31] Add mips-specific parity functions 2016-03-27 6:06 ` [PATCH 07/31] Add mips-specific parity functions zhaoxiu.zeng @ 2016-03-28 17:25 ` David Daney 2016-03-29 2:15 ` Zeng Zhaoxiu 0 siblings, 1 reply; 4+ messages in thread From: David Daney @ 2016-03-28 17:25 UTC (permalink / raw) To: zhaoxiu.zeng Cc: Ralf Baechle, Leonid Yegoshin, Maciej W. Rozycki, linux-kernel, linux-mips On 03/26/2016 11:06 PM, zhaoxiu.zeng wrote: > From: Zeng Zhaoxiu <zhaoxiu.zeng@gmail.com> > There is nothing MIPS specific here. Why not put it in asm-generic or some similar place where it can be shared by all architectures? Also, are you sure __builtin_popcount() is available on all GCC versions that are supported for building the kernel? David Daney > Signed-off-by: Zeng Zhaoxiu <zhaoxiu.zeng@gmail.com> > --- > arch/mips/include/asm/arch_parity.h | 44 +++++++++++++++++++++++++++++++++++++ > arch/mips/include/asm/bitops.h | 3 +++ > 2 files changed, 47 insertions(+) > create mode 100644 arch/mips/include/asm/arch_parity.h > > diff --git a/arch/mips/include/asm/arch_parity.h b/arch/mips/include/asm/arch_parity.h > new file mode 100644 > index 0000000..23b3c23 > --- /dev/null > +++ b/arch/mips/include/asm/arch_parity.h > @@ -0,0 +1,44 @@ > +/* > + * This file is subject to the terms and conditions of the GNU General Public > + * License. See the file "COPYING" in the main directory of this archive > + * for more details. > + * > + */ > +#ifndef _ASM_ARCH_PARITY_H > +#define _ASM_ARCH_PARITY_H > + > +#ifdef ARCH_HAS_USABLE_BUILTIN_POPCOUNT > + > +#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; > +} > + > +#else > +#include <asm-generic/bitops/arch_hweight.h> > +#include <asm-generic/bitops/arch_parity.h> > +#endif > + > +#endif /* _ASM_ARCH_PARITY_H */ > diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h > index ce9666c..0b87734 100644 > --- a/arch/mips/include/asm/bitops.h > +++ b/arch/mips/include/asm/bitops.h > @@ -626,6 +626,9 @@ static inline int ffs(int word) > #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.h> > > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 07/31] Add mips-specific parity functions 2016-03-28 17:25 ` David Daney @ 2016-03-29 2:15 ` Zeng Zhaoxiu 0 siblings, 0 replies; 4+ messages in thread From: Zeng Zhaoxiu @ 2016-03-29 2:15 UTC (permalink / raw) To: David Daney Cc: Ralf Baechle, Leonid Yegoshin, Maciej W. Rozycki, linux-kernel, linux-mips 在 2016年03月29日 01:25, David Daney 写道: > On 03/26/2016 11:06 PM, zhaoxiu.zeng wrote: >> From: Zeng Zhaoxiu <zhaoxiu.zeng@gmail.com> >> > > There is nothing MIPS specific here. Why not put it in asm-generic or > some similar place where it can be shared by all architectures? > > Also, are you sure __builtin_popcount() is available on all GCC > versions that are supported for building the kernel? > > David Daney > Refrence to arch_hweight.h. In the 68th line of arch/mips/include/asm/mach-cavium-octeon/cpu-feature-overrides.h, we can see: #ifdef __OCTEON__ /* * All gcc versions that have OCTEON support define __OCTEON__ and have the * __builtin_popcount support. */ #define ARCH_HAS_USABLE_BUILTIN_POPCOUNT 1 #endif /* * All gcc versions that have OCTEON support define __OCTEON__ and have the * __builtin_popcount support. */ >> Signed-off-by: Zeng Zhaoxiu <zhaoxiu.zeng@gmail.com> >> --- >> arch/mips/include/asm/arch_parity.h | 44 >> +++++++++++++++++++++++++++++++++++++ >> arch/mips/include/asm/bitops.h | 3 +++ >> 2 files changed, 47 insertions(+) >> create mode 100644 arch/mips/include/asm/arch_parity.h >> >> diff --git a/arch/mips/include/asm/arch_parity.h >> b/arch/mips/include/asm/arch_parity.h >> new file mode 100644 >> index 0000000..23b3c23 >> --- /dev/null >> +++ b/arch/mips/include/asm/arch_parity.h >> @@ -0,0 +1,44 @@ >> +/* >> + * This file is subject to the terms and conditions of the GNU >> General Public >> + * License. See the file "COPYING" in the main directory of this >> archive >> + * for more details. >> + * >> + */ >> +#ifndef _ASM_ARCH_PARITY_H >> +#define _ASM_ARCH_PARITY_H >> + >> +#ifdef ARCH_HAS_USABLE_BUILTIN_POPCOUNT >> + >> +#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; >> +} >> + >> +#else >> +#include <asm-generic/bitops/arch_hweight.h> >> +#include <asm-generic/bitops/arch_parity.h> >> +#endif >> + >> +#endif /* _ASM_ARCH_PARITY_H */ >> diff --git a/arch/mips/include/asm/bitops.h >> b/arch/mips/include/asm/bitops.h >> index ce9666c..0b87734 100644 >> --- a/arch/mips/include/asm/bitops.h >> +++ b/arch/mips/include/asm/bitops.h >> @@ -626,6 +626,9 @@ static inline int ffs(int word) >> #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.h> >> >> > ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 13/31] mips: use parity functions in cerr-sb1.c [not found] <1458788612-4367-1-git-send-email-zhaoxiu.zeng@gmail.com> 2016-03-27 6:06 ` [PATCH 07/31] Add mips-specific parity functions zhaoxiu.zeng @ 2016-03-27 6:55 ` zhaoxiu.zeng 1 sibling, 0 replies; 4+ messages in thread From: zhaoxiu.zeng @ 2016-03-27 6:55 UTC (permalink / raw) To: Ralf Baechle; +Cc: linux-kernel, linux-mips From: Zeng Zhaoxiu <zhaoxiu.zeng@gmail.com> Signed-off-by: Zeng Zhaoxiu <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.5.5 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-03-29 2:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1458788612-4367-1-git-send-email-zhaoxiu.zeng@gmail.com>
2016-03-27 6:06 ` [PATCH 07/31] Add mips-specific parity functions zhaoxiu.zeng
2016-03-28 17:25 ` David Daney
2016-03-29 2:15 ` Zeng Zhaoxiu
2016-03-27 6:55 ` [PATCH 13/31] mips: use parity functions in cerr-sb1.c zhaoxiu.zeng
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox