lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CACRpkdbn_v7g4=2+jGwxTr2z4ZLcFFfRF4F0oohn0VOf4uJ1SQ@mail.gmail.com>
Date:   Wed, 31 Aug 2022 16:07:28 +0200
From:   Linus Walleij <linus.walleij@...aro.org>
To:     Andy Shevchenko <andriy.shevchenko@...el.com>,
        Arnd Bergmann <arnd@...db.de>,
        linux-alpha <linux-alpha@...r.kernel.org>
Cc:     Mark Brown <broonie@...nel.org>, linux-kernel@...r.kernel.org,
        Brian Cain <bcain@...cinc.com>, linux-hexagon@...r.kernel.org
Subject: Re: [PATCH 2/2 v5] regmap: mmio: Support accelerared noinc operations

On Tue, Aug 30, 2022 at 6:39 PM Andy Shevchenko
<andriy.shevchenko@...el.com> wrote:
> On Tue, Aug 16, 2022 at 10:48:32PM +0200, Linus Walleij wrote:
> > Use the newly added callback for accelerated noinc MMIO
> > to provide writesb, writesw, writesl, writesq, readsb, readsw,
> > readsl and readsq.
> >
> > A special quirk is needed to deal with big endian regmaps: there
> > are no accelerated operations defined for big endian, so fall
> > back to calling the big endian operations itereatively for this
> > case.
> >
> > The Hexagon architecture turns out to have an incomplete
> > <asm/io.h>: writesb() is not implemented. Fix this by doing
> > what other architectures do: include <asm-generic/io.h> into
> > the <asm/io.h> file.
>
> Wonderful!
>
> So, I have seen a recent blow up by kernel bot due to Alpha issues on these
> accessors.

There is a patch for that:
https://lore.kernel.org/linux-arch/20220818092059.103884-1-linus.walleij@linaro.org/

Alpha maintainance is not very active.

The problem is that some (fringe) architectures do not fulfil the contract
to provide full accessors. I can fix them all, I am fixing powerpc right now,
but the breakage is just random compile tests, they don't really use
regmap-mmio, we're just enabling regmap-mmio to compile on archs
that don't ever use it, so it's not urgent.

> > +     if (!IS_ERR(ctx->clk)) {
> > +             ret = clk_enable(ctx->clk);
> > +             if (ret < 0)
> > +                     return ret;
> > +     }
>
> It's a new place of the duplicating check, can we have a helper for that?
>
> ...
>
> > +     /*
> > +      * There are no native, assembly-optimized write single register
> > +      * operations for big endian, so fall back to emulation if this
> > +      * is needed. (Single bytes are fine, they are not affected by
> > +      * endianness.)
> > +      */
>
> Wouldn't be faster to memdup() / swap / use corresponding IO accessor?

Hm I would like a real BE target to test on and profile that.
If someone has a target I can make a patch.

> > +     /*
> > +      * There are no native, assembly-optimized write single register
> > +      * operations for big endian, so fall back to emulation if this
> > +      * is needed. (Single bytes are fine, they are not affected by
> > +      * endianness.)
> > +      */
> > +     if (ctx->big_endian && (ctx->val_bytes > 1)) {
> > +             switch (ctx->val_bytes) {
> > +             case 2:
> > +             {
> > +                     u16 *valp = (u16 *)val;
> > +                     for (i = 0; i < val_count; i++)
> > +                             valp[i] = swab16(valp[i]);
> > +                     break;
> > +             }
> > +             case 4:
> > +             {
> > +                     u32 *valp = (u32 *)val;
> > +                     for (i = 0; i < val_count; i++)
> > +                             valp[i] = swab32(valp[i]);
> > +                     break;
> > +             }
> > +#ifdef CONFIG_64BIT
> > +             case 8:
> > +             {
> > +                     u64 *valp = (u64 *)val;
> > +                     for (i = 0; i < val_count; i++)
> > +                             valp[i] = swab64(valp[i]);
> > +                     break;
> > +             }
> > +#endif
> > +             default:
> > +                     ret = -EINVAL;
> > +                     break;
> > +             }
> > +     }
>
> So, two questions here:
>
> 1) can we use helpers from include/linux/byteorder/generic.h, such as
>    cpu_to_be32_array()/be32_to_cpu_array()?
>
> 2) have you considered using memcpy_toio() / memcpy_fromio() and why
>    it's not okay to use them?

I got scared of all of these accessors because of
commit 7e7ba58c94127efa97c249e38cc2d1c0ed78b58f
"regmap: mmio: Fix MMIO accessors to avoid talking to IO port"
so I don't know if I dare to trust them. Therefore I opted for the
simplest thing that I could write that fulfils the requirement.

Again, if someone has a BE target to test on, I can write a patch!

> > +out_clk:
> > +     if (!IS_ERR(ctx->clk))
> > +             clk_disable(ctx->clk);
> > +
> > +     return ret;
> > +
> > +     return 0;
>
> Seems like misrebase? I believe this has to be fixed.

Ooops I fix. Also the double newline.

Yours,
Linus Walleij

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