linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: arnd@arndb.de (Arnd Bergmann)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v8 4/9] pci: OF: Fix the conversion of IO ranges into IO resources.
Date: Wed, 16 Jul 2014 16:47:41 +0200	[thread overview]
Message-ID: <9785692.7QoVkhofSt@wuerfel> (raw)
In-Reply-To: <CAL_JsqKaR=SYtM7BKTgO_AN5Vb0GCjaiKbA=9Zr7qGB29R9-5Q@mail.gmail.com>

On Wednesday 16 July 2014 09:35:37 Rob Herring wrote:
> On Wed, Jul 9, 2014 at 3:31 AM, Arnd Bergmann <arnd@arndb.de> wrote:
> > On Tuesday 08 July 2014, Liviu Dudau wrote:
> >> On Mon, Jul 07, 2014 at 10:22:00PM +0100, Arnd Bergmann wrote:
> >> >
> >> > I looked at the other drivers briefly, and I think you indeed fix the Tegra
> >> > driver with this but break the integrator driver as mentioned above.
> >> > The other callers of of_pci_range_to_resource() are apparently not
> >> > impacted as they recalculate the values they get.
> >>
> >> I would argue that integrator version is having broken assumptions. If it would
> >> try to allocate that IO range or request the resource as returned currently by
> >> of_pci_range_to_resource (without my patch) it would fail. I know because I did
> >> the same thing in my host bridge driver and it failed miserably. That's why I
> >> tried to patch it.
> >
> > The integrator code was just introduced and the reason for how it does things
> > is the way that of_pci_range_to_resource() works today. We tried to cope with
> > it and not change the existing behavior in order to not break any other drivers.
> >
> > It's certainly not fair to call the integrator version broken, it just works
> > around the common code having a quirky interface. We should probably have
> > done of_pci_range_to_resource better than it is today (I would have argued
> > for it to return an IORESOURCE_MEM with the CPU address), but it took long
> > enough to get that merged and I was sick of arguing about it.
> >
> >> If the IO space is memory mapped, then we use the port number, the io_offset
> >> and the PCI_IOBASE to get to the virtual address that, when accessed, will
> >> generate the correct addresses on the bus, based on what the host bridge has
> >> been configured.
> >>
> >> This is the current level of my understanding of PCI IO.
> 
> What is io_offset supposed to be and be based on?

(you probably know most of this, but I'll explain it the long way
to avoid ambiguity).

io_offset is a concept used internally to translate bus-specific I/O port
numbers into Linux-global ports.

A simple example would be having two PCI host bridges each with a
(hardware) port range from 0 to 0xffff. These numbers are programmed
into "BARs" in PCI device config space and they are used on the physical
address lines in PCI or in the packet header on PCIe.

In Linux, we have a single logical port range that is seen by device
drivers, in the example the first host bridge would use ports 0-0xfffff
and the second one would use ports 0x10000-0x1ffff.

The PCI core uses the io_offset to translate between the two address
spaces when it does the resource allocation during bus probe, so a device
that gets Linux I/O port 0x10100 has its BAR programmed with 0x100 and
the struct resource filled as 0x10000.

When a PCI host bridge driver registers its root bus with the PCI core,
it passes the io_offset using the last argument to pci_add_resource_offset()
along with the Linux I/O port resource, so in the example the first
io_offset is zero, while the second one is 0x10000.

Note that there is no requirement for the I/O port range on the bus to
start at zero, and you can even have negative io_offset values to
deal with that, but this is the exception.

> >> Now, I believe Rob has switched entirely to using my series in some test that
> >> he has run and he hasn't encountered any issues, as long as one remembers in
> >> the host bridge driver to add the io_base offset to the .start resource. If
> >> not then I need to patch pci_v3.c.
> >
> > The crazy part of all these discussions is that basically nobody ever uses
> > I/O port access, so it's very hard to test and we don't even notice when
> > we get it wrong, but we end up spending most of the time for PCI host controller
> > reviews trying to get these right.
> 
> FWIW, I test i/o accesses with Versatile QEMU. The LSI53xxxx device in
> the model has a kconfig option to use i/o accesses. However, I have
> seen in the past this is an area where 2 wrongs can make a right.

