On Fri, 17 Aug 2018, Arnd Bergmann wrote:
> - For outb()/outw()/outl(), we ought to provide stronger barriers than for
> writeb()/writew()/writel(), as PCI drivers should expect the store to have
> arrived at the device by the time the function returns.
>
> Could you try the patch below that would address the second issue but not
> the first?
>
> Arnd
>
> diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h
> index 4c533fc94d62..0a479ac27cab 100644
> --- a/arch/alpha/include/asm/io.h
> +++ b/arch/alpha/include/asm/io.h
> @@ -364,11 +364,13 @@ extern inline u16 inw(unsigned long port)
> extern inline void outb(u8 b, unsigned long port)
> {
> iowrite8(b, ioport_map(port, 1));
> + mb();
But is `mb' the right kind of high-level barrier for MMIO rather than
regular memory access?
I believe it is not and so I was told in the past when an ordering
barrier was required for MMIO in a network driver for a weakly ordered
system. I think different kind of barrier is required here, such as
`mmiowb', if appropriate. Of course at the low level it may indeed expand
to an MB hardware instruction, but that's another matter, we need to
abstract things properly.
A while ago I proposed a set of different MMIO barriers, that some
systems may require, corresponding to the respective regular memory
barriers, but in the I/O context. I never got to implementing that
proposal, but I still think it's the right thing to do and will see if I
can find some time to try doing that. Right now we have quite a mess with
that. :(
Maciej