alistair23-linux/drivers/pci/host
Dong Bo 68a0bfec72 PCI: designware: Exchange viewport of MEMORYs' and CFGs/IOs'
When we have only two view ports in a DesignWare PCIe platform, iatu0
is used for both CFG and IO accesses.  When CFGs are sent to peripherals
(e.g., lspci), iatu0 frequently switches between CFG and IO.

For such scenarios, a MEMORY might be sent as an IOs by mistake.
Considering the following configurations:

  MEMORY  ->   BASE_ADDR: 0xb4100000, LIMIT: 0xb4100FFF, TYPE=mem
  CFG     ->   BASE_ADDR: 0xb4000000, LIMIT: 0xb4000FFF, TYPE=cfg
  IO      ->   BASE_ADDR: 0xFFFFFFFF, LIMIT: 0xFFFFFFFE, TYPE=io

Suppose PCIe has just completed a CFG access.  To switch back to IO, it
sets the BASE_ADDR to 0xFFFFFFFF, LIMIT 0xFFFFFFFE and TYPE to IO.  When
another CFG comes, the BASE_ADDR is set to 0xb4000000 to switch to CFG.  At
this moment, a MEMORY access shows up, since it matches with iatu0 (due to
0xb4000000 <= MEMORY BASE_ADDR <= MEMORY LIMIT <= 0xFFFFFFF), it is treated
as an IO access by mistake, then sent to perpheral.

This patch fixes the problem by exchanging the assignments of `MEMORYs' and
`CFGs/IOs', which assigning MEMORYs to iatu0, CFGs and IOs to iatu1.

We can still have issues with IO transfer, however memory transfer is used
predominantly therefore we are just minimizing the risk of failure.
Actually, we can not do much when we have only two viewports.  We can
either not allow the less frequent IO transfers at all, or can live with a
remote possibility of getting it corrupted.

Signed-off-by: Dong Bo <dongbo4@huawei.com>
[pratyush.anand@gmail.com: Modified commit log to capture remote risk]
Signed-off-by: Pratyush Anand <pratyush.anand@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
2016-08-23 16:55:16 -05:00
..
Kconfig Merge branches 'pci/host-aardvark', 'pci/host-altera', 'pci/host-dra7xx', 'pci/host-hv', 'pci/host-vmd' and 'pci/host-xilinx' into next 2016-08-01 12:32:13 -05:00
Makefile Merge branches 'pci/host-aardvark', 'pci/host-altera', 'pci/host-dra7xx', 'pci/host-hv', 'pci/host-vmd' and 'pci/host-xilinx' into next 2016-08-01 12:32:13 -05:00
pci-aardvark.c Merge branches 'pci/host-aardvark', 'pci/host-altera', 'pci/host-dra7xx', 'pci/host-hv', 'pci/host-vmd' and 'pci/host-xilinx' into next 2016-08-01 12:32:13 -05:00
pci-dra7xx.c PCI: dra7xx: Fix return value in case of error 2016-07-25 12:29:51 -05:00
pci-exynos.c PCI: designware: Return data directly from dw_pcie_readl_rc() 2016-08-17 14:43:38 -05:00
pci-host-common.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
pci-host-generic.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
pci-hyperv.c PCI: hv: Fix interrupt cleanup path 2016-07-25 12:33:36 -05:00
pci-imx6.c PCI: imx6: Implement reset sequence for i.MX6+ 2016-05-02 14:33:17 -05:00
pci-keystone-dw.c PCI: keystone: Add error IRQ handler 2016-04-14 14:40:42 -05:00
pci-keystone.c PCI: keystone: Make explicitly non-modular 2016-08-01 12:22:50 -05:00
pci-keystone.h PCI: keystone: Add error IRQ handler 2016-04-14 14:40:42 -05:00
pci-layerscape.c PCI: layerscape: Make explicitly non-modular 2016-08-01 12:22:50 -05:00
pci-mvebu.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
pci-rcar-gen2.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
pci-tegra.c Merge branch 'pci/host-tegra' into next 2016-08-01 12:25:37 -05:00
pci-thunder-ecam.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
pci-thunder-pem.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
pci-versatile.c PCI: versatile: Simplify host bridge window iteration 2016-06-25 07:44:24 -05:00
pci-xgene-msi.c
pci-xgene.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
pcie-altera-msi.c
pcie-altera.c Merge branches 'pci/host-aardvark', 'pci/host-altera', 'pci/host-dra7xx', 'pci/host-hv', 'pci/host-vmd' and 'pci/host-xilinx' into next 2016-08-01 12:32:13 -05:00
pcie-armada8k.c PCI: armada8k: Make explicitly non-modular 2016-08-01 12:22:50 -05:00
pcie-artpec6.c PCI: artpec6: Make explicitly non-modular 2016-08-01 12:22:50 -05:00
pcie-designware-plat.c PCI: designware-plat: Make it explicitly non-modular 2016-08-01 12:22:50 -05:00
pcie-designware.c PCI: designware: Exchange viewport of MEMORYs' and CFGs/IOs' 2016-08-23 16:55:16 -05:00
pcie-designware.h PCI: designware: Keep viewport fixed for IO transaction if num_viewport > 2 2016-08-22 12:34:43 -05:00
pcie-hisi.c PCI: hisi: Make explicitly non-modular 2016-08-01 12:22:50 -05:00
pcie-iproc-bcma.c
pcie-iproc-msi.c
pcie-iproc-platform.c
pcie-iproc.c PCI: iproc: Request host bridge window resources 2016-06-20 14:06:05 -05:00
pcie-iproc.h
pcie-qcom.c PCI: designware: Add generic dw_pcie_wait_for_link() 2016-03-15 08:50:45 -05:00
pcie-rcar.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
pcie-spear13xx.c PCI: designware: Add generic dw_pcie_wait_for_link() 2016-03-15 08:50:45 -05:00
pcie-xilinx-nwl.c PCI: xilinx-nwl: Use dev_printk() when possible 2016-06-20 14:06:06 -05:00
pcie-xilinx.c Merge branches 'pci/host-aardvark', 'pci/host-altera', 'pci/host-dra7xx', 'pci/host-hv', 'pci/host-vmd' and 'pci/host-xilinx' into next 2016-08-01 12:32:13 -05:00