From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Jonas Bonn <jonas@southpole.se>, Rich Felker <dalias@libc.org>,
linux-pci@vger.kernel.org, Will Deacon <will.deacon@arm.com>,
"James E.J. Bottomley" <jejb@parisc-linux.org>,
David Howells <dhowells@redhat.com>,
Max Filippov <jcmvbkbc@gmail.com>,
Paul Mackerras <paulus@samba.org>,
Huacai Chen <chenhc@lemote.com>,
Guan Xuetao <gxt@mprc.pku.edu.cn>,
Thomas Gleixner <tglx@linutronix.de>,
Hans-Christian Egtvedt <egtvedt@samfundet.no>,
linux-arch@vger.kernel.org,
Jesper Nilsson <jesper.nilsson@axis.com>,
Yoshinori Sato <ysato@users.sourceforge.jp>,
Michael Ellerman <mpe@ellerman.id.au>,
Helge Deller <deller@gmx.de>,
Russell King <linux@armlinux.org.uk>,
Ingo Molnar <mingo@redhat.com>,
Geert Uytterhoeven <geert@linux-m68k.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Matt Turner <mattst88@gmail.com>,
Haavard Skinnemoen <hskinnemoen@gmail.com>,
Fenghua Yu <fenghua.yu@intel.co>
Subject: Re: [PATCH v3 00/32] PCI: fix config and I/O Address space memory mappings
Date: Wed, 12 Apr 2017 09:12:51 +1000 [thread overview]
Message-ID: <1491952371.7236.22.camel@kernel.crashing.org> (raw)
In-Reply-To: <20170411140857.GA6821@red-moon>
On Tue, 2017-04-11 at 15:08 +0100, Lorenzo Pieralisi wrote:
> On Tue, Apr 11, 2017 at 11:38:26PM +1000, Benjamin Herrenschmidt wrote:
> > On Tue, 2017-04-11 at 13:28 +0100, Lorenzo Pieralisi wrote:
> > > This patch series[1] is a v3 of a previous version:
> > >
> > > v2: https://lkml.org/lkml/2017/3/27/220
> >
> > I am not a fan of this at All.
> >
> > That whole concept of "ioremap_nopost" is simply not applicable to the
> > majority of architectures and certainly not in a way that can apply to
> > arbitrary mappings.
> >
> > It's also very wrong to provide a "default" operation whose semantics
> > are weaker than what it's supposed to implement. Very wrong actually.
> > People will use it assuming the non-posted behaviour and things will
> > break in subtle way when it cannot be provided.
>
> Well, what's very wrong for you it is not very wrong for others
> (it is just v3, that's fine, see thread below).
Maybe, but I don't see in what universe it is ok to have something
defined for the stronger ordering semantics it provide silently
fallback to weaker semantics.
> I can easily make ioremap_nopost() mirror ioremap_uc() (ie return
> NULL unless overriden so that basically you can't use in on an arch
> that can't provide its semantics) but then that becomes very wrong
> for other reviewers.
Those reviewers are WRONG :-)
> https://lkml.org/lkml/2017/4/6/396
>
> > What exactly are you trying to fix here ?
>
> I wrote in the commit logs and cover letter what I am fixing here.
Right right, what *actual bug you have observed* are you trying to fix
?
I'm pretty such close to all non-x86 archs had that "problem" since the
dawn of time and it has never hurt anybody.
That said, I don't think it makes sense to "solve" it by creating a
"generic" mapping semantic that is basically impossible to implement on
most architectures out there (and cannot be emulated).
This is a problem to be solved by the bridge itself. If ARM has a
mapping attribute to make stores non-posted, keep this an ARM specific
attribute at this stage I'd say.
> Anyway:
>
> "The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and
> Posting") mandate non-posted configuration transactions. As further
> highlighted in the PCIe specifications (4.0 - Rev0.3, "Ordering
> Considerations for the Enhanced Configuration Access Mechanism"),
> through ECAM and ECAM-derivative configuration mechanism, the memory
> mapped transactions from the host CPU into Configuration Requests on the
> PCI express fabric may create ordering problems for software because
> writes to memory address are typically posted transactions (unless the
> architecture can enforce through virtual address mapping non-posted
> write transactions behaviour) but writes to Configuration Space are not
> posted on the PCI express fabric."
>
> On ARM64:
>
> "This rule is reinforced by the ARM v8 architecture reference manual
> (issue A.k, Early Write Acknowledgment) that explicitly recommends
> that No Early Write Acknowledgment attribute should be used to map
> PCI configuration (write) transactions."
>
> > If a given PCIe host bridge (architecture specific) require a special
> > sauce to provide the illusion of non-posting, then implement this in
> > the actual root complex code.
> >
> > BTW. I'm pretty sure we "accidentally" made config writes posted at
> > least to the PHB on a number of powerpc systems forever and we *never*
> > had a problem because of it ;)
>
> Ok so we should ignore the PCIe specifications and ARM v8 reference
> manual waiting for a kernel bug to appear ? Is that what you suggest
> doing ?
>
> Lorenzo
>
> > > v2 -> v3:
> > > - Created a default ioremap_nopost() implementation in a
> > > separate
> > > asm-generic header and patched all arches to make use of it
> > > - Removed PCI drivers patches from the series to simplify the
> > > review, they will be posted separately once the
> > > ioremap_nopost()
> > > interface is settled
> > > - Fixed devm_ioremap_* BUS offset comments and implemented
> > > nopost interface on top of it
> > > - Added collected tags
> > >
> > > v1: https://lkml.org/lkml/2017/2/27/228
> > >
> > > v1 -> v2:
> > > - Changed pci_remap_cfgspace() to more generic ioremap_nopost()
> > > interface
> > > - Added pgprot_nonposted
> > > - Fixed build errors on arches not relying on asm-generic
> > > headers
> > > - Added PCI versatile host controller driver patch
> > > - Added missing config space remapping to hisilicon host
> > > controller
> > >
> > > ---------------------
> > > Original cover letter
> > > ---------------------
> > >
> > > PCI local bus specifications (Rev3.0, 3.2.5 "Transaction Ordering
> > > and Posting") strictly require PCI configuration and I/O Address
> > > space
> > > write transactions to be non-posted.
> > >
> > > Current crop of DT/ACPI PCI host controllers drivers relies on
> > > the ioremap interface to map ECAM and ECAM-derivative PCI config
> > > regions and pci_remap_iospace() to create a VMA for mapping
> > > PCI host bridge I/O Address space transactions to CPU virtual address
> > > space.
> > >
> > > On some platforms (ie ARM/ARM64) ioremap fails to comply with the PCI
> > > configuration non-posted write transactions requirement, because it
> > > provides a memory mapping that issues "bufferable" or, in PCI terms
> > > "posted" write transactions. Likewise, the current
> > > pci_remap_iospace()
> > > implementation maps the physical address range that the PCI
> > > translates
> > > to I/O space cycles to virtual address space through pgprot_device()
> > > attributes that on eg ARM64 provides a memory mapping issuing
> > > posted writes transactions, which is not PCI specifications
> > > compliant.
> > >
> > > This patch series[1] addresses both issues in one go:
> > >
> > > - It updates the pci_remap_iospace() function to use a page mapping
> > > that guarantees non-posted write transactions for I/O space
> > > addresses
> > > - It adds a kernel API to remap PCI config space resources, so that
> > > architecture can override it with a mapping implementation that
> > > guarantees PCI specifications compliancy wrt non-posted write
> > > configuration transactions
> > > - It updates all PCI host controller implementations (and the generic
> > > ECAM layer) to use the newly introduced mapping interface
> > >
> > > Tested on Juno ECAM based interface (DT/ACPI).
> > >
> > > Non-ECAM PCI host controller drivers patches need checking to make
> > > sure that:
> > >
> > > - I patched the correct resource region mapping for config space
> > > - There are not any other ways to ensure posted-write completion
> > > in the respective pci_ops that make the relevant patch unnecessary
> > >
> > > [1]
> > > git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/linux.git
> > > pci/config-io-mappings-fix-v3
> > >
> > > Lorenzo Pieralisi (32):
> > > PCI: remove __weak tag from pci_remap_iospace()
> > > asm-generic/pgtable.h: introduce pgprot_nonposted remap attribute
> > > PCI: fix pci_remap_iospace() remap attribute
> > > asm-generic: add ioremap_nopost() remap interface
> > > alpha: include default ioremap_nopost() implementation
> > > avr32: include default ioremap_nopost() implementation
> > > arc: include default ioremap_nopost() implementation
> > > cris: include default ioremap_nopost() implementation
> > > frv: include default ioremap_nopost() implementation
> > > hexagon: include default ioremap_nopost() implementation
> > > ia64: include default ioremap_nopost() implementation
> > > m32r: include default ioremap_nopost() implementation
> > > m68k: include default ioremap_nopost() implementation
> > > metag: include default ioremap_nopost() implementation
> > > microblaze: include default ioremap_nopost() implementation
> > > mips: include default ioremap_nopost() implementation
> > > mn10300: include default ioremap_nopost() implementation
> > > nios2: include default ioremap_nopost() implementation
> > > openrisc: include default ioremap_nopost() implementation
> > > parisc: include default ioremap_nopost() implementation
> > > powerpc: include default ioremap_nopost() implementation
> > > s390: include default ioremap_nopost() implementation
> > > sh: include default ioremap_nopost() implementation
> > > sparc: include default ioremap_nopost() implementation
> > > tile: include default ioremap_nopost() implementation
> > > unicore32: include default ioremap_nopost() implementation
> > > x86: include default ioremap_nopost() implementation
> > > xtensa: include default ioremap_nopost() implementation
> > > arm64: implement ioremap_nopost() interface
> > > arm: implement ioremap_nopost() interface
> > > lib: fix Devres devm_ioremap_* offset parameter kerneldoc
> > > description
> > > lib: implement Devres ioremap_nopost() interface
> > >
> > > Documentation/driver-model/devres.txt | 3 ++
> > > arch/alpha/include/asm/io.h | 1 +
> > > arch/arc/include/asm/io.h | 1 +
> > > arch/arm/include/asm/io.h | 9 ++++
> > > arch/arm/mm/ioremap.c | 7 +++
> > > arch/arm/mm/nommu.c | 9 ++++
> > > arch/arm64/include/asm/io.h | 12 +++++
> > > arch/avr32/include/asm/io.h | 1 +
> > > arch/cris/include/asm/io.h | 1 +
> > > arch/frv/include/asm/io.h | 1 +
> > > arch/hexagon/include/asm/io.h | 2 +
> > > arch/ia64/include/asm/io.h | 1 +
> > > arch/m32r/include/asm/io.h | 1 +
> > > arch/m68k/include/asm/io.h | 1 +
> > > arch/metag/include/asm/io.h | 2 +
> > > arch/microblaze/include/asm/io.h | 1 +
> > > arch/mips/include/asm/io.h | 1 +
> > > arch/mn10300/include/asm/io.h | 1 +
> > > arch/nios2/include/asm/io.h | 1 +
> > > arch/openrisc/include/asm/io.h | 2 +
> > > arch/parisc/include/asm/io.h | 1 +
> > > arch/powerpc/include/asm/io.h | 1 +
> > > arch/s390/include/asm/io.h | 1 +
> > > arch/sh/include/asm/io.h | 1 +
> > > arch/sparc/include/asm/io.h | 1 +
> > > arch/tile/include/asm/io.h | 1 +
> > > arch/unicore32/include/asm/io.h | 1 +
> > > arch/x86/include/asm/io.h | 1 +
> > > arch/xtensa/include/asm/io.h | 1 +
> > > drivers/pci/pci.c | 4 +-
> > > include/asm-generic/ioremap-nopost.h | 9 ++++
> > > include/asm-generic/pgtable.h | 4 ++
> > > include/linux/device.h | 2 +
> > > include/linux/io.h | 2 +
> > > lib/devres.c | 84
> > > +++++++++++++++++++++++++++++++++--
> > > 35 files changed, 167 insertions(+), 5 deletions(-)
> > > create mode 100644 include/asm-generic/ioremap-nopost.h
> > >
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2017-04-11 23:12 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-11 12:28 [PATCH v3 00/32] PCI: fix config and I/O Address space memory mappings Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 01/32] PCI: remove __weak tag from pci_remap_iospace() Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 02/32] asm-generic/pgtable.h: introduce pgprot_nonposted remap attribute Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 03/32] PCI: fix pci_remap_iospace() " Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 04/32] asm-generic: add ioremap_nopost() remap interface Lorenzo Pieralisi
2017-04-11 13:39 ` Benjamin Herrenschmidt
2017-04-11 14:31 ` Lorenzo Pieralisi
2017-04-11 23:14 ` Benjamin Herrenschmidt
2017-04-12 10:00 ` Lorenzo Pieralisi
2017-04-12 11:20 ` Russell King - ARM Linux
2017-04-18 15:49 ` Lorenzo Pieralisi
2017-04-18 16:31 ` Bjorn Helgaas
2017-04-18 22:43 ` Benjamin Herrenschmidt
2017-04-11 12:28 ` [PATCH v3 05/32] alpha: include default ioremap_nopost() implementation Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 06/32] avr32: " Lorenzo Pieralisi
2017-04-11 13:55 ` Nicolas Ferre
2017-04-11 12:28 ` [PATCH v3 07/32] arc: " Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 08/32] cris: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 13:15 ` Jesper Nilsson
2017-04-11 13:15 ` Jesper Nilsson
2017-04-11 12:28 ` [PATCH v3 09/32] frv: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 10/32] hexagon: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 11/32] ia64: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 12/32] m32r: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 13/32] m68k: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 14/32] metag: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 15/32] microblaze: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 16/32] mips: " Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 17/32] mn10300: " Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 18/32] nios2: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:28 ` [PATCH v3 19/32] openrisc: " Lorenzo Pieralisi
2017-04-11 12:28 ` Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 20/32] parisc: " Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 21/32] powerpc: " Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 13:38 ` Benjamin Herrenschmidt
2017-04-11 13:38 ` Benjamin Herrenschmidt
2017-04-11 14:24 ` Lorenzo Pieralisi
2017-04-11 14:24 ` Lorenzo Pieralisi
2017-04-11 23:15 ` Benjamin Herrenschmidt
2017-04-11 23:15 ` Benjamin Herrenschmidt
2017-04-13 3:35 ` Michael Ellerman
2017-04-11 12:29 ` [PATCH v3 22/32] s390: " Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 23/32] sh: " Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 24/32] sparc: " Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 25/32] tile: " Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 26/32] unicore32: " Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 27/32] x86: " Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 28/32] xtensa: " Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 29/32] arm64: implement ioremap_nopost() interface Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 30/32] arm: " Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 31/32] lib: fix Devres devm_ioremap_* offset parameter kerneldoc description Lorenzo Pieralisi
2017-04-11 12:29 ` [PATCH v3 32/32] lib: implement Devres ioremap_nopost() interface Lorenzo Pieralisi
2017-04-11 12:29 ` Lorenzo Pieralisi
2017-04-11 13:38 ` [PATCH v3 00/32] PCI: fix config and I/O Address space memory mappings Benjamin Herrenschmidt
2017-04-11 14:08 ` Lorenzo Pieralisi
2017-04-11 23:12 ` Benjamin Herrenschmidt [this message]
2017-04-12 9:44 ` Lorenzo Pieralisi
2017-04-12 13:48 ` Benjamin Herrenschmidt
2017-04-12 11:31 ` Russell King - ARM Linux
2017-04-12 13:51 ` Benjamin Herrenschmidt
2017-04-12 14:16 ` Russell King - ARM Linux
2017-04-12 14:41 ` Lorenzo Pieralisi
2017-04-12 22:30 ` Benjamin Herrenschmidt
2017-04-12 22:45 ` Russell King - ARM Linux
2017-04-13 0:53 ` Benjamin Herrenschmidt
2017-04-18 8:57 ` Lorenzo Pieralisi
2017-04-18 10:36 ` Benjamin Herrenschmidt
2017-04-18 11:03 ` Lorenzo Pieralisi
2017-04-18 22:38 ` Benjamin Herrenschmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1491952371.7236.22.camel@kernel.crashing.org \
--to=benh@kernel.crashing.org \
--cc=catalin.marinas@arm.com \
--cc=chenhc@lemote.com \
--cc=dalias@libc.org \
--cc=deller@gmx.de \
--cc=dhowells@redhat.com \
--cc=egtvedt@samfundet.no \
--cc=fenghua.yu@intel.co \
--cc=geert@linux-m68k.org \
--cc=gxt@mprc.pku.edu.cn \
--cc=hskinnemoen@gmail.com \
--cc=jcmvbkbc@gmail.com \
--cc=jejb@parisc-linux.org \
--cc=jesper.nilsson@axis.com \
--cc=jonas@southpole.se \
--cc=linux-arch@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=lorenzo.pieralisi@arm.com \
--cc=mattst88@gmail.com \
--cc=mingo@redhat.com \
--cc=mpe@ellerman.id.au \
--cc=paulus@samba.org \
--cc=tglx@linutronix.de \
--cc=will.deacon@arm.com \
--cc=ysato@users.sourceforge.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).