Can you point me to a git tree with your kernel and dts?

	Arnd

  parent reply	other threads:[~2014-07-16 14:47 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-01 18:43 [PATCH v8 0/9] Support for creating generic PCI host bridges from DT Liviu Dudau
2014-07-01 18:43 ` [PATCH v8 1/9] Fix ioport_map() for !CONFIG_GENERIC_IOMAP cases Liviu Dudau
2014-07-01 18:43 ` [PATCH v8 2/9] pci: Export find_pci_host_bridge() function Liviu Dudau
2014-07-02 18:06   ` Tanmay Inamdar
2014-07-02 19:12     ` Arnd Bergmann
2014-07-02 20:43       ` Tanmay Inamdar
2014-07-03  9:53         ` Liviu Dudau
2014-07-03 10:26         ` Arnd Bergmann
2014-07-07 23:27   ` Bjorn Helgaas
2014-07-08 10:42     ` Liviu Dudau
2014-07-01 18:43 ` [PATCH v8 3/9] pci: Introduce pci_register_io_range() helper function Liviu Dudau
2014-07-01 19:36   ` Arnd Bergmann
2014-07-01 20:45     ` Liviu Dudau
2014-07-02 12:30       ` Arnd Bergmann
2014-07-02 14:23         ` Liviu Dudau
2014-07-02 14:58           ` Arnd Bergmann
2014-07-02 11:22   ` Will Deacon
2014-07-02 16:00     ` Liviu Dudau
2014-07-02 12:38   ` Arnd Bergmann
2014-07-02 13:20     ` Liviu Dudau
2014-07-08  0:14   ` Bjorn Helgaas
2014-07-08  7:00     ` Arnd Bergmann
2014-07-08 21:29       ` Bjorn Helgaas
2014-07-08 22:45         ` Liviu Dudau
2014-07-09  6:32           ` Arnd Bergmann
2014-07-09  9:13             ` Liviu Dudau
2014-07-09  6:20         ` Arnd Bergmann
2014-07-09  9:14           ` Liviu Dudau
2014-07-09 15:21           ` Bjorn Helgaas
2014-07-08 10:40     ` Liviu Dudau
2014-07-08 14:14       ` Arnd Bergmann
2014-07-09  8:59         ` Liviu Dudau
2014-07-01 18:43 ` [PATCH v8 4/9] pci: OF: Fix the conversion of IO ranges into IO resources Liviu Dudau
2014-07-05 19:25   ` Rob Herring
2014-07-05 20:46     ` Arnd Bergmann
2014-07-07 11:11       ` Liviu Dudau
2014-07-07 21:22         ` Arnd Bergmann
2014-07-08 10:03           ` Liviu Dudau
2014-07-09  8:31             ` Arnd Bergmann
2014-07-09  9:27               ` Liviu Dudau
2014-07-16 14:35               ` Rob Herring
2014-07-16 14:47                 ` Liviu Dudau
2014-07-16 14:47                 ` Arnd Bergmann [this message]
2014-07-01 18:43 ` [PATCH v8 5/9] pci: Create pci_host_bridge before its associated bus in pci_create_root_bus Liviu Dudau
2014-07-01 18:43 ` [PATCH v8 6/9] pci: Introduce a domain number for pci_host_bridge Liviu Dudau
2014-07-08  0:59   ` Bjorn Helgaas
2014-07-08 10:46     ` Liviu Dudau
2014-07-08 18:41       ` Bjorn Helgaas
2014-07-08 22:48         ` Liviu Dudau
2014-07-09 15:10           ` Bjorn Helgaas
2014-07-10  9:47             ` Liviu Dudau
2014-07-10 22:36               ` Bjorn Helgaas
2014-07-11  9:30                 ` Liviu Dudau
2014-07-11 14:11                 ` Catalin Marinas
2014-07-11 15:08                   ` Liviu Dudau
2014-07-11 16:09                     ` Catalin Marinas
2014-07-11 17:02                   ` Bjorn Helgaas
2014-07-11 18:02                     ` Catalin Marinas
2014-07-14 16:39                       ` Catalin Marinas
2014-07-22  3:15                         ` Bjorn Helgaas
2014-07-25 15:42                           ` Catalin Marinas
2014-07-01 18:43 ` [PATCH v8 7/9] pci: of: Parse and map the IRQ when adding the PCI device Liviu Dudau
2014-07-02 11:17   ` Will Deacon
2014-07-05 19:04     ` Rob Herring
2014-07-01 18:43 ` [PATCH v8 8/9] pci: Add support for creating a generic host_bridge from device tree Liviu Dudau
2014-07-01 20:50   ` [RESEND] " Liviu Dudau
2014-07-01 21:04     ` Liviu Dudau
2014-07-02 11:22   ` Will Deacon
2014-07-02 17:23     ` Liviu Dudau
2014-07-02 17:31       ` Will Deacon
2014-07-02 19:09         ` Arnd Bergmann
2014-07-08  1:01   ` Bjorn Helgaas
2014-07-08 10:29     ` Liviu Dudau
2014-07-08 21:33       ` Bjorn Helgaas
2014-07-08 22:27         ` Liviu Dudau
2014-07-08 22:37           ` Bjorn Helgaas
2014-07-08 22:57             ` Liviu Dudau
2014-07-09  6:47               ` Arnd Bergmann
2014-07-11  7:43   ` Jingoo Han
2014-07-11  9:08     ` Liviu Dudau
2014-07-01 18:43 ` [PATCH v8 9/9] pci: Remap I/O bus resources into CPU space with pci_remap_iospace() Liviu Dudau
2014-07-14 16:54   ` Catalin Marinas
2014-07-14 16:56     ` Liviu Dudau
2014-07-14 18:15     ` Arnd Bergmann
2014-07-15  0:14       ` Liviu Dudau
2014-07-15  9:09       ` Catalin Marinas
2014-07-06 15:23 ` [PATCH v8 0/9] Support for creating generic PCI host bridges from DT Rob Herring
2014-07-07 11:12   ` Liviu Dudau
2014-07-08 17:18   ` Liviu Dudau
2014-07-11  0:44     ` Tanmay Inamdar
2014-07-11  7:33       ` Jingoo Han
2014-07-11  9:11         ` Liviu Dudau

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=9785692.7QoVkhofSt@wuerfel \
    --to=arnd@arndb.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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).