Re: [PATCH v5 2/2] mtd: rawnand: use bit-wise majority to recover the contents of ONFI parameter

From: Boris Brezillon
Date: Tue May 15 2018 - 16:35:27 EST


On Tue, 15 May 2018 23:23:02 +0300
Andy Shevchenko <andy.shevchenko@xxxxxxxxx> wrote:

> On Tue, May 15, 2018 at 11:03 AM, Boris Brezillon
> <boris.brezillon@xxxxxxxxxxx> wrote:
> > On Tue, 15 May 2018 10:46:00 +0300
> > Andy Shevchenko <andy.shevchenko@xxxxxxxxx> wrote:
> >
> >> On Tue, May 15, 2018 at 10:35 AM, Boris Brezillon
> >> <boris.brezillon@xxxxxxxxxxx> wrote:
> >> > On Mon, 14 May 2018 20:54:36 +0300
> >> > Andy Shevchenko <andy.shevchenko@xxxxxxxxx> wrote:
>
> >> >> > for (k = 0; k < nbufs; k++) {
> >> >> > const u8 *srcbuf = srcbufs[j];
> >> >> >
> >> >> > if (srcbuf[i] & BIT(k))
> >> >> > m++;
> >> >> > }
> >> >>
> >> >> ...which is effectively hweightXX().
> >> >
> >> > No it's not.
> >>
> >> I don't see how "not". In the loop everithing except m and k are
> >> invariants. What did I miss?
> >
> > We're not counting the number of bits set in an uXX var, but the number
> > of set bits at the same position in different buffers.
>
> ...on big picture. The excerpt above is hweight() against srcbuf[i].
>
> Let's rewrite it like this:
>
> const u8 *srcbuf = srcbufs[j];
>
> for (k = 0; k < nbufs; k++) {
> if (srcbuf[i] & BIT(k))

I made a mistake in my code sample, it's

if (srcbuf[i] & BIT(j))

If you look at v6, you'll see it's been fixed by Jane.

> m++;
> }
>
> ...and now it looks obvious:
>
> m += hweight...(srcbuf[i])
>
> _If_ nbufs is power of two we may use primitive helper.
>