linux/drivers/pci/host
Shawn Lin f257f4bf6f PCI: rockchip: Use normal register bank for config accessors
commit dc8cca5ef2 upstream.

Rockchip's RC has two banks of registers for the root port: a normal bank
that is strictly compatible with the PCIe spec, and a privileged bank that
can be used to change RO bits of root port registers.

When probing the RC driver, we use the privileged bank to do some basic
setup work as some RO bits are hw-inited to wrong value.  But we didn't
change to the normal bank after probing the driver.

This leads to a serious problem when the PME code tries to clear the PME
status by writing PCI_EXP_RTSTA_PME to the register of PCI_EXP_RTSTA.  Per
PCIe 3.0 spec, section 7.8.14, the PME status bit is RW1C.  So the PME code
is doing the right thing to clear the PME status but we find the RC doesn't
clear it but actually setting it to one.  So finally the system trap in
pcie_pme_work_fn() as PCI_EXP_RTSTA_PME is true now forever.  This issue
can be reproduced by booting kernel with pci=nomsi.

Use the normal register bank for the PCI config accessors.  The privileged
bank is used only internally by this driver.

Fixes: e77f847d ("PCI: rockchip: Add Rockchip PCIe controller support")
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Jeffy Chen <jeffy.chen@rock-chips.com>
Cc: Brian Norris <briannorris@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2017-07-27 15:08:00 -07:00
..
Kconfig Merge branch 'pci/host-vmd' into next 2016-10-05 14:00:21 -05:00
Makefile Merge branch 'pci/host-vmd' into next 2016-10-05 14:00:21 -05:00
pci-aardvark.c PCI: aardvark: Remove unused platform data 2016-10-11 19:44:04 -05:00
pci-dra7xx.c PCI: dra7xx: Reorder struct dra7xx_pcie 2016-10-12 00:05:54 -05:00
pci-exynos.c PCI: exynos: Reorder struct exynos_pcie 2016-10-11 21:30:52 -05:00
pci-host-common.c Merge branch 'pci/enumeration' into next 2016-10-03 09:43:19 -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: Specify CPU_AFFINITY_ALL for MSI affinity when >= 32 CPUs 2017-05-25 15:44:47 +02:00
pci-imx6.c PCI: imx6: Remove unused return values 2016-10-11 22:26:28 -05:00
pci-keystone-dw.c PCI: keystone: Add app register accessors 2016-10-11 22:58:34 -05:00
pci-keystone.c PCI: keystone: Pass keystone_pcie, not address, to IRQ functions 2016-10-11 22:56:46 -05:00
pci-keystone.h PCI: keystone: Reorder struct keystone_pcie 2016-10-11 22:58:43 -05:00
pci-layerscape.c PCI: layerscape: Fix drvdata usage before assignment 2016-10-17 07:58:18 -05:00
pci-mvebu.c PCI: mvebu: Use existing of_node pointer 2016-10-11 23:19:05 -05:00
pci-rcar-gen2.c PCI: rcar-gen2: Add local struct device pointers 2016-10-11 23:34:57 -05:00
pci-tegra.c PCI: tegra: Remove unused platform data 2016-10-11 23:45:32 -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 PCI: thunder-pem: Factor out resource lookup 2017-04-12 12:41:17 +02:00
pci-versatile.c PCI: versatile: Fix pci_remap_iospace() failure path 2016-09-06 12:41:15 -05:00
pci-xgene-msi.c irqdomain/msi: Use fwnode instead of of_node 2015-10-13 19:01:25 +02:00
pci-xgene.c PCI: xgene: Add register accessors 2016-10-11 23:54:31 -05:00
pcie-altera-msi.c Merge branches 'pci/host-aardvark', 'pci/host-altera', 'pci/host-artpec', 'pci/host-designware', 'pci/host-hv', 'pci/host-keystone', 'pci/host-rcar', 'pci/host-rockchip', 'pci/host-tegra' and 'pci/host-xilinx' into next 2016-10-05 13:59:14 -05:00
pcie-altera.c PCI: altera: Fix TLP_CFG_DW0 for TLP write 2017-03-12 06:41:47 +01:00
pcie-armada8k.c PCI: armada: Reorder struct armada8k_pcie 2016-10-11 20:33:01 -05:00
pcie-artpec6.c PCI: artpec6: Add resource name comments 2016-10-11 20:49:40 -05:00
pcie-designware-plat.c PCI: designware-plat: Update author email 2016-11-16 16:16:40 -06:00
pcie-designware.c PCI: designware: Check for iATU unroll only on platforms that use ATU 2017-01-26 08:24:38 +01:00
pcie-designware.h PCI: designware: Export dw_pcie_readl_rc(), dw_pcie_writel_rc() 2016-10-11 08:31:52 -05:00
pcie-hisi.c PCI: hisi: Reorder struct hisi_pcie 2016-10-12 00:08:32 -05:00
pcie-iproc-bcma.c PCI: iproc: Save host bridge window resource in struct iproc_pcie 2017-04-08 09:30:33 +02:00
pcie-iproc-msi.c PCI: iproc: Add iProc PCIe MSI support 2016-01-06 18:04:35 -06:00
pcie-iproc-platform.c PCI: iproc: Save host bridge window resource in struct iproc_pcie 2017-04-08 09:30:33 +02:00
pcie-iproc.c PCI: iproc: Hard-code PCIe capability offset instead of searching 2016-10-11 22:44:22 -05:00
pcie-iproc.h PCI: iproc: Save host bridge window resource in struct iproc_pcie 2017-04-08 09:30:33 +02:00
pcie-qcom.c PCI: qcom: Fix pp->dev usage before assignment 2016-10-26 14:46:39 -05:00
pcie-rcar.c PCI: rcar: Remove DRV_NAME macro 2016-10-11 23:34:49 -05:00
pcie-rockchip.c PCI: rockchip: Use normal register bank for config accessors 2017-07-27 15:08:00 -07:00
pcie-spear13xx.c PCI: spear: Clean up struct device usage 2016-10-11 08:45:47 -05:00
pcie-xilinx-nwl.c PCI: xilinx-nwl: Remove unused platform data 2016-10-12 00:00:51 -05:00
pcie-xilinx.c PCI: xilinx: Removed unused xilinx_pcie_assign_msi() argument 2016-10-12 00:00:00 -05:00
vmd.c PCI changes for the v4.9 merge window: 2016-10-07 11:46:37 -07:00