linux/drivers/pci/controller
Pali Rohár 1a1dbc4473 PCI: aardvark: Fix kernel panic during PIO transfer
commit f18139966d upstream.

Trying to start a new PIO transfer by writing value 0 in PIO_START register
when previous transfer has not yet completed (which is indicated by value 1
in PIO_START) causes an External Abort on CPU, which results in kernel
panic:

    SError Interrupt on CPU0, code 0xbf000002 -- SError
    Kernel panic - not syncing: Asynchronous SError Interrupt

To prevent kernel panic, it is required to reject a new PIO transfer when
previous one has not finished yet.

If previous PIO transfer is not finished yet, the kernel may issue a new
PIO request only if the previous PIO transfer timed out.

In the past the root cause of this issue was incorrectly identified (as it
often happens during link retraining or after link down event) and special
hack was implemented in Trusted Firmware to catch all SError events in EL3,
to ignore errors with code 0xbf000002 and not forwarding any other errors
to kernel and instead throw panic from EL3 Trusted Firmware handler.

Links to discussion and patches about this issue:
https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=3c7dcdac5c50
https://lore.kernel.org/linux-pci/20190316161243.29517-1-repk@triplefau.lt/
https://lore.kernel.org/linux-pci/971be151d24312cc533989a64bd454b4@www.loen.fr/
https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/1541

But the real cause was the fact that during link retraining or after link
down event the PIO transfer may take longer time, up to the 1.44s until it
times out. This increased probability that a new PIO transfer would be
issued by kernel while previous one has not finished yet.

After applying this change into the kernel, it is possible to revert the
mentioned TF-A hack and SError events do not have to be caught in TF-A EL3.

Link: https://lore.kernel.org/r/20210608203655.31228-1-pali@kernel.org
Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Marek Behún <kabel@kernel.org>
Cc: stable@vger.kernel.org # 7fbcb5da81 ("PCI: aardvark: Don't rely on jiffies while holding spinlock")
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-06-23 14:42:51 +02:00
..
cadence PCI: cadence: Retrain Link to work around Gen2 training defect 2021-03-11 14:17:29 +01:00
dwc PCI: tegra: Fix runtime PM imbalance in pex_ep_event_pex_rst_deassert() 2021-05-22 11:40:52 +02:00
mobiveil PCI: mobiveil: Simplify mobiveil_pcie_init_irq_domain() return expression 2020-10-02 12:48:08 +01:00
Kconfig pci-v5.10-changes 2020-10-22 12:41:00 -07:00
Makefile PCI: hip: Add handling of HiSilicon HIP PCIe controller errors 2020-09-16 10:30:42 +01:00
pci-aardvark.c PCI: aardvark: Fix kernel panic during PIO transfer 2021-06-23 14:42:51 +02:00
pci-ftpci100.c PCI: Set bridge map_irq and swizzle_irq to default functions 2020-08-04 16:36:30 +01:00
pci-host-common.c PCI: Set bridge map_irq and swizzle_irq to default functions 2020-08-04 16:36:30 +01:00
pci-host-generic.c
pci-hyperv-intf.c
pci-hyperv.c pci-v5.10-changes 2020-10-22 12:41:00 -07:00
pci-loongson.c PCI: loongson: Simplify loongson_pci_probe() return expression 2020-10-02 12:56:31 +01:00
pci-mvebu.c PCI: mvebu: Fix duplicate resource requests 2020-11-04 13:55:30 -06:00
pci-rcar-gen2.c PCI: rcar-gen2: Use fallthrough pseudo-keyword 2020-09-07 15:17:20 +01:00
pci-tegra.c PCI: tegra: Convert to use DEFINE_SEQ_ATTRIBUTE macro 2020-09-28 12:06:22 +01:00
pci-thunder-ecam.c PCI: thunder: Fix compile testing 2021-05-22 11:40:52 +02:00
pci-thunder-pem.c PCI: thunder: Fix compile testing 2021-05-22 11:40:52 +02:00
pci-v3-semi.c PCI: v3-semi: Remove unneeded break 2020-10-20 10:59:55 -05:00
pci-versatile.c PCI: Set bridge map_irq and swizzle_irq to default functions 2020-08-04 16:36:30 +01:00
pci-xgene-msi.c PCI: xgene-msi: Fix race in installing chained irq handler 2021-03-17 17:06:24 +01:00
pci-xgene.c PCI: xgene: Fix cfg resource mapping 2021-05-14 09:49:57 +02:00
pcie-altera-msi.c Merge branch 'pci/irq-error' 2020-08-05 18:24:22 -05:00
pcie-altera.c Merge branch 'pci/irq-error' 2020-08-05 18:24:22 -05:00
pcie-brcmstb.c PCI: brcmstb: Initialize "tmp" before use 2020-12-30 11:53:18 +01:00
pcie-hisi-error.c PCI: hip: Add handling of HiSilicon HIP PCIe controller errors 2020-09-16 10:30:42 +01:00
pcie-iproc-bcma.c PCI: iproc: Use module_bcma_driver to simplify the code 2020-10-02 12:45:26 +01:00
pcie-iproc-msi.c PCI: iproc: Fix return value of iproc_msi_irq_domain_alloc() 2021-05-19 10:13:01 +02:00
pcie-iproc-platform.c PCI: iproc: Fix using plain integer as NULL pointer in iproc_pcie_pltfm_probe 2020-10-09 13:37:57 +01:00
pcie-iproc.c PCI: iproc: Invalidate correct PAXB inbound windows 2020-12-30 11:53:27 +01:00
pcie-iproc.h
pcie-mediatek.c PCI: mediatek: Add missing of_node_put() to fix reference leak 2021-03-17 17:06:24 +01:00
pcie-rcar-ep.c
pcie-rcar-host.c PCI: rcar: Always allocate MSI addresses in 32bit space 2021-03-04 11:38:11 +01:00
pcie-rcar.c
pcie-rcar.h
pcie-rockchip-ep.c PCI: Fix kerneldoc warnings 2020-08-05 18:23:14 -05:00
pcie-rockchip-host.c PCI: rockchip: Fix bus checks in rockchip_pcie_valid_device() 2020-09-08 16:52:42 -05:00
pcie-rockchip.c PCI: rockchip: Make 'ep-gpios' DT property optional 2021-03-04 11:38:18 +01:00
pcie-rockchip.h PCI: rockchip: Use pci_is_root_bus() to check if bus is root bus 2020-07-23 11:20:50 +01:00
pcie-tango.c PCI: Remove dev_err() when handing an error from platform_get_irq() 2020-08-03 09:26:03 -05:00
pcie-xilinx-cpm.c PCI: xilinx-cpm: Fix reference count leak on error path 2021-03-04 11:38:11 +01:00
pcie-xilinx-nwl.c Merge branch 'pci/irq-error' 2020-08-05 18:24:22 -05:00
pcie-xilinx.c PCI: Set bridge map_irq and swizzle_irq to default functions 2020-08-04 16:36:30 +01:00
vmd.c pci-v5.10-changes 2020-10-22 12:41:00 -07:00