linux_dsm_epyc7002/drivers/pci
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
..
host PCI: designware: Exchange viewport of MEMORYs' and CFGs/IOs' 2016-08-23 16:55:16 -05:00
hotplug ACPI / hotplug / PCI: Runtime resume bridges before bus rescans 2016-08-04 21:33:58 -04:00
pcie Merge branches 'pci/aspm', 'pci/dpc', 'pci/hotplug', 'pci/misc', 'pci/msi', 'pci/pm' and 'pci/virtualization' into next 2016-08-01 12:23:31 -05:00
access.c PCI: Add pci_set_vpd_size() to set VPD size 2016-04-15 13:00:11 -05:00
ats.c PCI: Remove pci_ats_enabled() 2015-08-13 15:59:59 -05:00
bus.c Merge branches 'pci/demodularize-hosts' and 'pci/host-request-windows' into next 2016-08-01 12:23:57 -05:00
ecam.c tree-wide: replace config_enabled() with IS_ENABLED() 2016-08-04 08:50:07 -04:00
host-bridge.c
hotplug-pci.c
htirq.c
iov.c powerpc updates for 4.6 2016-03-19 15:38:41 -07:00
irq.c
Kconfig PCI/MSI: irqchip: Fix PCI_MSI dependencies 2016-06-15 15:47:33 -05:00
Makefile x86/platform/intel-mid: Add Power Management Unit driver 2016-06-15 10:10:49 +02:00
msi.c PCI: Spread interrupt vectors in pci_alloc_irq_vectors() 2016-07-21 15:57:03 -05:00
of.c PCI/MSI: Use of_msi_get_domain instead of open-coded "msi-parent" parsing 2015-10-16 13:07:14 +01:00
pci-acpi.c Power management and ACPI updates for v4.5-rc1 2016-01-12 20:25:09 -08:00
pci-driver.c PCI: Put PCIe ports into D3 during suspend 2016-06-13 14:57:36 -05:00
pci-label.c PCI: Fix broken URL for Dell biosdevname 2016-02-29 12:03:19 -06:00
pci-mid.c x86/platform/intel-mid: Add Power Management Unit driver 2016-06-15 10:10:49 +02:00
pci-stub.c
pci-sysfs.c PCI: Put PCIe ports into D3 during suspend 2016-06-13 14:57:36 -05:00
pci.c PCI changes for the v4.8 merge window: 2016-08-02 17:12:29 -04:00
pci.h PCI: Put PCIe ports into D3 during suspend 2016-06-13 14:57:36 -05:00
probe.c Merge branches 'pci/aspm', 'pci/dpc', 'pci/hotplug', 'pci/misc', 'pci/msi', 'pci/pm' and 'pci/virtualization' into next 2016-08-01 12:23:31 -05:00
proc.c PCI: Ignore write combining when mapping I/O port space 2016-06-17 14:43:33 -05:00
quirks.c PCI: Add ACS quirk for Solarflare SFC9220 2016-07-29 17:28:24 -05:00
remove.c PCI: Put PCIe ports into D3 during suspend 2016-06-13 14:57:36 -05:00
rom.c PCI: Remove unused IORESOURCE_ROM_COPY and IORESOURCE_ROM_BIOS_COPY 2016-03-12 06:00:29 -06:00
search.c PCI: Add support for multiple DMA aliases 2016-04-11 14:34:32 -05:00
setup-bus.c PCI changes for the v4.8 merge window: 2016-08-02 17:12:29 -04:00
setup-irq.c
setup-res.c PCI: Don't assign or reassign immutable resources 2016-03-08 12:14:31 -06:00
slot.c PCI: Hold pci_slot_mutex while searching bus->slots list 2015-07-30 16:19:53 -05:00
syscall.c
vc.c PCI: Fix unaligned accesses in VC code 2016-06-20 13:24:20 -05:00
vpd.c
xen-pcifront.c treewide: replace obsolete _refok by __ref 2016-08-02 17:31:41 -04:00